@aperant/framework 0.6.3 → 0.6.5

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 (244) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +64 -10
  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/artifacts/classification.d.mts.map +1 -1
  10. package/dist/cli/artifacts/classification.mjs +10 -0
  11. package/dist/cli/artifacts/classification.mjs.map +1 -1
  12. package/dist/cli/ci-watch/lock.d.mts +53 -0
  13. package/dist/cli/ci-watch/lock.d.mts.map +1 -0
  14. package/dist/cli/ci-watch/lock.mjs +172 -0
  15. package/dist/cli/ci-watch/lock.mjs.map +1 -0
  16. package/dist/cli/ci-watch/state.d.mts +36 -0
  17. package/dist/cli/ci-watch/state.d.mts.map +1 -0
  18. package/dist/cli/ci-watch/state.mjs +103 -0
  19. package/dist/cli/ci-watch/state.mjs.map +1 -0
  20. package/dist/cli/ci-watch/stop-matrix.d.mts +58 -0
  21. package/dist/cli/ci-watch/stop-matrix.d.mts.map +1 -0
  22. package/dist/cli/ci-watch/stop-matrix.mjs +164 -0
  23. package/dist/cli/ci-watch/stop-matrix.mjs.map +1 -0
  24. package/dist/cli/cli-wrappers/ci-watch.d.mts +2 -0
  25. package/dist/cli/cli-wrappers/ci-watch.d.mts.map +1 -0
  26. package/dist/cli/cli-wrappers/ci-watch.mjs +9 -0
  27. package/dist/cli/cli-wrappers/ci-watch.mjs.map +1 -0
  28. package/dist/cli/commands/adr.d.mts +5 -0
  29. package/dist/cli/commands/adr.d.mts.map +1 -0
  30. package/dist/cli/commands/adr.mjs +228 -0
  31. package/dist/cli/commands/adr.mjs.map +1 -0
  32. package/dist/cli/commands/ci-watch.d.mts +7 -0
  33. package/dist/cli/commands/ci-watch.d.mts.map +1 -0
  34. package/dist/cli/commands/ci-watch.mjs +465 -0
  35. package/dist/cli/commands/ci-watch.mjs.map +1 -0
  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 +59 -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/init.d.mts.map +1 -1
  48. package/dist/cli/commands/init.mjs +73 -5
  49. package/dist/cli/commands/init.mjs.map +1 -1
  50. package/dist/cli/commands/modes.d.mts +13 -0
  51. package/dist/cli/commands/modes.d.mts.map +1 -0
  52. package/dist/cli/commands/modes.mjs +220 -0
  53. package/dist/cli/commands/modes.mjs.map +1 -0
  54. package/dist/cli/commands/pr-review-audit-fixer.d.mts +41 -2
  55. package/dist/cli/commands/pr-review-audit-fixer.d.mts.map +1 -1
  56. package/dist/cli/commands/pr-review-audit-fixer.mjs +91 -14
  57. package/dist/cli/commands/pr-review-audit-fixer.mjs.map +1 -1
  58. package/dist/cli/commands/route.d.mts.map +1 -1
  59. package/dist/cli/commands/route.mjs +11 -2
  60. package/dist/cli/commands/route.mjs.map +1 -1
  61. package/dist/cli/commands/task.d.mts.map +1 -1
  62. package/dist/cli/commands/task.mjs +136 -6
  63. package/dist/cli/commands/task.mjs.map +1 -1
  64. package/dist/cli/commands/tokens.d.mts.map +1 -1
  65. package/dist/cli/commands/tokens.mjs +150 -6
  66. package/dist/cli/commands/tokens.mjs.map +1 -1
  67. package/dist/cli/commands/triage.d.mts +8 -0
  68. package/dist/cli/commands/triage.d.mts.map +1 -0
  69. package/dist/cli/commands/triage.mjs +259 -0
  70. package/dist/cli/commands/triage.mjs.map +1 -0
  71. package/dist/cli/config/post-merge-sweep.d.mts +18 -0
  72. package/dist/cli/config/post-merge-sweep.d.mts.map +1 -1
  73. package/dist/cli/config/post-merge-sweep.mjs +48 -3
  74. package/dist/cli/config/post-merge-sweep.mjs.map +1 -1
  75. package/dist/cli/consistency/registry.d.mts +11 -0
  76. package/dist/cli/consistency/registry.d.mts.map +1 -1
  77. package/dist/cli/consistency/registry.mjs +13 -0
  78. package/dist/cli/consistency/registry.mjs.map +1 -1
  79. package/dist/cli/coordination/agent-identity.d.mts +9 -0
  80. package/dist/cli/coordination/agent-identity.d.mts.map +1 -1
  81. package/dist/cli/coordination/agent-identity.mjs +11 -0
  82. package/dist/cli/coordination/agent-identity.mjs.map +1 -1
  83. package/dist/cli/coordination/event-log.d.mts +27 -0
  84. package/dist/cli/coordination/event-log.d.mts.map +1 -1
  85. package/dist/cli/coordination/event-log.mjs +72 -2
  86. package/dist/cli/coordination/event-log.mjs.map +1 -1
  87. package/dist/cli/design/frontmatter-schema.d.mts +3 -3
  88. package/dist/cli/design/frontmatter-schema.d.mts.map +1 -1
  89. package/dist/cli/design/frontmatter-schema.mjs +3 -1
  90. package/dist/cli/design/frontmatter-schema.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 +1 -0
  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/route/envelope.d.mts +68 -4
  106. package/dist/cli/route/envelope.d.mts.map +1 -1
  107. package/dist/cli/route/envelope.mjs +140 -103
  108. package/dist/cli/route/envelope.mjs.map +1 -1
  109. package/dist/cli/route/skill-discover.d.mts +11 -0
  110. package/dist/cli/route/skill-discover.d.mts.map +1 -1
  111. package/dist/cli/route/skill-discover.mjs +46 -1
  112. package/dist/cli/route/skill-discover.mjs.map +1 -1
  113. package/dist/cli/skill-author/contract.d.mts +20 -0
  114. package/dist/cli/skill-author/contract.d.mts.map +1 -1
  115. package/dist/cli/skill-author/contract.mjs +27 -0
  116. package/dist/cli/skill-author/contract.mjs.map +1 -1
  117. package/dist/cli/skill-author/skill-template.d.mts.map +1 -1
  118. package/dist/cli/skill-author/skill-template.mjs +4 -3
  119. package/dist/cli/skill-author/skill-template.mjs.map +1 -1
  120. package/dist/cli/task/worktree-cleanup.d.mts +9 -1
  121. package/dist/cli/task/worktree-cleanup.d.mts.map +1 -1
  122. package/dist/cli/task/worktree-cleanup.mjs +190 -9
  123. package/dist/cli/task/worktree-cleanup.mjs.map +1 -1
  124. package/dist/plugin/.claude-plugin/plugin.json +1 -1
  125. package/dist/plugin/agents/apt-planner.md +1 -1
  126. package/dist/plugin/skills/apt/SKILL.md +111 -5
  127. package/dist/plugin/skills/apt-author-skill/SKILL.md +11 -0
  128. package/dist/plugin/skills/apt-bootstrap/SKILL.md +1 -0
  129. package/dist/plugin/skills/apt-classify/SKILL.md +1 -0
  130. package/dist/plugin/skills/apt-close-task/SKILL.md +1 -0
  131. package/dist/plugin/skills/apt-create-docs/SKILL.md +1 -0
  132. package/dist/plugin/skills/apt-debug/SKILL.md +2 -0
  133. package/dist/plugin/skills/apt-design/SKILL.md +2 -0
  134. package/dist/plugin/skills/apt-discuss/SKILL.md +2 -0
  135. package/dist/plugin/skills/apt-docs/SKILL.md +2 -0
  136. package/dist/plugin/skills/apt-execute/SKILL.md +1 -0
  137. package/dist/plugin/skills/apt-mockup/SKILL.md +2 -0
  138. package/dist/plugin/skills/apt-pause/SKILL.md +1 -0
  139. package/dist/plugin/skills/apt-personas/SKILL.md +1 -0
  140. package/dist/plugin/skills/apt-plan/SKILL.md +2 -0
  141. package/dist/plugin/skills/apt-pr-review/SKILL.md +1 -0
  142. package/dist/plugin/skills/apt-quick/SKILL.md +2 -0
  143. package/dist/plugin/skills/apt-resume/SKILL.md +1 -0
  144. package/dist/plugin/skills/apt-review/SKILL.md +1 -0
  145. package/dist/plugin/skills/apt-roadmap/SKILL.md +1 -0
  146. package/dist/plugin/skills/apt-roundtable/SKILL.md +2 -0
  147. package/dist/plugin/skills/apt-run/SKILL.md +1 -0
  148. package/dist/plugin/skills/apt-scan/SKILL.md +1 -0
  149. package/dist/plugin/skills/apt-setup/SKILL.md +1 -0
  150. package/dist/plugin/skills/apt-ship/SKILL.md +6 -5
  151. package/dist/plugin/skills/apt-stress-test/SKILL.md +1 -0
  152. package/dist/plugin/skills/apt-terminal/SKILL.md +1 -0
  153. package/dist/plugin/skills/apt-update/SKILL.md +5 -0
  154. package/dist/plugin/skills/apt-verify/SKILL.md +1 -0
  155. package/dist/plugin/skills/apt-verify-proof/SKILL.md +1 -0
  156. package/dist/types/config.d.ts +85 -0
  157. package/dist/types/config.d.ts.map +1 -1
  158. package/package.json +125 -122
  159. package/prompts/coder.md +2 -0
  160. package/prompts/planner.md +12 -0
  161. package/prompts/spec_writer.md +9 -0
  162. package/skills/apt/SKILL.md +112 -5
  163. package/skills/apt-author-skill/SKILL.md +11 -0
  164. package/skills/apt-bootstrap/SKILL.md +1 -0
  165. package/skills/apt-classify/SKILL.md +1 -0
  166. package/skills/apt-close-task/SKILL.md +33 -1
  167. package/skills/apt-create-docs/SKILL.md +1 -0
  168. package/skills/apt-debug/SKILL.md +41 -6
  169. package/skills/apt-debug/appendices/diagnose-discipline.md +119 -0
  170. package/skills/apt-design/SKILL.md +2 -0
  171. package/skills/apt-diagram/SKILL.md +342 -0
  172. package/skills/apt-diagram/appendices/design-discipline.md +97 -0
  173. package/skills/apt-discuss/SKILL.md +27 -0
  174. package/skills/apt-discuss/appendices/grill-discipline.md +104 -0
  175. package/skills/apt-discuss/appendices/zoom-out-helper.md +79 -0
  176. package/skills/apt-docs/SKILL.md +2 -0
  177. package/skills/apt-execute/SKILL.md +49 -5
  178. package/skills/apt-execute/appendices/tdd-mode.md +107 -0
  179. package/skills/apt-improve/DEEPENING.md +84 -0
  180. package/skills/apt-improve/INTERFACE-DESIGN.md +97 -0
  181. package/skills/apt-improve/LANGUAGE.md +104 -0
  182. package/skills/apt-improve/SKILL.md +141 -0
  183. package/skills/apt-mockup/SKILL.md +2 -0
  184. package/skills/apt-pause/SKILL.md +1 -0
  185. package/skills/apt-personas/SKILL.md +1 -0
  186. package/skills/apt-plan/SKILL.md +149 -4
  187. package/skills/apt-planner.md +42 -1
  188. package/skills/apt-pr-review/SKILL.md +47 -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 +32 -0
  193. package/skills/apt-resume/SKILL.md +1 -0
  194. package/skills/apt-review/SKILL.md +3 -0
  195. package/skills/apt-roadmap/SKILL.md +1 -0
  196. package/skills/apt-roundtable/SKILL.md +2 -0
  197. package/skills/apt-run/SKILL.md +33 -4
  198. package/skills/apt-scan/SKILL.md +1 -0
  199. package/skills/apt-setup/SKILL.md +129 -2
  200. package/skills/apt-ship/SKILL.md +52 -4
  201. package/skills/apt-stress-test/SKILL.md +1 -0
  202. package/skills/apt-terminal/SKILL.md +1 -0
  203. package/skills/apt-triage/AGENT-BRIEF.md +84 -0
  204. package/skills/apt-triage/OUT-OF-SCOPE.md +75 -0
  205. package/skills/apt-triage/SKILL.md +169 -0
  206. package/skills/apt-update/SKILL.md +3 -0
  207. package/skills/apt-verify/SKILL.md +4 -0
  208. package/skills/apt-verify-proof/SKILL.md +4 -0
  209. package/skills/apt-watch-ci/SKILL.md +163 -0
  210. package/skills/apt-zoom-out/SKILL.md +130 -0
  211. package/src/cli/artifacts/classification.mjs +10 -0
  212. package/src/cli/ci-watch/lock.mjs +178 -0
  213. package/src/cli/ci-watch/state.mjs +103 -0
  214. package/src/cli/ci-watch/stop-matrix.mjs +181 -0
  215. package/src/cli/cli-wrappers/ci-watch.mjs +9 -0
  216. package/src/cli/commands/adr.mjs +243 -0
  217. package/src/cli/commands/ci-watch.mjs +503 -0
  218. package/src/cli/commands/context.mjs +244 -0
  219. package/src/cli/commands/event.mjs +63 -24
  220. package/src/cli/commands/host-detect.mjs +33 -7
  221. package/src/cli/commands/init.mjs +83 -5
  222. package/src/cli/commands/modes.mjs +215 -0
  223. package/src/cli/commands/pr-review-audit-fixer.mjs +95 -16
  224. package/src/cli/commands/route.mjs +11 -2
  225. package/src/cli/commands/task.mjs +152 -18
  226. package/src/cli/commands/tokens.mjs +157 -6
  227. package/src/cli/commands/triage.mjs +277 -0
  228. package/src/cli/config/post-merge-sweep.mjs +49 -3
  229. package/src/cli/consistency/registry.mjs +14 -0
  230. package/src/cli/coordination/agent-identity.mjs +12 -0
  231. package/src/cli/coordination/event-log.mjs +73 -2
  232. package/src/cli/design/frontmatter-schema.mjs +3 -1
  233. package/src/cli/dispatch.mjs +15 -1
  234. package/src/cli/gate/registry.mjs +14 -0
  235. package/src/cli/help.mjs +1 -0
  236. package/src/cli/host/detect.mjs +5 -0
  237. package/src/cli/route/envelope.mjs +140 -106
  238. package/src/cli/route/skill-discover.mjs +46 -1
  239. package/src/cli/skill-author/contract.mjs +29 -0
  240. package/src/cli/skill-author/skill-template.mjs +4 -3
  241. package/src/cli/task/worktree-cleanup.mjs +191 -9
  242. package/templates/adr-format.md +56 -0
  243. package/templates/config.json +4 -0
  244. package/templates/context-format.md +34 -0
