chore(packages): rename packages to trapos

This commit is contained in:
Guillaume ARM 2026-06-09 04:32:27 +02:00
parent 65d8a927b8
commit b2a68fc11a
16 changed files with 69 additions and 68 deletions

View File

@ -35,8 +35,8 @@ Use [`docs/README.md`](docs/README.md) as the entrypoint for CC:Tweaked, CraftOS
- `startup/servers.lua` starts `/programs`, the shell, and configured servers via `parallel.waitForAll`. - `startup/servers.lua` starts `/programs`, the shell, and configured servers via `parallel.waitForAll`.
- Preserve `periphemu` guards used for CraftOS-PC emulation; see [`docs/craftos_pc_glossary.md`](docs/craftos_pc_glossary.md) for upstream emulator references. - Preserve `periphemu` guards used for CraftOS-PC emulation; see [`docs/craftos_pc_glossary.md`](docs/craftos_pc_glossary.md) for upstream emulator references.
- TrapOS ships as packages, each described by `packages/<name>/ccpm.json` (`name`, `version`, `dependencies`, `files`, `autostart`); `packages/index.json` lists them. Source files stay in place — descriptors only reference them. To ship a new file, add it to the right package's `files` (and `autostart` if it is a server). `packages/trapos/ccpm.json` is the full OS meta-package. See [ADR-0010](docs/adrs/adr-0010-ccpm-package-manager.md). - TrapOS ships as packages, each described by `packages/<name>/ccpm.json` (`name`, `version`, `dependencies`, `files`, `autostart`); `packages/index.json` lists them. Source files stay in place — descriptors only reference them. To ship a new file, add it to the right package's `files` (and `autostart` if it is a server). `packages/trapos/ccpm.json` is the full OS meta-package. See [ADR-0010](docs/adrs/adr-0010-ccpm-package-manager.md).
- `install-ccpm.lua` is the one-time wget bootstrap. It installs only `tos-core`/`ccpm`, seeds the default `guillaumearm/cc-libs` registry on `master` (or `next` with `--beta`), and tells users to run `ccpm update` then `ccpm install trapos`. - `install-ccpm.lua` is the one-time wget bootstrap. It installs only `trapos-core`/`ccpm`, seeds the default `guillaumearm/cc-libs` registry on `master` (or `next` with `--beta`), and tells users to run `ccpm update` then `ccpm install trapos`.
- `ccpm` (in `tos-core`) is the package manager: `apis/libccpm.lua` is the testable core (factory with injectable `http`/`stateDir`/`installRoot`), `programs/ccpm.lua` the CLI. State: `/trapos/ccpm.json` (registries), `/trapos/ccpm.lock.json` (installed packages), and `/trapos/ccpm.cache.json` (available packages from `ccpm update`). Never use the word "manifest" in ccpm — it is reserved for the OS manifest. - `ccpm` (in `trapos-core`) is the package manager: `apis/libccpm.lua` is the testable core (factory with injectable `http`/`stateDir`/`installRoot`), `programs/ccpm.lua` the CLI. State: `/trapos/ccpm.json` (registries), `/trapos/ccpm.lock.json` (installed packages), and `/trapos/ccpm.cache.json` (available packages from `ccpm update`). Never use the word "manifest" in ccpm — it is reserved for the OS manifest.
- Add new servers to `startup/servers.lua` as needed. - Add new servers to `startup/servers.lua` as needed.
## Conventions ## Conventions

View File

