@planu/cli 0.71.0 → 0.73.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 (283) hide show
  1. package/README.md +1 -1
  2. package/dist/config/license-plans.json +9 -2
  3. package/dist/config/tool-groups.json +5 -1
  4. package/dist/engine/actuals/git-analyzer.js +1 -1
  5. package/dist/engine/actuals/git-analyzer.js.map +1 -1
  6. package/dist/engine/agent-prompt-generator.d.ts +12 -0
  7. package/dist/engine/agent-prompt-generator.d.ts.map +1 -0
  8. package/dist/engine/agent-prompt-generator.js +171 -0
  9. package/dist/engine/agent-prompt-generator.js.map +1 -0
  10. package/dist/engine/ai-tool-detector/index.d.ts +6 -0
  11. package/dist/engine/ai-tool-detector/index.d.ts.map +1 -0
  12. package/dist/engine/ai-tool-detector/index.js +95 -0
  13. package/dist/engine/ai-tool-detector/index.js.map +1 -0
  14. package/dist/engine/ci-generator/planu-steps.d.ts.map +1 -1
  15. package/dist/engine/ci-generator/planu-steps.js +10 -11
  16. package/dist/engine/ci-generator/planu-steps.js.map +1 -1
  17. package/dist/engine/convention-scanner/codebase-scanner.d.ts +7 -0
  18. package/dist/engine/convention-scanner/codebase-scanner.d.ts.map +1 -0
  19. package/dist/engine/convention-scanner/codebase-scanner.js +258 -0
  20. package/dist/engine/convention-scanner/codebase-scanner.js.map +1 -0
  21. package/dist/engine/convention-scanner/convention-parser.d.ts +7 -0
  22. package/dist/engine/convention-scanner/convention-parser.d.ts.map +1 -0
  23. package/dist/engine/convention-scanner/convention-parser.js +195 -0
  24. package/dist/engine/convention-scanner/convention-parser.js.map +1 -0
  25. package/dist/engine/convention-scanner/index.d.ts +3 -0
  26. package/dist/engine/convention-scanner/index.d.ts.map +1 -0
  27. package/dist/engine/convention-scanner/index.js +5 -0
  28. package/dist/engine/convention-scanner/index.js.map +1 -0
  29. package/dist/engine/convention-sync.d.ts +9 -0
  30. package/dist/engine/convention-sync.d.ts.map +1 -0
  31. package/dist/engine/convention-sync.js +156 -0
  32. package/dist/engine/convention-sync.js.map +1 -0
  33. package/dist/engine/doc-generator/portal/portal-regenerator.d.ts +2 -1
  34. package/dist/engine/doc-generator/portal/portal-regenerator.d.ts.map +1 -1
  35. package/dist/engine/doc-generator/portal/portal-regenerator.js +23 -15
  36. package/dist/engine/doc-generator/portal/portal-regenerator.js.map +1 -1
  37. package/dist/engine/feedback/triage.d.ts +16 -0
  38. package/dist/engine/feedback/triage.d.ts.map +1 -0
  39. package/dist/engine/feedback/triage.js +165 -0
  40. package/dist/engine/feedback/triage.js.map +1 -0
  41. package/dist/engine/hooks-reconciler.d.ts +7 -0
  42. package/dist/engine/hooks-reconciler.d.ts.map +1 -0
  43. package/dist/engine/hooks-reconciler.js +214 -0
  44. package/dist/engine/hooks-reconciler.js.map +1 -0
  45. package/dist/engine/platform-registry.d.ts +17 -0
  46. package/dist/engine/platform-registry.d.ts.map +1 -0
  47. package/dist/engine/platform-registry.js +78 -0
  48. package/dist/engine/platform-registry.js.map +1 -0
  49. package/dist/engine/project-health-checker.d.ts +4 -2
  50. package/dist/engine/project-health-checker.d.ts.map +1 -1
  51. package/dist/engine/project-health-checker.js +78 -5
  52. package/dist/engine/project-health-checker.js.map +1 -1
  53. package/dist/engine/rules-generator/index.d.ts +14 -0
  54. package/dist/engine/rules-generator/index.d.ts.map +1 -0
  55. package/dist/engine/rules-generator/index.js +313 -0
  56. package/dist/engine/rules-generator/index.js.map +1 -0
  57. package/dist/engine/rules-reconciler.d.ts +13 -0
  58. package/dist/engine/rules-reconciler.d.ts.map +1 -0
  59. package/dist/engine/rules-reconciler.js +193 -0
  60. package/dist/engine/rules-reconciler.js.map +1 -0
  61. package/dist/engine/skill-generator/detect.d.ts +1 -0
  62. package/dist/engine/skill-generator/detect.d.ts.map +1 -1
  63. package/dist/engine/skill-generator/detect.js +13 -5
  64. package/dist/engine/skill-generator/detect.js.map +1 -1
  65. package/dist/engine/skills/skills-fetcher.d.ts +4 -0
  66. package/dist/engine/skills/skills-fetcher.d.ts.map +1 -0
  67. package/dist/engine/skills/skills-fetcher.js +102 -0
  68. package/dist/engine/skills/skills-fetcher.js.map +1 -0
  69. package/dist/engine/skills-reconciler.d.ts +15 -0
  70. package/dist/engine/skills-reconciler.d.ts.map +1 -0
  71. package/dist/engine/skills-reconciler.js +98 -0
  72. package/dist/engine/skills-reconciler.js.map +1 -0
  73. package/dist/engine/spec-template-cleaner.d.ts +12 -0
  74. package/dist/engine/spec-template-cleaner.d.ts.map +1 -0
  75. package/dist/engine/spec-template-cleaner.js +119 -0
  76. package/dist/engine/spec-template-cleaner.js.map +1 -0
  77. package/dist/engine/validator/analyzer.d.ts +4 -2
  78. package/dist/engine/validator/analyzer.d.ts.map +1 -1
  79. package/dist/engine/validator/analyzer.js +14 -3
  80. package/dist/engine/validator/analyzer.js.map +1 -1
  81. package/dist/engine/validator/criterion-enricher.d.ts +42 -0
  82. package/dist/engine/validator/criterion-enricher.d.ts.map +1 -0
  83. package/dist/engine/validator/criterion-enricher.js +186 -0
  84. package/dist/engine/validator/criterion-enricher.js.map +1 -0
  85. package/dist/engine/validator/deep-code-checker.d.ts +41 -0
  86. package/dist/engine/validator/deep-code-checker.d.ts.map +1 -0
  87. package/dist/engine/validator/deep-code-checker.js +363 -0
  88. package/dist/engine/validator/deep-code-checker.js.map +1 -0
  89. package/dist/engine/validator/extractors.d.ts +8 -1
  90. package/dist/engine/validator/extractors.d.ts.map +1 -1
  91. package/dist/engine/validator/extractors.js +33 -0
  92. package/dist/engine/validator/extractors.js.map +1 -1
  93. package/dist/engine/validator/index.d.ts +7 -0
  94. package/dist/engine/validator/index.d.ts.map +1 -0
  95. package/dist/engine/validator/index.js +8 -0
  96. package/dist/engine/validator/index.js.map +1 -0
  97. package/dist/engine/validator.d.ts.map +1 -1
  98. package/dist/engine/validator.js +13 -2
  99. package/dist/engine/validator.js.map +1 -1
  100. package/dist/engine/workers/schema.d.ts +58 -0
  101. package/dist/engine/workers/schema.d.ts.map +1 -0
  102. package/dist/engine/workers/schema.js +41 -0
  103. package/dist/engine/workers/schema.js.map +1 -0
  104. package/dist/engine/workers/worker-engine.js +1 -1
  105. package/dist/engine/workers/worker-engine.js.map +1 -1
  106. package/dist/index.js +10 -0
  107. package/dist/index.js.map +1 -1
  108. package/dist/storage/convention-baseline.d.ts +20 -0
  109. package/dist/storage/convention-baseline.d.ts.map +1 -0
  110. package/dist/storage/convention-baseline.js +57 -0
  111. package/dist/storage/convention-baseline.js.map +1 -0
  112. package/dist/storage/feedback-remote.d.ts +8 -0
  113. package/dist/storage/feedback-remote.d.ts.map +1 -0
  114. package/dist/storage/feedback-remote.js +27 -0
  115. package/dist/storage/feedback-remote.js.map +1 -0
  116. package/dist/storage/feedback-store.d.ts +27 -0
  117. package/dist/storage/feedback-store.d.ts.map +1 -0
  118. package/dist/storage/feedback-store.js +272 -0
  119. package/dist/storage/feedback-store.js.map +1 -0
  120. package/dist/storage/index.d.ts +1 -0
  121. package/dist/storage/index.d.ts.map +1 -1
  122. package/dist/storage/index.js +1 -0
  123. package/dist/storage/index.js.map +1 -1
  124. package/dist/tools/convention-sync.d.ts +8 -0
  125. package/dist/tools/convention-sync.d.ts.map +1 -0
  126. package/dist/tools/convention-sync.js +77 -0
  127. package/dist/tools/convention-sync.js.map +1 -0
  128. package/dist/tools/create-spec-hu/ac-adapters/convention-adapter.d.ts +9 -0
  129. package/dist/tools/create-spec-hu/ac-adapters/convention-adapter.d.ts.map +1 -0
  130. package/dist/tools/create-spec-hu/ac-adapters/convention-adapter.js +68 -0
  131. package/dist/tools/create-spec-hu/ac-adapters/convention-adapter.js.map +1 -0
  132. package/dist/tools/create-spec-hu/ac-adapters/custom-template-adapter.d.ts +14 -0
  133. package/dist/tools/create-spec-hu/ac-adapters/custom-template-adapter.d.ts.map +1 -0
  134. package/dist/tools/create-spec-hu/ac-adapters/custom-template-adapter.js +60 -0
  135. package/dist/tools/create-spec-hu/ac-adapters/custom-template-adapter.js.map +1 -0
  136. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts +4 -0
  137. package/dist/tools/create-spec-hu/ac-adapters/index.d.ts.map +1 -1
  138. package/dist/tools/create-spec-hu/ac-adapters/index.js +9 -1
  139. package/dist/tools/create-spec-hu/ac-adapters/index.js.map +1 -1
  140. package/dist/tools/create-spec-hu/hu-body-generators.d.ts.map +1 -1
  141. package/dist/tools/create-spec-hu/hu-body-generators.js +15 -2
  142. package/dist/tools/create-spec-hu/hu-body-generators.js.map +1 -1
  143. package/dist/tools/create-spec.d.ts.map +1 -1
  144. package/dist/tools/create-spec.js +3 -2
  145. package/dist/tools/create-spec.js.map +1 -1
  146. package/dist/tools/delete-decision.d.ts.map +1 -1
  147. package/dist/tools/delete-decision.js +2 -0
  148. package/dist/tools/delete-decision.js.map +1 -1
  149. package/dist/tools/delete-project.d.ts.map +1 -1
  150. package/dist/tools/delete-project.js +11 -14
  151. package/dist/tools/delete-project.js.map +1 -1
  152. package/dist/tools/delete-spec.d.ts.map +1 -1
  153. package/dist/tools/delete-spec.js +11 -9
  154. package/dist/tools/delete-spec.js.map +1 -1
  155. package/dist/tools/estimate.d.ts.map +1 -1
  156. package/dist/tools/estimate.js +6 -5
  157. package/dist/tools/estimate.js.map +1 -1
  158. package/dist/tools/export-session.d.ts.map +1 -1
  159. package/dist/tools/export-session.js +7 -9
  160. package/dist/tools/export-session.js.map +1 -1
  161. package/dist/tools/feedback-handler.d.ts +5 -0
  162. package/dist/tools/feedback-handler.d.ts.map +1 -0
  163. package/dist/tools/feedback-handler.js +106 -0
  164. package/dist/tools/feedback-handler.js.map +1 -0
  165. package/dist/tools/generate-teammate-prompt.d.ts +8 -0
  166. package/dist/tools/generate-teammate-prompt.d.ts.map +1 -1
  167. package/dist/tools/generate-teammate-prompt.js +33 -0
  168. package/dist/tools/generate-teammate-prompt.js.map +1 -1
  169. package/dist/tools/init-project/handler.d.ts.map +1 -1
  170. package/dist/tools/init-project/handler.js +73 -15
  171. package/dist/tools/init-project/handler.js.map +1 -1
  172. package/dist/tools/init-project/helpers.d.ts.map +1 -1
  173. package/dist/tools/init-project/helpers.js +1 -2
  174. package/dist/tools/init-project/helpers.js.map +1 -1
  175. package/dist/tools/init-project/result-builder.d.ts.map +1 -1
  176. package/dist/tools/init-project/result-builder.js +13 -1
  177. package/dist/tools/init-project/result-builder.js.map +1 -1
  178. package/dist/tools/init-project/skill-auto-installer.d.ts +10 -0
  179. package/dist/tools/init-project/skill-auto-installer.d.ts.map +1 -0
  180. package/dist/tools/init-project/skill-auto-installer.js +28 -0
  181. package/dist/tools/init-project/skill-auto-installer.js.map +1 -0
  182. package/dist/tools/log-decision.d.ts.map +1 -1
  183. package/dist/tools/log-decision.js +15 -4
  184. package/dist/tools/log-decision.js.map +1 -1
  185. package/dist/tools/manage-trash.d.ts.map +1 -1
  186. package/dist/tools/manage-trash.js +13 -27
  187. package/dist/tools/manage-trash.js.map +1 -1
  188. package/dist/tools/reconcile-hooks.d.ts +7 -0
  189. package/dist/tools/reconcile-hooks.d.ts.map +1 -0
  190. package/dist/tools/reconcile-hooks.js +78 -0
  191. package/dist/tools/reconcile-hooks.js.map +1 -0
  192. package/dist/tools/reconcile-rules.d.ts +7 -0
  193. package/dist/tools/reconcile-rules.d.ts.map +1 -0
  194. package/dist/tools/reconcile-rules.js +86 -0
  195. package/dist/tools/reconcile-rules.js.map +1 -0
  196. package/dist/tools/reconcile-skills.d.ts +8 -0
  197. package/dist/tools/reconcile-skills.d.ts.map +1 -0
  198. package/dist/tools/reconcile-skills.js +70 -0
  199. package/dist/tools/reconcile-skills.js.map +1 -0
  200. package/dist/tools/register-feedback-tools.d.ts +3 -0
  201. package/dist/tools/register-feedback-tools.d.ts.map +1 -0
  202. package/dist/tools/register-feedback-tools.js +65 -0
  203. package/dist/tools/register-feedback-tools.js.map +1 -0
  204. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  205. package/dist/tools/register-spec-tools/core-spec-tools.js +14 -4
  206. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  207. package/dist/tools/register-team-tools.d.ts.map +1 -1
  208. package/dist/tools/register-team-tools.js +35 -8
  209. package/dist/tools/register-team-tools.js.map +1 -1
  210. package/dist/tools/safe-handler.d.ts.map +1 -1
  211. package/dist/tools/safe-handler.js +20 -2
  212. package/dist/tools/safe-handler.js.map +1 -1
  213. package/dist/tools/schemas/index.d.ts +1 -0
  214. package/dist/tools/schemas/index.d.ts.map +1 -1
  215. package/dist/tools/schemas/index.js +1 -0
  216. package/dist/tools/schemas/index.js.map +1 -1
  217. package/dist/tools/schemas/reconcile-skills-schemas.d.ts +7 -0
  218. package/dist/tools/schemas/reconcile-skills-schemas.d.ts.map +1 -0
  219. package/dist/tools/schemas/reconcile-skills-schemas.js +18 -0
  220. package/dist/tools/schemas/reconcile-skills-schemas.js.map +1 -0
  221. package/dist/tools/schemas/workers-schema.d.ts +1 -56
  222. package/dist/tools/schemas/workers-schema.d.ts.map +1 -1
  223. package/dist/tools/schemas/workers-schema.js +6 -42
  224. package/dist/tools/schemas/workers-schema.js.map +1 -1
  225. package/dist/tools/skill-registry/search.d.ts +2 -1
  226. package/dist/tools/skill-registry/search.d.ts.map +1 -1
  227. package/dist/tools/skill-registry/search.js +81 -8
  228. package/dist/tools/skill-registry/search.js.map +1 -1
  229. package/dist/tools/suggest-tooling/skills-fetcher.d.ts +1 -3
  230. package/dist/tools/suggest-tooling/skills-fetcher.d.ts.map +1 -1
  231. package/dist/tools/suggest-tooling/skills-fetcher.js +3 -101
  232. package/dist/tools/suggest-tooling/skills-fetcher.js.map +1 -1
  233. package/dist/tools/token-recording.d.ts +16 -0
  234. package/dist/tools/token-recording.d.ts.map +1 -0
  235. package/dist/tools/token-recording.js +47 -0
  236. package/dist/tools/token-recording.js.map +1 -0
  237. package/dist/tools/update-status-convention-gate.d.ts +12 -0
  238. package/dist/tools/update-status-convention-gate.d.ts.map +1 -0
  239. package/dist/tools/update-status-convention-gate.js +159 -0
  240. package/dist/tools/update-status-convention-gate.js.map +1 -0
  241. package/dist/tools/update-status-reconcile.d.ts +7 -0
  242. package/dist/tools/update-status-reconcile.d.ts.map +1 -0
  243. package/dist/tools/update-status-reconcile.js +47 -0
  244. package/dist/tools/update-status-reconcile.js.map +1 -0
  245. package/dist/tools/update-status.d.ts.map +1 -1
  246. package/dist/tools/update-status.js +113 -67
  247. package/dist/tools/update-status.js.map +1 -1
  248. package/dist/tools/validate.d.ts.map +1 -1
  249. package/dist/tools/validate.js +92 -2
  250. package/dist/tools/validate.js.map +1 -1
  251. package/dist/types/ai-tool-rules.d.ts +42 -0
  252. package/dist/types/ai-tool-rules.d.ts.map +1 -0
  253. package/dist/types/ai-tool-rules.js +3 -0
  254. package/dist/types/ai-tool-rules.js.map +1 -0
  255. package/dist/types/analysis.d.ts +16 -0
  256. package/dist/types/analysis.d.ts.map +1 -1
  257. package/dist/types/conventions.d.ts +155 -0
  258. package/dist/types/conventions.d.ts.map +1 -0
  259. package/dist/types/conventions.js +3 -0
  260. package/dist/types/conventions.js.map +1 -0
  261. package/dist/types/feedback.d.ts +76 -0
  262. package/dist/types/feedback.d.ts.map +1 -0
  263. package/dist/types/feedback.js +3 -0
  264. package/dist/types/feedback.js.map +1 -0
  265. package/dist/types/index.d.ts +4 -0
  266. package/dist/types/index.d.ts.map +1 -1
  267. package/dist/types/index.js +1 -0
  268. package/dist/types/index.js.map +1 -1
  269. package/dist/types/mcp.d.ts +2 -0
  270. package/dist/types/mcp.d.ts.map +1 -1
  271. package/dist/types/project/inputs.d.ts +2 -0
  272. package/dist/types/project/inputs.d.ts.map +1 -1
  273. package/dist/types/project/planu-config.d.ts +7 -1
  274. package/dist/types/project/planu-config.d.ts.map +1 -1
  275. package/dist/types/skill-registry.d.ts +12 -0
  276. package/dist/types/skill-registry.d.ts.map +1 -1
  277. package/dist/types/verifiable-criteria.d.ts +50 -0
  278. package/dist/types/verifiable-criteria.d.ts.map +1 -0
  279. package/dist/types/verifiable-criteria.js +3 -0
  280. package/dist/types/verifiable-criteria.js.map +1 -0
  281. package/package.json +1 -1
  282. package/src/config/license-plans.json +9 -2
  283. package/src/config/tool-groups.json +5 -1
