@aperant/framework 0.6.4 → 0.6.6
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/CHANGELOG.md +38 -0
- package/README.md +54 -234
- package/agents/apt-improver.md +99 -0
- package/agents/apt-planner.md +115 -10
- package/dist/__test-helpers/run-cmd.d.mts +4 -2
- package/dist/__test-helpers/run-cmd.d.mts.map +1 -1
- package/dist/__test-helpers/run-cmd.mjs +56 -15
- package/dist/__test-helpers/run-cmd.mjs.map +1 -1
- package/dist/cli/ci-watch/lock.d.mts +53 -0
- package/dist/cli/ci-watch/lock.d.mts.map +1 -0
- package/dist/cli/ci-watch/lock.mjs +172 -0
- package/dist/cli/ci-watch/lock.mjs.map +1 -0
- package/dist/cli/ci-watch/state.d.mts +36 -0
- package/dist/cli/ci-watch/state.d.mts.map +1 -0
- package/dist/cli/ci-watch/state.mjs +103 -0
- package/dist/cli/ci-watch/state.mjs.map +1 -0
- package/dist/cli/ci-watch/stop-matrix.d.mts +58 -0
- package/dist/cli/ci-watch/stop-matrix.d.mts.map +1 -0
- package/dist/cli/ci-watch/stop-matrix.mjs +164 -0
- package/dist/cli/ci-watch/stop-matrix.mjs.map +1 -0
- package/dist/cli/cli-wrappers/ci-watch.d.mts +2 -0
- package/dist/cli/cli-wrappers/ci-watch.d.mts.map +1 -0
- package/dist/cli/cli-wrappers/ci-watch.mjs +9 -0
- package/dist/cli/cli-wrappers/ci-watch.mjs.map +1 -0
- package/dist/cli/commands/adr.d.mts +5 -0
- package/dist/cli/commands/adr.d.mts.map +1 -0
- package/dist/cli/commands/adr.mjs +228 -0
- package/dist/cli/commands/adr.mjs.map +1 -0
- package/dist/cli/commands/ci-watch.d.mts +7 -0
- package/dist/cli/commands/ci-watch.d.mts.map +1 -0
- package/dist/cli/commands/ci-watch.mjs +465 -0
- package/dist/cli/commands/ci-watch.mjs.map +1 -0
- package/dist/cli/commands/commit.d.mts.map +1 -1
- package/dist/cli/commands/commit.mjs +25 -8
- package/dist/cli/commands/commit.mjs.map +1 -1
- package/dist/cli/commands/context.d.mts +7 -0
- package/dist/cli/commands/context.d.mts.map +1 -0
- package/dist/cli/commands/context.mjs +224 -0
- package/dist/cli/commands/context.mjs.map +1 -0
- package/dist/cli/commands/event.d.mts.map +1 -1
- package/dist/cli/commands/event.mjs +125 -24
- package/dist/cli/commands/event.mjs.map +1 -1
- package/dist/cli/commands/host-detect.d.mts +1 -1
- package/dist/cli/commands/host-detect.d.mts.map +1 -1
- package/dist/cli/commands/host-detect.mjs +30 -3
- package/dist/cli/commands/host-detect.mjs.map +1 -1
- package/dist/cli/commands/modes.d.mts +13 -0
- package/dist/cli/commands/modes.d.mts.map +1 -0
- package/dist/cli/commands/modes.mjs +221 -0
- package/dist/cli/commands/modes.mjs.map +1 -0
- package/dist/cli/commands/route.mjs +1 -1
- package/dist/cli/commands/route.mjs.map +1 -1
- package/dist/cli/commands/task.d.mts.map +1 -1
- package/dist/cli/commands/task.mjs +393 -145
- package/dist/cli/commands/task.mjs.map +1 -1
- package/dist/cli/commands/tokens.d.mts.map +1 -1
- package/dist/cli/commands/tokens.mjs +150 -6
- package/dist/cli/commands/tokens.mjs.map +1 -1
- package/dist/cli/commands/triage.d.mts +8 -0
- package/dist/cli/commands/triage.d.mts.map +1 -0
- package/dist/cli/commands/triage.mjs +263 -0
- package/dist/cli/commands/triage.mjs.map +1 -0
- package/dist/cli/config/post-merge-sweep.d.mts +18 -0
- package/dist/cli/config/post-merge-sweep.d.mts.map +1 -1
- package/dist/cli/config/post-merge-sweep.mjs +48 -3
- package/dist/cli/config/post-merge-sweep.mjs.map +1 -1
- package/dist/cli/consistency/registry.d.mts +11 -0
- package/dist/cli/consistency/registry.d.mts.map +1 -1
- package/dist/cli/consistency/registry.mjs +13 -0
- package/dist/cli/consistency/registry.mjs.map +1 -1
- package/dist/cli/coordination/agent-identity.d.mts +9 -0
- package/dist/cli/coordination/agent-identity.d.mts.map +1 -1
- package/dist/cli/coordination/agent-identity.mjs +11 -0
- package/dist/cli/coordination/agent-identity.mjs.map +1 -1
- package/dist/cli/coordination/auto-emit-artifact-ready.d.mts +16 -0
- package/dist/cli/coordination/auto-emit-artifact-ready.d.mts.map +1 -0
- package/dist/cli/coordination/auto-emit-artifact-ready.mjs +88 -0
- package/dist/cli/coordination/auto-emit-artifact-ready.mjs.map +1 -0
- package/dist/cli/coordination/event-log.d.mts +27 -0
- package/dist/cli/coordination/event-log.d.mts.map +1 -1
- package/dist/cli/coordination/event-log.mjs +72 -2
- package/dist/cli/coordination/event-log.mjs.map +1 -1
- package/dist/cli/coordination/event-schema.d.mts +16 -0
- package/dist/cli/coordination/event-schema.d.mts.map +1 -0
- package/dist/cli/coordination/event-schema.mjs +161 -0
- package/dist/cli/coordination/event-schema.mjs.map +1 -0
- package/dist/cli/coordination/store.d.mts +6 -0
- package/dist/cli/coordination/store.d.mts.map +1 -1
- package/dist/cli/coordination/store.mjs +14 -0
- package/dist/cli/coordination/store.mjs.map +1 -1
- package/dist/cli/dispatch.d.mts.map +1 -1
- package/dist/cli/dispatch.mjs +14 -1
- package/dist/cli/dispatch.mjs.map +1 -1
- package/dist/cli/gate/registry.d.mts +11 -0
- package/dist/cli/gate/registry.d.mts.map +1 -1
- package/dist/cli/gate/registry.mjs +13 -0
- package/dist/cli/gate/registry.mjs.map +1 -1
- package/dist/cli/help.d.mts.map +1 -1
- package/dist/cli/help.mjs +3 -2
- package/dist/cli/help.mjs.map +1 -1
- package/dist/cli/host/detect.d.mts +1 -0
- package/dist/cli/host/detect.d.mts.map +1 -1
- package/dist/cli/host/detect.mjs +5 -0
- package/dist/cli/host/detect.mjs.map +1 -1
- package/dist/cli/roadmap/conductor-view.d.mts +13 -0
- package/dist/cli/roadmap/conductor-view.d.mts.map +1 -0
- package/dist/cli/roadmap/conductor-view.mjs +31 -0
- package/dist/cli/roadmap/conductor-view.mjs.map +1 -0
- package/dist/cli/route/envelope.d.mts +68 -4
- package/dist/cli/route/envelope.d.mts.map +1 -1
- package/dist/cli/route/envelope.mjs +140 -103
- package/dist/cli/route/envelope.mjs.map +1 -1
- package/dist/cli/route/skill-discover.d.mts +9 -0
- package/dist/cli/route/skill-discover.d.mts.map +1 -1
- package/dist/cli/route/skill-discover.mjs +13 -1
- package/dist/cli/route/skill-discover.mjs.map +1 -1
- package/dist/cli/skill-author/contract.d.mts +1 -0
- package/dist/cli/skill-author/contract.d.mts.map +1 -1
- package/dist/cli/skill-author/contract.mjs +7 -0
- package/dist/cli/skill-author/contract.mjs.map +1 -1
- package/dist/cli/task/ids.d.mts +7 -4
- package/dist/cli/task/ids.d.mts.map +1 -1
- package/dist/cli/task/ids.mjs +11 -10
- package/dist/cli/task/ids.mjs.map +1 -1
- package/dist/cli/task/worktree-cleanup.d.mts +9 -1
- package/dist/cli/task/worktree-cleanup.d.mts.map +1 -1
- package/dist/cli/task/worktree-cleanup.mjs +190 -9
- package/dist/cli/task/worktree-cleanup.mjs.map +1 -1
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/agents/apt-planner.md +1 -1
- package/dist/plugin/skills/apt/SKILL.md +111 -5
- package/dist/plugin/skills/apt-author-skill/SKILL.md +11 -0
- package/dist/plugin/skills/apt-bootstrap/SKILL.md +1 -0
- package/dist/plugin/skills/apt-classify/SKILL.md +1 -0
- package/dist/plugin/skills/apt-close-task/SKILL.md +1 -0
- package/dist/plugin/skills/apt-create-docs/SKILL.md +1 -0
- package/dist/plugin/skills/apt-debug/SKILL.md +2 -0
- package/dist/plugin/skills/apt-design/SKILL.md +2 -0
- package/dist/plugin/skills/apt-discuss/SKILL.md +2 -0
- package/dist/plugin/skills/apt-docs/SKILL.md +2 -0
- package/dist/plugin/skills/apt-execute/SKILL.md +1 -0
- package/dist/plugin/skills/apt-mockup/SKILL.md +2 -0
- package/dist/plugin/skills/apt-pause/SKILL.md +1 -0
- package/dist/plugin/skills/apt-personas/SKILL.md +1 -0
- package/dist/plugin/skills/apt-plan/SKILL.md +2 -0
- package/dist/plugin/skills/apt-pr-review/SKILL.md +1 -0
- package/dist/plugin/skills/apt-quick/SKILL.md +2 -0
- package/dist/plugin/skills/apt-resume/SKILL.md +1 -0
- package/dist/plugin/skills/apt-review/SKILL.md +1 -0
- package/dist/plugin/skills/apt-roadmap/SKILL.md +1 -0
- package/dist/plugin/skills/apt-roundtable/SKILL.md +2 -0
- package/dist/plugin/skills/apt-run/SKILL.md +1 -0
- package/dist/plugin/skills/apt-scan/SKILL.md +1 -0
- package/dist/plugin/skills/apt-setup/SKILL.md +1 -0
- package/dist/plugin/skills/apt-ship/SKILL.md +6 -5
- package/dist/plugin/skills/apt-stress-test/SKILL.md +1 -0
- package/dist/plugin/skills/apt-terminal/SKILL.md +1 -0
- package/dist/plugin/skills/apt-update/SKILL.md +5 -0
- package/dist/plugin/skills/apt-verify/SKILL.md +1 -0
- package/dist/plugin/skills/apt-verify-proof/SKILL.md +1 -0
- package/dist/types/config.d.ts +85 -0
- package/dist/types/config.d.ts.map +1 -1
- package/package.json +9 -1
- package/prompts/coder.md +2 -0
- package/prompts/conductor-status-check.md +23 -0
- package/prompts/conductor-sub-agent.md +57 -0
- package/prompts/conductor-system.md +172 -0
- package/prompts/planner.md +12 -0
- package/prompts/spec_writer.md +9 -0
- package/skills/apt/SKILL.md +1 -0
- package/skills/apt-close-task/SKILL.md +32 -1
- package/skills/apt-debug/SKILL.md +39 -6
- package/skills/apt-debug/appendices/diagnose-discipline.md +119 -0
- package/skills/apt-diagram/SKILL.md +342 -0
- package/skills/apt-diagram/appendices/design-discipline.md +97 -0
- package/skills/apt-discuss/SKILL.md +25 -0
- package/skills/apt-discuss/appendices/grill-discipline.md +104 -0
- package/skills/apt-discuss/appendices/zoom-out-helper.md +79 -0
- package/skills/apt-execute/SKILL.md +48 -5
- package/skills/apt-execute/appendices/tdd-mode.md +107 -0
- package/skills/apt-improve/DEEPENING.md +84 -0
- package/skills/apt-improve/INTERFACE-DESIGN.md +97 -0
- package/skills/apt-improve/LANGUAGE.md +104 -0
- package/skills/apt-improve/SKILL.md +141 -0
- package/skills/apt-plan/SKILL.md +159 -4
- package/skills/apt-plan/adapters/conductor.md +98 -0
- package/skills/apt-planner.md +42 -1
- package/skills/apt-pr-review/SKILL.md +46 -16
- package/skills/apt-prototype/LOGIC.md +109 -0
- package/skills/apt-prototype/SKILL.md +143 -0
- package/skills/apt-prototype/UI.md +90 -0
- package/skills/apt-quick/SKILL.md +30 -0
- package/skills/apt-review/SKILL.md +2 -0
- package/skills/apt-run/SKILL.md +32 -4
- package/skills/apt-setup/SKILL.md +130 -2
- package/skills/apt-ship/SKILL.md +63 -1
- package/skills/apt-spar/SKILL.md +290 -0
- package/skills/apt-triage/AGENT-BRIEF.md +84 -0
- package/skills/apt-triage/OUT-OF-SCOPE.md +75 -0
- package/skills/apt-triage/SKILL.md +169 -0
- package/skills/apt-verify/SKILL.md +3 -0
- package/skills/apt-verify-proof/SKILL.md +3 -0
- package/skills/apt-watch-ci/SKILL.md +163 -0
- package/skills/apt-zoom-out/SKILL.md +130 -0
- package/src/cli/ci-watch/lock.mjs +178 -0
- package/src/cli/ci-watch/state.mjs +103 -0
- package/src/cli/ci-watch/stop-matrix.mjs +181 -0
- package/src/cli/cli-wrappers/ci-watch.mjs +9 -0
- package/src/cli/commands/adr.mjs +243 -0
- package/src/cli/commands/ci-watch.mjs +503 -0
- package/src/cli/commands/commit.mjs +27 -8
- package/src/cli/commands/context.mjs +244 -0
- package/src/cli/commands/event.mjs +131 -24
- package/src/cli/commands/host-detect.mjs +33 -7
- package/src/cli/commands/modes.mjs +216 -0
- package/src/cli/commands/route.mjs +1 -1
- package/src/cli/commands/task.mjs +430 -170
- package/src/cli/commands/tokens.mjs +157 -6
- package/src/cli/commands/triage.mjs +286 -0
- package/src/cli/config/post-merge-sweep.mjs +49 -3
- package/src/cli/consistency/registry.mjs +14 -0
- package/src/cli/coordination/agent-identity.mjs +12 -0
- package/src/cli/coordination/auto-emit-artifact-ready.mjs +96 -0
- package/src/cli/coordination/event-log.mjs +73 -2
- package/src/cli/coordination/event-schema.d.ts +13 -0
- package/src/cli/coordination/event-schema.mjs +174 -0
- package/src/cli/coordination/store.mjs +14 -0
- package/src/cli/dispatch.mjs +15 -1
- package/src/cli/gate/registry.mjs +14 -0
- package/src/cli/help.mjs +3 -2
- package/src/cli/host/detect.mjs +5 -0
- package/src/cli/roadmap/conductor-view.d.ts +10 -0
- package/src/cli/roadmap/conductor-view.mjs +31 -0
- package/src/cli/route/envelope.mjs +140 -106
- package/src/cli/route/skill-discover.mjs +14 -1
- package/src/cli/skill-author/contract.mjs +7 -0
- package/src/cli/task/ids.mjs +15 -13
- package/src/cli/task/worktree-cleanup.mjs +191 -9
- package/templates/adr-format.md +56 -0
- package/templates/config.json +4 -0
- package/templates/context-format.md +34 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commands/triage.mjs — `apt-tools triage` (Pocock adoption ST-10, AC9).
|
|
3
|
+
*
|
|
4
|
+
* 5-state triage state machine with extensible metadata for v2 OSS
|
|
5
|
+
* contributor primitives. Backend-configured: writes to
|
|
6
|
+
* `.aperant/tasks/{task-id}/triage.json` by default (local-only); other
|
|
7
|
+
* backends (github-issues, app-inbox) ship as not-implemented stubs.
|
|
8
|
+
*
|
|
9
|
+
* Subcommands:
|
|
10
|
+
* apt-tools triage init <project-dir> --id <task-id> [--category bug|enhancement] [--extra '{...}']
|
|
11
|
+
* apt-tools triage transition <project-dir> --id <task-id> --to <state> [--reason <text>] [--by user|agent]
|
|
12
|
+
* apt-tools triage get <project-dir> --id <task-id>
|
|
13
|
+
*
|
|
14
|
+
* States: needs-triage | needs-info | ready-for-agent | ready-for-human | wontfix
|
|
15
|
+
* Categories: bug | enhancement
|
|
16
|
+
*
|
|
17
|
+
* Fast Path Guarantee (ID-05): QUICK-routed tasks NEVER enter triage.
|
|
18
|
+
* The CLI does NOT enforce this directly — the apt:triage SKILL.md
|
|
19
|
+
* routes around QUICK tasks before invoking the CLI. The CLI is the
|
|
20
|
+
* mechanical state-machine surface; the routing is the skill body's job.
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
23
|
+
import { dirname, join, resolve } from 'node:path';
|
|
24
|
+
import { parseFlags } from '../util/args.mjs';
|
|
25
|
+
import { err, exitWith, ok } from '../util/result.mjs';
|
|
26
|
+
const STATES = ['needs-triage', 'needs-info', 'ready-for-agent', 'ready-for-human', 'wontfix'];
|
|
27
|
+
const CATEGORIES = ['bug', 'enhancement'];
|
|
28
|
+
// The 8 valid transitions per spec.md AC9. Anything else is rejected.
|
|
29
|
+
const VALID_TRANSITIONS = new Set([
|
|
30
|
+
'needs-triage->needs-info',
|
|
31
|
+
'needs-triage->ready-for-agent',
|
|
32
|
+
'needs-triage->ready-for-human',
|
|
33
|
+
'needs-triage->wontfix',
|
|
34
|
+
'needs-info->ready-for-agent',
|
|
35
|
+
'needs-info->ready-for-human',
|
|
36
|
+
'needs-info->wontfix',
|
|
37
|
+
'needs-info->needs-triage',
|
|
38
|
+
]);
|
|
39
|
+
const BACKENDS = new Set(['local-only', 'github-issues', 'app-inbox']);
|
|
40
|
+
// Two task-id shapes coexist:
|
|
41
|
+
// - Legacy date-first: YY-MM-DD_slug-XXXX (preserved so the ~159
|
|
42
|
+
// pre-slug-first tasks already on disk keep resolving).
|
|
43
|
+
// - Current slug-first: slug_YY-MM-DD with optional -N counter
|
|
44
|
+
// emitted by generateTaskId since the slug-first rename.
|
|
45
|
+
const TASK_ID_RE_LEGACY = /^[0-9]{2}-[0-9]{2}-[0-9]{2}_[a-z0-9-]+-[a-z0-9]{4}$/;
|
|
46
|
+
const TASK_ID_RE_SLUG_FIRST = /^[a-z0-9][a-z0-9-]*_[0-9]{2}-[0-9]{2}-[0-9]{2}(-\d+)?$/;
|
|
47
|
+
/**
|
|
48
|
+
* Read .aperant/config.json and extract task_tracking.backend.
|
|
49
|
+
* Defaults to 'local-only' if the file or the key is missing.
|
|
50
|
+
*
|
|
51
|
+
* @param {string} absProjectDir
|
|
52
|
+
* @returns {string}
|
|
53
|
+
*/
|
|
54
|
+
function readBackend(absProjectDir) {
|
|
55
|
+
const configPath = join(absProjectDir, '.aperant', 'config.json');
|
|
56
|
+
if (!existsSync(configPath))
|
|
57
|
+
return 'local-only';
|
|
58
|
+
try {
|
|
59
|
+
const parsed = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
60
|
+
const backend = parsed?.task_tracking?.backend;
|
|
61
|
+
if (typeof backend === 'string' && BACKENDS.has(backend))
|
|
62
|
+
return backend;
|
|
63
|
+
return 'local-only';
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return 'local-only';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Triage record file path.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} absProjectDir
|
|
73
|
+
* @param {string} taskId
|
|
74
|
+
*/
|
|
75
|
+
function triagePath(absProjectDir, taskId) {
|
|
76
|
+
return join(absProjectDir, '.aperant', 'tasks', taskId, 'triage.json');
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read the current triage record, or null if it doesn't exist.
|
|
80
|
+
*
|
|
81
|
+
* @param {string} path
|
|
82
|
+
*/
|
|
83
|
+
function readTriage(path) {
|
|
84
|
+
if (!existsSync(path))
|
|
85
|
+
return null;
|
|
86
|
+
try {
|
|
87
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Write a triage record.
|
|
95
|
+
*
|
|
96
|
+
* @param {string} path
|
|
97
|
+
* @param {object} record
|
|
98
|
+
*/
|
|
99
|
+
function writeTriage(path, record) {
|
|
100
|
+
const dir = dirname(path);
|
|
101
|
+
if (!existsSync(dir))
|
|
102
|
+
mkdirSync(dir, { recursive: true });
|
|
103
|
+
writeFileSync(path, `${JSON.stringify(record, null, 2)}\n`);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Apply the backend mirror step. local-only writes to disk; the other
|
|
107
|
+
* backends return a not-implemented envelope so callers can handle the
|
|
108
|
+
* stub gracefully.
|
|
109
|
+
*
|
|
110
|
+
* @param {string} backend
|
|
111
|
+
* @param {string} absProjectDir
|
|
112
|
+
* @param {string} taskId
|
|
113
|
+
* @param {object} record
|
|
114
|
+
* @returns {null | { status: 'not-implemented', backend: string, v2_issue: string }}
|
|
115
|
+
*/
|
|
116
|
+
function mirrorToBackend(backend, absProjectDir, taskId, record) {
|
|
117
|
+
if (backend === 'local-only') {
|
|
118
|
+
writeTriage(triagePath(absProjectDir, taskId), record);
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
// v1 stubs: github-issues and app-inbox return not-implemented.
|
|
122
|
+
return { status: 'not-implemented', backend, v2_issue: '#TBD' };
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Entry: `apt-tools triage <subcommand> <project-dir> [flags]`.
|
|
126
|
+
*/
|
|
127
|
+
export function cmdTriage(subcommand, projectDir, extraArgs) {
|
|
128
|
+
if (!subcommand || !['init', 'transition', 'get'].includes(subcommand)) {
|
|
129
|
+
return err('Usage: apt-tools triage <init|transition|get> <project-dir> --id <task-id> [...]', 1, { command: 'triage' });
|
|
130
|
+
}
|
|
131
|
+
if (!projectDir) {
|
|
132
|
+
return err('project-dir is required', 1, { command: `triage-${subcommand}` });
|
|
133
|
+
}
|
|
134
|
+
const absProjectDir = resolve(projectDir);
|
|
135
|
+
if (!existsSync(absProjectDir)) {
|
|
136
|
+
return err(`project directory not found: ${absProjectDir}`, 1, {
|
|
137
|
+
command: `triage-${subcommand}`,
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
const flags = parseFlags(extraArgs ?? []);
|
|
141
|
+
const taskId = flags.get('id');
|
|
142
|
+
if (typeof taskId !== 'string' || taskId.trim() === '') {
|
|
143
|
+
return err('--id <task-id> is required', 1, { command: `triage-${subcommand}` });
|
|
144
|
+
}
|
|
145
|
+
if (!TASK_ID_RE_LEGACY.test(taskId) && !TASK_ID_RE_SLUG_FIRST.test(taskId)) {
|
|
146
|
+
return err(`--id must match pattern <slug_YY-MM-DD[-N]> (e.g. fix-login_24-01-15) or legacy <YY-MM-DD_slug-XXXX>`, 1, { command: `triage-${subcommand}` });
|
|
147
|
+
}
|
|
148
|
+
const backend = readBackend(absProjectDir);
|
|
149
|
+
if (subcommand === 'init') {
|
|
150
|
+
// Optional --category, optional --extra (JSON string).
|
|
151
|
+
const category = flags.get('category');
|
|
152
|
+
if (category !== undefined && !CATEGORIES.includes(String(category))) {
|
|
153
|
+
return err(`--category must be one of: ${CATEGORIES.join(' | ')}`, 1, {
|
|
154
|
+
command: 'triage-init',
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
let extra = {};
|
|
158
|
+
const extraRaw = flags.get('extra');
|
|
159
|
+
if (typeof extraRaw === 'string' && extraRaw.length > 0) {
|
|
160
|
+
try {
|
|
161
|
+
const parsed = JSON.parse(extraRaw);
|
|
162
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
163
|
+
extra = parsed;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
return err('--extra must be a JSON object string', 1, { command: 'triage-init' });
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch (e) {
|
|
170
|
+
return err(`--extra is not valid JSON: ${e.message}`, 1, { command: 'triage-init' });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const existing = readTriage(triagePath(absProjectDir, taskId));
|
|
174
|
+
if (existing) {
|
|
175
|
+
return err(`triage record already exists for ${taskId}`, 1, {
|
|
176
|
+
command: 'triage-init',
|
|
177
|
+
current_state: existing.state,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const record = {
|
|
181
|
+
task_id: taskId,
|
|
182
|
+
state: 'needs-triage',
|
|
183
|
+
category: typeof category === 'string' ? category : null,
|
|
184
|
+
transitions: [],
|
|
185
|
+
extra,
|
|
186
|
+
};
|
|
187
|
+
const stub = mirrorToBackend(backend, absProjectDir, taskId, record);
|
|
188
|
+
if (stub)
|
|
189
|
+
return exitWith({ command: 'triage-init', ...stub }, 0);
|
|
190
|
+
return ok({ status: 'ok', command: 'triage-init', backend, record });
|
|
191
|
+
}
|
|
192
|
+
if (subcommand === 'transition') {
|
|
193
|
+
const toState = flags.get('to');
|
|
194
|
+
if (typeof toState !== 'string' || !STATES.includes(toState)) {
|
|
195
|
+
return err(`--to <state> is required (one of: ${STATES.join(' | ')})`, 1, {
|
|
196
|
+
command: 'triage-transition',
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// SEC-003: cap --reason to 1000 chars to prevent unbounded disk writes.
|
|
200
|
+
const rawReason = flags.get('reason');
|
|
201
|
+
const reason = typeof rawReason === 'string' ? rawReason.slice(0, 1000) : null;
|
|
202
|
+
const by = typeof flags.get('by') === 'string' && ['user', 'agent'].includes(String(flags.get('by')))
|
|
203
|
+
? String(flags.get('by'))
|
|
204
|
+
: 'agent';
|
|
205
|
+
const current = readTriage(triagePath(absProjectDir, taskId));
|
|
206
|
+
if (!current) {
|
|
207
|
+
return err(`no triage record for ${taskId} — run \`triage init\` first`, 1, {
|
|
208
|
+
command: 'triage-transition',
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
const from = current.state;
|
|
212
|
+
const transitionKey = `${from}->${toState}`;
|
|
213
|
+
if (!VALID_TRANSITIONS.has(transitionKey)) {
|
|
214
|
+
return exitWith({
|
|
215
|
+
status: 'rejected',
|
|
216
|
+
command: 'triage-transition',
|
|
217
|
+
reason: 'invalid-transition',
|
|
218
|
+
from,
|
|
219
|
+
to: toState,
|
|
220
|
+
valid_from_current: STATES.filter((s) => VALID_TRANSITIONS.has(`${from}->${s}`)),
|
|
221
|
+
}, 1);
|
|
222
|
+
}
|
|
223
|
+
const transition = {
|
|
224
|
+
from,
|
|
225
|
+
to: toState,
|
|
226
|
+
at: new Date().toISOString(),
|
|
227
|
+
by,
|
|
228
|
+
reason,
|
|
229
|
+
};
|
|
230
|
+
// SEC-002: Only carry known fields forward — do NOT spread the full
|
|
231
|
+
// disk-backed `current` object, which could contain arbitrary unknown
|
|
232
|
+
// keys from a hand-edited triage.json that would silently propagate.
|
|
233
|
+
const next = {
|
|
234
|
+
task_id: current.task_id,
|
|
235
|
+
state: toState,
|
|
236
|
+
category: current.category,
|
|
237
|
+
extra: current.extra ?? {},
|
|
238
|
+
transitions: [...(current.transitions || []), transition],
|
|
239
|
+
};
|
|
240
|
+
const stub = mirrorToBackend(backend, absProjectDir, taskId, next);
|
|
241
|
+
if (stub)
|
|
242
|
+
return exitWith({ command: 'triage-transition', ...stub }, 0);
|
|
243
|
+
return ok({
|
|
244
|
+
status: 'ok',
|
|
245
|
+
command: 'triage-transition',
|
|
246
|
+
backend,
|
|
247
|
+
transition,
|
|
248
|
+
record: next,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
// subcommand === 'get'
|
|
252
|
+
const path = triagePath(absProjectDir, taskId);
|
|
253
|
+
const record = readTriage(path);
|
|
254
|
+
if (!record) {
|
|
255
|
+
return exitWith({ status: 'not-found', command: 'triage-get', task_id: taskId, file: path }, 0);
|
|
256
|
+
}
|
|
257
|
+
return ok({ status: 'ok', command: 'triage-get', record, backend });
|
|
258
|
+
}
|
|
259
|
+
// Exported for testing.
|
|
260
|
+
export const _STATES = STATES;
|
|
261
|
+
export const _CATEGORIES = CATEGORIES;
|
|
262
|
+
export const _VALID_TRANSITIONS = VALID_TRANSITIONS;
|
|
263
|
+
//# sourceMappingURL=triage.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.mjs","sourceRoot":"","sources":["../../../src/cli/commands/triage.mjs"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,14 @@ export function readShippedCandidates(projectRoot: any): {
|
|
|
10
10
|
pr_url: any;
|
|
11
11
|
worktree_path: any;
|
|
12
12
|
}[] | null;
|
|
13
|
+
/**
|
|
14
|
+
* Pure preflight — returns the integer length of state.pending_narration[].
|
|
15
|
+
* Returns 0 on read/parse failure or when the ledger is absent (the banner
|
|
16
|
+
* is suppressed in that case).
|
|
17
|
+
*
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export function readPendingNarrationCount(projectRoot: any): number;
|
|
13
21
|
/**
|
|
14
22
|
* Returns true if the cooldown lock is "fresh" (last sweep too recent).
|
|
15
23
|
* Lock content is `{pid}:{ms-since-epoch}` but we only consult mtime.
|
|
@@ -66,6 +74,14 @@ export function spawnDetachedSweep(projectRoot: any, options?: {}): number | nul
|
|
|
66
74
|
export function maybeSweepShippedMergedTasks(projectRoot: any, command: any, options?: {}): {
|
|
67
75
|
kicked: boolean;
|
|
68
76
|
reason: string;
|
|
77
|
+
pending_narration?: undefined;
|
|
78
|
+
deferred?: undefined;
|
|
79
|
+
pid?: undefined;
|
|
80
|
+
candidate_count?: undefined;
|
|
81
|
+
} | {
|
|
82
|
+
kicked: boolean;
|
|
83
|
+
reason: string;
|
|
84
|
+
pending_narration: number;
|
|
69
85
|
deferred?: undefined;
|
|
70
86
|
pid?: undefined;
|
|
71
87
|
candidate_count?: undefined;
|
|
@@ -73,6 +89,7 @@ export function maybeSweepShippedMergedTasks(projectRoot: any, command: any, opt
|
|
|
73
89
|
kicked: boolean;
|
|
74
90
|
reason: string;
|
|
75
91
|
deferred: any[];
|
|
92
|
+
pending_narration?: undefined;
|
|
76
93
|
pid?: undefined;
|
|
77
94
|
candidate_count?: undefined;
|
|
78
95
|
} | {
|
|
@@ -81,5 +98,6 @@ export function maybeSweepShippedMergedTasks(projectRoot: any, command: any, opt
|
|
|
81
98
|
pid: any;
|
|
82
99
|
candidate_count: number;
|
|
83
100
|
deferred: any[];
|
|
101
|
+
pending_narration?: undefined;
|
|
84
102
|
};
|
|
85
103
|
//# sourceMappingURL=post-merge-sweep.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-merge-sweep.d.mts","sourceRoot":"","sources":["../../../src/cli/config/post-merge-sweep.mjs"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"post-merge-sweep.d.mts","sourceRoot":"","sources":["../../../src/cli/config/post-merge-sweep.mjs"],"names":[],"mappings":"AA4EA;;;;;;GAMG;AACH;;;;WAmBC;AAED;;;;;;GAMG;AACH,oEAUC;AAED;;;;;GAKG;AACH,8EAQC;AAED;;;;;;;GAOG;AACH,wDAYC;AAED;;;;;;GAMG;AACH;;;EAWC;AAcD;;;;;;;GAOG;AACH,kFAiBC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwFC"}
|
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
* post-merge-sweep.mjs — dispatch-time passive sweeper for stuck
|
|
3
3
|
* `shipped-pending-merge` tasks (C57 Piece 2).
|
|
4
4
|
*
|
|
5
|
+
* **Bookkeeping-only contract.** This hook runs the deterministic
|
|
6
|
+
* close half of the post-merge handoff: poll `gh pr view`, flip
|
|
7
|
+
* lifecycle_phase from `shipped-pending-merge` to `completed` via
|
|
8
|
+
* the same `task close` path, strip per-PR authorship overrides,
|
|
9
|
+
* and append a `pending_narration[]` ledger row. The LLM-side
|
|
10
|
+
* narration work (registry sync + ROADMAP prose) is explicitly
|
|
11
|
+
* out of scope here — the user drains the ledger via
|
|
12
|
+
* `/apt:close-task --narrate-only` (see packages/framework/skills/
|
|
13
|
+
* apt-close-task/SKILL.md §4) which is where those side effects belong.
|
|
14
|
+
*
|
|
5
15
|
* AI agents ship a PR and walk away. Tasks then rot in
|
|
6
16
|
* `shipped-pending-merge` because nothing automatic invokes
|
|
7
17
|
* `apt-tools task close-merged`. This hook runs on every `apt-tools`
|
|
@@ -11,8 +21,10 @@
|
|
|
11
21
|
* whose PRs have terminally landed.
|
|
12
22
|
*
|
|
13
23
|
* Non-blocking: never fails the command, never mutates exit code,
|
|
14
|
-
* never throws.
|
|
15
|
-
*
|
|
24
|
+
* never throws. Two stderr lines max per dispatch: the
|
|
25
|
+
* `Auto-sweeping N pending PR(s)` line on actual sweep kick, plus
|
|
26
|
+
* the `Post-merge narration pending` banner when the ledger has
|
|
27
|
+
* un-drained rows. Both lines are gated by `APT_SUPPRESS_MERGE_SWEEP=1`.
|
|
16
28
|
*
|
|
17
29
|
* Silenced by `APT_SUPPRESS_MERGE_SWEEP=1`. Skipped when
|
|
18
30
|
* `APT_INTERNAL_MERGE_SWEEP=1` is set in env (recursion guard for
|
|
@@ -91,6 +103,26 @@ export function readShippedCandidates(projectRoot) {
|
|
|
91
103
|
}
|
|
92
104
|
return candidates.length === 0 ? null : candidates;
|
|
93
105
|
}
|
|
106
|
+
/**
|
|
107
|
+
* Pure preflight — returns the integer length of state.pending_narration[].
|
|
108
|
+
* Returns 0 on read/parse failure or when the ledger is absent (the banner
|
|
109
|
+
* is suppressed in that case).
|
|
110
|
+
*
|
|
111
|
+
* @internal
|
|
112
|
+
*/
|
|
113
|
+
export function readPendingNarrationCount(projectRoot) {
|
|
114
|
+
const statePath = join(projectRoot, '.aperant', 'state.json');
|
|
115
|
+
if (!existsSync(statePath))
|
|
116
|
+
return 0;
|
|
117
|
+
try {
|
|
118
|
+
const state = JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
119
|
+
const ledger = state?.pending_narration;
|
|
120
|
+
return Array.isArray(ledger) ? ledger.length : 0;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
94
126
|
/**
|
|
95
127
|
* Returns true if the cooldown lock is "fresh" (last sweep too recent).
|
|
96
128
|
* Lock content is `{pid}:{ms-since-epoch}` but we only consult mtime.
|
|
@@ -222,9 +254,22 @@ export function maybeSweepShippedMergedTasks(projectRoot, command, options = {})
|
|
|
222
254
|
if (!existsSync(join(root, '.aperant'))) {
|
|
223
255
|
return { kicked: false, reason: 'no-aperant-dir' };
|
|
224
256
|
}
|
|
257
|
+
// Narration-pending banner — fires on EVERY dispatch cycle when
|
|
258
|
+
// the ledger has un-drained rows, regardless of whether a sweep is
|
|
259
|
+
// kicked below. Cheap read, no spawn, no cooldown. Same suppression
|
|
260
|
+
// env as the sweep banner (APT_SUPPRESS_MERGE_SWEEP=1 hides both).
|
|
261
|
+
const pendingNarration = readPendingNarrationCount(root);
|
|
262
|
+
if (pendingNarration > 0) {
|
|
263
|
+
try {
|
|
264
|
+
process.stderr.write(`[apt-tools] Post-merge narration pending (${pendingNarration}) — run /apt:close-task --narrate-only to refresh features registry + ROADMAP.\n`);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
/* stderr write failure is non-fatal */
|
|
268
|
+
}
|
|
269
|
+
}
|
|
225
270
|
const candidates = readShippedCandidates(root);
|
|
226
271
|
if (!candidates) {
|
|
227
|
-
return { kicked: false, reason: 'no-candidates' };
|
|
272
|
+
return { kicked: false, reason: 'no-candidates', pending_narration: pendingNarration };
|
|
228
273
|
}
|
|
229
274
|
const lockPath = join(root, '.aperant', '.merge-sweep.lock');
|
|
230
275
|
const cooldownMs = options.cooldownMs ?? getCooldownMs();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-merge-sweep.mjs","sourceRoot":"","sources":["../../../src/cli/config/post-merge-sweep.mjs"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"post-merge-sweep.mjs","sourceRoot":"","sources":["../../../src/cli/config/post-merge-sweep.mjs"],"names":[],"mappings":"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"}
|
|
@@ -24,4 +24,15 @@ export function getRule(id: any): any;
|
|
|
24
24
|
* @internal
|
|
25
25
|
*/
|
|
26
26
|
export function __resetRegistryForTests(): void;
|
|
27
|
+
/**
|
|
28
|
+
* Test-only helper — uniformly-named alias for the in-process cmd harness
|
|
29
|
+
* (run-cmd.mjs). Built-in rules self-register via the `rules/index.mjs`
|
|
30
|
+
* barrel at module-import time, which ESM evaluates exactly once per
|
|
31
|
+
* process — so the harness deliberately does NOT call this by default
|
|
32
|
+
* (clearing here would leave subsequent cmd invocations looking at an empty
|
|
33
|
+
* registry). Tests that need an empty registry import this name explicitly.
|
|
34
|
+
*
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
export function __resetCaches(): void;
|
|
27
38
|
//# sourceMappingURL=registry.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.mts","sourceRoot":"","sources":["../../../src/cli/consistency/registry.mjs"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH,6CAuBC;AAED;;;;;GAKG;AACH,iDAIC;AAED;;;;GAIG;AACH,sCAEC;AAED;;;;GAIG;AACH,gDAEC"}
|
|
1
|
+
{"version":3,"file":"registry.d.mts","sourceRoot":"","sources":["../../../src/cli/consistency/registry.mjs"],"names":[],"mappings":"AAwBA;;;;;GAKG;AACH,6CAuBC;AAED;;;;;GAKG;AACH,iDAIC;AAED;;;;GAIG;AACH,sCAEC;AAED;;;;GAIG;AACH,gDAEC;AAED;;;;;;;;;GASG;AACH,sCAEC"}
|
|
@@ -76,4 +76,17 @@ export function getRule(id) {
|
|
|
76
76
|
export function __resetRegistryForTests() {
|
|
77
77
|
registry.clear();
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Test-only helper — uniformly-named alias for the in-process cmd harness
|
|
81
|
+
* (run-cmd.mjs). Built-in rules self-register via the `rules/index.mjs`
|
|
82
|
+
* barrel at module-import time, which ESM evaluates exactly once per
|
|
83
|
+
* process — so the harness deliberately does NOT call this by default
|
|
84
|
+
* (clearing here would leave subsequent cmd invocations looking at an empty
|
|
85
|
+
* registry). Tests that need an empty registry import this name explicitly.
|
|
86
|
+
*
|
|
87
|
+
* @internal
|
|
88
|
+
*/
|
|
89
|
+
export function __resetCaches() {
|
|
90
|
+
registry.clear();
|
|
91
|
+
}
|
|
79
92
|
//# sourceMappingURL=registry.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.mjs","sourceRoot":"","sources":["../../../src/cli/consistency/registry.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;AAE1B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAI;IAChC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACxD,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACd,gBAAgB,IAAI,CAAC,EAAE,8CAA8C,IAAI,CAAC,QAAQ,GAAG,CACrF,CAAA;IACF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,qCAAqC,CAAC,CAAA;IAC9E,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,6BAA6B,CAAC,CAAA;IACtE,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,iCAAiC,CAAC,CAAA;IAC1E,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAC3B,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAA;IACtB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE;IACzB,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,CAAA;AACjB,CAAC"}
|
|
1
|
+
{"version":3,"file":"registry.mjs","sourceRoot":"","sources":["../../../src/cli/consistency/registry.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;AAE1B;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,IAAI;IAChC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACxD,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAA;IACpE,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACd,gBAAgB,IAAI,CAAC,EAAE,8CAA8C,IAAI,CAAC,QAAQ,GAAG,CACrF,CAAA;IACF,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,qCAAqC,CAAC,CAAA;IAC9E,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,6BAA6B,CAAC,CAAA;IACtE,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,EAAE,iCAAiC,CAAC,CAAA;IAC1E,CAAC;IACD,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;IAC3B,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAA;IACtB,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE;IACzB,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;AACxB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,CAAA;AACjB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,CAAA;AACjB,CAAC"}
|
|
@@ -19,4 +19,13 @@ export function getAgentIdentity(projectDir: any): any;
|
|
|
19
19
|
* @internal
|
|
20
20
|
*/
|
|
21
21
|
export function __resetAgentIdentityCacheForTests(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Test-only helper — uniformly-named alias for the in-process cmd harness
|
|
24
|
+
* (run-cmd.mjs), which imports `__resetCaches` from each cache host with a
|
|
25
|
+
* single consistent name. Behaviour is identical to
|
|
26
|
+
* `__resetAgentIdentityCacheForTests`.
|
|
27
|
+
*
|
|
28
|
+
* @internal
|
|
29
|
+
*/
|
|
30
|
+
export function __resetCaches(): void;
|
|
22
31
|
//# sourceMappingURL=agent-identity.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-identity.d.mts","sourceRoot":"","sources":["../../../src/cli/coordination/agent-identity.mjs"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,wDAGC;AAsCD;;;;;;GAMG;AACH,uDAWC;AAED;;;;;;GAMG;AACH,0DAEC"}
|
|
1
|
+
{"version":3,"file":"agent-identity.d.mts","sourceRoot":"","sources":["../../../src/cli/coordination/agent-identity.mjs"],"names":[],"mappings":"AA2BA;;;GAGG;AACH,wDAGC;AAsCD;;;;;;GAMG;AACH,uDAWC;AAED;;;;;;GAMG;AACH,0DAEC;AAED;;;;;;;GAOG;AACH,sCAEC"}
|
|
@@ -91,4 +91,15 @@ export function getAgentIdentity(projectDir) {
|
|
|
91
91
|
export function __resetAgentIdentityCacheForTests() {
|
|
92
92
|
cache.clear();
|
|
93
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Test-only helper — uniformly-named alias for the in-process cmd harness
|
|
96
|
+
* (run-cmd.mjs), which imports `__resetCaches` from each cache host with a
|
|
97
|
+
* single consistent name. Behaviour is identical to
|
|
98
|
+
* `__resetAgentIdentityCacheForTests`.
|
|
99
|
+
*
|
|
100
|
+
* @internal
|
|
101
|
+
*/
|
|
102
|
+
export function __resetCaches() {
|
|
103
|
+
cache.clear();
|
|
104
|
+
}
|
|
94
105
|
//# sourceMappingURL=agent-identity.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-identity.mjs","sourceRoot":"","sources":["../../../src/cli/coordination/agent-identity.mjs"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-identity.mjs","sourceRoot":"","sources":["../../../src/cli/coordination/agent-identity.mjs"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {{ files: string[], projectRoot: string }} input
|
|
3
|
+
* @returns {{ emitted: false, reason: string } | { emitted: true, envelope: object, file: string }}
|
|
4
|
+
*/
|
|
5
|
+
export function maybeAutoEmitPlanReady({ files, projectRoot }: {
|
|
6
|
+
files: string[];
|
|
7
|
+
projectRoot: string;
|
|
8
|
+
}): {
|
|
9
|
+
emitted: false;
|
|
10
|
+
reason: string;
|
|
11
|
+
} | {
|
|
12
|
+
emitted: true;
|
|
13
|
+
envelope: object;
|
|
14
|
+
file: string;
|
|
15
|
+
};
|
|
16
|
+
//# sourceMappingURL=auto-emit-artifact-ready.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-emit-artifact-ready.d.mts","sourceRoot":"","sources":["../../../src/cli/coordination/auto-emit-artifact-ready.mjs"],"names":[],"mappings":"AAwCA;;;GAGG;AACH,+DAHW;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAqDlG"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal
|
|
3
|
+
* auto-emit-artifact-ready.mjs — code-enforced plan-ready signal.
|
|
4
|
+
*
|
|
5
|
+
* Promotes the `artifact.ready{kind:'plan'}` emit from a markdown contract
|
|
6
|
+
* in `skills/apt-plan/adapters/conductor.md` to a framework-level
|
|
7
|
+
* postcondition of `apt-tools commit`. This closes the Conductor v2 gap
|
|
8
|
+
* exposed during live verification 2026-05-15: the planner's QUICK /
|
|
9
|
+
* SIMPLE track is hard-exempt from "new interaction discipline"
|
|
10
|
+
* (Pocock Fast Path Guarantee ID-05), so the markdown emit step was
|
|
11
|
+
* never executed for tasks router-classified as simple. The fleet
|
|
12
|
+
* never saw artifact.ready, the PlanReadyCard never auto-promoted.
|
|
13
|
+
*
|
|
14
|
+
* The fix lives in `framework` rather than the skill so:
|
|
15
|
+
* - it works for QUICK + STANDARD + DEEP + COMPLEX uniformly
|
|
16
|
+
* - it doesn't violate the Fast Path Guarantee (a passive log emit
|
|
17
|
+
* is not interaction discipline)
|
|
18
|
+
* - it's the same code path every CLI consumer (Claude Code, Gemini,
|
|
19
|
+
* OpenCode, Codex) traverses via `apt-tools commit`
|
|
20
|
+
*
|
|
21
|
+
* Conditions for emit (ALL must hold — otherwise no-op):
|
|
22
|
+
* 1. `APERANT_TERMINAL_ID` is set in process.env (Conductor PTY context).
|
|
23
|
+
* 2. The committed files include a path matching
|
|
24
|
+
* `.aperant/tasks/{task-id}/implementation_plan.json`.
|
|
25
|
+
*
|
|
26
|
+
* The emit re-uses the same `event-schema` validator and JSONL writer
|
|
27
|
+
* `commands/event.mjs` already uses, so the envelope structure stays
|
|
28
|
+
* byte-identical with manually-emitted ones.
|
|
29
|
+
*/
|
|
30
|
+
import { createHash } from 'node:crypto';
|
|
31
|
+
import { appendFileSync, mkdirSync, readFileSync } from 'node:fs';
|
|
32
|
+
import { hostname } from 'node:os';
|
|
33
|
+
import { join } from 'node:path';
|
|
34
|
+
import { validateConductorEvent } from './event-schema.mjs';
|
|
35
|
+
const PLAN_PATH_RE = /^(?:\.\/)?\.aperant\/tasks\/([^/]+)\/implementation_plan\.json$/;
|
|
36
|
+
let _incarnationCounter = 0;
|
|
37
|
+
/**
|
|
38
|
+
* @param {{ files: string[], projectRoot: string }} input
|
|
39
|
+
* @returns {{ emitted: false, reason: string } | { emitted: true, envelope: object, file: string }}
|
|
40
|
+
*/
|
|
41
|
+
export function maybeAutoEmitPlanReady({ files, projectRoot }) {
|
|
42
|
+
const terminalId = process.env.APERANT_TERMINAL_ID;
|
|
43
|
+
if (!terminalId)
|
|
44
|
+
return { emitted: false, reason: 'APERANT_TERMINAL_ID unset' };
|
|
45
|
+
const match = files.map((f) => f.replace(/\\/g, '/').match(PLAN_PATH_RE)).find((m) => m !== null);
|
|
46
|
+
if (!match)
|
|
47
|
+
return { emitted: false, reason: 'no implementation_plan.json in committed files' };
|
|
48
|
+
const taskId = match[1];
|
|
49
|
+
const planRelPath = `.aperant/tasks/${taskId}/implementation_plan.json`;
|
|
50
|
+
const absolutePath = join(projectRoot, planRelPath);
|
|
51
|
+
let hash;
|
|
52
|
+
try {
|
|
53
|
+
const body = readFileSync(absolutePath);
|
|
54
|
+
hash = createHash('sha256').update(body).digest('hex');
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return { emitted: false, reason: `plan file unreadable: ${(err && err.message) || err}` };
|
|
58
|
+
}
|
|
59
|
+
const data = {
|
|
60
|
+
kind: 'plan',
|
|
61
|
+
path: planRelPath,
|
|
62
|
+
hash,
|
|
63
|
+
request_id: `plan-${taskId}-${Date.now()}`,
|
|
64
|
+
task_id: taskId,
|
|
65
|
+
terminal_id: terminalId,
|
|
66
|
+
};
|
|
67
|
+
const validation = validateConductorEvent('artifact.ready', data);
|
|
68
|
+
if (!validation.ok) {
|
|
69
|
+
return { emitted: false, reason: `schema violation: ${validation.error}` };
|
|
70
|
+
}
|
|
71
|
+
const envelope = {
|
|
72
|
+
t: new Date().toISOString(),
|
|
73
|
+
agent: `${hostname()}-${process.pid}`,
|
|
74
|
+
pid: process.pid,
|
|
75
|
+
hostname: hostname(),
|
|
76
|
+
incarnation: ++_incarnationCounter,
|
|
77
|
+
op: 'artifact.ready',
|
|
78
|
+
task: taskId,
|
|
79
|
+
data,
|
|
80
|
+
};
|
|
81
|
+
const eventsDir = join(projectRoot, '.aperant', 'events');
|
|
82
|
+
mkdirSync(eventsDir, { recursive: true });
|
|
83
|
+
const dayFile = `${new Date().toISOString().slice(0, 10)}.jsonl`;
|
|
84
|
+
const fullPath = join(eventsDir, dayFile);
|
|
85
|
+
appendFileSync(fullPath, `${JSON.stringify(envelope)}\n`, 'utf-8');
|
|
86
|
+
return { emitted: true, envelope, file: dayFile };
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=auto-emit-artifact-ready.mjs.map
|