@timurproko/a1 0.1.8-dev.122 → 0.1.8-dev.126
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -70
- package/dist/foundation/release/update.js +4 -14
- package/dist/native/darwin-arm64/manifest.json +1 -1
- package/dist/native/linux-x64/manifest.json +3 -3
- package/dist/native/linux-x64/process-guardian +0 -0
- package/dist/native/win32-x64/manifest.json +2 -2
- package/dist/native/win32-x64/process-guardian.exe +0 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,118 +6,95 @@
|
|
|
6
6
|
npm install --global @timurproko/a1@latest
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Use
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
a1 # A1
|
|
12
|
+
a1 # launch A1 (profile: ~/.a1/agent)
|
|
13
13
|
a1 version # show Installed, Release, and Develop versions
|
|
14
|
-
a1 update #
|
|
15
|
-
a1 update:develop #
|
|
16
|
-
a1 update:107 # install numbered
|
|
14
|
+
a1 update # install the newest stable release
|
|
15
|
+
a1 update:develop # install the current development preview
|
|
16
|
+
a1 update:107 # install numbered preview 107
|
|
17
17
|
a1 update --models # refresh A1's model catalogs
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
for comparing against pinned Pi and for experimenting against an isolated profile.
|
|
22
|
-
A release build does not carry them.
|
|
20
|
+
Development previews add two extra profiles; release builds do not carry them.
|
|
23
21
|
|
|
24
22
|
```sh
|
|
25
|
-
a1 pi #
|
|
26
|
-
a1 sandbox #
|
|
23
|
+
a1 pi # vanilla Pi oracle: ~/.pi/agent
|
|
24
|
+
a1 sandbox # isolated vanilla Pi profile: ~/.a1/sandbox
|
|
27
25
|
```
|
|
28
26
|
|
|
29
27
|
## Extensions
|
|
30
28
|
|
|
31
|
-
Pi extension packages install into A1's own profile, so bare `a1`
|
|
32
|
-
`a1 pi`
|
|
29
|
+
Pi extension packages install into A1's own profile (`~/.a1/agent`), so bare `a1`
|
|
30
|
+
loads them and `a1 pi` / `a1 sandbox` do not. Sources are Pi's: `npm:`, git, or a
|
|
31
|
+
local path.
|
|
33
32
|
|
|
34
33
|
```sh
|
|
35
|
-
a1 pi install npm:pi-mcp-adapter # install a package
|
|
36
|
-
a1 pi remove npm:pi-mcp-adapter # remove it
|
|
37
|
-
a1 pi list # list
|
|
34
|
+
a1 pi install npm:pi-mcp-adapter # install a package
|
|
35
|
+
a1 pi remove npm:pi-mcp-adapter # remove it (alias: a1 pi uninstall)
|
|
36
|
+
a1 pi list # list installed packages
|
|
38
37
|
a1 pi update --extensions # update every installed package
|
|
39
|
-
a1 pi update npm:pi-mcp-adapter # update one
|
|
38
|
+
a1 pi update npm:pi-mcp-adapter # update one
|
|
40
39
|
```
|
|
41
40
|
|
|
42
|
-
A running session
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
`~/.a1/agent` (or the project), so `~/.pi/agent/mcp.json` is not read. Run
|
|
46
|
-
`/mcp setup` inside bare `a1` to configure it; the MCP footer status appears
|
|
47
|
-
when that A1 configuration contains a server.
|
|
41
|
+
A running session picks up a newly installed package after a restart.
|
|
42
|
+
Configuration is isolated the same way: bare `a1` reads `~/.a1/agent` (or the
|
|
43
|
+
project), never `~/.pi/agent`. Configure MCP with `/mcp setup` inside bare `a1`.
|
|
48
44
|
|
|
49
45
|
## Develop
|
|
50
46
|
|
|
51
47
|
```sh
|
|
52
48
|
npm ci # install exact locked dependencies
|
|
53
49
|
npm run build # compile TypeScript and the process guardian into dist
|
|
54
|
-
npm start # build and launch
|
|
55
|
-
npm run start:pi # build and launch
|
|
56
|
-
npm run start:sandbox # build and launch
|
|
57
|
-
npm run test:fast # typecheck + fast suite
|
|
58
|
-
npm test # same as test:fast
|
|
50
|
+
npm start # build and launch a development `a1`
|
|
51
|
+
npm run start:pi # build and launch a development `a1 pi`
|
|
52
|
+
npm run start:sandbox # build and launch a development `a1 sandbox`
|
|
53
|
+
npm run test:fast # typecheck + fast suite (alias: npm test)
|
|
59
54
|
npm run test:full # complete non-physical suite
|
|
60
55
|
```
|
|
61
56
|
|
|
62
57
|
## Release
|
|
63
58
|
|
|
64
|
-
Two channels, both published by CI from the exact bytes it validated
|
|
65
|
-
|
|
59
|
+
Two channels, both published by CI from the exact bytes it validated — never from
|
|
60
|
+
a workstation.
|
|
66
61
|
|
|
67
62
|
### Development previews
|
|
68
63
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
that source's preview is absent.
|
|
72
|
-
|
|
64
|
+
A preview is `<major.minor.patch>-dev.<pull-request number>`, e.g. `0.1.8-dev.107`.
|
|
65
|
+
The nightly run (`03:17 UTC`) verifies current `origin/develop` and publishes only
|
|
66
|
+
when that source's preview is absent. `npm run develop` requests the same GitHub
|
|
67
|
+
Actions run and waits for it. The published version list is authoritative: an
|
|
68
|
+
unpublished number is refused.
|
|
73
69
|
|
|
74
|
-
|
|
75
|
-
npm run develop
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
A preview is `<major.minor.patch>-dev.<pull-request number>`, stamped only into the
|
|
79
|
-
package. For example, the source GitHub presents as `develop (#107)` produces
|
|
80
|
-
`0.1.8-dev.107`. Repeating a request for immutable version 107 succeeds without
|
|
81
|
-
building or publishing again.
|
|
70
|
+
Publish:
|
|
82
71
|
|
|
83
72
|
```sh
|
|
84
|
-
|
|
85
|
-
a1 update:107 # install preview 107
|
|
86
|
-
a1 update:0.1.8-dev.107 # install that exact full preview version
|
|
73
|
+
npm run develop # request the preview publish run and wait for it
|
|
87
74
|
```
|
|
88
75
|
|
|
89
|
-
|
|
90
|
-
rather than guessed. npm's `next` dist-tag remains an internal registry detail.
|
|
91
|
-
|
|
92
|
-
### Stable — npm `latest`
|
|
93
|
-
|
|
94
|
-
One command, from a clean `develop` that matches its remote:
|
|
76
|
+
Install:
|
|
95
77
|
|
|
96
78
|
```sh
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
npm run release -- major # 0.1.1 -> 1.0.0
|
|
100
|
-
npm run release -- 0.4.0 # an exact version
|
|
101
|
-
npm run develop # develop
|
|
79
|
+
a1 update:107 # install preview 107
|
|
80
|
+
a1 update:0.1.8-dev.107 # install that exact full preview version
|
|
102
81
|
```
|
|
103
82
|
|
|
104
|
-
|
|
105
|
-
explicitly dispatches publication for that exact commit. GitHub Actions builds,
|
|
106
|
-
validates the packed release on Windows, Linux, and macOS, publishes to npm
|
|
107
|
-
`latest` with provenance, and only then writes the `v<version>` tag and records the
|
|
108
|
-
GitHub Release. The command waits for success before opening the next `-dev` line.
|
|
83
|
+
### Stable
|
|
109
84
|
|
|
110
85
|
```sh
|
|
111
|
-
|
|
86
|
+
npm run release -- patch # 0.1.1 -> 0.1.2
|
|
87
|
+
npm run release -- minor # 0.1.1 -> 0.2.0
|
|
88
|
+
npm run release -- major # 0.1.1 -> 1.0.0
|
|
89
|
+
npm run release -- 0.4.0 # an exact version
|
|
112
90
|
```
|
|
113
91
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
serves.
|
|
120
|
-
|
|
92
|
+
The command lands the version on `develop` through a self-merging pull request,
|
|
93
|
+
dispatches publication for that exact commit, and waits for success. CI validates
|
|
94
|
+
the packed release on Windows, Linux, and macOS, publishes to npm `latest` with
|
|
95
|
+
provenance, then writes the `v<version>` tag and the GitHub Release. `master`
|
|
96
|
+
fast-forwards to the released commit, so it always points at what npm `latest`
|
|
97
|
+
serves. A failed release leaves nothing behind: no tag, no GitHub Release, no
|
|
98
|
+
moved branch.
|
|
121
99
|
|
|
122
|
-
`docs/ci-release-runbook.md` has the full picture
|
|
123
|
-
publish fails partway.
|
|
100
|
+
`docs/ci-release-runbook.md` has the full picture.
|
|
@@ -14,13 +14,6 @@ import { materializeRelease, readMaterializedRelease } from "./release-store.js"
|
|
|
14
14
|
import { UpdateTransactionStore } from "./update-transaction.js";
|
|
15
15
|
export const PRODUCT_PACKAGE = PRODUCT_TEXT.packageName;
|
|
16
16
|
const UPDATE_DIST_TAGS = { stable: "latest", next: "next" };
|
|
17
|
-
/**
|
|
18
|
-
* What each channel is called when A1 says it out loud. The internal name stays
|
|
19
|
-
* `stable` because that is what the channel is, but what a reader is moving to is
|
|
20
|
-
* a release, and that is the word the repository, its tags, and its GitHub
|
|
21
|
-
* releases all use.
|
|
22
|
-
*/
|
|
23
|
-
const UPDATE_CHANNEL_LABELS = { stable: "release", next: "develop" };
|
|
24
17
|
const defaultFileSystem = {
|
|
25
18
|
async readFile(path) { return await readFile(path, "utf8"); },
|
|
26
19
|
realpath,
|
|
@@ -103,13 +96,10 @@ export function createUpdateLifecycleCoordinator(environment = process.env, file
|
|
|
103
96
|
await removeEndpointArtifacts(owner.paths.endpointMetadataPath, owner.paths.endpoint);
|
|
104
97
|
return { priorActiveVersion };
|
|
105
98
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
output.stdout(`${PRODUCT_TEXT.commandName} update: leaving ${running === 1 ? "one session" : `${running} sessions`} running on ${endpoint.releaseId}\n`);
|
|
110
|
-
}
|
|
99
|
+
// Leaving sessions alone is the expected outcome, and saying so mid-update tears
|
|
100
|
+
// the progress bar; only ending a session (below) is worth interrupting it for.
|
|
101
|
+
if (plan === "leave-running")
|
|
111
102
|
return { priorActiveVersion };
|
|
112
|
-
}
|
|
113
103
|
// Say whose work is ending before it ends.
|
|
114
104
|
const live = endpoint.ownership.liveInstanceIds.length;
|
|
115
105
|
if (live > 0) {
|
|
@@ -348,7 +338,7 @@ export async function runSelfUpdate(options) {
|
|
|
348
338
|
const targetVersion = resolved.version;
|
|
349
339
|
// No full stop after a version: it already ends in a dot-separated identifier,
|
|
350
340
|
// and a trailing one reads as part of the version rather than as punctuation.
|
|
351
|
-
output.stdout(`${PRODUCT_TEXT.commandName} update
|
|
341
|
+
output.stdout(`${PRODUCT_TEXT.commandName} update: ${runningVersion} → ${targetVersion}\n`);
|
|
352
342
|
const progress = createUpdateProgress(output, options.progress ?? (options.output === undefined && process.stdout.isTTY === true));
|
|
353
343
|
const rootLookup = await measure("global-root", async () => await runNpm(runner, ["root", "--global"], true, output, "resolve npm's global package root"));
|
|
354
344
|
if (rootLookup.result === null)
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"platform": "darwin",
|
|
6
6
|
"architecture": "arm64",
|
|
7
7
|
"capability": "unsupported",
|
|
8
|
-
"builtAt": "2026-08-
|
|
8
|
+
"builtAt": "2026-08-25T16:05:21.345Z",
|
|
9
9
|
"artifact": {
|
|
10
10
|
"filename": "process-guardian",
|
|
11
11
|
"sha256": "7524bf568992517f50ed53196c861c5edeba0d7275633bb4735ab45bd5963a28",
|
|
@@ -5,11 +5,11 @@
|
|
|
5
5
|
"platform": "linux",
|
|
6
6
|
"architecture": "x64",
|
|
7
7
|
"capability": "supported",
|
|
8
|
-
"builtAt": "2026-08-
|
|
8
|
+
"builtAt": "2026-08-25T16:05:37.568Z",
|
|
9
9
|
"artifact": {
|
|
10
10
|
"filename": "process-guardian",
|
|
11
|
-
"sha256": "
|
|
12
|
-
"size":
|
|
11
|
+
"sha256": "29e22fe29de2828982bc67ef418c4adcaab1490281477b7bea592ec6fe621bcd",
|
|
12
|
+
"size": 415696
|
|
13
13
|
},
|
|
14
14
|
"provenance": {
|
|
15
15
|
"language": "Rust",
|
|
Binary file
|
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
"platform": "win32",
|
|
6
6
|
"architecture": "x64",
|
|
7
7
|
"capability": "supported",
|
|
8
|
-
"builtAt": "2026-08-
|
|
8
|
+
"builtAt": "2026-08-25T16:06:01.104Z",
|
|
9
9
|
"artifact": {
|
|
10
10
|
"filename": "process-guardian.exe",
|
|
11
|
-
"sha256": "
|
|
11
|
+
"sha256": "b6d74c0b5b0a9977001c9e9bf175ccda5676da8668575a092d621a12ccda74b6",
|
|
12
12
|
"size": 172544
|
|
13
13
|
},
|
|
14
14
|
"provenance": {
|
|
Binary file
|