@planu/cli 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (237) hide show
  1. package/dist/config/license-plans.json +15 -1
  2. package/dist/engine/audit-trail/formatter.d.ts +13 -0
  3. package/dist/engine/audit-trail/formatter.d.ts.map +1 -0
  4. package/dist/engine/audit-trail/formatter.js +43 -0
  5. package/dist/engine/audit-trail/formatter.js.map +1 -0
  6. package/dist/engine/audit-trail/hasher.d.ts +18 -0
  7. package/dist/engine/audit-trail/hasher.d.ts.map +1 -0
  8. package/dist/engine/audit-trail/hasher.js +46 -0
  9. package/dist/engine/audit-trail/hasher.js.map +1 -0
  10. package/dist/engine/audit-trail/index.d.ts +2 -0
  11. package/dist/engine/audit-trail/index.d.ts.map +1 -1
  12. package/dist/engine/audit-trail/index.js +4 -1
  13. package/dist/engine/audit-trail/index.js.map +1 -1
  14. package/dist/engine/auto-promoter.d.ts +14 -0
  15. package/dist/engine/auto-promoter.d.ts.map +1 -0
  16. package/dist/engine/auto-promoter.js +40 -0
  17. package/dist/engine/auto-promoter.js.map +1 -0
  18. package/dist/engine/compliance-test-generator/control-mapper.d.ts +4 -0
  19. package/dist/engine/compliance-test-generator/control-mapper.d.ts.map +1 -0
  20. package/dist/engine/compliance-test-generator/control-mapper.js +41 -0
  21. package/dist/engine/compliance-test-generator/control-mapper.js.map +1 -0
  22. package/dist/engine/compliance-test-generator/frameworks/iso42001.d.ts +3 -0
  23. package/dist/engine/compliance-test-generator/frameworks/iso42001.d.ts.map +1 -0
  24. package/dist/engine/compliance-test-generator/frameworks/iso42001.js +55 -0
  25. package/dist/engine/compliance-test-generator/frameworks/iso42001.js.map +1 -0
  26. package/dist/engine/compliance-test-generator/frameworks/pci-dss.d.ts +3 -0
  27. package/dist/engine/compliance-test-generator/frameworks/pci-dss.d.ts.map +1 -0
  28. package/dist/engine/compliance-test-generator/frameworks/pci-dss.js +55 -0
  29. package/dist/engine/compliance-test-generator/frameworks/pci-dss.js.map +1 -0
  30. package/dist/engine/compliance-test-generator/frameworks/soc2.d.ts +3 -0
  31. package/dist/engine/compliance-test-generator/frameworks/soc2.d.ts.map +1 -0
  32. package/dist/engine/compliance-test-generator/frameworks/soc2.js +47 -0
  33. package/dist/engine/compliance-test-generator/frameworks/soc2.js.map +1 -0
  34. package/dist/engine/compliance-test-generator/index.d.ts +3 -0
  35. package/dist/engine/compliance-test-generator/index.d.ts.map +1 -0
  36. package/dist/engine/compliance-test-generator/index.js +64 -0
  37. package/dist/engine/compliance-test-generator/index.js.map +1 -0
  38. package/dist/engine/compliance-test-generator/test-formatter.d.ts +6 -0
  39. package/dist/engine/compliance-test-generator/test-formatter.d.ts.map +1 -0
  40. package/dist/engine/compliance-test-generator/test-formatter.js +33 -0
  41. package/dist/engine/compliance-test-generator/test-formatter.js.map +1 -0
  42. package/dist/engine/cost-guardrails.d.ts +11 -0
  43. package/dist/engine/cost-guardrails.d.ts.map +1 -0
  44. package/dist/engine/cost-guardrails.js +39 -0
  45. package/dist/engine/cost-guardrails.js.map +1 -0
  46. package/dist/engine/dogfood-analyzer.d.ts +6 -0
  47. package/dist/engine/dogfood-analyzer.d.ts.map +1 -0
  48. package/dist/engine/dogfood-analyzer.js +59 -0
  49. package/dist/engine/dogfood-analyzer.js.map +1 -0
  50. package/dist/engine/drift-watcher/criteria-checker.d.ts +16 -0
  51. package/dist/engine/drift-watcher/criteria-checker.d.ts.map +1 -0
  52. package/dist/engine/drift-watcher/criteria-checker.js +81 -0
  53. package/dist/engine/drift-watcher/criteria-checker.js.map +1 -0
  54. package/dist/engine/drift-watcher/file-watcher.d.ts +8 -0
  55. package/dist/engine/drift-watcher/file-watcher.d.ts.map +1 -0
  56. package/dist/engine/drift-watcher/file-watcher.js +24 -0
  57. package/dist/engine/drift-watcher/file-watcher.js.map +1 -0
  58. package/dist/engine/drift-watcher/index.d.ts +19 -0
  59. package/dist/engine/drift-watcher/index.d.ts.map +1 -0
  60. package/dist/engine/drift-watcher/index.js +70 -0
  61. package/dist/engine/drift-watcher/index.js.map +1 -0
  62. package/dist/engine/hooks-reconciler.d.ts +7 -1
  63. package/dist/engine/hooks-reconciler.d.ts.map +1 -1
  64. package/dist/engine/hooks-reconciler.js +127 -2
  65. package/dist/engine/hooks-reconciler.js.map +1 -1
  66. package/dist/engine/mcp-gateway/gateway-registry.d.ts +19 -0
  67. package/dist/engine/mcp-gateway/gateway-registry.d.ts.map +1 -0
  68. package/dist/engine/mcp-gateway/gateway-registry.js +33 -0
  69. package/dist/engine/mcp-gateway/gateway-registry.js.map +1 -0
  70. package/dist/engine/mcp-gateway/gateway-scanner.d.ts +17 -0
  71. package/dist/engine/mcp-gateway/gateway-scanner.d.ts.map +1 -0
  72. package/dist/engine/mcp-gateway/gateway-scanner.js +62 -0
  73. package/dist/engine/mcp-gateway/gateway-scanner.js.map +1 -0
  74. package/dist/engine/mcp-gateway/index.d.ts +3 -0
  75. package/dist/engine/mcp-gateway/index.d.ts.map +1 -0
  76. package/dist/engine/mcp-gateway/index.js +4 -0
  77. package/dist/engine/mcp-gateway/index.js.map +1 -0
  78. package/dist/engine/multi-repo/companion-spec-builder.d.ts +9 -0
  79. package/dist/engine/multi-repo/companion-spec-builder.d.ts.map +1 -0
  80. package/dist/engine/multi-repo/companion-spec-builder.js +22 -0
  81. package/dist/engine/multi-repo/companion-spec-builder.js.map +1 -0
  82. package/dist/engine/multi-repo/consumer-scanner.d.ts +12 -0
  83. package/dist/engine/multi-repo/consumer-scanner.d.ts.map +1 -0
  84. package/dist/engine/multi-repo/consumer-scanner.js +48 -0
  85. package/dist/engine/multi-repo/consumer-scanner.js.map +1 -0
  86. package/dist/engine/multi-repo/index.d.ts +4 -0
  87. package/dist/engine/multi-repo/index.d.ts.map +1 -0
  88. package/dist/engine/multi-repo/index.js +5 -0
  89. package/dist/engine/multi-repo/index.js.map +1 -0
  90. package/dist/engine/multi-repo/refactor-tracker.d.ts +7 -0
  91. package/dist/engine/multi-repo/refactor-tracker.d.ts.map +1 -0
  92. package/dist/engine/multi-repo/refactor-tracker.js +22 -0
  93. package/dist/engine/multi-repo/refactor-tracker.js.map +1 -0
  94. package/dist/engine/skills-reconciler.d.ts +10 -1
  95. package/dist/engine/skills-reconciler.d.ts.map +1 -1
  96. package/dist/engine/skills-reconciler.js +128 -2
  97. package/dist/engine/skills-reconciler.js.map +1 -1
  98. package/dist/index.js +15 -0
  99. package/dist/index.js.map +1 -1
  100. package/dist/storage/audit-trail-store.d.ts +20 -0
  101. package/dist/storage/audit-trail-store.d.ts.map +1 -0
  102. package/dist/storage/audit-trail-store.js +98 -0
  103. package/dist/storage/audit-trail-store.js.map +1 -0
  104. package/dist/storage/auto-promoter-config-store.d.ts +11 -0
  105. package/dist/storage/auto-promoter-config-store.d.ts.map +1 -0
  106. package/dist/storage/auto-promoter-config-store.js +23 -0
  107. package/dist/storage/auto-promoter-config-store.js.map +1 -0
  108. package/dist/storage/budget-store.d.ts +19 -0
  109. package/dist/storage/budget-store.d.ts.map +1 -0
  110. package/dist/storage/budget-store.js +64 -0
  111. package/dist/storage/budget-store.js.map +1 -0
  112. package/dist/storage/gateway-store.d.ts +23 -0
  113. package/dist/storage/gateway-store.d.ts.map +1 -0
  114. package/dist/storage/gateway-store.js +52 -0
  115. package/dist/storage/gateway-store.js.map +1 -0
  116. package/dist/storage/refactor-registry-store.d.ts +21 -0
  117. package/dist/storage/refactor-registry-store.d.ts.map +1 -0
  118. package/dist/storage/refactor-registry-store.js +77 -0
  119. package/dist/storage/refactor-registry-store.js.map +1 -0
  120. package/dist/tools/auto-promoter-handler.d.ts +13 -0
  121. package/dist/tools/auto-promoter-handler.d.ts.map +1 -0
  122. package/dist/tools/auto-promoter-handler.js +50 -0
  123. package/dist/tools/auto-promoter-handler.js.map +1 -0
  124. package/dist/tools/compliance-test-handler.d.ts +5 -0
  125. package/dist/tools/compliance-test-handler.d.ts.map +1 -0
  126. package/dist/tools/compliance-test-handler.js +66 -0
  127. package/dist/tools/compliance-test-handler.js.map +1 -0
  128. package/dist/tools/cost-guardrails-handler.d.ts +15 -0
  129. package/dist/tools/cost-guardrails-handler.d.ts.map +1 -0
  130. package/dist/tools/cost-guardrails-handler.js +72 -0
  131. package/dist/tools/cost-guardrails-handler.js.map +1 -0
  132. package/dist/tools/dogfood-status-handler.d.ts +3 -0
  133. package/dist/tools/dogfood-status-handler.d.ts.map +1 -0
  134. package/dist/tools/dogfood-status-handler.js +28 -0
  135. package/dist/tools/dogfood-status-handler.js.map +1 -0
  136. package/dist/tools/drift-watcher-handler.d.ts +7 -0
  137. package/dist/tools/drift-watcher-handler.d.ts.map +1 -0
  138. package/dist/tools/drift-watcher-handler.js +65 -0
  139. package/dist/tools/drift-watcher-handler.js.map +1 -0
  140. package/dist/tools/export-audit-trail-handler.d.ts +9 -0
  141. package/dist/tools/export-audit-trail-handler.d.ts.map +1 -0
  142. package/dist/tools/export-audit-trail-handler.js +103 -0
  143. package/dist/tools/export-audit-trail-handler.js.map +1 -0
  144. package/dist/tools/mcp-gateway-handler.d.ts +13 -0
  145. package/dist/tools/mcp-gateway-handler.d.ts.map +1 -0
  146. package/dist/tools/mcp-gateway-handler.js +60 -0
  147. package/dist/tools/mcp-gateway-handler.js.map +1 -0
  148. package/dist/tools/multi-repo-handler.d.ts +15 -0
  149. package/dist/tools/multi-repo-handler.d.ts.map +1 -0
  150. package/dist/tools/multi-repo-handler.js +86 -0
  151. package/dist/tools/multi-repo-handler.js.map +1 -0
  152. package/dist/tools/reconcile-hooks.d.ts +5 -0
  153. package/dist/tools/reconcile-hooks.d.ts.map +1 -1
  154. package/dist/tools/reconcile-hooks.js +61 -4
  155. package/dist/tools/reconcile-hooks.js.map +1 -1
  156. package/dist/tools/reconcile-skills.d.ts +1 -0
  157. package/dist/tools/reconcile-skills.d.ts.map +1 -1
  158. package/dist/tools/reconcile-skills.js +57 -9
  159. package/dist/tools/reconcile-skills.js.map +1 -1
  160. package/dist/tools/register-audit-trail-tools.d.ts.map +1 -1
  161. package/dist/tools/register-audit-trail-tools.js +38 -0
  162. package/dist/tools/register-audit-trail-tools.js.map +1 -1
  163. package/dist/tools/register-auto-promoter-tools.d.ts +3 -0
  164. package/dist/tools/register-auto-promoter-tools.d.ts.map +1 -0
  165. package/dist/tools/register-auto-promoter-tools.js +43 -0
  166. package/dist/tools/register-auto-promoter-tools.js.map +1 -0
  167. package/dist/tools/register-compliance-test-tools.d.ts +3 -0
  168. package/dist/tools/register-compliance-test-tools.d.ts.map +1 -0
  169. package/dist/tools/register-compliance-test-tools.js +55 -0
  170. package/dist/tools/register-compliance-test-tools.js.map +1 -0
  171. package/dist/tools/register-cost-guardrails-tools.d.ts +3 -0
  172. package/dist/tools/register-cost-guardrails-tools.d.ts.map +1 -0
  173. package/dist/tools/register-cost-guardrails-tools.js +61 -0
  174. package/dist/tools/register-cost-guardrails-tools.js.map +1 -0
  175. package/dist/tools/register-dogfood-tools.d.ts +3 -0
  176. package/dist/tools/register-dogfood-tools.d.ts.map +1 -0
  177. package/dist/tools/register-dogfood-tools.js +21 -0
  178. package/dist/tools/register-dogfood-tools.js.map +1 -0
  179. package/dist/tools/register-drift-watcher-tools.d.ts +3 -0
  180. package/dist/tools/register-drift-watcher-tools.d.ts.map +1 -0
  181. package/dist/tools/register-drift-watcher-tools.js +28 -0
  182. package/dist/tools/register-drift-watcher-tools.js.map +1 -0
  183. package/dist/tools/register-mcp-gateway-tools.d.ts +3 -0
  184. package/dist/tools/register-mcp-gateway-tools.d.ts.map +1 -0
  185. package/dist/tools/register-mcp-gateway-tools.js +35 -0
  186. package/dist/tools/register-mcp-gateway-tools.js.map +1 -0
  187. package/dist/tools/register-multi-repo-tools.d.ts +8 -0
  188. package/dist/tools/register-multi-repo-tools.d.ts.map +1 -0
  189. package/dist/tools/register-multi-repo-tools.js +52 -0
  190. package/dist/tools/register-multi-repo-tools.js.map +1 -0
  191. package/dist/tools/safe-handler.d.ts.map +1 -1
  192. package/dist/tools/safe-handler.js +50 -1
  193. package/dist/tools/safe-handler.js.map +1 -1
  194. package/dist/tools/schemas/reconcile-skills-schemas.d.ts +1 -0
  195. package/dist/tools/schemas/reconcile-skills-schemas.d.ts.map +1 -1
  196. package/dist/tools/schemas/reconcile-skills-schemas.js +5 -0
  197. package/dist/tools/schemas/reconcile-skills-schemas.js.map +1 -1
  198. package/dist/types/audit.d.ts +64 -0
  199. package/dist/types/audit.d.ts.map +1 -0
  200. package/dist/types/audit.js +3 -0
  201. package/dist/types/audit.js.map +1 -0
  202. package/dist/types/auto-promoter.d.ts +26 -0
  203. package/dist/types/auto-promoter.d.ts.map +1 -0
  204. package/dist/types/auto-promoter.js +3 -0
  205. package/dist/types/auto-promoter.js.map +1 -0
  206. package/dist/types/compliance-tests.d.ts +41 -0
  207. package/dist/types/compliance-tests.d.ts.map +1 -0
  208. package/dist/types/compliance-tests.js +3 -0
  209. package/dist/types/compliance-tests.js.map +1 -0
  210. package/dist/types/conventions.d.ts +29 -0
  211. package/dist/types/conventions.d.ts.map +1 -1
  212. package/dist/types/cost-guardrails.d.ts +41 -0
  213. package/dist/types/cost-guardrails.d.ts.map +1 -0
  214. package/dist/types/cost-guardrails.js +3 -0
  215. package/dist/types/cost-guardrails.js.map +1 -0
  216. package/dist/types/dogfood.d.ts +22 -0
  217. package/dist/types/dogfood.d.ts.map +1 -0
  218. package/dist/types/dogfood.js +3 -0
  219. package/dist/types/dogfood.js.map +1 -0
  220. package/dist/types/drift-watcher.d.ts +35 -0
  221. package/dist/types/drift-watcher.d.ts.map +1 -0
  222. package/dist/types/drift-watcher.js +3 -0
  223. package/dist/types/drift-watcher.js.map +1 -0
  224. package/dist/types/index.d.ts +8 -0
  225. package/dist/types/index.d.ts.map +1 -1
  226. package/dist/types/index.js +8 -0
  227. package/dist/types/index.js.map +1 -1
  228. package/dist/types/mcp-gateway.d.ts +34 -0
  229. package/dist/types/mcp-gateway.d.ts.map +1 -0
  230. package/dist/types/mcp-gateway.js +3 -0
  231. package/dist/types/mcp-gateway.js.map +1 -0
  232. package/dist/types/multi-repo.d.ts +39 -0
  233. package/dist/types/multi-repo.d.ts.map +1 -0
  234. package/dist/types/multi-repo.js +5 -0
  235. package/dist/types/multi-repo.js.map +1 -0
  236. package/package.json +1 -1
  237. package/src/config/license-plans.json +15 -1
