@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.
Files changed (241) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +54 -234
  3. package/agents/apt-improver.md +99 -0
  4. package/agents/apt-planner.md +115 -10
  5. package/dist/__test-helpers/run-cmd.d.mts +4 -2
  6. package/dist/__test-helpers/run-cmd.d.mts.map +1 -1
  7. package/dist/__test-helpers/run-cmd.mjs +56 -15
  8. package/dist/__test-helpers/run-cmd.mjs.map +1 -1
  9. package/dist/cli/ci-watch/lock.d.mts +53 -0
  10. package/dist/cli/ci-watch/lock.d.mts.map +1 -0
  11. package/dist/cli/ci-watch/lock.mjs +172 -0
  12. package/dist/cli/ci-watch/lock.mjs.map +1 -0
  13. package/dist/cli/ci-watch/state.d.mts +36 -0
  14. package/dist/cli/ci-watch/state.d.mts.map +1 -0
  15. package/dist/cli/ci-watch/state.mjs +103 -0
  16. package/dist/cli/ci-watch/state.mjs.map +1 -0
  17. package/dist/cli/ci-watch/stop-matrix.d.mts +58 -0
  18. package/dist/cli/ci-watch/stop-matrix.d.mts.map +1 -0
  19. package/dist/cli/ci-watch/stop-matrix.mjs +164 -0
  20. package/dist/cli/ci-watch/stop-matrix.mjs.map +1 -0
  21. package/dist/cli/cli-wrappers/ci-watch.d.mts +2 -0
  22. package/dist/cli/cli-wrappers/ci-watch.d.mts.map +1 -0
  23. package/dist/cli/cli-wrappers/ci-watch.mjs +9 -0
  24. package/dist/cli/cli-wrappers/ci-watch.mjs.map +1 -0
  25. package/dist/cli/commands/adr.d.mts +5 -0
  26. package/dist/cli/commands/adr.d.mts.map +1 -0
  27. package/dist/cli/commands/adr.mjs +228 -0
  28. package/dist/cli/commands/adr.mjs.map +1 -0
  29. package/dist/cli/commands/ci-watch.d.mts +7 -0
  30. package/dist/cli/commands/ci-watch.d.mts.map +1 -0
  31. package/dist/cli/commands/ci-watch.mjs +465 -0
  32. package/dist/cli/commands/ci-watch.mjs.map +1 -0
  33. package/dist/cli/commands/commit.d.mts.map +1 -1
  34. package/dist/cli/commands/commit.mjs +25 -8
  35. package/dist/cli/commands/commit.mjs.map +1 -1
  36. package/dist/cli/commands/context.d.mts +7 -0
  37. package/dist/cli/commands/context.d.mts.map +1 -0
  38. package/dist/cli/commands/context.mjs +224 -0
  39. package/dist/cli/commands/context.mjs.map +1 -0
  40. package/dist/cli/commands/event.d.mts.map +1 -1
  41. package/dist/cli/commands/event.mjs +125 -24
  42. package/dist/cli/commands/event.mjs.map +1 -1
  43. package/dist/cli/commands/host-detect.d.mts +1 -1
  44. package/dist/cli/commands/host-detect.d.mts.map +1 -1
  45. package/dist/cli/commands/host-detect.mjs +30 -3
  46. package/dist/cli/commands/host-detect.mjs.map +1 -1
  47. package/dist/cli/commands/modes.d.mts +13 -0
  48. package/dist/cli/commands/modes.d.mts.map +1 -0
  49. package/dist/cli/commands/modes.mjs +221 -0
  50. package/dist/cli/commands/modes.mjs.map +1 -0
  51. package/dist/cli/commands/route.mjs +1 -1
  52. package/dist/cli/commands/route.mjs.map +1 -1
  53. package/dist/cli/commands/task.d.mts.map +1 -1
  54. package/dist/cli/commands/task.mjs +393 -145
  55. package/dist/cli/commands/task.mjs.map +1 -1
  56. package/dist/cli/commands/tokens.d.mts.map +1 -1
  57. package/dist/cli/commands/tokens.mjs +150 -6
  58. package/dist/cli/commands/tokens.mjs.map +1 -1
  59. package/dist/cli/commands/triage.d.mts +8 -0
  60. package/dist/cli/commands/triage.d.mts.map +1 -0
  61. package/dist/cli/commands/triage.mjs +263 -0
  62. package/dist/cli/commands/triage.mjs.map +1 -0
  63. package/dist/cli/config/post-merge-sweep.d.mts +18 -0
  64. package/dist/cli/config/post-merge-sweep.d.mts.map +1 -1
  65. package/dist/cli/config/post-merge-sweep.mjs +48 -3
  66. package/dist/cli/config/post-merge-sweep.mjs.map +1 -1
  67. package/dist/cli/consistency/registry.d.mts +11 -0
  68. package/dist/cli/consistency/registry.d.mts.map +1 -1
  69. package/dist/cli/consistency/registry.mjs +13 -0
  70. package/dist/cli/consistency/registry.mjs.map +1 -1
  71. package/dist/cli/coordination/agent-identity.d.mts +9 -0
  72. package/dist/cli/coordination/agent-identity.d.mts.map +1 -1
  73. package/dist/cli/coordination/agent-identity.mjs +11 -0
  74. package/dist/cli/coordination/agent-identity.mjs.map +1 -1
  75. package/dist/cli/coordination/auto-emit-artifact-ready.d.mts +16 -0
  76. package/dist/cli/coordination/auto-emit-artifact-ready.d.mts.map +1 -0
  77. package/dist/cli/coordination/auto-emit-artifact-ready.mjs +88 -0
  78. package/dist/cli/coordination/auto-emit-artifact-ready.mjs.map +1 -0
  79. package/dist/cli/coordination/event-log.d.mts +27 -0
  80. package/dist/cli/coordination/event-log.d.mts.map +1 -1
  81. package/dist/cli/coordination/event-log.mjs +72 -2
  82. package/dist/cli/coordination/event-log.mjs.map +1 -1
  83. package/dist/cli/coordination/event-schema.d.mts +16 -0
  84. package/dist/cli/coordination/event-schema.d.mts.map +1 -0
  85. package/dist/cli/coordination/event-schema.mjs +161 -0
  86. package/dist/cli/coordination/event-schema.mjs.map +1 -0
  87. package/dist/cli/coordination/store.d.mts +6 -0
  88. package/dist/cli/coordination/store.d.mts.map +1 -1
  89. package/dist/cli/coordination/store.mjs +14 -0
  90. package/dist/cli/coordination/store.mjs.map +1 -1
  91. package/dist/cli/dispatch.d.mts.map +1 -1
  92. package/dist/cli/dispatch.mjs +14 -1
  93. package/dist/cli/dispatch.mjs.map +1 -1
  94. package/dist/cli/gate/registry.d.mts +11 -0
  95. package/dist/cli/gate/registry.d.mts.map +1 -1
  96. package/dist/cli/gate/registry.mjs +13 -0
  97. package/dist/cli/gate/registry.mjs.map +1 -1
  98. package/dist/cli/help.d.mts.map +1 -1
  99. package/dist/cli/help.mjs +3 -2
  100. package/dist/cli/help.mjs.map +1 -1
  101. package/dist/cli/host/detect.d.mts +1 -0
  102. package/dist/cli/host/detect.d.mts.map +1 -1
  103. package/dist/cli/host/detect.mjs +5 -0
  104. package/dist/cli/host/detect.mjs.map +1 -1
  105. package/dist/cli/roadmap/conductor-view.d.mts +13 -0
  106. package/dist/cli/roadmap/conductor-view.d.mts.map +1 -0
  107. package/dist/cli/roadmap/conductor-view.mjs +31 -0
  108. package/dist/cli/roadmap/conductor-view.mjs.map +1 -0
  109. package/dist/cli/route/envelope.d.mts +68 -4
  110. package/dist/cli/route/envelope.d.mts.map +1 -1
  111. package/dist/cli/route/envelope.mjs +140 -103
  112. package/dist/cli/route/envelope.mjs.map +1 -1
  113. package/dist/cli/route/skill-discover.d.mts +9 -0
  114. package/dist/cli/route/skill-discover.d.mts.map +1 -1
  115. package/dist/cli/route/skill-discover.mjs +13 -1
  116. package/dist/cli/route/skill-discover.mjs.map +1 -1
  117. package/dist/cli/skill-author/contract.d.mts +1 -0
  118. package/dist/cli/skill-author/contract.d.mts.map +1 -1
  119. package/dist/cli/skill-author/contract.mjs +7 -0
  120. package/dist/cli/skill-author/contract.mjs.map +1 -1
  121. package/dist/cli/task/ids.d.mts +7 -4
  122. package/dist/cli/task/ids.d.mts.map +1 -1
  123. package/dist/cli/task/ids.mjs +11 -10
  124. package/dist/cli/task/ids.mjs.map +1 -1
  125. package/dist/cli/task/worktree-cleanup.d.mts +9 -1
  126. package/dist/cli/task/worktree-cleanup.d.mts.map +1 -1
  127. package/dist/cli/task/worktree-cleanup.mjs +190 -9
  128. package/dist/cli/task/worktree-cleanup.mjs.map +1 -1
  129. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  130. package/dist/plugin/agents/apt-planner.md +1 -1
  131. package/dist/plugin/skills/apt/SKILL.md +111 -5
  132. package/dist/plugin/skills/apt-author-skill/SKILL.md +11 -0
  133. package/dist/plugin/skills/apt-bootstrap/SKILL.md +1 -0
  134. package/dist/plugin/skills/apt-classify/SKILL.md +1 -0
  135. package/dist/plugin/skills/apt-close-task/SKILL.md +1 -0
  136. package/dist/plugin/skills/apt-create-docs/SKILL.md +1 -0
  137. package/dist/plugin/skills/apt-debug/SKILL.md +2 -0
  138. package/dist/plugin/skills/apt-design/SKILL.md +2 -0
  139. package/dist/plugin/skills/apt-discuss/SKILL.md +2 -0
  140. package/dist/plugin/skills/apt-docs/SKILL.md +2 -0
  141. package/dist/plugin/skills/apt-execute/SKILL.md +1 -0
  142. package/dist/plugin/skills/apt-mockup/SKILL.md +2 -0
  143. package/dist/plugin/skills/apt-pause/SKILL.md +1 -0
  144. package/dist/plugin/skills/apt-personas/SKILL.md +1 -0
  145. package/dist/plugin/skills/apt-plan/SKILL.md +2 -0
  146. package/dist/plugin/skills/apt-pr-review/SKILL.md +1 -0
  147. package/dist/plugin/skills/apt-quick/SKILL.md +2 -0
  148. package/dist/plugin/skills/apt-resume/SKILL.md +1 -0
  149. package/dist/plugin/skills/apt-review/SKILL.md +1 -0
  150. package/dist/plugin/skills/apt-roadmap/SKILL.md +1 -0
  151. package/dist/plugin/skills/apt-roundtable/SKILL.md +2 -0
  152. package/dist/plugin/skills/apt-run/SKILL.md +1 -0
  153. package/dist/plugin/skills/apt-scan/SKILL.md +1 -0
  154. package/dist/plugin/skills/apt-setup/SKILL.md +1 -0
  155. package/dist/plugin/skills/apt-ship/SKILL.md +6 -5
  156. package/dist/plugin/skills/apt-stress-test/SKILL.md +1 -0
  157. package/dist/plugin/skills/apt-terminal/SKILL.md +1 -0
  158. package/dist/plugin/skills/apt-update/SKILL.md +5 -0
  159. package/dist/plugin/skills/apt-verify/SKILL.md +1 -0
  160. package/dist/plugin/skills/apt-verify-proof/SKILL.md +1 -0
  161. package/dist/types/config.d.ts +85 -0
  162. package/dist/types/config.d.ts.map +1 -1
  163. package/package.json +9 -1
  164. package/prompts/coder.md +2 -0
  165. package/prompts/conductor-status-check.md +23 -0
  166. package/prompts/conductor-sub-agent.md +57 -0
  167. package/prompts/conductor-system.md +172 -0
  168. package/prompts/planner.md +12 -0
  169. package/prompts/spec_writer.md +9 -0
  170. package/skills/apt/SKILL.md +1 -0
  171. package/skills/apt-close-task/SKILL.md +32 -1
  172. package/skills/apt-debug/SKILL.md +39 -6
  173. package/skills/apt-debug/appendices/diagnose-discipline.md +119 -0
  174. package/skills/apt-diagram/SKILL.md +342 -0
  175. package/skills/apt-diagram/appendices/design-discipline.md +97 -0
  176. package/skills/apt-discuss/SKILL.md +25 -0
  177. package/skills/apt-discuss/appendices/grill-discipline.md +104 -0
  178. package/skills/apt-discuss/appendices/zoom-out-helper.md +79 -0
  179. package/skills/apt-execute/SKILL.md +48 -5
  180. package/skills/apt-execute/appendices/tdd-mode.md +107 -0
  181. package/skills/apt-improve/DEEPENING.md +84 -0
  182. package/skills/apt-improve/INTERFACE-DESIGN.md +97 -0
  183. package/skills/apt-improve/LANGUAGE.md +104 -0
  184. package/skills/apt-improve/SKILL.md +141 -0
  185. package/skills/apt-plan/SKILL.md +159 -4
  186. package/skills/apt-plan/adapters/conductor.md +98 -0
  187. package/skills/apt-planner.md +42 -1
  188. package/skills/apt-pr-review/SKILL.md +46 -16
  189. package/skills/apt-prototype/LOGIC.md +109 -0
  190. package/skills/apt-prototype/SKILL.md +143 -0
  191. package/skills/apt-prototype/UI.md +90 -0
  192. package/skills/apt-quick/SKILL.md +30 -0
  193. package/skills/apt-review/SKILL.md +2 -0
  194. package/skills/apt-run/SKILL.md +32 -4
  195. package/skills/apt-setup/SKILL.md +130 -2
  196. package/skills/apt-ship/SKILL.md +63 -1
  197. package/skills/apt-spar/SKILL.md +290 -0
  198. package/skills/apt-triage/AGENT-BRIEF.md +84 -0
  199. package/skills/apt-triage/OUT-OF-SCOPE.md +75 -0
  200. package/skills/apt-triage/SKILL.md +169 -0
  201. package/skills/apt-verify/SKILL.md +3 -0
  202. package/skills/apt-verify-proof/SKILL.md +3 -0
  203. package/skills/apt-watch-ci/SKILL.md +163 -0
  204. package/skills/apt-zoom-out/SKILL.md +130 -0
  205. package/src/cli/ci-watch/lock.mjs +178 -0
  206. package/src/cli/ci-watch/state.mjs +103 -0
  207. package/src/cli/ci-watch/stop-matrix.mjs +181 -0
  208. package/src/cli/cli-wrappers/ci-watch.mjs +9 -0
  209. package/src/cli/commands/adr.mjs +243 -0
  210. package/src/cli/commands/ci-watch.mjs +503 -0
  211. package/src/cli/commands/commit.mjs +27 -8
  212. package/src/cli/commands/context.mjs +244 -0
  213. package/src/cli/commands/event.mjs +131 -24
  214. package/src/cli/commands/host-detect.mjs +33 -7
  215. package/src/cli/commands/modes.mjs +216 -0
  216. package/src/cli/commands/route.mjs +1 -1
  217. package/src/cli/commands/task.mjs +430 -170
  218. package/src/cli/commands/tokens.mjs +157 -6
  219. package/src/cli/commands/triage.mjs +286 -0
  220. package/src/cli/config/post-merge-sweep.mjs +49 -3
  221. package/src/cli/consistency/registry.mjs +14 -0
  222. package/src/cli/coordination/agent-identity.mjs +12 -0
  223. package/src/cli/coordination/auto-emit-artifact-ready.mjs +96 -0
  224. package/src/cli/coordination/event-log.mjs +73 -2
  225. package/src/cli/coordination/event-schema.d.ts +13 -0
  226. package/src/cli/coordination/event-schema.mjs +174 -0
  227. package/src/cli/coordination/store.mjs +14 -0
  228. package/src/cli/dispatch.mjs +15 -1
  229. package/src/cli/gate/registry.mjs +14 -0
  230. package/src/cli/help.mjs +3 -2
  231. package/src/cli/host/detect.mjs +5 -0
  232. package/src/cli/roadmap/conductor-view.d.ts +10 -0
  233. package/src/cli/roadmap/conductor-view.mjs +31 -0
  234. package/src/cli/route/envelope.mjs +140 -106
  235. package/src/cli/route/skill-discover.mjs +14 -1
  236. package/src/cli/skill-author/contract.mjs +7 -0
  237. package/src/cli/task/ids.mjs +15 -13
  238. package/src/cli/task/worktree-cleanup.mjs +191 -9
  239. package/templates/adr-format.md +56 -0
  240. package/templates/config.json +4 -0
  241. 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":"AAgEA;;;;;;GAMG;AACH;;;;WAmBC;AAED;;;;;GAKG;AACH,8EAQC;AAED;;;;;;;GAOG;AACH,wDAYC;AAED;;;;;;GAMG;AACH;;;EAWC;AAcD;;;;;;;GAOG;AACH,kFAiBC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH;;;;;;;;;;;;;;;;;;EAyEC"}
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. Single stderr line on actual sweep kick (not on
15
- * every dispatch).
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":"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"}
1
+ {"version":3,"file":"post-merge-sweep.mjs","sourceRoot":"","sources":["../../../src/cli/config/post-merge-sweep.mjs"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAC5F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC;;;;;;GAMG;AACH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC7B,OAAO;IACP,gBAAgB;IAChB,iBAAiB;IACjB,cAAc;IACd,kBAAkB;IAClB,aAAa;IACb,MAAM,EAAE,2DAA2D;IACnE,WAAW;IACX,QAAQ;IACR,IAAI;IACJ,IAAI;CACJ,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,OAAO,CAAA,CAAC,aAAa;AAEjD,SAAS,aAAa;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAA;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,mBAAmB,CAAA;IACpC,MAAM,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAClC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,WAAW;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;IAC7D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAA;IACvC,IAAI,KAAK,CAAA;IACT,IAAI,CAAC;QACJ,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IACrD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,EAAE,YAAY,CAAA;IAClC,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACtD,MAAM,UAAU,GAAG,EAAE,CAAA;IACrB,KAAK,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,SAAQ;QACzC,IAAI,CAAC,CAAC,eAAe,KAAK,uBAAuB;YAAE,SAAQ;QAC3D,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,SAAQ;QACvB,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC,CAAA;IAClF,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAA;AACnD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAW;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA;IAC7D,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,CAAA;IACpC,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;QAC1D,MAAM,MAAM,GAAG,KAAK,EAAE,iBAAiB,CAAA;QACvC,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACjD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,CAAA;IACT,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAQ,EAAE,UAAU,GAAG,aAAa,EAAE;IACtE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAA;IACvC,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;QAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,GAAG,UAAU,CAAA;IAC5C,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAA;IACb,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,QAAQ;IACvC,IAAI,CAAC;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;QAClC,IAAI,CAAC;YACJ,SAAS,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;QAChD,CAAC;gBAAS,CAAC;YACV,SAAS,CAAC,EAAE,CAAC,CAAA;QACd,CAAC;QACD,OAAO,IAAI,CAAA;IACZ,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAA;IACb,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,UAAU,EAAE,GAAG;IAC7C,MAAM,IAAI,GAAG,EAAE,CAAA;IACf,MAAM,QAAQ,GAAG,EAAE,CAAA;IACnB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,aAAa,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QACpB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACb,CAAC;IACF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAA;AAC1B,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB;IAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;IACpD,8CAA8C;IAC9C,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAA;AAC/D,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAW,EAAE,OAAO,GAAG,EAAE;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAA;IACnD,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,CAAC,EAAE;YACvE,GAAG,EAAE,WAAW;YAChB,GAAG,EAAE;gBACJ,GAAG,OAAO,CAAC,GAAG;gBACd,wBAAwB,EAAE,GAAG;aAC7B;YACD,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,QAAQ;SACf,CAAC,CAAA;QACF,KAAK,CAAC,KAAK,EAAE,CAAA;QACb,OAAO,KAAK,CAAC,GAAG,IAAI,IAAI,CAAA;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAA;IACZ,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,4BAA4B,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE;IAC9E,IAAI,CAAC;QACJ,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;QAC/C,CAAC;QACD,oEAAoE;QACpE,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;YAClD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAA;QAC7D,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjD,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;QACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAA;QACnD,CAAC;QAED,gEAAgE;QAChE,mEAAmE;QACnE,oEAAoE;QACpE,mEAAmE;QACnE,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAA;QACxD,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,6CAA6C,gBAAgB,kFAAkF,CAC/I,CAAA;YACF,CAAC;YAAC,MAAM,CAAC;gBACR,uCAAuC;YACxC,CAAC;QACF,CAAC;QAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,UAAU,EAAE,CAAC;YACjB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;QACvF,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAA;QAC5D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,aAAa,EAAE,CAAA;QACxD,IAAI,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;QAC7C,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAA;QACxC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACN,MAAM,EAAE,KAAK;gBACb,MAAM,EAAE,qBAAqB;gBAC7B,QAAQ;aACR,CAAA;QACF,CAAC;QAED,kEAAkE;QAClE,mEAAmE;QACnE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;QACvD,CAAC;QAED,iEAAiE;QACjE,oEAAoE;QACpE,mEAAmE;QACnE,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO;YAC1B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QACzD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjD,CAAC;QAED,IAAI,CAAC;YACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,6BAA6B,IAAI,CAAC,MAAM,sHAAsH,CAC9J,CAAA;QACF,CAAC;QAAC,MAAM,CAAC;YACR,uCAAuC;QACxC,CAAC;QAED,OAAO;YACN,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,SAAS;YACjB,GAAG;YACH,eAAe,EAAE,IAAI,CAAC,MAAM;YAC5B,QAAQ;SACR,CAAA;IACF,CAAC;IAAC,MAAM,CAAC;QACR,mEAAmE;QACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IAC/C,CAAC;AACF,CAAC"}
@@ -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