@@ -0,0 +1,102 @@
1
+ // engine/skills/skills-fetcher.ts — SPEC-022: skills.sh catalog fetcher
2
+ // Business logic for fetching and recommending AI agent skills.
3
+ // Lives in engine/ so engine/ modules can import it without violating architecture.
4
+ import { fetchUrl } from '../web-fetcher/http-client.js';
5
+ export function isMcpServer(knowledge) {
6
+ const stackLower = knowledge.stack.map((s) => s.toLowerCase());
7
+ const toolingStr = JSON.stringify(knowledge.tooling).toLowerCase();
8
+ return (stackLower.some((s) => s.includes('mcp') || s.includes('@modelcontextprotocol')) ||
9
+ toolingStr.includes('modelcontextprotocol') ||
10
+ toolingStr.includes('@modelcontextprotocol'));
11
+ }
12
+ export async function fetchRecommendedSkills(knowledge) {
13
+ const skills = [];
14
+ // Always add mcp-builder first for MCP server projects
15
+ if (isMcpServer(knowledge)) {
16
+ skills.push({
17
+ name: 'mcp-builder',
18
+ description: 'Best practices and conventions for building high-quality MCP servers',
19
+ installCommand: 'npx skills add mcp-builder',
20
+ justification: 'Project detected as an MCP server (@modelcontextprotocol detected in stack/tooling)',
21
+ });
22
+ }
23
+ // Fetch skills.sh catalog in real time (with graceful fallback to hardcoded skills)
24
+ const catalogSkills = await fetchSkillsShCatalog(knowledge.stack, knowledge.language);
25
+ if (catalogSkills.length > 0) {
26
+ skills.push(...catalogSkills);
27
+ }
28
+ else {
29
+ // Fallback: use hardcoded relevant skills when catalog is unavailable or empty
30
+ skills.push(...buildFallbackSkills(knowledge));
31
+ }
32
+ // Deduplicate by name
33
+ const seen = new Set();
34
+ return skills.filter((s) => {
35
+ if (seen.has(s.name)) {
36
+ return false;
37
+ }
38
+ seen.add(s.name);
39
+ return true;
40
+ });
41
+ }
42
+ async function fetchSkillsShCatalog(stack, language) {
43
+ const stackParam = encodeURIComponent([...stack, language].join(',').toLowerCase());
44
+ const url = `https://skills.sh/api/catalog?stack=${stackParam}`;
45
+ try {
46
+ const response = await fetchUrl(url);
47
+ if (!response) {
48
+ return [];
49
+ }
50
+ const parsed = JSON.parse(response.content);
51
+ return (parsed.skills ?? []).slice(0, 5).map((s) => ({
52
+ name: s.name,
53
+ description: s.description ?? `Skill: ${s.name}`,
54
+ installCommand: s.installCommand ?? `npx skills add ${s.name}`,
55
+ justification: `Relevant to your ${language} stack`,
56
+ }));
57
+ }
58
+ catch {
59
+ /* v8 ignore next */ // JSON.parse errors are unlikely with mocked fetchUrl in tests
60
+ return [];
61
+ }
62
+ }
63
+ function buildFallbackSkills(knowledge) {
64
+ const skills = [];
65
+ const stackLower = knowledge.stack.map((s) => s.toLowerCase());
66
+ const lang = knowledge.language.toLowerCase();
67
+ if (lang === 'typescript' || lang === 'javascript') {
68
+ skills.push({
69
+ name: 'typescript-patterns',
70
+ description: 'TypeScript best practices, strict mode patterns, and type safety conventions',
71
+ installCommand: 'npx skills add typescript-patterns',
72
+ justification: `Project uses ${knowledge.language}`,
73
+ });
74
+ }
75
+ if (stackLower.some((s) => s.includes('react'))) {
76
+ skills.push({
77
+ name: 'react-patterns',
78
+ description: 'React component patterns, hooks best practices, and performance optimization',
79
+ installCommand: 'npx skills add react-patterns',
80
+ justification: 'React detected in project stack',
81
+ });
82
+ }
83
+ if (stackLower.some((s) => s.includes('next'))) {
84
+ skills.push({
85
+ name: 'nextjs-patterns',
86
+ description: 'Next.js App Router patterns, server components, and deployment best practices',
87
+ installCommand: 'npx skills add nextjs-patterns',
88
+ justification: 'Next.js detected in project stack',
89
+ });
90
+ }
91
+ if (stackLower.some((s) => s.includes('python')) ||
92
+ knowledge.language.toLowerCase() === 'python') {
93
+ skills.push({
94
+ name: 'python-patterns',
95
+ description: 'Python best practices, type hints, async patterns, and testing conventions',
96
+ installCommand: 'npx skills add python-patterns',
97
+ justification: 'Python detected in project stack',
98
+ });
99
+ }
100
+ return skills;
101
+ }
102
+ //# sourceMappingURL=skills-fetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-fetcher.js","sourceRoot":"","sources":["../../../src/engine/skills/skills-fetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SkillsReconciliation, ProjectKnowledge } from '../types/index.js';
2
+ export type { SkillsReconciliation };
3
+ /**
4
+ * Scan the project's installed skills against the recommended set for its current stack.
5
+ *
6
+ * Algorithm:
7
+ * 1. Load ProjectKnowledge to obtain the current stack + language.
8
+ * 2. Read the manifest from `.claude/skills/manifest.json`.
9
+ * 3. Also enumerate `.md` files in `.claude/skills/` to catch manually installed skills.
10
+ * 4. Fetch recommended skills for the current stack (same logic as suggest_tooling).
11
+ * 5. Diff: missing = recommended − installed; stale = installed − recommended.
12
+ * 6. Compute health score and return the reconciliation report.
13
+ */
14
+ export declare function reconcileSkills(projectPath: string, knowledge: ProjectKnowledge | null): Promise<SkillsReconciliation>;
15
+ //# sourceMappingURL=skills-reconciler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-reconciler.d.ts","sourceRoot":"","sources":["../../src/engine/skills-reconciler.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEhF,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,gBAAgB,GAAG,IAAI,GACjC,OAAO,CAAC,oBAAoB,CAAC,CA8B/B"}
@@ -0,0 +1,98 @@
1
+ // engine/skills-reconciler.ts — SPEC-189: Detect stack changes and reconcile skills
2
+ // Compares recommended skills (based on current stack) with installed skills.
3
+ // Read-only analysis — does NOT install or remove anything.
4
+ import * as fs from 'node:fs/promises';
5
+ import * as path from 'node:path';
6
+ import { readSkillManifest } from './skill-registry/installer.js';
7
+ import { fetchRecommendedSkills } from './skills/skills-fetcher.js';
8
+ /**
9
+ * Scan the project's installed skills against the recommended set for its current stack.
10
+ *
11
+ * Algorithm:
12
+ * 1. Load ProjectKnowledge to obtain the current stack + language.
13
+ * 2. Read the manifest from `.claude/skills/manifest.json`.
14
+ * 3. Also enumerate `.md` files in `.claude/skills/` to catch manually installed skills.
15
+ * 4. Fetch recommended skills for the current stack (same logic as suggest_tooling).
16
+ * 5. Diff: missing = recommended − installed; stale = installed − recommended.
17
+ * 6. Compute health score and return the reconciliation report.
18
+ */
19
+ export async function reconcileSkills(projectPath, knowledge) {
20
+ if (!knowledge) {
21
+ return buildEmptyReconciliation('Project knowledge not found — run init_project first.');
22
+ }
23
+ const [installedNames, recommendedSkills] = await Promise.all([
24
+ listInstalledSkillNames(projectPath),
25
+ fetchRecommendedSkills(knowledge),
26
+ ]);
27
+ const recommendedNames = new Set(recommendedSkills.map((s) => s.name));
28
+ const installedSet = new Set(installedNames);
29
+ const newSkillsDetected = recommendedSkills
30
+ .filter((s) => !installedSet.has(s.name))
31
+ .map((s) => s.name);
32
+ const staleSkills = installedNames.filter((name) => !recommendedNames.has(name));
33
+ const totalRelevant = recommendedNames.size;
34
+ const alreadyInSync = installedNames.filter((name) => recommendedNames.has(name)).length;
35
+ const healthScore = computeHealthScore(totalRelevant, alreadyInSync, staleSkills.length);
36
+ return {
37
+ skillsInSync: newSkillsDetected.length === 0 && staleSkills.length === 0,
38
+ newSkillsDetected,
39
+ staleSkills,
40
+ updatedSkills: [],
41
+ healthScore,
42
+ };
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Helpers
46
+ // ---------------------------------------------------------------------------
47
+ /**
48
+ * Collect all skill names present on disk:
49
+ * - From manifest.json (canonical source)
50
+ * - From .md files in .claude/skills/ (manually placed skills without manifest entry)
51
+ *
52
+ * Returns deduplicated list of skill names (without .md extension).
53
+ */
54
+ async function listInstalledSkillNames(projectPath) {
55
+ const skillsDir = path.join(projectPath, '.claude', 'skills');
56
+ const names = new Set();
57
+ // 1. Read manifest
58
+ const manifest = await readSkillManifest(projectPath);
59
+ for (const entry of manifest.skills) {
60
+ names.add(entry.name);
61
+ }
62
+ // 2. Enumerate .md files (manually installed skills not in manifest)
63
+ try {
64
+ const entries = await fs.readdir(skillsDir);
65
+ for (const entry of entries) {
66
+ if (entry.endsWith('.md')) {
67
+ names.add(entry.slice(0, -3)); // strip .md
68
+ }
69
+ }
70
+ }
71
+ catch {
72
+ // Directory does not exist — no skills installed yet
73
+ }
74
+ return [...names];
75
+ }
76
+ /**
77
+ * Compute a 0–100 health score.
78
+ *
79
+ * Formula:
80
+ * base = alreadyInSync / totalRelevant * 100 (or 100 when totalRelevant === 0)
81
+ * penalty = staleCount * 5 (each stale skill costs 5 points)
82
+ */
83
+ function computeHealthScore(totalRelevant, alreadyInSync, staleCount) {
84
+ const base = totalRelevant === 0 ? 100 : Math.round((alreadyInSync / totalRelevant) * 100);
85
+ const penalty = staleCount * 5;
86
+ return Math.max(0, base - penalty);
87
+ }
88
+ /** Return a neutral reconciliation when prerequisites are missing. */
89
+ function buildEmptyReconciliation(_reason) {
90
+ return {
91
+ skillsInSync: false,
92
+ newSkillsDetected: [],
93
+ staleSkills: [],
94
+ updatedSkills: [],
95
+ healthScore: 0,
96
+ };
97
+ }
98
+ //# sourceMappingURL=skills-reconciler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-reconciler.js","sourceRoot":"","sources":["../../src/engine/skills-reconciler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Strip sections from spec content that contain only template/placeholder text.
3
+ *
4
+ * Targets:
5
+ * - "Affected Modules" sections with no real module list
6
+ * - "Entity Relationship" sections using ENTITY_A / ENTITY_B placeholders
7
+ * - Mermaid diagram blocks with no real domain nodes (graph LR with no meaningful edges)
8
+ *
9
+ * Keeps all sections that have real, project-specific content.
10
+ */
11
+ export declare function stripEmptySections(content: string): string;
12
+ //# sourceMappingURL=spec-template-cleaner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-template-cleaner.d.ts","sourceRoot":"","sources":["../../src/engine/spec-template-cleaner.ts"],"names":[],"mappings":"AAoGA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA0B1D"}
@@ -0,0 +1,119 @@
1
+ // engine/spec-template-cleaner.ts — Strip unfilled template sections from spec content.
2
+ // Applied before writing HU.md and FICHA-TECNICA.md to prevent generic placeholders
3
+ // from leaking into committed spec files.
4
+ /**
5
+ * Patterns that identify template sections with no real project-specific content.
6
+ * A section is considered "empty" if its body only contains these patterns.
7
+ */
8
+ /** Lines that are considered pure placeholders (no real content). */
9
+ const PLACEHOLDER_LINE_PATTERNS = [
10
+ /^\s*-\s*\(List (modules|files|affected environments|edge cases|step|section)\b.*\)\s*$/i,
11
+ /^\s*-\s*\(Define what is NOT included.*\)\s*$/i,
12
+ /^\s*-\s*\(Describe .*\)\s*$/i,
13
+ /^\s*-\s*\(Analyze .*\)\s*$/i,
14
+ /^\s*-\s*\(Why .*\)\s*$/i,
15
+ /^\s*-\s*\(List .*\)\s*$/i,
16
+ /^\s*1\.\s*\(.*\)\s*$/,
17
+ /^\s*2\.\s*\(.*\)\s*$/,
18
+ ];
19
+ /** Section headings whose entire block is replaceable when the body is template-only. */
20
+ const STRIPPABLE_SECTION_HEADINGS = [
21
+ /^## Affected Modules$/i,
22
+ /^## Entity Relationship/i,
23
+ ];
24
+ /** Mermaid diagram blocks considered empty (no real domain nodes). */
25
+ const EMPTY_MERMAID_PATTERNS = [
26
+ // ER diagrams with only ENTITY_A / ENTITY_B placeholders
27
+ /```mermaid\s*\nerDiagram\s*\n(?:\s*%%[^\n]*\n)*\s*ENTITY_A\s*\{[\s\S]*?\}\s*\n\s*ENTITY_B\s*\{[\s\S]*?\}\s*\n\s*ENTITY_A\s*\|\|--o\{[^\n]*\n\s*```/,
28
+ ];
29
+ /** Inline content patterns that mark sections as template-only. */
30
+ const ENTITY_AB_CONTENT = /ENTITY_A|ENTITY_B/;
31
+ const TBD_ONLY = /^\s*-?\s*(TBD|TODO|N\/A|None|n\/a)\s*$/i;
32
+ /**
33
+ * Returns true if a text block (section body without the heading line) contains
34
+ * only placeholder/template content and no real project-specific information.
35
+ */
36
+ function isBodyPlaceholderOnly(body) {
37
+ const lines = body
38
+ .split('\n')
39
+ .map((l) => l.trim())
40
+ .filter((l) => l.length > 0);
41
+ if (lines.length === 0) {
42
+ return true;
43
+ }
44
+ // Contains generic ENTITY_A / ENTITY_B references
45
+ if (ENTITY_AB_CONTENT.test(body)) {
46
+ return true;
47
+ }
48
+ // All non-empty lines are placeholder patterns or TBD
49
+ return lines.every((line) => {
50
+ if (TBD_ONLY.test(line)) {
51
+ return true;
52
+ }
53
+ return PLACEHOLDER_LINE_PATTERNS.some((p) => p.test(line));
54
+ });
55
+ }
56
+ /**
57
+ * Split markdown content into sections keyed by their heading line.
58
+ * Returns an array of { heading, body } tuples preserving order.
59
+ */
60
+ function splitSections(content) {
61
+ const lines = content.split('\n');
62
+ const sections = [];
63
+ let currentHeading = '';
64
+ let currentBody = [];
65
+ for (const line of lines) {
66
+ if (/^#{1,3} /.test(line)) {
67
+ sections.push({ heading: currentHeading, body: currentBody.join('\n') });
68
+ currentHeading = line;
69
+ currentBody = [];
70
+ }
71
+ else {
72
+ currentBody.push(line);
73
+ }
74
+ }
75
+ sections.push({ heading: currentHeading, body: currentBody.join('\n') });
76
+ return sections;
77
+ }
78
+ /**
79
+ * Remove empty Mermaid diagram blocks that contain only generic placeholder nodes.
80
+ * Operates on the full content string (regex-based, not line-by-line).
81
+ */
82
+ function stripEmptyMermaidBlocks(content) {
83
+ let result = content;
84
+ for (const pattern of EMPTY_MERMAID_PATTERNS) {
85
+ result = result.replace(pattern, '');
86
+ }
87
+ return result;
88
+ }
89
+ /**
90
+ * Strip sections from spec content that contain only template/placeholder text.
91
+ *
92
+ * Targets:
93
+ * - "Affected Modules" sections with no real module list
94
+ * - "Entity Relationship" sections using ENTITY_A / ENTITY_B placeholders
95
+ * - Mermaid diagram blocks with no real domain nodes (graph LR with no meaningful edges)
96
+ *
97
+ * Keeps all sections that have real, project-specific content.
98
+ */
99
+ export function stripEmptySections(content) {
100
+ // First pass: remove empty mermaid diagram blocks
101
+ const result = stripEmptyMermaidBlocks(content);
102
+ // Second pass: remove strippable sections with placeholder-only bodies
103
+ const sections = splitSections(result);
104
+ const kept = [];
105
+ for (const { heading, body } of sections) {
106
+ const shouldStrip = STRIPPABLE_SECTION_HEADINGS.some((pattern) => pattern.test(heading));
107
+ if (shouldStrip && isBodyPlaceholderOnly(body)) {
108
+ // Drop this section entirely — heading + body
109
+ continue;
110
+ }
111
+ kept.push(heading ? `${heading}\n${body}` : body);
112
+ }
113
+ // Re-join and normalize multiple consecutive blank lines to at most two
114
+ return (kept
115
+ .join('\n')
116
+ .replace(/\n{3,}/g, '\n\n')
117
+ .trimEnd() + '\n');
118
+ }
119
+ //# sourceMappingURL=spec-template-cleaner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-template-cleaner.js","sourceRoot":"","sources":["../../src/engine/spec-template-cleaner.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,14 @@
1
- import type { Spec, AuditFinding, CodeState } from '../../types/index.js';
1
+ import type { Spec, AuditFinding, CodeState, VerifyBlock } from '../../types/index.js';
2
2
  /**
3
3
  * Scan the project directory to build a CodeState for the given spec.
4
4
  */
5
5
  export declare function scanCodeForSpec(spec: Spec, projectPath: string): Promise<CodeState>;
6
6
  /**
7
7
  * Check whether a single criterion is satisfied in the given code state.
8
+ * When `verifyBlock` is provided it is forwarded to deepCheckCriterion,
9
+ * bypassing keyword-based classification (explicit beats inferred).
8
10
  */
9
- export declare function checkCriterion(criterion: string, projectPath: string, codeState: CodeState): Promise<boolean>;
11
+ export declare function checkCriterion(criterion: string, projectPath: string, codeState: CodeState, verifyBlock?: VerifyBlock): Promise<boolean>;
10
12
  /**
11
13
  * Classify the severity of a missing criterion based on its content.
12
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/analyzer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAE1E;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiFzF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,OAAO,CAAC,CAmElB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAY/F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CA8EzB;AAkBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAalF"}
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/analyzer.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAGvF;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAiFzF;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,WAAW,GACxB,OAAO,CAAC,OAAO,CAAC,CA4ElB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAY/F;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CA8EzB;AAkBD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAalF"}
@@ -3,6 +3,7 @@
3
3
  import { readFile, stat } from 'node:fs/promises';
4
4
  import { join, extname } from 'node:path';
5
5
  import { glob } from 'glob';
6
+ import { deepCheckCriterion } from './deep-code-checker.js';
6
7
  /**
7
8
  * Scan the project directory to build a CodeState for the given spec.
8
9
  */
@@ -91,8 +92,10 @@ export async function scanCodeForSpec(spec, projectPath) {
91
92
  }
92
93
  /**
93
94
  * Check whether a single criterion is satisfied in the given code state.
95
+ * When `verifyBlock` is provided it is forwarded to deepCheckCriterion,
96
+ * bypassing keyword-based classification (explicit beats inferred).
94
97
  */
95
- export async function checkCriterion(criterion, projectPath, codeState) {
98
+ export async function checkCriterion(criterion, projectPath, codeState, verifyBlock) {
96
99
  // Check for file existence criteria
97
100
  const fileMatch = /(?:create|add|implement)\s+(?:file\s+)?["']?([^\s"']+\.\w+)["']?/i.exec(criterion);
98
101
  if (fileMatch?.[1]) {
@@ -148,9 +151,17 @@ export async function checkCriterion(criterion, projectPath, codeState) {
148
151
  }
149
152
  }
150
153
  }
151
- // If we have affected files, assume basic criteria are met
154
+ // Deep code check: grep/metric/coverage analysis on the actual filesystem.
155
+ // If a verify block is present it is passed explicitly (bypasses keyword inference).
156
+ // For non-manual checks, the deep result is authoritative.
157
+ // For manual checks (type === 'manual'), we fall back to the optimistic heuristic.
158
+ const deepResult = deepCheckCriterion(criterion, projectPath, verifyBlock);
159
+ if (deepResult.checkType !== 'manual') {
160
+ return deepResult.passed;
161
+ }
162
+ // If we have affected files, assume basic criteria are met (optimistic fallback)
152
163
  if (codeState.affectedFiles.length > 0) {
153
- return true; // Optimistic: if code exists, assume criterion may be met
164
+ return true;
154
165
  }
155
166
  return false;
156
167
  }
@@ -1 +1 @@
1
- {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/engine/validator/analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/engine/validator/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { VerifiableCriterion, VerifyBlock, VerifyTemplate } from '../../types/index.js';
2
+ /** Exported for extensibility: callers may add domain-specific templates. */
3
+ export declare const VERIFY_TEMPLATES: VerifyTemplate[];
4
+ /**
5
+ * Match a criterion text against the built-in (and optionally injected) templates.
6
+ * Returns the first matching template or null if none match.
7
+ */
8
+ export declare function matchTemplate(criterion: string): VerifyTemplate | null;
9
+ /**
10
+ * Build a VerifyBlock from a matched template, extracting numeric/scope hints
11
+ * from the criterion text when possible.
12
+ */
13
+ export declare function buildVerifyBlock(criterion: string, template: VerifyTemplate): VerifyBlock;
14
+ /**
15
+ * Enrich a single criterion text with a VerifyBlock.
16
+ * Falls back to `manual` when no template matches.
17
+ */
18
+ export declare function enrichCriterion(criterion: string): VerifiableCriterion;
19
+ /**
20
+ * Enrich a batch of criterion texts.
21
+ * Empty or whitespace-only entries are silently skipped.
22
+ */
23
+ export declare function enrichCriteria(criteria: string[]): VerifiableCriterion[];
24
+ /**
25
+ * Parse raw markdown AC lines (e.g. "- [ ] Criterion text") into plain strings.
26
+ * Strips list prefixes so enrichers receive clean criterion text.
27
+ */
28
+ export declare function parseCriteriaText(lines: string[]): string[];
29
+ /**
30
+ * Format enriched criteria as markdown list items with embedded verify blocks.
31
+ *
32
+ * Output format:
33
+ * ```
34
+ * - [ ] Criterion text
35
+ * <!-- verify: {"type":"grep_absent","pattern":"...","scope":"..."} -->
36
+ * ```
37
+ *
38
+ * The `<!-- verify: ... -->` HTML comment is invisible in rendered markdown
39
+ * but fully parseable by automated tooling.
40
+ */
41
+ export declare function formatVerifiableCriteria(criteria: VerifiableCriterion[]): string;
42
+ //# sourceMappingURL=criterion-enricher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"criterion-enricher.d.ts","sourceRoot":"","sources":["../../../src/engine/validator/criterion-enricher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAM7F,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,EAAE,cAAc,EA0D5C,CAAC;AAoCF;;;GAGG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAQtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,WAAW,CA2BzF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAStE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,mBAAmB,EAAE,CAExE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAI3D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,MAAM,CAWhF"}