@@ -0,0 +1,33 @@
1
+ // engine/compliance-test-generator/test-formatter.ts — SPEC-390: Formats mapped tests to output formats
2
+ export function formatAsJest(test) {
3
+ return (`describe('${test.control.id} — ${test.control.title}', () => {\n` +
4
+ ` it('should satisfy: ${test.criterion.slice(0, 80)}', async () => {\n` +
5
+ ` // Control: ${test.control.description}\n` +
6
+ ` // Rationale: ${test.rationale}\n` +
7
+ ` // TODO: implement assertion for this compliance requirement\n` +
8
+ ` expect(true).toBe(true); // placeholder\n` +
9
+ ` });\n` +
10
+ `});\n`);
11
+ }
12
+ export function formatAsGherkin(test) {
13
+ return (`Feature: ${test.control.id} — ${test.control.title}\n` +
14
+ ` Scenario: ${test.criterion.slice(0, 80)}\n` +
15
+ ` Given the system is running\n` +
16
+ ` When ${test.criterion.slice(0, 60).toLowerCase()}\n` +
17
+ ` Then the ${test.control.title.toLowerCase()} control is satisfied\n\n`);
18
+ }
19
+ export function formatAsMarkdown(test) {
20
+ return (`- [ ] **[${test.control.id}]** ${test.criterion}\n` +
21
+ ` - Control: ${test.control.title}\n` +
22
+ ` - Rationale: ${test.rationale}\n`);
23
+ }
24
+ export function formatTest(test, format) {
25
+ if (format === 'jest') {
26
+ return formatAsJest(test);
27
+ }
28
+ if (format === 'gherkin') {
29
+ return formatAsGherkin(test);
30
+ }
31
+ return formatAsMarkdown(test);
32
+ }
33
+ //# sourceMappingURL=test-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-formatter.js","sourceRoot":"","sources":["../../../src/engine/compliance-test-generator/test-formatter.ts"],"names":[],"mappings":"AAAA,wGAAwG;AAIxG,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,OAAO,CACL,aAAa,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,cAAc;QAClE,yBAAyB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB;QACxE,mBAAmB,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI;QAC/C,qBAAqB,IAAI,CAAC,SAAS,IAAI;QACvC,oEAAoE;QACpE,+CAA+C;QAC/C,SAAS;QACT,OAAO,CACR,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAgB;IAC9C,OAAO,CACL,YAAY,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI;QACvD,eAAe,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI;QAC9C,mCAAmC;QACnC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI;QACzD,gBAAgB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,2BAA2B,CAC5E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAgB;IAC/C,OAAO,CACL,YAAY,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,IAAI,CAAC,SAAS,IAAI;QACpD,gBAAgB,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI;QACtC,kBAAkB,IAAI,CAAC,SAAS,IAAI,CACrC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,MAAwB;IACnE,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtB,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SpecBudget, SpecBudgetStatus } from '../types/cost-guardrails.js';
2
+ /**
3
+ * Compute the current budget status for a spec.
4
+ * Recommends a model tier based on usage percentage to control costs.
5
+ */
6
+ export declare function computeBudgetStatus(budget: SpecBudget): SpecBudgetStatus;
7
+ /**
8
+ * Format a budget status into a human-readable summary message.
9
+ */
10
+ export declare function formatBudgetMessage(status: SpecBudgetStatus): string;
11
+ //# sourceMappingURL=cost-guardrails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-guardrails.d.ts","sourceRoot":"","sources":["../../src/engine/cost-guardrails.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAGhF;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,GAAG,gBAAgB,CAqBxE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAUpE"}
@@ -0,0 +1,39 @@
1
+ // engine/cost-guardrails.ts — Cost Guardrails computation logic (SPEC-393)
2
+ /**
3
+ * Compute the current budget status for a spec.
4
+ * Recommends a model tier based on usage percentage to control costs.
5
+ */
6
+ export function computeBudgetStatus(budget) {
7
+ const remaining = budget.maxUsdCents - budget.usedUsdCents;
8
+ const usagePercent = budget.maxUsdCents > 0 ? Math.round((budget.usedUsdCents / budget.maxUsdCents) * 100) : 0;
9
+ const warningTriggered = usagePercent >= budget.warningThreshold;
10
+ const exhausted = budget.usedUsdCents >= budget.maxUsdCents;
11
+ // Auto-downgrade model based on remaining budget
12
+ const recommendedModel = exhausted || usagePercent >= 80 ? 'haiku' : usagePercent >= 60 ? 'sonnet' : 'opus';
13
+ return {
14
+ specId: budget.specId,
15
+ maxUsdCents: budget.maxUsdCents,
16
+ usedUsdCents: budget.usedUsdCents,
17
+ remainingUsdCents: Math.max(0, remaining),
18
+ usagePercent,
19
+ warningTriggered,
20
+ recommendedModel,
21
+ exhausted,
22
+ };
23
+ }
24
+ /**
25
+ * Format a budget status into a human-readable summary message.
26
+ */
27
+ export function formatBudgetMessage(status) {
28
+ const dollars = (status.usedUsdCents / 100).toFixed(2);
29
+ const max = (status.maxUsdCents / 100).toFixed(2);
30
+ let msg = `Budget: $${dollars} / $${max} (${status.usagePercent}%)`;
31
+ if (status.exhausted) {
32
+ msg += ' EXHAUSTED — using haiku';
33
+ }
34
+ else if (status.warningTriggered) {
35
+ msg += ` Warning — downgraded to ${status.recommendedModel}`;
36
+ }
37
+ return msg;
38
+ }
39
+ //# sourceMappingURL=cost-guardrails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-guardrails.js","sourceRoot":"","sources":["../../src/engine/cost-guardrails.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAK3E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC;IAC3D,MAAM,YAAY,GAChB,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5F,MAAM,gBAAgB,GAAG,YAAY,IAAI,MAAM,CAAC,gBAAgB,CAAC;IACjE,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,WAAW,CAAC;IAE5D,iDAAiD;IACjD,MAAM,gBAAgB,GACpB,SAAS,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAErF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,iBAAiB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC;QACzC,YAAY;QACZ,gBAAgB;QAChB,gBAAgB;QAChB,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC1D,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClD,IAAI,GAAG,GAAG,YAAY,OAAO,OAAO,GAAG,KAAK,MAAM,CAAC,YAAY,IAAI,CAAC;IACpE,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,GAAG,IAAI,0BAA0B,CAAC;IACpC,CAAC;SAAM,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;QACnC,GAAG,IAAI,4BAA4B,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { DogfoodReport } from '../types/dogfood.js';
2
+ export declare const KEY_SDD_TOOLS: string[];
3
+ export declare function getRecentCommitMessages(projectPath: string, sinceDays: number): string[];
4
+ export declare function detectToolUsageFromMessages(messages: string[]): string[];
5
+ export declare function buildDogfoodReport(usedTools: string[], period: string, messages: string[]): DogfoodReport;
6
+ //# sourceMappingURL=dogfood-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dogfood-analyzer.d.ts","sourceRoot":"","sources":["../../src/engine/dogfood-analyzer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzE,eAAO,MAAM,aAAa,UAWzB,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAYxF;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CASxE;AAED,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,GACjB,aAAa,CAuBf"}
@@ -0,0 +1,59 @@
1
+ // dogfood-analyzer.ts — Analyzes git history for Planu tool usage (SPEC-394)
2
+ import { execSync } from 'node:child_process';
3
+ export const KEY_SDD_TOOLS = [
4
+ 'create_spec',
5
+ 'validate',
6
+ 'challenge_spec',
7
+ 'check_readiness',
8
+ 'update_status',
9
+ 'estimate',
10
+ 'suggest_criteria',
11
+ 'inject_criteria',
12
+ 'doc_compliance_report',
13
+ 'generate_skill',
14
+ ];
15
+ export function getRecentCommitMessages(projectPath, sinceDays) {
16
+ try {
17
+ const since = new Date(Date.now() - sinceDays * 86400000).toISOString().split('T')[0];
18
+ const output = execSync(`git log --since="${since}" --pretty=format:"%s %b" --no-merges`, {
19
+ cwd: projectPath,
20
+ encoding: 'utf-8',
21
+ timeout: 5000,
22
+ });
23
+ return output.split('\n').filter(Boolean);
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ export function detectToolUsageFromMessages(messages) {
30
+ const used = new Set();
31
+ const combined = messages.join(' ').toLowerCase();
32
+ for (const tool of KEY_SDD_TOOLS) {
33
+ if (combined.includes(tool.replace(/_/g, '_')) || combined.includes(tool.replace(/_/g, '-'))) {
34
+ used.add(tool);
35
+ }
36
+ }
37
+ return [...used];
38
+ }
39
+ export function buildDogfoodReport(usedTools, period, messages) {
40
+ const missingTools = KEY_SDD_TOOLS.filter((t) => !usedTools.includes(t));
41
+ const dogfoodScore = Math.round((usedTools.length / KEY_SDD_TOOLS.length) * 100);
42
+ const combined = messages.join(' ').toLowerCase();
43
+ const metrics = {
44
+ specCreated: (combined.match(/create_spec|feat.*spec-\d+/g) ?? []).length,
45
+ specValidated: (combined.match(/validate|validation/g) ?? []).length,
46
+ specChallenged: (combined.match(/challenge_spec|challenge/g) ?? []).length,
47
+ readinessChecked: (combined.match(/check_readiness|readiness/g) ?? []).length,
48
+ statusUpdated: (combined.match(/update_status|status.*done|status.*impl/g) ?? []).length,
49
+ totalToolUses: usedTools.length,
50
+ coveragePercent: dogfoodScore,
51
+ };
52
+ const recommendation = dogfoodScore >= 80
53
+ ? 'Excellent dogfooding! Keep using Planu throughout development.'
54
+ : dogfoodScore >= 50
55
+ ? `Good progress. Missing: ${missingTools.slice(0, 3).join(', ')}`
56
+ : `Improve SDD adoption. Start with: ${missingTools.slice(0, 3).join(', ')}`;
57
+ return { period, metrics, usedTools, missingTools, recommendation, dogfoodScore };
58
+ }
59
+ //# sourceMappingURL=dogfood-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dogfood-analyzer.js","sourceRoot":"","sources":["../../src/engine/dogfood-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { DriftAlert } from '../../types/drift-watcher.js';
2
+ /**
3
+ * Parse spec.md lines starting with "- [ ]" or "- [x]" as criteria.
4
+ * Returns the criterion text stripped of the checkbox prefix.
5
+ */
6
+ export declare function extractCriteriaFromSpec(specPath: string): Promise<string[]>;
7
+ /**
8
+ * Check if a file's content contains key terms from the criterion.
9
+ * Returns true if any key term is found in the file.
10
+ */
11
+ export declare function checkCriterionInFile(criterion: string, filePath: string): Promise<boolean>;
12
+ /**
13
+ * Build a DriftAlert for a criterion that may no longer be satisfied.
14
+ */
15
+ export declare function buildDriftAlert(specId: string, criterion: string, filePath: string): DriftAlert;
16
+ //# sourceMappingURL=criteria-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-checker.d.ts","sourceRoot":"","sources":["../../../src/engine/drift-watcher/criteria-checker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAK/D;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkBjF;AAYD;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAShG;AAiBD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAU/F"}
@@ -0,0 +1,81 @@
1
+ // engine/drift-watcher/criteria-checker.ts — SPEC-388: criterion checks on file change
2
+ import { readFile } from 'node:fs/promises';
3
+ const HIGH_SEVERITY_KEYWORDS = ['auth', 'security', 'permission', 'access', 'token', 'password'];
4
+ const MEDIUM_SEVERITY_KEYWORDS = ['validate', 'error', 'fail', 'reject', 'limit', 'timeout'];
5
+ /**
6
+ * Parse spec.md lines starting with "- [ ]" or "- [x]" as criteria.
7
+ * Returns the criterion text stripped of the checkbox prefix.
8
+ */
9
+ export async function extractCriteriaFromSpec(specPath) {
10
+ try {
11
+ const content = await readFile(specPath, 'utf-8');
12
+ const lines = content.split('\n');
13
+ const criteria = [];
14
+ for (const line of lines) {
15
+ const trimmed = line.trim();
16
+ if (trimmed.startsWith('- [ ]') || trimmed.startsWith('- [x]')) {
17
+ const text = trimmed.replace(/^- \[[ x]\]\s*/, '').trim();
18
+ if (text.length > 0) {
19
+ criteria.push(text);
20
+ }
21
+ }
22
+ }
23
+ return criteria;
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ /**
30
+ * Extract key terms from a criterion (words >=4 chars, lowercased).
31
+ */
32
+ function extractKeyTerms(criterion) {
33
+ return criterion
34
+ .toLowerCase()
35
+ .split(/\W+/)
36
+ .filter((w) => w.length >= 4);
37
+ }
38
+ /**
39
+ * Check if a file's content contains key terms from the criterion.
40
+ * Returns true if any key term is found in the file.
41
+ */
42
+ export async function checkCriterionInFile(criterion, filePath) {
43
+ try {
44
+ const content = await readFile(filePath, 'utf-8');
45
+ const lower = content.toLowerCase();
46
+ const terms = extractKeyTerms(criterion);
47
+ return terms.some((term) => lower.includes(term));
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ /**
54
+ * Determine severity based on criterion keywords.
55
+ * auth/security keywords = high, validate/error = medium, otherwise low.
56
+ */
57
+ function determineSeverity(criterion) {
58
+ const lower = criterion.toLowerCase();
59
+ if (HIGH_SEVERITY_KEYWORDS.some((kw) => lower.includes(kw))) {
60
+ return 'high';
61
+ }
62
+ if (MEDIUM_SEVERITY_KEYWORDS.some((kw) => lower.includes(kw))) {
63
+ return 'medium';
64
+ }
65
+ return 'low';
66
+ }
67
+ /**
68
+ * Build a DriftAlert for a criterion that may no longer be satisfied.
69
+ */
70
+ export function buildDriftAlert(specId, criterion, filePath) {
71
+ const severity = determineSeverity(criterion);
72
+ return {
73
+ specId,
74
+ criterionText: criterion,
75
+ affectedFile: filePath,
76
+ detectedAt: new Date().toISOString(),
77
+ severity,
78
+ suggestedFix: `Review ${filePath} to ensure it still satisfies: "${criterion}"`,
79
+ };
80
+ }
81
+ //# sourceMappingURL=criteria-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criteria-checker.js","sourceRoot":"","sources":["../../../src/engine/drift-watcher/criteria-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Watch a directory recursively for file changes.
3
+ * Calls onChange with the relative filename whenever a file changes.
4
+ * Silently skips directories that don't exist or can't be watched.
5
+ * Closes the watcher when the provided AbortSignal is aborted.
6
+ */
7
+ export declare function watchDirectory(dirPath: string, onChange: (filename: string) => void, signal: AbortSignal): void;
8
+ //# sourceMappingURL=file-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../../src/engine/drift-watcher/file-watcher.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,EACpC,MAAM,EAAE,WAAW,GAClB,IAAI,CAiBN"}
@@ -0,0 +1,24 @@
1
+ // engine/drift-watcher/file-watcher.ts — SPEC-388: FSEvents wrapper using node:fs watch
2
+ import { watch } from 'node:fs';
3
+ /**
4
+ * Watch a directory recursively for file changes.
5
+ * Calls onChange with the relative filename whenever a file changes.
6
+ * Silently skips directories that don't exist or can't be watched.
7
+ * Closes the watcher when the provided AbortSignal is aborted.
8
+ */
9
+ export function watchDirectory(dirPath, onChange, signal) {
10
+ try {
11
+ const watcher = watch(dirPath, { recursive: true }, (_event, filename) => {
12
+ if (filename) {
13
+ onChange(filename);
14
+ }
15
+ });
16
+ signal.addEventListener('abort', () => {
17
+ watcher.close();
18
+ }, { once: true });
19
+ }
20
+ catch {
21
+ // Directory doesn't exist or not watchable — silently skip
22
+ }
23
+ }
24
+ //# sourceMappingURL=file-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-watcher.js","sourceRoot":"","sources":["../../../src/engine/drift-watcher/file-watcher.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,QAAoC,EACpC,MAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YACvE,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,CACrB,OAAO,EACP,GAAG,EAAE;YACH,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,2DAA2D;IAC7D,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { DriftWatcherConfig, WatcherState } from '../../types/drift-watcher.js';
2
+ /**
3
+ * Start watching a spec's associated paths for drift.
4
+ * Returns the initial WatcherState.
5
+ */
6
+ export declare function startWatcher(config: DriftWatcherConfig): WatcherState;
7
+ /**
8
+ * Stop a running watcher. Returns true if it was running, false if not found.
9
+ */
10
+ export declare function stopWatcher(specId: string): boolean;
11
+ /**
12
+ * Get the current state of a watcher. Returns null if not running.
13
+ */
14
+ export declare function getWatcherState(specId: string): WatcherState | null;
15
+ /**
16
+ * List all active watcher states.
17
+ */
18
+ export declare function listActiveWatchers(): WatcherState[];
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/drift-watcher/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAgB,MAAM,8BAA8B,CAAC;AAuBnG;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,YAAY,CA8BrE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUnD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,EAAE,CAEnD"}
@@ -0,0 +1,70 @@
1
+ import { watchDirectory } from './file-watcher.js';
2
+ import { extractCriteriaFromSpec, buildDriftAlert } from './criteria-checker.js';
3
+ // In-memory registry — does not persist across server restarts
4
+ const activeWatchers = new Map();
5
+ async function runCriteriaCheck(config, filename) {
6
+ const entry = activeWatchers.get(config.specId);
7
+ if (!entry) {
8
+ return;
9
+ }
10
+ const filePath = filename;
11
+ const criteria = await extractCriteriaFromSpec(config.specPath);
12
+ for (const criterion of criteria) {
13
+ const alert = buildDriftAlert(config.specId, criterion, filePath);
14
+ entry.state.alertCount++;
15
+ entry.state.lastAlert = alert;
16
+ }
17
+ }
18
+ /**
19
+ * Start watching a spec's associated paths for drift.
20
+ * Returns the initial WatcherState.
21
+ */
22
+ export function startWatcher(config) {
23
+ const existing = activeWatchers.get(config.specId);
24
+ if (existing) {
25
+ return existing.state;
26
+ }
27
+ const controller = new AbortController();
28
+ const state = {
29
+ specId: config.specId,
30
+ projectPath: config.projectPath,
31
+ active: true,
32
+ startedAt: new Date().toISOString(),
33
+ alertCount: 0,
34
+ };
35
+ activeWatchers.set(config.specId, { state, controller });
36
+ for (const watchedPath of config.watchedPaths) {
37
+ watchDirectory(watchedPath, (filename) => {
38
+ runCriteriaCheck(config, filename).catch(() => {
39
+ // Silently ignore errors during criteria check
40
+ });
41
+ }, controller.signal);
42
+ }
43
+ return state;
44
+ }
45
+ /**
46
+ * Stop a running watcher. Returns true if it was running, false if not found.
47
+ */
48
+ export function stopWatcher(specId) {
49
+ const entry = activeWatchers.get(specId);
50
+ if (!entry) {
51
+ return false;
52
+ }
53
+ entry.controller.abort();
54
+ entry.state.active = false;
55
+ activeWatchers.delete(specId);
56
+ return true;
57
+ }
58
+ /**
59
+ * Get the current state of a watcher. Returns null if not running.
60
+ */
61
+ export function getWatcherState(specId) {
62
+ return activeWatchers.get(specId)?.state ?? null;
63
+ }
64
+ /**
65
+ * List all active watcher states.
66
+ */
67
+ export function listActiveWatchers() {
68
+ return [...activeWatchers.values()].map((e) => e.state);
69
+ }
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/drift-watcher/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEjF,+DAA+D;AAC/D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEvD,KAAK,UAAU,gBAAgB,CAAC,MAA0B,EAAE,QAAgB;IAC1E,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC1B,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEhE,KAAK,MAAM,SAAS,IAAI,QAAQ,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;QACzB,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;IAChC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAiB;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,UAAU,EAAE,CAAC;KACd,CAAC;IAEF,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;IAEzD,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAC9C,cAAc,CACZ,WAAW,EACX,CAAC,QAAQ,EAAE,EAAE;YACX,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC5C,+CAA+C;YACjD,CAAC,CAAC,CAAC;QACL,CAAC,EACD,UAAU,CAAC,MAAM,CAClB,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACzB,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IAC3B,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,OAAO,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC1D,CAAC"}
@@ -1,4 +1,10 @@
1
- import type { HooksReconciliation } from '../types/index.js';
1
+ import type { HooksReconciliation, HooksPatchResult } from '../types/index.js';
2
+ /**
3
+ * Auto-patch husky hook files with missing quality checks.
4
+ * Idempotent: checks already present in the file are reported as skipped.
5
+ * Only works for husky manager — returns empty patch for other managers.
6
+ */
7
+ export declare function patchHooks(missingChecks: string[], projectPath: string): HooksPatchResult;
2
8
  /**
3
9
  * Analyse git hooks against detected project capabilities and report drift.
4
10
  * Never throws — returns a zero-score result on unexpected errors.
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-reconciler.d.ts","sourceRoot":"","sources":["../../src/engine/hooks-reconciler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EAIpB,MAAM,mBAAmB,CAAC;AAgN3B;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CA+CvE"}
1
+ {"version":3,"file":"hooks-reconciler.d.ts","sourceRoot":"","sources":["../../src/engine/hooks-reconciler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,mBAAmB,EAInB,gBAAgB,EAEjB,MAAM,mBAAmB,CAAC;AAiT3B;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAsCzF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,CA+CvE"}
@@ -1,6 +1,6 @@
1
1
  // engine/hooks-reconciler.ts — Detect drift between CI/quality pipeline and git hooks.
2
- // Read-only analysis: never modifies hook scripts.
3
- import { readFileSync, existsSync, readdirSync } from 'node:fs';
2
+ // Read-only analysis by default; patchHooks() writes fixes when autoFix is enabled.
3
+ import { readFileSync, existsSync, readdirSync, writeFileSync } from 'node:fs';
4
4
  import { join } from 'node:path';
5
5
  // ---------------------------------------------------------------------------
6
6
  // Helpers
@@ -152,8 +152,133 @@ function detectOutdatedChecks(scripts, caps) {
152
152
  return outdated;
153
153
  }
154
154
  // ---------------------------------------------------------------------------
155
+ // Lint-staged detection helpers
156
+ // ---------------------------------------------------------------------------
157
+ function lintStagedCoversPrettier(pkg) {
158
+ const ls = pkg['lint-staged'];
159
+ if (!ls || typeof ls !== 'object') {
160
+ return false;
161
+ }
162
+ const entries = Object.values(ls);
163
+ return entries.some((v) => {
164
+ if (typeof v === 'string') {
165
+ return v.includes('prettier');
166
+ }
167
+ if (Array.isArray(v)) {
168
+ return v.some((cmd) => typeof cmd === 'string' && cmd.includes('prettier'));
169
+ }
170
+ return false;
171
+ });
172
+ }
173
+ function lintStagedCoversEslint(pkg) {
174
+ const ls = pkg['lint-staged'];
175
+ if (!ls || typeof ls !== 'object') {
176
+ return false;
177
+ }
178
+ const entries = Object.values(ls);
179
+ return entries.some((v) => {
180
+ if (typeof v === 'string') {
181
+ return /eslint|lint/.test(v);
182
+ }
183
+ if (Array.isArray(v)) {
184
+ return v.some((cmd) => typeof cmd === 'string' && /eslint|lint/.test(cmd));
185
+ }
186
+ return false;
187
+ });
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Patch helpers
191
+ // ---------------------------------------------------------------------------
192
+ const HUSKY_SHEBANG = '#!/usr/bin/env sh\n. "$(dirname -- "$0")/_/husky.sh"\n';
193
+ function readHookFile(hookPath) {
194
+ try {
195
+ return readFileSync(hookPath, 'utf-8');
196
+ }
197
+ catch {
198
+ return '';
199
+ }
200
+ }
201
+ function writeHookFile(hookPath, content) {
202
+ writeFileSync(hookPath, content, { encoding: 'utf-8', mode: 0o755 });
203
+ }
204
+ function buildPatchCandidates(missingChecks, pkg) {
205
+ const candidates = [];
206
+ const prettierCoveredByLintStaged = lintStagedCoversPrettier(pkg);
207
+ const eslintCoveredByLintStaged = lintStagedCoversEslint(pkg);
208
+ for (const check of missingChecks) {
209
+ if (check.includes('TypeScript') && check.includes('pre-commit')) {
210
+ candidates.push({ hook: 'pre-commit', line: 'pnpm typecheck', description: check });
211
+ }
212
+ else if (check.includes('ESLint') && check.includes('pre-commit')) {
213
+ if (!eslintCoveredByLintStaged) {
214
+ candidates.push({ hook: 'pre-commit', line: 'pnpm lint', description: check });
215
+ }
216
+ }
217
+ else if (check.includes('test') && check.includes('pre-push')) {
218
+ candidates.push({ hook: 'pre-push', line: 'pnpm test', description: check });
219
+ }
220
+ else if (check.includes('commit-msg') && check.includes('no commit-msg hook')) {
221
+ candidates.push({
222
+ hook: 'commit-msg',
223
+ line: 'npx --no -- commitlint --edit "$1"',
224
+ description: check,
225
+ });
226
+ }
227
+ else if (check.includes('commit-msg') && check.includes('does not invoke commitlint')) {
228
+ candidates.push({
229
+ hook: 'commit-msg',
230
+ line: 'npx --no -- commitlint --edit "$1"',
231
+ description: check,
232
+ });
233
+ }
234
+ else if (check.includes('prettier') && !prettierCoveredByLintStaged) {
235
+ candidates.push({
236
+ hook: 'pre-commit',
237
+ line: 'npx prettier --check .',
238
+ description: check,
239
+ });
240
+ }
241
+ }
242
+ return candidates;
243
+ }
244
+ // ---------------------------------------------------------------------------
155
245
  // Public API
156
246
  // ---------------------------------------------------------------------------
247
+ /**
248
+ * Auto-patch husky hook files with missing quality checks.
249
+ * Idempotent: checks already present in the file are reported as skipped.
250
+ * Only works for husky manager — returns empty patch for other managers.
251
+ */
252
+ export function patchHooks(missingChecks, projectPath) {
253
+ const pkg = readPackageJson(projectPath);
254
+ const manager = detectHookManager(projectPath, pkg);
255
+ if (manager !== 'husky') {
256
+ return { patched: [], skipped: missingChecks.slice(), healthScore: 0 };
257
+ }
258
+ const huskyDir = join(projectPath, '.husky');
259
+ const candidates = buildPatchCandidates(missingChecks, pkg);
260
+ const patched = [];
261
+ const skipped = [];
262
+ for (const candidate of candidates) {
263
+ const hookPath = join(huskyDir, candidate.hook);
264
+ let current = readHookFile(hookPath);
265
+ if (current.includes(candidate.line)) {
266
+ skipped.push(candidate.description);
267
+ continue;
268
+ }
269
+ if (current === '') {
270
+ current = HUSKY_SHEBANG;
271
+ }
272
+ const updated = current.endsWith('\n')
273
+ ? `${current}${candidate.line}\n`
274
+ : `${current}\n${candidate.line}\n`;
275
+ writeHookFile(hookPath, updated);
276
+ patched.push({ hook: candidate.hook, added: candidate.line });
277
+ }
278
+ // Re-run analysis to get updated health score
279
+ const afterReconcile = reconcileHooks(projectPath);
280
+ return { patched, skipped, healthScore: afterReconcile.healthScore };
281
+ }
157
282
  /**
158
283
  * Analyse git hooks against detected project capabilities and report drift.
159
284
  * Never throws — returns a zero-score result on unexpected errors.
@@ -1 +1 @@
1
- {"version":3,"file":"hooks-reconciler.js","sourceRoot":"","sources":["../../src/engine/hooks-reconciler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hooks-reconciler.js","sourceRoot":"","sources":["../../src/engine/hooks-reconciler.ts"],"names":[],"mappings":"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"}