@joenandez/academy 0.4.0-rc.1 → 0.4.0
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/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +24 -0
- package/README.md +8 -4
- package/docs/integration-guide.md +16 -0
- package/hooks/sync_memory.mjs +3 -1
- package/package.json +1 -1
- package/scripts/cli/run.mjs +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,30 @@
|
|
|
3
3
|
This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
The heading at the top of this file is the version in `package.json`.
|
|
5
5
|
|
|
6
|
+
## 0.4.0 — 2026-09-02
|
|
7
|
+
|
|
8
|
+
First stable release.
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **Stable registry channel.** `npm install -g @joenandez/academy` installs
|
|
13
|
+
the finished 0.4.0 release. Release checks can validate an explicit new
|
|
14
|
+
target while the previous candidate tag remains.
|
|
15
|
+
- **Published guidance.** The README documents stable registry installation
|
|
16
|
+
and the enforced `threads.md` budget.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **Memory bridge opt-in.** The observation bridge copies client observations
|
|
21
|
+
only when `ACADEMY_MEMORY_BRIDGE=1`. Session tracking and pending
|
|
22
|
+
consolidation remain active when the bridge is off.
|
|
23
|
+
- **Bare-run scheduler stability.** A bare run leaves the saved runtime and
|
|
24
|
+
the existing nightly registration unchanged. An explicit runtime flag is
|
|
25
|
+
the only run action that changes them.
|
|
26
|
+
- **Lifecycle recovery guidance.** The integration guide explains that an
|
|
27
|
+
archive or delete change can complete before an event-log failure. It tells
|
|
28
|
+
clients to recover with `list --json`.
|
|
29
|
+
|
|
6
30
|
## 0.4.0-rc.1 — 2026-08-31
|
|
7
31
|
|
|
8
32
|
First release candidate, and the first Academy artifact that can be installed
|
package/README.md
CHANGED
|
@@ -10,8 +10,8 @@ against whatever project you are in. Every command also answers JSON, so a
|
|
|
10
10
|
desktop app, a web service, or another CLI can render and manage agents without
|
|
11
11
|
reading Academy's source.
|
|
12
12
|
|
|
13
|
-
**Status: `0.4.0
|
|
14
|
-
|
|
13
|
+
**Status: `0.4.0`, contract version 1.** The stable release is on npm.
|
|
14
|
+
Install it with `npm install -g @joenandez/academy`.
|
|
15
15
|
|
|
16
16
|
## Requirements
|
|
17
17
|
|
|
@@ -26,6 +26,10 @@ yet. Install it from a checkout, as below.
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
+
# Stable release install
|
|
30
|
+
npm install -g @joenandez/academy
|
|
31
|
+
|
|
32
|
+
# Contributor checkout
|
|
29
33
|
git clone https://github.com/joenandez/academy.git
|
|
30
34
|
cd academy
|
|
31
35
|
npm link # makes `academy` available globally
|
|
@@ -73,7 +77,7 @@ every `academy run` compile them into
|
|
|
73
77
|
| `knowledge.md` | Domain expertise, frameworks, patterns | ~1500–2500 |
|
|
74
78
|
| `goals.md` | Strategic objectives (cap 3) | ~150 |
|
|
75
79
|
| `priorities.md` | Weekly direction (3–5 visible) | ~250 |
|
|
76
|
-
| `threads.md` | Active work pursuits | ~
|
|
80
|
+
| `threads.md` | Active work pursuits | ~1750 |
|
|
77
81
|
| `notes.md` | Micro-steering staging area | ~500 |
|
|
78
82
|
| `dailys.md` | Last 7 working days | ~1000 |
|
|
79
83
|
|
|
@@ -133,7 +137,7 @@ The shape in one line: success is JSON on stdout with exit 0, failure is JSON on
|
|
|
133
137
|
stderr with exit 1, and exit status is 0 if and only if `ok` is true.
|
|
134
138
|
|
|
135
139
|
```json
|
|
136
|
-
{ "contract_version": 1, "ok": true, "command": "doctor", "version": "0.4.0
|
|
140
|
+
{ "contract_version": 1, "ok": true, "command": "doctor", "version": "0.4.0" }
|
|
137
141
|
```
|
|
138
142
|
|
|
139
143
|
Academy ships a conformance suite for client authors. It imports no Academy
|
|
@@ -588,6 +588,12 @@ Every published command except `unarchive` answers `agent_archived` for it — i
|
|
|
588
588
|
is never reported as missing, because a client told an archived specialist does
|
|
589
589
|
not exist would offer to hire a replacement for somebody who is still there.
|
|
590
590
|
|
|
591
|
+
**Committed-mutation failure.** Academy moves the directory before it appends
|
|
592
|
+
the lifecycle event. If `archive --json` answers `log_corrupt` or
|
|
593
|
+
`internal_error`, the move can already have landed. Recover with one
|
|
594
|
+
`academy list --json` call and replace the client roster and watermark from that
|
|
595
|
+
response.
|
|
596
|
+
|
|
591
597
|
Errors: `invalid_name`, `agent_not_found`, `agent_archived`,
|
|
592
598
|
`not_academy_owned`, `agent_exists`, `unsafe_agent_path`,
|
|
593
599
|
`runtime_unavailable`, `unschedule_failed`, `log_corrupt`, `lock_timeout`.
|
|
@@ -635,6 +641,12 @@ agent that no longer exists. If it cannot be put back because the slot has been
|
|
|
635
641
|
refilled, the answer is `unschedule_failed_restore_blocked` and the `error`
|
|
636
642
|
object names the `quarantine` path an operator must recover by hand.
|
|
637
643
|
|
|
644
|
+
**Committed-mutation failure.** Academy removes the quarantined directory before
|
|
645
|
+
it appends the lifecycle event. If `delete --json` answers `log_corrupt` or
|
|
646
|
+
`internal_error`, the removal can already have landed. Recover with one
|
|
647
|
+
`academy list --json` call and replace the client roster and watermark from that
|
|
648
|
+
response.
|
|
649
|
+
|
|
638
650
|
Errors: `invalid_name`, `agent_not_found`, `agent_archived`,
|
|
639
651
|
`not_academy_owned`, `unsafe_agent_path`, `runtime_unavailable`,
|
|
640
652
|
`unschedule_failed`, `unschedule_failed_restore_blocked`, `log_corrupt`,
|
|
@@ -723,6 +735,10 @@ code.
|
|
|
723
735
|
`internal_error` is the floor and can answer any command. The other fourteen
|
|
724
736
|
are raised only by the commands whose sections list them in §5.
|
|
725
737
|
|
|
738
|
+
For `archive` and `delete`, `log_corrupt` or `internal_error` can follow a
|
|
739
|
+
committed directory move or removal. Use `list --json` as the atomic roster and
|
|
740
|
+
watermark recovery call described in §8.
|
|
741
|
+
|
|
726
742
|
**Handling guidance.** `agent_not_found`, `agent_exists`, `invalid_name`,
|
|
727
743
|
`agent_archived` and `invalid_spec` are user-facing and should be rendered as
|
|
728
744
|
such. `unsafe_agent_path`, `runtime_unavailable`, `log_corrupt`, `lock_timeout`
|
package/hooks/sync_memory.mjs
CHANGED
|
@@ -19,7 +19,9 @@ export function syncAcademyMemory(payload, env = process.env) {
|
|
|
19
19
|
// agent still consolidates when the memory bridge is unavailable.
|
|
20
20
|
if (env.ACADEMY_NIGHTLY_RUN !== '1') markPendingConsolidation(memoryDir);
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
const synced =
|
|
23
|
+
env.ACADEMY_MEMORY_BRIDGE === '1' ? syncBridgeObservations(env, observationsDir, sessionId) : 0;
|
|
24
|
+
return { synced };
|
|
23
25
|
}
|
|
24
26
|
|
|
25
27
|
if (isMainModule(import.meta.url)) {
|
package/package.json
CHANGED
package/scripts/cli/run.mjs
CHANGED
|
@@ -81,8 +81,8 @@ function prepareAgentRun(name, requestedRuntime, passthrough) {
|
|
|
81
81
|
? { ...writeCodexProfile(dir, name), runtimeContextPath: codexRuntimeContextPath() }
|
|
82
82
|
: undefined;
|
|
83
83
|
if (codex) writeCodexHooks(codex.runtimeContextPath);
|
|
84
|
-
const nightlyTask = registerNightlyConsolidationTask(dir, name);
|
|
85
|
-
if (!nightlyTask.registered && process.env.ACADEMY_SKIP_NIGHTLY_TASK !== '1') {
|
|
84
|
+
const nightlyTask = requestedRuntime ? registerNightlyConsolidationTask(dir, name) : null;
|
|
85
|
+
if (nightlyTask && !nightlyTask.registered && process.env.ACADEMY_SKIP_NIGHTLY_TASK !== '1') {
|
|
86
86
|
console.error(
|
|
87
87
|
`Warning: nightly consolidation job "${nightlyTask.id}" not updated: ${nightlyTask.reason}`,
|
|
88
88
|
);
|