@ -17,8 +17,8 @@ ccpm install trapos
Install individual packages instead if you want to cherry-pick: Install individual packages instead if you want to cherry-pick:
``` ```
> ccpm install tos-net > ccpm install trapos-net
> ccpm install tos-ui > ccpm install trapos-ui
``` ```
Install `ccpm` from the beta branch (one-time opt-in, asks for confirmation): Install `ccpm` from the beta branch (one-time opt-in, asks for confirmation):
@ -34,12 +34,13 @@ After install, every boot shows a colored MOTD with the installed version and br
TrapOS is split into packages, each described by a `packages/<name>/ccpm.json`: TrapOS is split into packages, each described by a `packages/<name>/ccpm.json`:
- `tos-core`: the package manager (`ccpm`), event loop, `upgrade`, `events`. - `trapos-core`: the package manager (`ccpm`), event loop, `upgrade`, `events`.
- `tos-test`: the test framework (`libtest`) and suite runner (`runtest`). - `trapos-test`: the test framework (`libtest`) and suite runner (`runtest`).
- `tos-boot`: the startup MOTD and autostart server launcher. - `trapos-boot`: the startup MOTD and autostart server launcher.
- `tos-net`: routed modem networking (`net`, `router`, `ping`, `ping-server`). - `trapos-net`: routed modem networking (`net`, `router`, `ping`, `ping-server`).
- `tos-ui`: the terminal UI toolkit (`libtui`, `tuidemo`). - `trapos-ui`: the terminal UI toolkit (`libtui`, `tuidemo`).
- `trapos`: full TrapOS meta-package (`tos-boot`, `tos-net`, `tos-ui`, and `tos-test` during beta). - `trapos-ai`: the AI client for `opencode serve`.
- `trapos`: full TrapOS meta-package (`trapos-boot`, `trapos-net`, `trapos-ui`, `trapos-test`, and `trapos-ai` during beta).
The `trapos` meta-package is the user-facing full install. Package descriptors list The `trapos` meta-package is the user-facing full install. Package descriptors list
files and autostart servers; installed state is tracked under `/trapos`. files and autostart servers; installed state is tracked under `/trapos`.
@ -47,7 +48,7 @@ files and autostart servers; installed state is tracked under `/trapos`.
## ccpm ## ccpm
`ccpm` is the TrapOS package manager. `install-ccpm.lua` installs it by installing `ccpm` is the TrapOS package manager. `install-ccpm.lua` installs it by installing
the required `tos-core` package and configures the default registry the required `trapos-core` package and configures the default registry
(`guillaumearm/cc-libs`). (`guillaumearm/cc-libs`).
``` ```

View File

@ -17,7 +17,7 @@ the OS after the initial install.
We want a package manager, `ccpm` ("ComputerCraft Package Manager"), installed first We want a package manager, `ccpm` ("ComputerCraft Package Manager"), installed first
as a standalone user-facing step. After that, a machine can `ccpm update`, as a standalone user-facing step. After that, a machine can `ccpm update`,
`ccpm install trapos`, `ccpm install tos-net`, `ccpm uninstall tos-ui`, and manage `ccpm install trapos`, `ccpm install trapos-net`, `ccpm uninstall trapos-ui`, and manage
where packages come from. TrapOS itself is installed through a `trapos` meta-package; where packages come from. TrapOS itself is installed through a `trapos` meta-package;
the `wget run .../install-ccpm.lua` bootstrap exists only to install `ccpm`. the `wget run .../install-ccpm.lua` bootstrap exists only to install `ccpm`.
@ -36,12 +36,13 @@ The split is finer-grained than the install examples imply:
| package | contents | deps | | package | contents | deps |
|----------|-----------------------------------------------------------------|----------| |----------|-----------------------------------------------------------------|----------|
| tos-core | ccpm, libccpm, eventloop, upgrade, events | — | | trapos-core | ccpm, libccpm, eventloop, upgrade, events | — |
| tos-test | libtest, runtest | tos-core | | trapos-test | libtest, runtest | trapos-core |
| tos-boot | motd, servers (startup) | tos-core | | trapos-boot | motd, servers (startup) | trapos-core |
| tos-net | net, router, ping, ping-server | tos-core | | trapos-net | net, router, ping, ping-server | trapos-core |
| tos-ui | libtui, tuidemo | tos-core | | trapos-ui | libtui, tuidemo | trapos-core |
| trapos | full TrapOS meta-package | tos-boot, tos-net, tos-ui, tos-test | | trapos-ai | AI client for opencode serve | trapos-core |
| trapos | full TrapOS meta-package | trapos-boot, trapos-net, trapos-ui, trapos-test, trapos-ai |
### Two files for ccpm, "manifest" reserved for the OS ### Two files for ccpm, "manifest" reserved for the OS
@ -62,24 +63,24 @@ are injectable for tests). `programs/ccpm.lua` is a thin CLI over it.
### The bootstrap installs only ccpm ### The bootstrap installs only ccpm
`install-ccpm.lua` resolves only the `tos-core` package descriptor (pulling any future `install-ccpm.lua` resolves only the `trapos-core` package descriptor (pulling any future
dependencies), downloads its files, and writes: dependencies), downloads its files, and writes:
- `/trapos/manifest.json` — the aggregated `{ name, version, branch, files, autostart }` - `/trapos/manifest.json` — the aggregated `{ name, version, branch, files, autostart }`
still consumed by `startup/motd.lua` and `startup/servers.lua` after boot packages still consumed by `startup/motd.lua` and `startup/servers.lua` after boot packages
are installed; are installed;
- `/trapos/ccpm.lock.json` — so right after a fresh install `ccpm install tos-core` - `/trapos/ccpm.lock.json` — so right after a fresh install `ccpm install trapos-core`
correctly reports "already installed"; correctly reports "already installed";
- `/trapos/ccpm.json` — seeding/refreshing the default `guillaumearm/cc-libs` registry - `/trapos/ccpm.json` — seeding/refreshing the default `guillaumearm/cc-libs` registry
to track the install branch. to track the install branch.
The install path is: The install path is:
- `wget run .../install-ccpm.lua` — install `ccpm` (`tos-core`) and seed the default - `wget run .../install-ccpm.lua` — install `ccpm` (`trapos-core`) and seed the default
registry. registry.
- `ccpm update` — refresh the local package cache. - `ccpm update` — refresh the local package cache.
- `ccpm install trapos` — install the full OS. During beta, `trapos` includes - `ccpm install trapos` — install the full OS. During beta, `trapos` includes
`tos-test` by default. `trapos-test` by default.
On a subsequent `upgrade`, `programs/upgrade.lua` delegates to `ccpm upgrade`, which On a subsequent `upgrade`, `programs/upgrade.lua` delegates to `ccpm upgrade`, which
upgrades installed packages using `/trapos/ccpm.cache.json`. Users run `ccpm update` upgrades installed packages using `/trapos/ccpm.cache.json`. Users run `ccpm update`

