@planu/cli 1.11.0 → 1.13.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 (298) hide show
  1. package/dist/config/ai-tool-registry.json +71 -0
  2. package/dist/config/autopilot-config.json +21 -0
  3. package/dist/config/competitive-catalog.json +83 -0
  4. package/dist/config/license-plans.json +43 -2
  5. package/dist/engine/agent-registry/lifecycle-manager.d.ts +8 -0
  6. package/dist/engine/agent-registry/lifecycle-manager.d.ts.map +1 -0
  7. package/dist/engine/agent-registry/lifecycle-manager.js +81 -0
  8. package/dist/engine/agent-registry/lifecycle-manager.js.map +1 -0
  9. package/dist/engine/agent-registry/role-catalog.d.ts +17 -0
  10. package/dist/engine/agent-registry/role-catalog.d.ts.map +1 -0
  11. package/dist/engine/agent-registry/role-catalog.js +55 -0
  12. package/dist/engine/agent-registry/role-catalog.js.map +1 -0
  13. package/dist/engine/api-compat/compatibility-checker.d.ts +4 -0
  14. package/dist/engine/api-compat/compatibility-checker.d.ts.map +1 -0
  15. package/dist/engine/api-compat/compatibility-checker.js +118 -0
  16. package/dist/engine/api-compat/compatibility-checker.js.map +1 -0
  17. package/dist/engine/autopilot/action-executor.d.ts +18 -0
  18. package/dist/engine/autopilot/action-executor.d.ts.map +1 -0
  19. package/dist/engine/autopilot/action-executor.js +91 -0
  20. package/dist/engine/autopilot/action-executor.js.map +1 -0
  21. package/dist/engine/autopilot/event-bus.d.ts +8 -0
  22. package/dist/engine/autopilot/event-bus.d.ts.map +1 -0
  23. package/dist/engine/autopilot/event-bus.js +28 -0
  24. package/dist/engine/autopilot/event-bus.js.map +1 -0
  25. package/dist/engine/autopilot/trigger-rules.d.ts +3 -0
  26. package/dist/engine/autopilot/trigger-rules.d.ts.map +1 -0
  27. package/dist/engine/autopilot/trigger-rules.js +125 -0
  28. package/dist/engine/autopilot/trigger-rules.js.map +1 -0
  29. package/dist/engine/checkpoint/checkpoint-manager.d.ts +22 -0
  30. package/dist/engine/checkpoint/checkpoint-manager.d.ts.map +1 -0
  31. package/dist/engine/checkpoint/checkpoint-manager.js +76 -0
  32. package/dist/engine/checkpoint/checkpoint-manager.js.map +1 -0
  33. package/dist/engine/checkpoint/policy-engine.d.ts +10 -0
  34. package/dist/engine/checkpoint/policy-engine.d.ts.map +1 -0
  35. package/dist/engine/checkpoint/policy-engine.js +87 -0
  36. package/dist/engine/checkpoint/policy-engine.js.map +1 -0
  37. package/dist/engine/competitive/gap-analyzer.d.ts +12 -0
  38. package/dist/engine/competitive/gap-analyzer.d.ts.map +1 -0
  39. package/dist/engine/competitive/gap-analyzer.js +214 -0
  40. package/dist/engine/competitive/gap-analyzer.js.map +1 -0
  41. package/dist/engine/compliance/auto-remediator.d.ts +9 -0
  42. package/dist/engine/compliance/auto-remediator.d.ts.map +1 -0
  43. package/dist/engine/compliance/auto-remediator.js +118 -0
  44. package/dist/engine/compliance/auto-remediator.js.map +1 -0
  45. package/dist/engine/context-profile/profile-catalog.d.ts +5 -0
  46. package/dist/engine/context-profile/profile-catalog.d.ts.map +1 -0
  47. package/dist/engine/context-profile/profile-catalog.js +145 -0
  48. package/dist/engine/context-profile/profile-catalog.js.map +1 -0
  49. package/dist/engine/critical-path/path-analyzer.d.ts +3 -0
  50. package/dist/engine/critical-path/path-analyzer.d.ts.map +1 -0
  51. package/dist/engine/critical-path/path-analyzer.js +145 -0
  52. package/dist/engine/critical-path/path-analyzer.js.map +1 -0
  53. package/dist/engine/drift/violation-resolver.d.ts +9 -0
  54. package/dist/engine/drift/violation-resolver.d.ts.map +1 -0
  55. package/dist/engine/drift/violation-resolver.js +128 -0
  56. package/dist/engine/drift/violation-resolver.js.map +1 -0
  57. package/dist/engine/ears/criterion-scorer.d.ts +7 -0
  58. package/dist/engine/ears/criterion-scorer.d.ts.map +1 -0
  59. package/dist/engine/ears/criterion-scorer.js +87 -0
  60. package/dist/engine/ears/criterion-scorer.js.map +1 -0
  61. package/dist/engine/ears/pattern-matcher.d.ts +5 -0
  62. package/dist/engine/ears/pattern-matcher.d.ts.map +1 -0
  63. package/dist/engine/ears/pattern-matcher.js +48 -0
  64. package/dist/engine/ears/pattern-matcher.js.map +1 -0
  65. package/dist/engine/ears/rewriter.d.ts +7 -0
  66. package/dist/engine/ears/rewriter.d.ts.map +1 -0
  67. package/dist/engine/ears/rewriter.js +45 -0
  68. package/dist/engine/ears/rewriter.js.map +1 -0
  69. package/dist/engine/ears/spec-linter.d.ts +7 -0
  70. package/dist/engine/ears/spec-linter.d.ts.map +1 -0
  71. package/dist/engine/ears/spec-linter.js +127 -0
  72. package/dist/engine/ears/spec-linter.js.map +1 -0
  73. package/dist/engine/health/auto-fixer.d.ts +7 -0
  74. package/dist/engine/health/auto-fixer.d.ts.map +1 -0
  75. package/dist/engine/health/auto-fixer.js +130 -0
  76. package/dist/engine/health/auto-fixer.js.map +1 -0
  77. package/dist/engine/hook-generator/ai-hook-templates.d.ts +8 -0
  78. package/dist/engine/hook-generator/ai-hook-templates.d.ts.map +1 -0
  79. package/dist/engine/hook-generator/ai-hook-templates.js +43 -0
  80. package/dist/engine/hook-generator/ai-hook-templates.js.map +1 -0
  81. package/dist/engine/hook-generator/hook-merger.d.ts +13 -0
  82. package/dist/engine/hook-generator/hook-merger.d.ts.map +1 -0
  83. package/dist/engine/hook-generator/hook-merger.js +148 -0
  84. package/dist/engine/hook-generator/hook-merger.js.map +1 -0
  85. package/dist/engine/hook-generator/stack-hook-templates.d.ts +10 -0
  86. package/dist/engine/hook-generator/stack-hook-templates.d.ts.map +1 -0
  87. package/dist/engine/hook-generator/stack-hook-templates.js +105 -0
  88. package/dist/engine/hook-generator/stack-hook-templates.js.map +1 -0
  89. package/dist/engine/mcp-catalog/catalog-advisor.d.ts +3 -0
  90. package/dist/engine/mcp-catalog/catalog-advisor.d.ts.map +1 -0
  91. package/dist/engine/mcp-catalog/catalog-advisor.js +180 -0
  92. package/dist/engine/mcp-catalog/catalog-advisor.js.map +1 -0
  93. package/dist/engine/project-dna/ai-tool-detector.d.ts +12 -0
  94. package/dist/engine/project-dna/ai-tool-detector.d.ts.map +1 -0
  95. package/dist/engine/project-dna/ai-tool-detector.js +103 -0
  96. package/dist/engine/project-dna/ai-tool-detector.js.map +1 -0
  97. package/dist/engine/project-dna/rules-generator.d.ts +18 -0
  98. package/dist/engine/project-dna/rules-generator.d.ts.map +1 -0
  99. package/dist/engine/project-dna/rules-generator.js +193 -0
  100. package/dist/engine/project-dna/rules-generator.js.map +1 -0
  101. package/dist/engine/project-dna/stack-detector.d.ts +24 -0
  102. package/dist/engine/project-dna/stack-detector.d.ts.map +1 -0
  103. package/dist/engine/project-dna/stack-detector.js +309 -0
  104. package/dist/engine/project-dna/stack-detector.js.map +1 -0
  105. package/dist/engine/similar-problems/similarity-finder.d.ts +3 -0
  106. package/dist/engine/similar-problems/similarity-finder.d.ts.map +1 -0
  107. package/dist/engine/similar-problems/similarity-finder.js +144 -0
  108. package/dist/engine/similar-problems/similarity-finder.js.map +1 -0
  109. package/dist/engine/sync/asana-puller.d.ts +9 -0
  110. package/dist/engine/sync/asana-puller.d.ts.map +1 -0
  111. package/dist/engine/sync/asana-puller.js +91 -0
  112. package/dist/engine/sync/asana-puller.js.map +1 -0
  113. package/dist/engine/sync/conflict-resolver.d.ts +17 -0
  114. package/dist/engine/sync/conflict-resolver.d.ts.map +1 -0
  115. package/dist/engine/sync/conflict-resolver.js +58 -0
  116. package/dist/engine/sync/conflict-resolver.js.map +1 -0
  117. package/dist/engine/sync/monday-puller.d.ts +9 -0
  118. package/dist/engine/sync/monday-puller.d.ts.map +1 -0
  119. package/dist/engine/sync/monday-puller.js +110 -0
  120. package/dist/engine/sync/monday-puller.js.map +1 -0
  121. package/dist/engine/sync/notion-puller.d.ts +15 -0
  122. package/dist/engine/sync/notion-puller.d.ts.map +1 -0
  123. package/dist/engine/sync/notion-puller.js +101 -0
  124. package/dist/engine/sync/notion-puller.js.map +1 -0
  125. package/dist/engine/verifier/code-scanner.d.ts +8 -0
  126. package/dist/engine/verifier/code-scanner.d.ts.map +1 -0
  127. package/dist/engine/verifier/code-scanner.js +73 -0
  128. package/dist/engine/verifier/code-scanner.js.map +1 -0
  129. package/dist/engine/verifier/compliance-scorer.d.ts +17 -0
  130. package/dist/engine/verifier/compliance-scorer.d.ts.map +1 -0
  131. package/dist/engine/verifier/compliance-scorer.js +131 -0
  132. package/dist/engine/verifier/compliance-scorer.js.map +1 -0
  133. package/dist/engine/verifier/criterion-matcher.d.ts +15 -0
  134. package/dist/engine/verifier/criterion-matcher.d.ts.map +1 -0
  135. package/dist/engine/verifier/criterion-matcher.js +210 -0
  136. package/dist/engine/verifier/criterion-matcher.js.map +1 -0
  137. package/dist/index.js +24 -0
  138. package/dist/index.js.map +1 -1
  139. package/dist/storage/agent-registry-store.d.ts +11 -0
  140. package/dist/storage/agent-registry-store.d.ts.map +1 -0
  141. package/dist/storage/agent-registry-store.js +45 -0
  142. package/dist/storage/agent-registry-store.js.map +1 -0
  143. package/dist/storage/compliance-score-store.d.ts +16 -0
  144. package/dist/storage/compliance-score-store.d.ts.map +1 -0
  145. package/dist/storage/compliance-score-store.js +30 -0
  146. package/dist/storage/compliance-score-store.js.map +1 -0
  147. package/dist/storage/context-profile-store.d.ts +14 -0
  148. package/dist/storage/context-profile-store.d.ts.map +1 -0
  149. package/dist/storage/context-profile-store.js +34 -0
  150. package/dist/storage/context-profile-store.js.map +1 -0
  151. package/dist/storage/workflow-checkpoint-store.d.ts +16 -0
  152. package/dist/storage/workflow-checkpoint-store.d.ts.map +1 -0
  153. package/dist/storage/workflow-checkpoint-store.js +71 -0
  154. package/dist/storage/workflow-checkpoint-store.js.map +1 -0
  155. package/dist/tools/checkpoint/approve-checkpoint-handler.d.ts +3 -0
  156. package/dist/tools/checkpoint/approve-checkpoint-handler.d.ts.map +1 -0
  157. package/dist/tools/checkpoint/approve-checkpoint-handler.js +32 -0
  158. package/dist/tools/checkpoint/approve-checkpoint-handler.js.map +1 -0
  159. package/dist/tools/checkpoint/configure-policy-handler.d.ts +3 -0
  160. package/dist/tools/checkpoint/configure-policy-handler.d.ts.map +1 -0
  161. package/dist/tools/checkpoint/configure-policy-handler.js +60 -0
  162. package/dist/tools/checkpoint/configure-policy-handler.js.map +1 -0
  163. package/dist/tools/checkpoint/list-checkpoints-handler.d.ts +3 -0
  164. package/dist/tools/checkpoint/list-checkpoints-handler.d.ts.map +1 -0
  165. package/dist/tools/checkpoint/list-checkpoints-handler.js +25 -0
  166. package/dist/tools/checkpoint/list-checkpoints-handler.js.map +1 -0
  167. package/dist/tools/checkpoint/reject-checkpoint-handler.d.ts +3 -0
  168. package/dist/tools/checkpoint/reject-checkpoint-handler.d.ts.map +1 -0
  169. package/dist/tools/checkpoint/reject-checkpoint-handler.js +32 -0
  170. package/dist/tools/checkpoint/reject-checkpoint-handler.js.map +1 -0
  171. package/dist/tools/checkpoint/require-checkpoint-handler.d.ts +3 -0
  172. package/dist/tools/checkpoint/require-checkpoint-handler.d.ts.map +1 -0
  173. package/dist/tools/checkpoint/require-checkpoint-handler.js +44 -0
  174. package/dist/tools/checkpoint/require-checkpoint-handler.js.map +1 -0
  175. package/dist/tools/competitive-handlers.d.ts +30 -0
  176. package/dist/tools/competitive-handlers.d.ts.map +1 -0
  177. package/dist/tools/competitive-handlers.js +155 -0
  178. package/dist/tools/competitive-handlers.js.map +1 -0
  179. package/dist/tools/create-spec/post-creation.d.ts +1 -1
  180. package/dist/tools/create-spec/post-creation.d.ts.map +1 -1
  181. package/dist/tools/create-spec/post-creation.js +13 -1
  182. package/dist/tools/create-spec/post-creation.js.map +1 -1
  183. package/dist/tools/create-spec.js +1 -1
  184. package/dist/tools/create-spec.js.map +1 -1
  185. package/dist/tools/hook-generator-handler.d.ts +8 -0
  186. package/dist/tools/hook-generator-handler.d.ts.map +1 -0
  187. package/dist/tools/hook-generator-handler.js +154 -0
  188. package/dist/tools/hook-generator-handler.js.map +1 -0
  189. package/dist/tools/project-dna-handler.d.ts +34 -0
  190. package/dist/tools/project-dna-handler.d.ts.map +1 -0
  191. package/dist/tools/project-dna-handler.js +261 -0
  192. package/dist/tools/project-dna-handler.js.map +1 -0
  193. package/dist/tools/pull-sync-handler.d.ts +25 -0
  194. package/dist/tools/pull-sync-handler.d.ts.map +1 -0
  195. package/dist/tools/pull-sync-handler.js +161 -0
  196. package/dist/tools/pull-sync-handler.js.map +1 -0
  197. package/dist/tools/register-agent-registry.d.ts +5 -0
  198. package/dist/tools/register-agent-registry.d.ts.map +1 -0
  199. package/dist/tools/register-agent-registry.js +254 -0
  200. package/dist/tools/register-agent-registry.js.map +1 -0
  201. package/dist/tools/register-auto-remediation.d.ts +3 -0
  202. package/dist/tools/register-auto-remediation.d.ts.map +1 -0
  203. package/dist/tools/register-auto-remediation.js +174 -0
  204. package/dist/tools/register-auto-remediation.js.map +1 -0
  205. package/dist/tools/register-autopilot.d.ts +3 -0
  206. package/dist/tools/register-autopilot.d.ts.map +1 -0
  207. package/dist/tools/register-autopilot.js +78 -0
  208. package/dist/tools/register-autopilot.js.map +1 -0
  209. package/dist/tools/register-checkpoints.d.ts +3 -0
  210. package/dist/tools/register-checkpoints.d.ts.map +1 -0
  211. package/dist/tools/register-checkpoints.js +134 -0
  212. package/dist/tools/register-checkpoints.js.map +1 -0
  213. package/dist/tools/register-competitive.d.ts +3 -0
  214. package/dist/tools/register-competitive.d.ts.map +1 -0
  215. package/dist/tools/register-competitive.js +88 -0
  216. package/dist/tools/register-competitive.js.map +1 -0
  217. package/dist/tools/register-context-profile.d.ts +3 -0
  218. package/dist/tools/register-context-profile.d.ts.map +1 -0
  219. package/dist/tools/register-context-profile.js +106 -0
  220. package/dist/tools/register-context-profile.js.map +1 -0
  221. package/dist/tools/register-ears.d.ts +3 -0
  222. package/dist/tools/register-ears.d.ts.map +1 -0
  223. package/dist/tools/register-ears.js +148 -0
  224. package/dist/tools/register-ears.js.map +1 -0
  225. package/dist/tools/register-enterprise-compliance.js +1 -1
  226. package/dist/tools/register-enterprise-compliance.js.map +1 -1
  227. package/dist/tools/register-hook-generator.d.ts +3 -0
  228. package/dist/tools/register-hook-generator.d.ts.map +1 -0
  229. package/dist/tools/register-hook-generator.js +96 -0
  230. package/dist/tools/register-hook-generator.js.map +1 -0
  231. package/dist/tools/register-project-dna.d.ts +3 -0
  232. package/dist/tools/register-project-dna.d.ts.map +1 -0
  233. package/dist/tools/register-project-dna.js +43 -0
  234. package/dist/tools/register-project-dna.js.map +1 -0
  235. package/dist/tools/register-pull-sync.d.ts +3 -0
  236. package/dist/tools/register-pull-sync.d.ts.map +1 -0
  237. package/dist/tools/register-pull-sync.js +71 -0
  238. package/dist/tools/register-pull-sync.js.map +1 -0
  239. package/dist/tools/register-spec405-tools.d.ts +7 -0
  240. package/dist/tools/register-spec405-tools.d.ts.map +1 -0
  241. package/dist/tools/register-spec405-tools.js +194 -0
  242. package/dist/tools/register-spec405-tools.js.map +1 -0
  243. package/dist/tools/register-verifier.d.ts +3 -0
  244. package/dist/tools/register-verifier.d.ts.map +1 -0
  245. package/dist/tools/register-verifier.js +141 -0
  246. package/dist/tools/register-verifier.js.map +1 -0
  247. package/dist/tools/update-status/side-effects.d.ts.map +1 -1
  248. package/dist/tools/update-status/side-effects.js +32 -0
  249. package/dist/tools/update-status/side-effects.js.map +1 -1
  250. package/dist/types/agent-registry.d.ts +53 -0
  251. package/dist/types/agent-registry.d.ts.map +1 -0
  252. package/dist/types/agent-registry.js +2 -0
  253. package/dist/types/agent-registry.js.map +1 -0
  254. package/dist/types/analysis.d.ts +98 -0
  255. package/dist/types/analysis.d.ts.map +1 -1
  256. package/dist/types/autopilot.d.ts +36 -0
  257. package/dist/types/autopilot.d.ts.map +1 -0
  258. package/dist/types/autopilot.js +3 -0
  259. package/dist/types/autopilot.js.map +1 -0
  260. package/dist/types/competitive.d.ts +41 -0
  261. package/dist/types/competitive.d.ts.map +1 -0
  262. package/dist/types/competitive.js +3 -0
  263. package/dist/types/competitive.js.map +1 -0
  264. package/dist/types/context-profile.d.ts +22 -0
  265. package/dist/types/context-profile.d.ts.map +1 -0
  266. package/dist/types/context-profile.js +2 -0
  267. package/dist/types/context-profile.js.map +1 -0
  268. package/dist/types/ears.d.ts +34 -0
  269. package/dist/types/ears.d.ts.map +1 -0
  270. package/dist/types/ears.js +3 -0
  271. package/dist/types/ears.js.map +1 -0
  272. package/dist/types/health.d.ts +40 -0
  273. package/dist/types/health.d.ts.map +1 -0
  274. package/dist/types/health.js +3 -0
  275. package/dist/types/health.js.map +1 -0
  276. package/dist/types/hook-generator.d.ts +49 -0
  277. package/dist/types/hook-generator.d.ts.map +1 -0
  278. package/dist/types/hook-generator.js +3 -0
  279. package/dist/types/hook-generator.js.map +1 -0
  280. package/dist/types/index.d.ts +9 -0
  281. package/dist/types/index.d.ts.map +1 -1
  282. package/dist/types/index.js +9 -0
  283. package/dist/types/index.js.map +1 -1
  284. package/dist/types/notion-asana-monday.d.ts +38 -0
  285. package/dist/types/notion-asana-monday.d.ts.map +1 -1
  286. package/dist/types/project-dna.d.ts +46 -0
  287. package/dist/types/project-dna.d.ts.map +1 -0
  288. package/dist/types/project-dna.js +4 -0
  289. package/dist/types/project-dna.js.map +1 -0
  290. package/dist/types/workflow-checkpoint.d.ts +66 -0
  291. package/dist/types/workflow-checkpoint.d.ts.map +1 -0
  292. package/dist/types/workflow-checkpoint.js +4 -0
  293. package/dist/types/workflow-checkpoint.js.map +1 -0
  294. package/package.json +1 -1
  295. package/src/config/ai-tool-registry.json +71 -0
  296. package/src/config/autopilot-config.json +21 -0
  297. package/src/config/competitive-catalog.json +83 -0
  298. package/src/config/license-plans.json +43 -2