@@ -0,0 +1,9 @@
1
+ /**
2
+ * cli-wrappers/ci-watch.mjs — Layer 2 wrapper for the ci-watch cmd.
3
+ *
4
+ * Today this is a passthrough — DISPATCH calls wrap(cmdCiWatch) directly.
5
+ * Re-exporting under cliCiWatch keeps the file-per-cmd structural seam
6
+ * (mirrors task.mjs / pr-review.mjs).
7
+ */
8
+ export { cmdCiWatch as cliCiWatch } from '../commands/ci-watch.mjs';
9
+ //# sourceMappingURL=ci-watch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-watch.mjs","sourceRoot":"","sources":["../../../src/cli/cli-wrappers/ci-watch.mjs"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,IAAI,UAAU,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * CLI entry: `apt-tools adr <subcommand> <project-dir> [flags]`.
3
+ */
4
+ export function cmdAdr(subcommand: any, projectDir: any, extraArgs: any): import("../util/result.mjs").CommandResult;
5
+ //# sourceMappingURL=adr.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/adr.mjs"],"names":[],"mappings":"AAmIA;;GAEG;AACH,qHA4GC"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * commands/adr.mjs — `apt-tools adr write` (Pocock adoption ST-6, AC5).
3
+ *
4
+ * Writes an ADR under `docs/adr/NNNN-slug.md` ONLY when all three Nygard
5
+ * gates pass: hard-to-reverse AND surprising-without-context AND
6
+ * real-trade-off. When any gate fails, the writer returns a `filtered`
7
+ * envelope and writes nothing — the decision stays in
8
+ * `.aperant/context/notes/{task-id}.md` instead.
9
+ *
10
+ * CLI:
11
+ * apt-tools adr write <project-dir>
12
+ * --title <slug>
13
+ * --hard-to-reverse <true|false>
14
+ * --surprising-without-context <true|false>
15
+ * --real-trade-off <true|false>
16
+ * --decision <text>
17
+ * --consequences <text>
18
+ * [--context <text>]
19
+ * [--status Proposed|Accepted|Deprecated|Superseded]
20
+ *
21
+ * Output: JSON envelope.
22
+ * On filter: { status: 'filtered', failed_gates: string[], reason: 'three-gate-filter' }
23
+ * On write: { status: 'ok', command: 'adr-write', file: <abs path>, number: N, slug: '...' }
24
+ */
25
+ import { existsSync, mkdirSync, readdirSync, writeFileSync } from 'node:fs';
26
+ import { join, resolve } from 'node:path';
27
+ import { parseFlags } from '../util/args.mjs';
28
+ import { err, exitWith, ok } from '../util/result.mjs';
29
+ /**
30
+ * Parse a flag value as a strict boolean. Returns null on unrecognized form
31
+ * so callers can distinguish "missing" from "false".
32
+ *
33
+ * @param {unknown} v
34
+ * @returns {boolean|null}
35
+ */
36
+ function parseBool(v) {
37
+ if (v === true)
38
+ return true;
39
+ if (typeof v !== 'string')
40
+ return null;
41
+ const low = v.toLowerCase();
42
+ if (low === 'true' || low === 'yes' || low === '1')
43
+ return true;
44
+ if (low === 'false' || low === 'no' || low === '0')
45
+ return false;
46
+ return null;
47
+ }
48
+ /**
49
+ * Slugify a title for the filename (NNNN-slug.md).
50
+ *
51
+ * @param {string} title
52
+ */
53
+ function slugify(title) {
54
+ return title
55
+ .toLowerCase()
56
+ .trim()
57
+ .replace(/[^\w\s-]/g, '')
58
+ .replace(/\s+/g, '-')
59
+ .replace(/-+/g, '-')
60
+ .replace(/^-|-$/g, '');
61
+ }
62
+ /**
63
+ * Find the next ADR sequence number by scanning `docs/adr/`.
64
+ *
65
+ * @param {string} adrDir
66
+ * @returns {number}
67
+ */
68
+ function nextAdrNumber(adrDir) {
69
+ if (!existsSync(adrDir))
70
+ return 1;
71
+ const entries = readdirSync(adrDir);
72
+ let max = 0;
73
+ for (const name of entries) {
74
+ const m = name.match(/^(\d{4})-/);
75
+ if (!m)
76
+ continue;
77
+ const n = Number.parseInt(m[1], 10);
78
+ if (n > max)
79
+ max = n;
80
+ }
81
+ return max + 1;
82
+ }
83
+ /**
84
+ * Render the ADR markdown body.
85
+ *
86
+ * @param {{
87
+ * number: number,
88
+ * title: string,
89
+ * status: string,
90
+ * date: string,
91
+ * context: string,
92
+ * decision: string,
93
+ * consequences: string,
94
+ * hardToReverse: boolean,
95
+ * surprisingWithoutContext: boolean,
96
+ * realTradeOff: boolean,
97
+ * }} opts
98
+ */
99
+ function renderAdr(opts) {
100
+ const paddedNumber = String(opts.number).padStart(4, '0');
101
+ return [
102
+ `# ADR-${paddedNumber}: ${opts.title}`,
103
+ '',
104
+ `**Status:** ${opts.status}`,
105
+ `**Date:** ${opts.date}`,
106
+ '',
107
+ '## Context',
108
+ '',
109
+ opts.context,
110
+ '',
111
+ '## Decision',
112
+ '',
113
+ opts.decision,
114
+ '',
115
+ '## Consequences',
116
+ '',
117
+ opts.consequences,
118
+ '',
119
+ '---',
120
+ '',
121
+ '## Nygard 3-gate filter (audit trail)',
122
+ '',
123
+ 'This ADR was written via `apt-tools adr write` and passed all three of',
124
+ "Nygard's filter gates. Reversible / obvious / trade-off-free decisions",
125
+ 'stay in `.aperant/context/notes/{task-id}.md` and do NOT become ADRs.',
126
+ '',
127
+ `- **Hard to reverse:** ${opts.hardToReverse}`,
128
+ `- **Surprising without context:** ${opts.surprisingWithoutContext}`,
129
+ `- **Real trade-off:** ${opts.realTradeOff}`,
130
+ '',
131
+ ].join('\n');
132
+ }
133
+ /**
134
+ * CLI entry: `apt-tools adr <subcommand> <project-dir> [flags]`.
135
+ */
136
+ export function cmdAdr(subcommand, projectDir, extraArgs) {
137
+ if (subcommand !== 'write') {
138
+ return err('Usage: apt-tools adr write <project-dir> --title <slug> --hard-to-reverse <bool> --surprising-without-context <bool> --real-trade-off <bool> --decision <text> --consequences <text> [--context <text>] [--status <status>]', 1, { command: 'adr' });
139
+ }
140
+ if (!projectDir) {
141
+ return err('project-dir is required', 1, { command: 'adr-write' });
142
+ }
143
+ const flags = parseFlags(extraArgs ?? []);
144
+ const title = flags.get('title');
145
+ if (typeof title !== 'string' || title.trim() === '') {
146
+ return err('--title <slug> is required', 1, { command: 'adr-write' });
147
+ }
148
+ // Three Nygard gates — every one must be parseable; missing means "not
149
+ // asked", which is the same as "no" for the filter.
150
+ const hardToReverse = parseBool(flags.get('hard-to-reverse'));
151
+ const surprisingWithoutContext = parseBool(flags.get('surprising-without-context'));
152
+ const realTradeOff = parseBool(flags.get('real-trade-off'));
153
+ for (const [name, value] of [
154
+ ['--hard-to-reverse', hardToReverse],
155
+ ['--surprising-without-context', surprisingWithoutContext],
156
+ ['--real-trade-off', realTradeOff],
157
+ ]) {
158
+ if (value === null) {
159
+ return err(`${name} <true|false> is required`, 1, { command: 'adr-write' });
160
+ }
161
+ }
162
+ const decision = flags.get('decision');
163
+ const consequences = flags.get('consequences');
164
+ if (typeof decision !== 'string' || decision.trim() === '') {
165
+ return err('--decision <text> is required', 1, { command: 'adr-write' });
166
+ }
167
+ if (typeof consequences !== 'string' || consequences.trim() === '') {
168
+ return err('--consequences <text> is required', 1, { command: 'adr-write' });
169
+ }
170
+ // Three-gate filter — every gate must be true to write.
171
+ const failed = [];
172
+ if (!hardToReverse)
173
+ failed.push('hard-to-reverse');
174
+ if (!surprisingWithoutContext)
175
+ failed.push('surprising-without-context');
176
+ if (!realTradeOff)
177
+ failed.push('real-trade-off');
178
+ if (failed.length > 0) {
179
+ return exitWith({
180
+ status: 'filtered',
181
+ command: 'adr-write',
182
+ reason: 'three-gate-filter',
183
+ failed_gates: failed,
184
+ note: 'Decision stays in .aperant/context/notes/{task-id}.md. ADRs are reserved for hard-to-reverse, surprising, real-trade-off decisions.',
185
+ }, 0);
186
+ }
187
+ // All three gates passed — write the ADR.
188
+ const absProjectDir = resolve(projectDir);
189
+ if (!existsSync(absProjectDir)) {
190
+ return err(`project directory not found: ${absProjectDir}`, 1, { command: 'adr-write' });
191
+ }
192
+ const adrDir = join(absProjectDir, 'docs', 'adr');
193
+ if (!existsSync(adrDir)) {
194
+ mkdirSync(adrDir, { recursive: true });
195
+ }
196
+ const number = nextAdrNumber(adrDir);
197
+ const slug = slugify(title);
198
+ const paddedNumber = String(number).padStart(4, '0');
199
+ const filename = `${paddedNumber}-${slug}.md`;
200
+ const filePath = join(adrDir, filename);
201
+ const status = (typeof flags.get('status') === 'string' && flags.get('status')) || 'Proposed';
202
+ const context = (typeof flags.get('context') === 'string' && flags.get('context')) ||
203
+ '{Context not supplied — provide via --context on a re-run.}';
204
+ const date = new Date().toISOString().slice(0, 10);
205
+ const body = renderAdr({
206
+ number,
207
+ title,
208
+ status: String(status),
209
+ date,
210
+ context: String(context),
211
+ decision,
212
+ consequences,
213
+ hardToReverse: true,
214
+ surprisingWithoutContext: true,
215
+ realTradeOff: true,
216
+ });
217
+ writeFileSync(filePath, body);
218
+ return ok({
219
+ status: 'ok',
220
+ command: 'adr-write',
221
+ file: filePath,
222
+ number,
223
+ slug,
224
+ title,
225
+ passed_gates: ['hard-to-reverse', 'surprising-without-context', 'real-trade-off'],
226
+ });
227
+ }
228
+ //# sourceMappingURL=adr.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adr.mjs","sourceRoot":"","sources":["../../../src/cli/commands/adr.mjs"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @param {string} subcommand
3
+ * @param {string} projectDir
4
+ * @param {string[]} extraArgs
5
+ */
6
+ export function cmdCiWatch(subcommand: string, projectDir: string, extraArgs: string[]): import("../util/result.mjs").CommandResult;
7
+ //# sourceMappingURL=ci-watch.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-watch.d.mts","sourceRoot":"","sources":["../../../src/cli/commands/ci-watch.mjs"],"names":[],"mappings":"AA8DA;;;;GAIG;AACH,uCAJW,MAAM,cACN,MAAM,aACN,MAAM,EAAE,8CAyBlB"}