View File

@ -20,7 +20,6 @@ On a fresh CC computer (beta branch):
wget run https://raw.githubusercontent.com/guillaumearm/cc-libs/next/install-ccpm.lua --beta wget run https://raw.githubusercontent.com/guillaumearm/cc-libs/next/install-ccpm.lua --beta
ccpm update ccpm update
ccpm install trapos ccpm install trapos
ccpm install tos-ai
``` ```
## 1. Start `opencode serve` ## 1. Start `opencode serve`

View File

@ -170,7 +170,7 @@ if not manifest then
return; return;
end end
local requested = { 'tos-core' }; local requested = { 'trapos-core' };
local resolved, resolveErr = resolvePackages(branch, requested); local resolved, resolveErr = resolvePackages(branch, requested);
if not resolved then if not resolved then

View File

@ -1,6 +1,6 @@
{ {
"name": "TrapOS", "name": "TrapOS",
"version": "0.5.1", "version": "0.5.2",
"branch": "next", "branch": "next",
"packages": [ "packages": [
"trapos" "trapos"

View File

@ -1,11 +1,11 @@
{ {
"packages": { "packages": {
"tos-core": "0.3.0", "trapos-core": "0.3.0",
"tos-test": "0.2.0", "trapos-test": "0.2.0",
"tos-boot": "0.2.1", "trapos-boot": "0.2.1",
"tos-net": "0.2.0", "trapos-net": "0.2.0",
"tos-ui": "0.2.0", "trapos-ui": "0.2.0",
"tos-ai": "0.3.0", "trapos-ai": "0.3.0",
"trapos": "0.5.1" "trapos": "0.5.2"
} }
} }

View File

@ -1,8 +1,8 @@
{ {
"name": "tos-ai", "name": "trapos-ai",
"version": "0.3.0", "version": "0.3.0",
"description": "TrapOS AI client for opencode serve", "description": "TrapOS AI client for opencode serve",
"dependencies": ["tos-core"], "dependencies": ["trapos-core"],
"files": [ "files": [
"apis/libai.lua", "apis/libai.lua",
"programs/ai.lua" "programs/ai.lua"

View File

@ -1,8 +1,8 @@
{ {
"name": "tos-boot", "name": "trapos-boot",
"version": "0.2.1", "version": "0.2.1",
"description": "TrapOS boot: startup MOTD and autostart server launcher", "description": "TrapOS boot: startup MOTD and autostart server launcher",
"dependencies": ["tos-core"], "dependencies": ["trapos-core"],
"files": [ "files": [
"startup/motd.lua", "startup/motd.lua",
"startup/servers.lua" "startup/servers.lua"

View File

@ -1,5 +1,5 @@
{ {
"name": "tos-core", "name": "trapos-core",
"version": "0.3.0", "version": "0.3.0",
"description": "TrapOS base: package manager, event loop, upgrade and event tools", "description": "TrapOS base: package manager, event loop, upgrade and event tools",
"dependencies": [], "dependencies": [],

View File

@ -1,8 +1,8 @@
{ {
"name": "tos-net", "name": "trapos-net",
"version": "0.2.0", "version": "0.2.0",
"description": "TrapOS networking: routed modem messaging, router, ping", "description": "TrapOS networking: routed modem messaging, router, ping",
"dependencies": ["tos-core"], "dependencies": ["trapos-core"],
"files": [ "files": [
"apis/net.lua", "apis/net.lua",
"programs/router.lua", "programs/router.lua",

View File

@ -1,8 +1,8 @@
{ {
"name": "tos-test", "name": "trapos-test",
"version": "0.2.0", "version": "0.2.0",
"description": "TrapOS test framework and CraftOS-PC suite runner", "description": "TrapOS test framework and CraftOS-PC suite runner",
"dependencies": ["tos-core"], "dependencies": ["trapos-core"],
"files": [ "files": [
"apis/libtest.lua", "apis/libtest.lua",
"programs/runtest.lua" "programs/runtest.lua"

View File

@ -1,8 +1,8 @@
{ {
"name": "tos-ui", "name": "trapos-ui",
"version": "0.2.0", "version": "0.2.0",
"description": "TrapOS terminal UI toolkit and demo", "description": "TrapOS terminal UI toolkit and demo",
"dependencies": ["tos-core"], "dependencies": ["trapos-core"],
"files": [ "files": [
"apis/libtui.lua", "apis/libtui.lua",
"programs/tuidemo.lua" "programs/tuidemo.lua"

View File

@ -1,8 +1,8 @@
{ {
"name": "trapos", "name": "trapos",
"version": "0.5.1", "version": "0.5.2",
"description": "TrapOS full install meta-package", "description": "TrapOS full install meta-package",
"dependencies": ["tos-boot", "tos-net", "tos-ui", "tos-test"], "dependencies": ["trapos-boot", "trapos-net", "trapos-ui", "trapos-test", "trapos-ai"],
"files": [], "files": [],
"autostart": [] "autostart": []
} }

View File

@ -48,8 +48,8 @@ testlib.test('registry urls resolve an http base', function()
'http://example.com/repo/' 'http://example.com/repo/'
); );
testlib.assertEquals( testlib.assertEquals(
ccpm.descriptorUrl({ name = 'http://example.com/repo/', type = 'http' }, 'tos-net'), ccpm.descriptorUrl({ name = 'http://example.com/repo/', type = 'http' }, 'trapos-net'),
'http://example.com/repo/packages/tos-net/ccpm.json' 'http://example.com/repo/packages/trapos-net/ccpm.json'
); );
end); end);
@ -103,8 +103,8 @@ end);
testlib.test('install downloads files and records the lock', function() testlib.test('install downloads files and records the lock', function()
local base = ghBase('me/repo', 'master'); local base = ghBase('me/repo', 'master');
local routes = { local routes = {
[base .. 'packages/tos-core/ccpm.json'] = textutils.serializeJSON({ name = 'tos-core', version = '1', dependencies = {}, files = { 'apis/eventloop.lua' } }), [base .. 'packages/trapos-core/ccpm.json'] = textutils.serializeJSON({ name = 'trapos-core', version = '1', dependencies = {}, files = { 'apis/eventloop.lua' } }),
[base .. 'packages/tos-net/ccpm.json'] = textutils.serializeJSON({ name = 'tos-net', version = '1', dependencies = { 'tos-core' }, files = { 'apis/net.lua' } }), [base .. 'packages/trapos-net/ccpm.json'] = textutils.serializeJSON({ name = 'trapos-net', version = '1', dependencies = { 'trapos-core' }, files = { 'apis/net.lua' } }),
[base .. 'apis/eventloop.lua'] = 'eventloop-body', [base .. 'apis/eventloop.lua'] = 'eventloop-body',
[base .. 'apis/net.lua'] = 'net-body', [base .. 'apis/net.lua'] = 'net-body',
}; };
@ -112,7 +112,7 @@ testlib.test('install downloads files and records the lock', function()
local ccpm = createCcpm({ stateDir = sd, installRoot = root, http = fakeHttp(routes) }); local ccpm = createCcpm({ stateDir = sd, installRoot = root, http = fakeHttp(routes) });
ccpm.writeConfig({ registries = { { name = 'me/repo', type = 'github', branch = 'master' } } }); ccpm.writeConfig({ registries = { { name = 'me/repo', type = 'github', branch = 'master' } } });
local ok = ccpm.install('tos-net', {}); local ok = ccpm.install('trapos-net', {});
testlib.assertTrue(ok); testlib.assertTrue(ok);
testlib.assertTrue(fs.exists(root .. '/apis/net.lua')); testlib.assertTrue(fs.exists(root .. '/apis/net.lua'));
testlib.assertTrue(fs.exists(root .. '/apis/eventloop.lua')); testlib.assertTrue(fs.exists(root .. '/apis/eventloop.lua'));
@ -123,17 +123,17 @@ testlib.test('install downloads files and records the lock', function()
testlib.assertEquals(body, 'net-body'); testlib.assertEquals(body, 'net-body');
local lock = ccpm.readLock(); local lock = ccpm.readLock();
testlib.assertTrue(lock.packages['tos-net']); testlib.assertTrue(lock.packages['trapos-net']);
testlib.assertTrue(lock.packages['tos-core']); testlib.assertTrue(lock.packages['trapos-core']);
testlib.assertEquals(lock.packages['tos-net'].registry, 'me/repo'); testlib.assertEquals(lock.packages['trapos-net'].registry, 'me/repo');
end); end);
testlib.test('installing trapos writes aggregated os state', function() testlib.test('installing trapos writes aggregated os state', function()
local base = ghBase('me/repo', 'master'); local base = ghBase('me/repo', 'master');
local routes = { local routes = {
[base .. 'packages/trapos/ccpm.json'] = textutils.serializeJSON({ name = 'trapos', version = '1', dependencies = { 'tos-net' }, files = {} }), [base .. 'packages/trapos/ccpm.json'] = textutils.serializeJSON({ name = 'trapos', version = '1', dependencies = { 'trapos-net' }, files = {} }),
[base .. 'packages/tos-core/ccpm.json'] = textutils.serializeJSON({ name = 'tos-core', version = '1', dependencies = {}, files = { 'programs/ccpm.lua' } }), [base .. 'packages/trapos-core/ccpm.json'] = textutils.serializeJSON({ name = 'trapos-core', version = '1', dependencies = {}, files = { 'programs/ccpm.lua' } }),
[base .. 'packages/tos-net/ccpm.json'] = textutils.serializeJSON({ name = 'tos-net', version = '1', dependencies = { 'tos-core' }, files = { 'apis/net.lua' }, autostart = { 'servers/ping-server' } }), [base .. 'packages/trapos-net/ccpm.json'] = textutils.serializeJSON({ name = 'trapos-net', version = '1', dependencies = { 'trapos-core' }, files = { 'apis/net.lua' }, autostart = { 'servers/ping-server' } }),
[base .. 'programs/ccpm.lua'] = 'ccpm-body', [base .. 'programs/ccpm.lua'] = 'ccpm-body',
[base .. 'apis/net.lua'] = 'net-body', [base .. 'apis/net.lua'] = 'net-body',
}; };
@ -255,13 +255,13 @@ end);
testlib.test('uninstall refuses a package with dependents', function() testlib.test('uninstall refuses a package with dependents', function()
local ccpm = createCcpm({ stateDir = freshDirs() }); local ccpm = createCcpm({ stateDir = freshDirs() });
ccpm.writeLock({ packages = { ccpm.writeLock({ packages = {
['tos-core'] = { version = '1', files = {}, dependencies = {} }, ['trapos-core'] = { version = '1', files = {}, dependencies = {} },
['tos-net'] = { version = '1', files = {}, dependencies = { 'tos-core' } }, ['trapos-net'] = { version = '1', files = {}, dependencies = { 'trapos-core' } },
} }); } });
local ok, err = ccpm.uninstall('tos-core', {}); local ok, err = ccpm.uninstall('trapos-core', {});
testlib.assertTrue(not ok); testlib.assertTrue(not ok);
testlib.assertTrue(string.find(err, 'required by', 1, true)); testlib.assertTrue(string.find(err, 'required by', 1, true));
testlib.assertTrue(string.find(err, 'tos-net', 1, true)); testlib.assertTrue(string.find(err, 'trapos-net', 1, true));
end); end);
testlib.test('uninstall removes a leaf package and its files', function() testlib.test('uninstall removes a leaf package and its files', function()
@ -273,14 +273,14 @@ testlib.test('uninstall removes a leaf package and its files', function()
local ccpm = createCcpm({ stateDir = sd, installRoot = root }); local ccpm = createCcpm({ stateDir = sd, installRoot = root });
ccpm.writeLock({ packages = { ccpm.writeLock({ packages = {
['tos-core'] = { version = '1', files = {}, dependencies = {} }, ['trapos-core'] = { version = '1', files = {}, dependencies = {} },
['tos-net'] = { version = '1', files = { 'apis/net.lua' }, dependencies = { 'tos-core' } }, ['trapos-net'] = { version = '1', files = { 'apis/net.lua' }, dependencies = { 'trapos-core' } },
} }); } });
testlib.assertTrue(ccpm.uninstall('tos-net', {})); testlib.assertTrue(ccpm.uninstall('trapos-net', {}));
testlib.assertTrue(not fs.exists(root .. '/apis/net.lua')); testlib.assertTrue(not fs.exists(root .. '/apis/net.lua'));
testlib.assertTrue(ccpm.readLock().packages['tos-net'] == nil); testlib.assertTrue(ccpm.readLock().packages['trapos-net'] == nil);
testlib.assertTrue(ccpm.readLock().packages['tos-core'] ~= nil); testlib.assertTrue(ccpm.readLock().packages['trapos-core'] ~= nil);
end); end);
testlib.run(); testlib.run();

View File

@ -51,7 +51,7 @@ testlib.test('programs path resolves the ccpm command', function()
testlib.assertEquals(resolved, 'programs/ccpm.lua'); testlib.assertEquals(resolved, 'programs/ccpm.lua');
end); end);
testlib.test('fresh beta bootstrap leaves ccpm runnable without tos-boot', function() testlib.test('fresh beta bootstrap leaves ccpm runnable without trapos-boot', function()
local root = '/install-ccpm-test/fresh-beta'; local root = '/install-ccpm-test/fresh-beta';
fs.delete(root); fs.delete(root);
fs.makeDir(root); fs.makeDir(root);
@ -59,8 +59,8 @@ testlib.test('fresh beta bootstrap leaves ccpm runnable without tos-boot', funct
local base = 'https://raw.githubusercontent.com/guillaumearm/cc-libs/next/'; local base = 'https://raw.githubusercontent.com/guillaumearm/cc-libs/next/';
local routes = { local routes = {
[base .. 'manifest.json'] = textutils.serializeJSON({ name = 'TrapOS', version = 'test' }), [base .. 'manifest.json'] = textutils.serializeJSON({ name = 'TrapOS', version = 'test' }),
[base .. 'packages/tos-core/ccpm.json'] = textutils.serializeJSON({ [base .. 'packages/trapos-core/ccpm.json'] = textutils.serializeJSON({
name = 'tos-core', name = 'trapos-core',
version = '1', version = '1',
dependencies = {}, dependencies = {},
files = { 'apis/libccpm.lua', 'programs/ccpm.lua' }, files = { 'apis/libccpm.lua', 'programs/ccpm.lua' },