@@ -0,0 +1,214 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Planu unique capabilities — source of truth
3
+ // ---------------------------------------------------------------------------
4
+ const PLANU_CAPABILITIES = [
5
+ 'mcp-protocol',
6
+ 'spec-driven-development',
7
+ 'drift-detection',
8
+ 'drift-watcher',
9
+ 'compliance-reporting',
10
+ 'ears-notation',
11
+ 'workflow-checkpoints',
12
+ 'context-profiles',
13
+ 'competitive-gap-analysis',
14
+ 'velocity-metrics',
15
+ 'auto-fix-health',
16
+ 'license-tiers',
17
+ 'multi-language-docs',
18
+ 'ai-code-alignment',
19
+ 'spec-health-scoring',
20
+ 'spec-history',
21
+ 'bdd-gherkin',
22
+ 'tdd-scaffold',
23
+ 'coverage-gap-analysis',
24
+ 'red-team',
25
+ 'challenge-spec',
26
+ 'require-checkpoint',
27
+ 'approve-checkpoint',
28
+ 'generate-compliance-evidence',
29
+ 'pull-from-notion',
30
+ 'pull-from-asana',
31
+ 'pull-from-monday',
32
+ 'validate-criteria-quality',
33
+ 'rewrite-criteria-ears',
34
+ 'session-checkpoint',
35
+ 'audit-claude-config',
36
+ ];
37
+ // ---------------------------------------------------------------------------
38
+ // Stop words for keyword extraction
39
+ // ---------------------------------------------------------------------------
40
+ const STOP_WORDS = new Set([
41
+ 'a',
42
+ 'an',
43
+ 'the',
44
+ 'and',
45
+ 'or',
46
+ 'is',
47
+ 'in',
48
+ 'on',
49
+ 'at',
50
+ 'to',
51
+ 'for',
52
+ 'of',
53
+ 'with',
54
+ 'by',
55
+ 'from',
56
+ 'as',
57
+ 'be',
58
+ 'are',
59
+ 'was',
60
+ 'were',
61
+ 'has',
62
+ 'have',
63
+ 'had',
64
+ 'do',
65
+ 'does',
66
+ 'did',
67
+ 'will',
68
+ 'would',
69
+ 'can',
70
+ 'could',
71
+ 'should',
72
+ 'may',
73
+ 'might',
74
+ 'must',
75
+ 'shall',
76
+ 'it',
77
+ 'its',
78
+ 'this',
79
+ 'that',
80
+ 'which',
81
+ 'who',
82
+ 'what',
83
+ 'when',
84
+ 'where',
85
+ 'how',
86
+ 'not',
87
+ 'no',
88
+ 'so',
89
+ 'if',
90
+ 'but',
91
+ 'yet',
92
+ 'than',
93
+ 'then',
94
+ 'also',
95
+ 'any',
96
+ 'all',
97
+ 'each',
98
+ 'such',
99
+ 'we',
100
+ 'our',
101
+ 'you',
102
+ 'your',
103
+ 'they',
104
+ 'their',
105
+ 'he',
106
+ 'she',
107
+ 'his',
108
+ 'her',
109
+ ]);
110
+ /**
111
+ * Extracts lowercase keywords from free text, removing stop words and
112
+ * short tokens. Returns a deduplicated array.
113
+ */
114
+ export function extractKeywords(text) {
115
+ const tokens = text
116
+ .toLowerCase()
117
+ .split(/[\s\-,.:;!?()[\]{}"'/\\|<>@#$%^&*+=~`]+/)
118
+ .map((t) => t.trim())
119
+ .filter((t) => t.length >= 3 && !STOP_WORDS.has(t));
120
+ return [...new Set(tokens)];
121
+ }
122
+ // ---------------------------------------------------------------------------
123
+ // Capability matching helpers
124
+ // ---------------------------------------------------------------------------
125
+ /**
126
+ * Returns true if any capability in `capabilities` contains `keyword` as a
127
+ * substring (case-insensitive after normalization).
128
+ */
129
+ function capabilityMatchesKeyword(capabilities, keyword) {
130
+ const lower = keyword.toLowerCase();
131
+ return capabilities.some((cap) => cap.toLowerCase().includes(lower));
132
+ }
133
+ /**
134
+ * Checks whether a list of capabilities matches at least one of the feature
135
+ * keywords.
136
+ */
137
+ function hasFeatureMatch(capabilities, keywords) {
138
+ return keywords.some((kw) => capabilityMatchesKeyword(capabilities, kw));
139
+ }
140
+ // ---------------------------------------------------------------------------
141
+ // Positioning thresholds
142
+ // ---------------------------------------------------------------------------
143
+ const PARITY_MIN = 2;
144
+ const PARITY_MAX = 4;
145
+ function computePositioning(matchCount) {
146
+ if (matchCount < PARITY_MIN) {
147
+ return 'differentiator';
148
+ }
149
+ if (matchCount <= PARITY_MAX) {
150
+ return 'parity';
151
+ }
152
+ return 'lagging';
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Main analysis function
156
+ // ---------------------------------------------------------------------------
157
+ /**
158
+ * Analyzes a feature (expressed as keywords) against all competitors in the
159
+ * catalog and returns a structured GapAnalysisResult.
160
+ */
161
+ export function analyzeGap(featureKeywords, catalog) {
162
+ const allCompetitors = Object.values(catalog.competitors);
163
+ // Build coverage map: competitorId -> whether they match any keyword
164
+ const coverage = {};
165
+ let matchCount = 0;
166
+ for (const competitor of allCompetitors) {
167
+ const matched = hasFeatureMatch(competitor.capabilities, featureKeywords);
168
+ coverage[competitor.id] = matched;
169
+ if (matched) {
170
+ matchCount++;
171
+ }
172
+ }
173
+ // Determine positioning
174
+ const positioning = computePositioning(matchCount);
175
+ // Compute Planu-unique capabilities: in PLANU_CAPABILITIES but not in any competitor
176
+ const allCompetitorCaps = allCompetitors.flatMap((c) => c.capabilities.map((cap) => cap.toLowerCase()));
177
+ const uniqueToPlanu = PLANU_CAPABILITIES.filter((cap) => !allCompetitorCaps.some((cc) => cc.includes(cap.toLowerCase())));
178
+ // Gaps: feature keywords not covered by Planu or any competitor
179
+ const planusCapabilitiesLower = PLANU_CAPABILITIES.map((c) => c.toLowerCase());
180
+ const gaps = featureKeywords.filter((kw) => !capabilityMatchesKeyword(planusCapabilitiesLower, kw) &&
181
+ !hasFeatureMatch(allCompetitors.flatMap((c) => c.capabilities), [kw]));
182
+ // Suggestions: derived from weaknesses of competitors that DO have the feature
183
+ const matchingCompetitors = allCompetitors.filter((c) => coverage[c.id] === true);
184
+ const suggestionSet = new Set();
185
+ for (const competitor of matchingCompetitors) {
186
+ for (const weakness of competitor.weaknesses) {
187
+ suggestionSet.add(`Differentiate from ${competitor.name}: ${weakness}`);
188
+ }
189
+ }
190
+ const suggestions = [...suggestionSet];
191
+ // Summary
192
+ const competitorNames = matchingCompetitors.map((c) => c.name);
193
+ const positioningLabel = positioning === 'differentiator'
194
+ ? 'a strong differentiator'
195
+ : positioning === 'parity'
196
+ ? 'at parity'
197
+ : 'potentially lagging';
198
+ const summary = `Feature analysis: Planu is ${positioningLabel} in this area. ` +
199
+ (competitorNames.length > 0
200
+ ? `Competitors with similar capabilities: ${competitorNames.join(', ')}. `
201
+ : 'No direct competitor matches found. ') +
202
+ (uniqueToPlanu.length > 0
203
+ ? `Planu-unique capabilities: ${uniqueToPlanu.slice(0, 5).join(', ')}${uniqueToPlanu.length > 5 ? ` (+${uniqueToPlanu.length - 5} more)` : ''}.`
204
+ : 'No unique capabilities identified for this query.');
205
+ return {
206
+ positioning,
207
+ coverage,
208
+ uniqueToPlanu,
209
+ gaps,
210
+ suggestions,
211
+ summary,
212
+ };
213
+ }
214
+ //# sourceMappingURL=gap-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gap-analyzer.js","sourceRoot":"","sources":["../../../src/engine/competitive/gap-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ComplianceRemediationResult } from '../../types/health.js';
2
+ type RemediationFramework = 'SOC2' | 'GDPR' | 'HIPAA' | 'ISO27001';
3
+ /**
4
+ * For each compliance gap, creates a stub spec so the team has a tracked
5
+ * work item. When dryRun=true, returns findings without writing any files.
6
+ */
7
+ export declare function autoRemediateCompliance(projectPath: string, projectId: string, framework: RemediationFramework, dryRun?: boolean): Promise<ComplianceRemediationResult>;
8
+ export {};
9
+ //# sourceMappingURL=auto-remediator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-remediator.d.ts","sourceRoot":"","sources":["../../../src/engine/compliance/auto-remediator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAgB,MAAM,uBAAuB,CAAC;AAUvF,KAAK,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AA4FnE;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,oBAAoB,EAC/B,MAAM,UAAQ,GACb,OAAO,CAAC,2BAA2B,CAAC,CAoDtC"}
@@ -0,0 +1,118 @@
1
+ // engine/compliance/auto-remediator.ts — Auto-remediation for compliance gaps (SPEC-408)
2
+ import { mkdir, writeFile, access } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ import { specStore } from '../../storage/index.js';
5
+ import { analyzeComplianceGaps } from './gap-analyzer.js';
6
+ const FRAMEWORK_MAP = {
7
+ SOC2: 'soc2-type2',
8
+ GDPR: 'gdpr',
9
+ HIPAA: 'hipaa',
10
+ ISO27001: 'iso27001',
11
+ };
12
+ // ---------------------------------------------------------------------------
13
+ // Spec file writer
14
+ // ---------------------------------------------------------------------------
15
+ async function specDirExists(specDir) {
16
+ try {
17
+ await access(specDir);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ async function writeStubSpec(projectPath, specId, title, framework, criteria, dryRun) {
25
+ if (dryRun) {
26
+ return;
27
+ }
28
+ const specDir = join(projectPath, 'planu', 'specs', specId);
29
+ await mkdir(specDir, { recursive: true });
30
+ const criteriaLines = criteria.map((c) => `- [ ] ${c}`).join('\n');
31
+ const now = new Date().toISOString();
32
+ const specContent = [
33
+ '---',
34
+ `id: ${specId}`,
35
+ `title: "${title}"`,
36
+ `status: draft`,
37
+ `tags: [compliance, ${framework.toLowerCase()}, auto-generated]`,
38
+ `createdAt: ${now}`,
39
+ '---',
40
+ '',
41
+ `# ${title}`,
42
+ '',
43
+ `Auto-generated compliance spec for ${framework} framework.`,
44
+ '',
45
+ '## Acceptance Criteria',
46
+ '',
47
+ criteriaLines,
48
+ '',
49
+ ].join('\n');
50
+ await writeFile(join(specDir, 'spec.md'), specContent, 'utf-8');
51
+ await writeFile(join(specDir, 'progress.md'), `# ${specId} — Progress\n\nstatus: draft\n`, 'utf-8');
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // Manual action builders
55
+ // ---------------------------------------------------------------------------
56
+ function buildManualAction(controlId, controlName, criteria) {
57
+ return {
58
+ control: controlId,
59
+ description: `${controlName} requires manual process implementation`,
60
+ steps: [
61
+ `Review control ${controlId}: ${controlName}`,
62
+ 'Identify existing policies and procedures that address this control',
63
+ 'Document evidence in a spec or decision record',
64
+ ...criteria.map((c) => `Verify: ${c}`),
65
+ ],
66
+ };
67
+ }
68
+ // ---------------------------------------------------------------------------
69
+ // Public API
70
+ // ---------------------------------------------------------------------------
71
+ /**
72
+ * For each compliance gap, creates a stub spec so the team has a tracked
73
+ * work item. When dryRun=true, returns findings without writing any files.
74
+ */
75
+ export async function autoRemediateCompliance(projectPath, projectId, framework, dryRun = false) {
76
+ const catalogFramework = FRAMEWORK_MAP[framework];
77
+ const specs = await specStore.listSpecs(projectId);
78
+ const specInputs = specs.map((s) => ({
79
+ id: s.id,
80
+ title: s.title,
81
+ description: '',
82
+ status: s.status,
83
+ }));
84
+ const gapResult = analyzeComplianceGaps(catalogFramework, specInputs);
85
+ const createdSpecs = [];
86
+ const alreadyCovered = [];
87
+ const manualActionRequired = [];
88
+ const timestamp = Date.now();
89
+ for (const control of gapResult.coverage) {
90
+ if (control.status === 'passing') {
91
+ alreadyCovered.push(control.controlId);
92
+ continue;
93
+ }
94
+ if (control.status === 'missing') {
95
+ const slugControl = control.controlId.toLowerCase().replace(/[^a-z0-9]/g, '-');
96
+ const specId = `SPEC-auto-${slugControl}-${timestamp}`;
97
+ const title = `${framework} ${control.controlId} — ${control.controlName}`;
98
+ const specDir = join(projectPath, 'planu', 'specs', specId);
99
+ if (await specDirExists(specDir)) {
100
+ alreadyCovered.push(control.controlId);
101
+ continue;
102
+ }
103
+ await writeStubSpec(projectPath, specId, title, framework, control.requiredCriteria, dryRun);
104
+ createdSpecs.push(specId);
105
+ }
106
+ else {
107
+ // partial — manual action to complete coverage
108
+ manualActionRequired.push(buildManualAction(control.controlId, control.controlName, control.requiredCriteria));
109
+ }
110
+ }
111
+ return {
112
+ framework,
113
+ createdSpecs,
114
+ alreadyCovered,
115
+ manualActionRequired,
116
+ };
117
+ }
118
+ //# sourceMappingURL=auto-remediator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-remediator.js","sourceRoot":"","sources":["../../../src/engine/compliance/auto-remediator.ts"],"names":[],"mappings":"AAAA,yFAAyF;AAEzF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAU1D,MAAM,aAAa,GAAsD;IACvE,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,UAAU;CACrB,CAAC;AAEF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,WAAmB,EACnB,MAAc,EACd,KAAa,EACb,SAA+B,EAC/B,QAAkB,EAClB,MAAe;IAEf,IAAI,MAAM,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5D,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1C,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,MAAM,WAAW,GAAG;QAClB,KAAK;QACL,OAAO,MAAM,EAAE;QACf,WAAW,KAAK,GAAG;QACnB,eAAe;QACf,sBAAsB,SAAS,CAAC,WAAW,EAAE,mBAAmB;QAChE,cAAc,GAAG,EAAE;QACnB,KAAK;QACL,EAAE;QACF,KAAK,KAAK,EAAE;QACZ,EAAE;QACF,sCAAsC,SAAS,aAAa;QAC5D,EAAE;QACF,wBAAwB;QACxB,EAAE;QACF,aAAa;QACb,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAChE,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,EAC5B,KAAK,MAAM,gCAAgC,EAC3C,OAAO,CACR,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,SAAS,iBAAiB,CACxB,SAAiB,EACjB,WAAmB,EACnB,QAAkB;IAElB,OAAO;QACL,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,GAAG,WAAW,yCAAyC;QACpE,KAAK,EAAE;YACL,kBAAkB,SAAS,KAAK,WAAW,EAAE;YAC7C,qEAAqE;YACrE,gDAAgD;YAChD,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC;SACvC;KACF,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,WAAmB,EACnB,SAAiB,EACjB,SAA+B,EAC/B,MAAM,GAAG,KAAK;IAEd,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAEnD,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACnC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,WAAW,EAAE,EAAE;QACf,MAAM,EAAE,CAAC,CAAC,MAAM;KACjB,CAAC,CAAC,CAAC;IAEJ,MAAM,SAAS,GAAG,qBAAqB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;IAEtE,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,MAAM,oBAAoB,GAAmB,EAAE,CAAC;IAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACzC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,aAAa,WAAW,IAAI,SAAS,EAAE,CAAC;YACvD,MAAM,KAAK,GAAG,GAAG,SAAS,IAAI,OAAO,CAAC,SAAS,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;YAE3E,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5D,IAAI,MAAM,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACvC,SAAS;YACX,CAAC;YAED,MAAM,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YAC7F,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,+CAA+C;YAC/C,oBAAoB,CAAC,IAAI,CACvB,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,SAAS;QACT,YAAY;QACZ,cAAc;QACd,oBAAoB;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ContextProfile, WorkPhase } from '../../types/context-profile.js';
2
+ export declare const PROFILE_CATALOG: Record<WorkPhase, ContextProfile>;
3
+ export declare function getProfile(phase: WorkPhase): ContextProfile;
4
+ export declare function getAllProfiles(): ContextProfile[];
5
+ //# sourceMappingURL=profile-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-catalog.d.ts","sourceRoot":"","sources":["../../../src/engine/context-profile/profile-catalog.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAEhF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,cAAc,CAyI7D,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc,CAE3D;AAED,wBAAgB,cAAc,IAAI,cAAc,EAAE,CAEjD"}
@@ -0,0 +1,145 @@
1
+ export const PROFILE_CATALOG = {
2
+ brainstorm: {
3
+ phase: 'brainstorm',
4
+ name: 'Brainstorm Mode',
5
+ description: 'Explore ideas, capture requirements, define scope',
6
+ focusTools: [
7
+ 'capture_idea',
8
+ 'clarify_requirements',
9
+ 'elicit_requirements',
10
+ 'suggest_stack',
11
+ 'create_spec',
12
+ 'list_backlog',
13
+ 'promote_idea',
14
+ 'discard_idea',
15
+ 'search_suggestions',
16
+ 'suggest_criteria',
17
+ ],
18
+ avoidTools: ['validate', 'lock_spec', 'approve_spec', 'create_release', 'generate_changelog'],
19
+ tips: [
20
+ 'Use capture_idea for rough thoughts before formalizing',
21
+ 'Use clarify_requirements to interview stakeholders',
22
+ 'Use elicit_requirements for structured requirement gathering',
23
+ 'Use create_spec only when ready to commit to a feature',
24
+ ],
25
+ estimatedTokensSaved: 85,
26
+ },
27
+ plan: {
28
+ phase: 'plan',
29
+ name: 'Planning Mode',
30
+ description: 'Design specs, estimate effort, check readiness',
31
+ focusTools: [
32
+ 'create_spec',
33
+ 'decompose_spec',
34
+ 'estimate',
35
+ 'check_readiness',
36
+ 'challenge_spec',
37
+ 'inject_quality_gates',
38
+ 'suggest_criteria',
39
+ 'clarify_requirements',
40
+ 'analyze_spec_dependencies',
41
+ 'critical_path_analyzer',
42
+ ],
43
+ avoidTools: ['lock_spec', 'create_release', 'generate_changelog', 'tdd_scaffold'],
44
+ tips: [
45
+ 'Use challenge_spec to stress-test before approving',
46
+ 'Use check_readiness to verify sufficient detail',
47
+ 'Use inject_quality_gates to add quality checklist automatically',
48
+ 'Use decompose_spec for large specs that should be split',
49
+ ],
50
+ estimatedTokensSaved: 82,
51
+ },
52
+ implement: {
53
+ phase: 'implement',
54
+ name: 'Implementation Mode',
55
+ description: 'Build features, track progress, manage sessions',
56
+ focusTools: [
57
+ 'list_specs',
58
+ 'update_status',
59
+ 'lock_spec',
60
+ 'unlock_spec',
61
+ 'tdd_scaffold',
62
+ 'validate',
63
+ 'session_checkpoint',
64
+ 'session_handoff',
65
+ 'planu_status',
66
+ 'generate_tests',
67
+ 'verify_spec_compliance',
68
+ ],
69
+ avoidTools: [
70
+ 'create_spec',
71
+ 'elicit_requirements',
72
+ 'create_release',
73
+ 'generate_changelog',
74
+ 'team_analytics',
75
+ ],
76
+ tips: [
77
+ 'Use lock_spec before starting to prevent conflicts',
78
+ 'Use session_checkpoint before context resets',
79
+ 'Use validate after implementing to check compliance',
80
+ 'Use update_status to track progress through lifecycle',
81
+ ],
82
+ estimatedTokensSaved: 88,
83
+ },
84
+ review: {
85
+ phase: 'review',
86
+ name: 'Review Mode',
87
+ description: 'Validate, approve, request changes, verify quality',
88
+ focusTools: [
89
+ 'validate',
90
+ 'verify_spec_compliance',
91
+ 'spec_quality_score',
92
+ 'approve_spec',
93
+ 'request_changes',
94
+ 'challenge_spec',
95
+ 'check_readiness',
96
+ 'review_pr',
97
+ 'ears_lint',
98
+ 'validate_criteria_quality',
99
+ ],
100
+ avoidTools: ['lock_spec', 'create_release', 'tdd_scaffold', 'capture_idea'],
101
+ tips: [
102
+ 'Use validate to check acceptance criteria compliance',
103
+ 'Use verify_spec_compliance to score code coverage',
104
+ 'Use ears_lint to check criteria quality',
105
+ 'Use approve_spec only when all criteria are verified',
106
+ ],
107
+ estimatedTokensSaved: 87,
108
+ },
109
+ release: {
110
+ phase: 'release',
111
+ name: 'Release Mode',
112
+ description: 'Prepare releases, generate changelogs, version specs',
113
+ focusTools: [
114
+ 'generate_changelog',
115
+ 'create_release',
116
+ 'version_spec',
117
+ 'export_specs_markdown',
118
+ 'generate_docs_site',
119
+ 'spec_usage_report',
120
+ 'velocity_report',
121
+ 'update_status',
122
+ ],
123
+ avoidTools: [
124
+ 'create_spec',
125
+ 'lock_spec',
126
+ 'tdd_scaffold',
127
+ 'capture_idea',
128
+ 'clarify_requirements',
129
+ ],
130
+ tips: [
131
+ 'Use generate_changelog to compile release notes from done specs',
132
+ 'Use create_release to tag and publish the version',
133
+ 'Use velocity_report to measure team performance this cycle',
134
+ 'Mark all specs done before creating the release',
135
+ ],
136
+ estimatedTokensSaved: 90,
137
+ },
138
+ };
139
+ export function getProfile(phase) {
140
+ return PROFILE_CATALOG[phase];
141
+ }
142
+ export function getAllProfiles() {
143
+ return Object.values(PROFILE_CATALOG);
144
+ }
145
+ //# sourceMappingURL=profile-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-catalog.js","sourceRoot":"","sources":["../../../src/engine/context-profile/profile-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Spec405CriticalPathResult } from '../../types/index.js';
2
+ export declare function analyzeCriticalPath(projectPath: string): Promise<Spec405CriticalPathResult>;
3
+ //# sourceMappingURL=path-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/critical-path/path-analyzer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,yBAAyB,EAAmB,MAAM,sBAAsB,CAAC;AA8FvF,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAyEjG"}