@planu/cli 0.90.1 → 0.91.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 (252) hide show
  1. package/dist/config/license-plans.json +3 -1
  2. package/dist/engine/batch-script-generator/index.d.ts +6 -0
  3. package/dist/engine/batch-script-generator/index.d.ts.map +1 -0
  4. package/dist/engine/batch-script-generator/index.js +126 -0
  5. package/dist/engine/batch-script-generator/index.js.map +1 -0
  6. package/dist/engine/ci-generator/index.d.ts.map +1 -1
  7. package/dist/engine/ci-generator/index.js +32 -1
  8. package/dist/engine/ci-generator/index.js.map +1 -1
  9. package/dist/engine/ci-generator/output-formats.d.ts +15 -0
  10. package/dist/engine/ci-generator/output-formats.d.ts.map +1 -0
  11. package/dist/engine/ci-generator/output-formats.js +52 -0
  12. package/dist/engine/ci-generator/output-formats.js.map +1 -0
  13. package/dist/engine/claude-config-auditor/claudemd-auditor.d.ts.map +1 -1
  14. package/dist/engine/claude-config-auditor/claudemd-auditor.js +139 -31
  15. package/dist/engine/claude-config-auditor/claudemd-auditor.js.map +1 -1
  16. package/dist/engine/claude-config-auditor/rules-auditor.d.ts.map +1 -1
  17. package/dist/engine/claude-config-auditor/rules-auditor.js +87 -49
  18. package/dist/engine/claude-config-auditor/rules-auditor.js.map +1 -1
  19. package/dist/engine/claude-config-auditor/scoring.d.ts.map +1 -1
  20. package/dist/engine/claude-config-auditor/scoring.js +37 -1
  21. package/dist/engine/claude-config-auditor/scoring.js.map +1 -1
  22. package/dist/engine/claude-config-auditor/settings-auditor.d.ts.map +1 -1
  23. package/dist/engine/claude-config-auditor/settings-auditor.js +55 -40
  24. package/dist/engine/claude-config-auditor/settings-auditor.js.map +1 -1
  25. package/dist/engine/config-schemas.d.ts.map +1 -1
  26. package/dist/engine/config-schemas.js +1 -0
  27. package/dist/engine/config-schemas.js.map +1 -1
  28. package/dist/engine/context-advisor/btw-advisor.d.ts +11 -0
  29. package/dist/engine/context-advisor/btw-advisor.d.ts.map +1 -0
  30. package/dist/engine/context-advisor/btw-advisor.js +29 -0
  31. package/dist/engine/context-advisor/btw-advisor.js.map +1 -0
  32. package/dist/engine/facilitate/context-loader.d.ts +12 -0
  33. package/dist/engine/facilitate/context-loader.d.ts.map +1 -0
  34. package/dist/engine/facilitate/context-loader.js +156 -0
  35. package/dist/engine/facilitate/context-loader.js.map +1 -0
  36. package/dist/engine/facilitate/intent-classifier.d.ts +6 -0
  37. package/dist/engine/facilitate/intent-classifier.d.ts.map +1 -0
  38. package/dist/engine/facilitate/intent-classifier.js +153 -0
  39. package/dist/engine/facilitate/intent-classifier.js.map +1 -0
  40. package/dist/engine/facilitate/plan-parser.d.ts +7 -0
  41. package/dist/engine/facilitate/plan-parser.d.ts.map +1 -0
  42. package/dist/engine/facilitate/plan-parser.js +115 -0
  43. package/dist/engine/facilitate/plan-parser.js.map +1 -0
  44. package/dist/engine/facilitate/router.d.ts +6 -0
  45. package/dist/engine/facilitate/router.d.ts.map +1 -0
  46. package/dist/engine/facilitate/router.js +71 -0
  47. package/dist/engine/facilitate/router.js.map +1 -0
  48. package/dist/engine/hooks/context-injector.d.ts +11 -0
  49. package/dist/engine/hooks/context-injector.d.ts.map +1 -0
  50. package/dist/engine/hooks/context-injector.js +163 -0
  51. package/dist/engine/hooks/context-injector.js.map +1 -0
  52. package/dist/engine/hooks/hook-templates.d.ts +16 -0
  53. package/dist/engine/hooks/hook-templates.d.ts.map +1 -0
  54. package/dist/engine/hooks/hook-templates.js +148 -0
  55. package/dist/engine/hooks/hook-templates.js.map +1 -0
  56. package/dist/engine/hooks/plan-mode-detector.d.ts +27 -0
  57. package/dist/engine/hooks/plan-mode-detector.d.ts.map +1 -0
  58. package/dist/engine/hooks/plan-mode-detector.js +68 -0
  59. package/dist/engine/hooks/plan-mode-detector.js.map +1 -0
  60. package/dist/engine/hooks/plan-mode-scripts.d.ts +10 -0
  61. package/dist/engine/hooks/plan-mode-scripts.d.ts.map +1 -0
  62. package/dist/engine/hooks/plan-mode-scripts.js +45 -0
  63. package/dist/engine/hooks/plan-mode-scripts.js.map +1 -0
  64. package/dist/engine/model-router/complexity-analyzer.d.ts +9 -1
  65. package/dist/engine/model-router/complexity-analyzer.d.ts.map +1 -1
  66. package/dist/engine/model-router/complexity-analyzer.js +44 -1
  67. package/dist/engine/model-router/complexity-analyzer.js.map +1 -1
  68. package/dist/engine/model-router/rules-engine.d.ts.map +1 -1
  69. package/dist/engine/model-router/rules-engine.js +14 -1
  70. package/dist/engine/model-router/rules-engine.js.map +1 -1
  71. package/dist/engine/nfr-profile-detector.d.ts.map +1 -1
  72. package/dist/engine/nfr-profile-detector.js +2 -1
  73. package/dist/engine/nfr-profile-detector.js.map +1 -1
  74. package/dist/engine/spec-coverage/core.js.map +1 -1
  75. package/dist/engine/spec-migrator/frontmatter-parser.d.ts.map +1 -1
  76. package/dist/engine/spec-migrator/frontmatter-parser.js.map +1 -1
  77. package/dist/engine/spec-summary-html.d.ts.map +1 -1
  78. package/dist/engine/spec-summary-html.js +1 -1
  79. package/dist/engine/spec-summary-html.js.map +1 -1
  80. package/dist/engine/team-planner/writer-reviewer.d.ts +12 -0
  81. package/dist/engine/team-planner/writer-reviewer.d.ts.map +1 -0
  82. package/dist/engine/team-planner/writer-reviewer.js +48 -0
  83. package/dist/engine/team-planner/writer-reviewer.js.map +1 -0
  84. package/dist/engine/tool-groups/group-manager.js.map +1 -1
  85. package/dist/index.js +11 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/storage/drift-cache-store.js.map +1 -1
  88. package/dist/storage/error-telemetry-store.js.map +1 -1
  89. package/dist/storage/federation-store.js.map +1 -1
  90. package/dist/storage/global-store.js.map +1 -1
  91. package/dist/storage/ideas-store.d.ts.map +1 -1
  92. package/dist/storage/ideas-store.js.map +1 -1
  93. package/dist/storage/living-dashboard-store.js.map +1 -1
  94. package/dist/storage/metrics-store.js.map +1 -1
  95. package/dist/storage/rbac-store.js.map +1 -1
  96. package/dist/storage/spec-observability-store.js.map +1 -1
  97. package/dist/storage/worker-metrics-store.js.map +1 -1
  98. package/dist/storage/worker-store.js.map +1 -1
  99. package/dist/tools/checkpoint-handler.d.ts.map +1 -1
  100. package/dist/tools/checkpoint-handler.js +11 -0
  101. package/dist/tools/checkpoint-handler.js.map +1 -1
  102. package/dist/tools/clarify-requirements/interview-mode.d.ts +42 -0
  103. package/dist/tools/clarify-requirements/interview-mode.d.ts.map +1 -0
  104. package/dist/tools/clarify-requirements/interview-mode.js +342 -0
  105. package/dist/tools/clarify-requirements/interview-mode.js.map +1 -0
  106. package/dist/tools/configure-workers-handler.d.ts.map +1 -1
  107. package/dist/tools/configure-workers-handler.js +81 -0
  108. package/dist/tools/configure-workers-handler.js.map +1 -1
  109. package/dist/tools/facilitate.d.ts +1 -5
  110. package/dist/tools/facilitate.d.ts.map +1 -1
  111. package/dist/tools/facilitate.js +100 -23
  112. package/dist/tools/facilitate.js.map +1 -1
  113. package/dist/tools/generate-automation-guide.d.ts +10 -0
  114. package/dist/tools/generate-automation-guide.d.ts.map +1 -0
  115. package/dist/tools/generate-automation-guide.js +222 -0
  116. package/dist/tools/generate-automation-guide.js.map +1 -0
  117. package/dist/tools/generate-batch-script.d.ts +27 -0
  118. package/dist/tools/generate-batch-script.d.ts.map +1 -0
  119. package/dist/tools/generate-batch-script.js +77 -0
  120. package/dist/tools/generate-batch-script.js.map +1 -0
  121. package/dist/tools/generate-sub-agent.d.ts.map +1 -1
  122. package/dist/tools/generate-sub-agent.js +16 -2
  123. package/dist/tools/generate-sub-agent.js.map +1 -1
  124. package/dist/tools/git/branch-ops.d.ts +18 -0
  125. package/dist/tools/git/branch-ops.d.ts.map +1 -1
  126. package/dist/tools/git/branch-ops.js +121 -0
  127. package/dist/tools/git/branch-ops.js.map +1 -1
  128. package/dist/tools/git/pr-ops.d.ts.map +1 -1
  129. package/dist/tools/git/pr-ops.js +7 -0
  130. package/dist/tools/git/pr-ops.js.map +1 -1
  131. package/dist/tools/init-project/git-setup.d.ts.map +1 -1
  132. package/dist/tools/init-project/git-setup.js.map +1 -1
  133. package/dist/tools/init-project/handler.d.ts.map +1 -1
  134. package/dist/tools/init-project/handler.js +5 -2
  135. package/dist/tools/init-project/handler.js.map +1 -1
  136. package/dist/tools/init-project/hooks-configurator.d.ts +17 -0
  137. package/dist/tools/init-project/hooks-configurator.d.ts.map +1 -0
  138. package/dist/tools/init-project/hooks-configurator.js +102 -0
  139. package/dist/tools/init-project/hooks-configurator.js.map +1 -0
  140. package/dist/tools/init-project/lifecycle-helpers.d.ts.map +1 -1
  141. package/dist/tools/init-project/lifecycle-helpers.js +1 -1
  142. package/dist/tools/init-project/lifecycle-helpers.js.map +1 -1
  143. package/dist/tools/init-project/migration-runner.d.ts.map +1 -1
  144. package/dist/tools/init-project/migration-runner.js +1 -1
  145. package/dist/tools/init-project/migration-runner.js.map +1 -1
  146. package/dist/tools/init-project/planu-workflow-generator.d.ts +21 -0
  147. package/dist/tools/init-project/planu-workflow-generator.d.ts.map +1 -0
  148. package/dist/tools/init-project/planu-workflow-generator.js +73 -0
  149. package/dist/tools/init-project/planu-workflow-generator.js.map +1 -0
  150. package/dist/tools/init-project/rules-generator.d.ts +15 -0
  151. package/dist/tools/init-project/rules-generator.d.ts.map +1 -0
  152. package/dist/tools/init-project/rules-generator.js +110 -0
  153. package/dist/tools/init-project/rules-generator.js.map +1 -0
  154. package/dist/tools/init-project/scaffold-writer.d.ts +3 -0
  155. package/dist/tools/init-project/scaffold-writer.d.ts.map +1 -1
  156. package/dist/tools/init-project/scaffold-writer.js +33 -0
  157. package/dist/tools/init-project/scaffold-writer.js.map +1 -1
  158. package/dist/tools/integrate-pm.js.map +1 -1
  159. package/dist/tools/license-status.js +4 -4
  160. package/dist/tools/license-status.js.map +1 -1
  161. package/dist/tools/list-backlog-handler.d.ts.map +1 -1
  162. package/dist/tools/list-backlog-handler.js +4 -1
  163. package/dist/tools/list-backlog-handler.js.map +1 -1
  164. package/dist/tools/list-sessions.d.ts.map +1 -1
  165. package/dist/tools/list-sessions.js +8 -0
  166. package/dist/tools/list-sessions.js.map +1 -1
  167. package/dist/tools/manage-git.d.ts.map +1 -1
  168. package/dist/tools/manage-git.js +15 -1
  169. package/dist/tools/manage-git.js.map +1 -1
  170. package/dist/tools/orchestrate/state.js.map +1 -1
  171. package/dist/tools/promote-idea-handler.d.ts.map +1 -1
  172. package/dist/tools/promote-idea-handler.js +1 -3
  173. package/dist/tools/promote-idea-handler.js.map +1 -1
  174. package/dist/tools/recommend-model-handler.d.ts.map +1 -1
  175. package/dist/tools/recommend-model-handler.js +7 -0
  176. package/dist/tools/recommend-model-handler.js.map +1 -1
  177. package/dist/tools/register-backlog-tools.d.ts.map +1 -1
  178. package/dist/tools/register-backlog-tools.js +3 -13
  179. package/dist/tools/register-backlog-tools.js.map +1 -1
  180. package/dist/tools/register-facilitator-tools.d.ts.map +1 -1
  181. package/dist/tools/register-facilitator-tools.js +12 -7
  182. package/dist/tools/register-facilitator-tools.js.map +1 -1
  183. package/dist/tools/register-generate-automation-guide.d.ts +3 -0
  184. package/dist/tools/register-generate-automation-guide.d.ts.map +1 -0
  185. package/dist/tools/register-generate-automation-guide.js +10 -0
  186. package/dist/tools/register-generate-automation-guide.js.map +1 -0
  187. package/dist/tools/register-generate-batch-script.d.ts +3 -0
  188. package/dist/tools/register-generate-batch-script.d.ts.map +1 -0
  189. package/dist/tools/register-generate-batch-script.js +10 -0
  190. package/dist/tools/register-generate-batch-script.js.map +1 -0
  191. package/dist/tools/register-hooks-tools.d.ts.map +1 -1
  192. package/dist/tools/register-hooks-tools.js +27 -0
  193. package/dist/tools/register-hooks-tools.js.map +1 -1
  194. package/dist/tools/register-platform-tools/design-stack-tools.d.ts.map +1 -1
  195. package/dist/tools/register-platform-tools/design-stack-tools.js +4 -0
  196. package/dist/tools/register-platform-tools/design-stack-tools.js.map +1 -1
  197. package/dist/tools/restore-session.d.ts.map +1 -1
  198. package/dist/tools/restore-session.js +10 -0
  199. package/dist/tools/restore-session.js.map +1 -1
  200. package/dist/tools/schemas/ide-config.d.ts +2 -2
  201. package/dist/tools/schemas/workers-schema.d.ts +1 -0
  202. package/dist/tools/schemas/workers-schema.d.ts.map +1 -1
  203. package/dist/tools/schemas/workers-schema.js +10 -2
  204. package/dist/tools/schemas/workers-schema.js.map +1 -1
  205. package/dist/tools/start-hooks.d.ts.map +1 -1
  206. package/dist/tools/start-hooks.js +104 -1
  207. package/dist/tools/start-hooks.js.map +1 -1
  208. package/dist/tools/status-handler.d.ts.map +1 -1
  209. package/dist/tools/status-handler.js +9 -0
  210. package/dist/tools/status-handler.js.map +1 -1
  211. package/dist/types/analysis.d.ts +8 -0
  212. package/dist/types/analysis.d.ts.map +1 -1
  213. package/dist/types/batch-script.d.ts +36 -0
  214. package/dist/types/batch-script.d.ts.map +1 -0
  215. package/dist/types/batch-script.js +3 -0
  216. package/dist/types/batch-script.js.map +1 -0
  217. package/dist/types/ci.d.ts +4 -0
  218. package/dist/types/ci.d.ts.map +1 -1
  219. package/dist/types/common/tech-enums.d.ts +1 -1
  220. package/dist/types/common/tech-enums.d.ts.map +1 -1
  221. package/dist/types/execution.d.ts +9 -0
  222. package/dist/types/execution.d.ts.map +1 -1
  223. package/dist/types/facilitator.d.ts +67 -0
  224. package/dist/types/facilitator.d.ts.map +1 -1
  225. package/dist/types/file-hooks.d.ts +7 -0
  226. package/dist/types/file-hooks.d.ts.map +1 -1
  227. package/dist/types/file-hooks.js +0 -1
  228. package/dist/types/file-hooks.js.map +1 -1
  229. package/dist/types/git.d.ts +12 -0
  230. package/dist/types/git.d.ts.map +1 -1
  231. package/dist/types/hooks.d.ts +77 -0
  232. package/dist/types/hooks.d.ts.map +1 -1
  233. package/dist/types/index.d.ts +1 -0
  234. package/dist/types/index.d.ts.map +1 -1
  235. package/dist/types/index.js +1 -0
  236. package/dist/types/index.js.map +1 -1
  237. package/dist/types/model-routing.d.ts +16 -0
  238. package/dist/types/model-routing.d.ts.map +1 -1
  239. package/dist/types/project/planu-config.d.ts +6 -0
  240. package/dist/types/project/planu-config.d.ts.map +1 -1
  241. package/dist/types/session.d.ts +2 -0
  242. package/dist/types/session.d.ts.map +1 -1
  243. package/dist/types/stack/recommend.d.ts +1 -0
  244. package/dist/types/stack/recommend.d.ts.map +1 -1
  245. package/dist/types/status.d.ts +7 -0
  246. package/dist/types/status.d.ts.map +1 -1
  247. package/dist/types/team-planner.d.ts +18 -0
  248. package/dist/types/team-planner.d.ts.map +1 -1
  249. package/dist/types/workers.d.ts +1 -1
  250. package/dist/types/workers.d.ts.map +1 -1
  251. package/package.json +10 -10
  252. package/src/config/license-plans.json +3 -1
@@ -1,69 +1,107 @@
1
- // Planu — .claude/rules/ auditor for SPEC-092
1
+ // Planu — .claude/rules/ auditor for SPEC-092 / SPEC-255
2
2
  import { readFile, readdir } from 'node:fs/promises';
3
3
  import { homedir } from 'node:os';
4
4
  import { join } from 'node:path';
5
+ import { glob } from 'glob';
5
6
  const DOCS_REF = 'https://code.claude.com/docs/en/memory#rules';
6
- async function auditRulesDir(rulesPath, label) {
7
+ async function auditRuleFile(file, rulesPath, projectPath) {
7
8
  const findings = [];
9
+ try {
10
+ const content = await readFile(join(rulesPath, file), 'utf-8');
11
+ const firstLines = content.split('\n').slice(0, 5).join('\n');
12
+ const hasPaths = /^paths:/m.test(firstLines) || /^---[\s\S]*?paths:/m.test(firstLines);
13
+ if (!hasPaths) {
14
+ const lc = content.toLowerCase();
15
+ const isScoped = lc.includes('typescript') ||
16
+ lc.includes('.test.') ||
17
+ lc.includes('vitest') ||
18
+ lc.includes('jest') ||
19
+ lc.includes('.tsx') ||
20
+ lc.includes('.jsx');
21
+ findings.push(isScoped
22
+ ? {
23
+ area: 'rules',
24
+ severity: 'warn',
25
+ message: `Rule "${file}" has language/test-specific content but no paths: frontmatter`,
26
+ suggestion: `Add "paths: src/**/*.ts" or similar frontmatter so it only loads for matching files`,
27
+ docsRef: DOCS_REF,
28
+ }
29
+ : {
30
+ area: 'rules',
31
+ severity: 'info',
32
+ code: 'RULE_MISSING_PATHS',
33
+ message: `Rule "${file}" has no paths: frontmatter — it loads for every file`,
34
+ suggestion: 'Add paths: frontmatter (e.g., "paths: src/**/*.ts") to scope when this rule loads',
35
+ docsRef: DOCS_REF,
36
+ });
37
+ }
38
+ else if (projectPath !== undefined) {
39
+ const pathsMatch = /^---[\s\S]*?^paths:\s*(.+)$/m.exec(content);
40
+ if (pathsMatch) {
41
+ const patterns = (pathsMatch[1]?.trim() ?? '')
42
+ .split(',')
43
+ .map((p) => p.trim())
44
+ .filter((p) => p.length > 0);
45
+ for (const pattern of patterns) {
46
+ try {
47
+ const matches = await glob(pattern, { cwd: projectPath });
48
+ if (matches.length === 0) {
49
+ findings.push({
50
+ area: 'rules',
51
+ severity: 'info',
52
+ code: 'RULE_DEAD_PATH',
53
+ message: `Rule "${file}" has paths: "${pattern}" but no files match in project`,
54
+ suggestion: 'Update the paths: pattern to match existing files, or remove the rule if obsolete',
55
+ docsRef: DOCS_REF,
56
+ });
57
+ }
58
+ }
59
+ catch {
60
+ /* invalid glob — skip */
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ catch {
67
+ /* unreadable file — skip */
68
+ }
69
+ return findings;
70
+ }
71
+ async function auditRulesDir(rulesPath, label, projectPath) {
8
72
  let files;
9
73
  try {
10
74
  const entries = await readdir(rulesPath);
11
75
  files = entries.filter((f) => f.endsWith('.md'));
12
76
  }
13
77
  catch {
14
- findings.push({
15
- area: 'rules',
16
- severity: 'info',
17
- message: `${label} directory does not exist`,
18
- suggestion: 'Create .claude/rules/ with scoped rule files to keep CLAUDE.md lean',
19
- docsRef: DOCS_REF,
20
- });
21
- return findings;
78
+ return [
79
+ {
80
+ area: 'rules',
81
+ severity: 'info',
82
+ message: `${label} directory does not exist`,
83
+ suggestion: 'Create .claude/rules/ with scoped rule files to keep CLAUDE.md lean',
84
+ docsRef: DOCS_REF,
85
+ },
86
+ ];
22
87
  }
23
88
  if (files.length === 0) {
24
- findings.push({
25
- area: 'rules',
26
- severity: 'info',
27
- message: `${label} directory exists but has no .md files`,
28
- suggestion: 'Add rule files with paths: frontmatter for context-aware loading',
29
- docsRef: DOCS_REF,
30
- });
31
- return findings;
32
- }
33
- for (const file of files) {
34
- try {
35
- const content = await readFile(join(rulesPath, file), 'utf-8');
36
- const firstLines = content.split('\n').slice(0, 5).join('\n');
37
- const hasPaths = /^paths:/m.test(firstLines) || /^---[\s\S]*?paths:/m.test(firstLines);
38
- if (!hasPaths) {
39
- // Check if file has TypeScript/test-specific content that should be scoped
40
- const lowerContent = content.toLowerCase();
41
- const isScoped = lowerContent.includes('typescript') ||
42
- lowerContent.includes('.test.') ||
43
- lowerContent.includes('vitest') ||
44
- lowerContent.includes('jest') ||
45
- lowerContent.includes('.tsx') ||
46
- lowerContent.includes('.jsx');
47
- if (isScoped) {
48
- findings.push({
49
- area: 'rules',
50
- severity: 'warn',
51
- message: `Rule "${file}" has language/test-specific content but no paths: frontmatter`,
52
- suggestion: `Add "paths: src/**/*.ts" or similar frontmatter so it only loads for matching files`,
53
- docsRef: DOCS_REF,
54
- });
55
- }
56
- }
57
- }
58
- catch {
59
- // Skip unreadable files
60
- }
89
+ return [
90
+ {
91
+ area: 'rules',
92
+ severity: 'info',
93
+ message: `${label} directory exists but has no .md files`,
94
+ suggestion: 'Add rule files with paths: frontmatter for context-aware loading',
95
+ docsRef: DOCS_REF,
96
+ },
97
+ ];
61
98
  }
62
- return findings;
99
+ const results = await Promise.all(files.map((f) => auditRuleFile(f, rulesPath, projectPath)));
100
+ return results.flat();
63
101
  }
64
102
  export async function auditRules(projectPath, includeGlobal) {
65
103
  const findings = [];
66
- findings.push(...(await auditRulesDir(join(projectPath, '.claude', 'rules'), 'Project .claude/rules/')));
104
+ findings.push(...(await auditRulesDir(join(projectPath, '.claude', 'rules'), 'Project .claude/rules/', projectPath)));
67
105
  if (includeGlobal) {
68
106
  findings.push(...(await auditRulesDir(join(homedir(), '.claude', 'rules'), 'Global ~/.claude/rules/')));
69
107
  }
@@ -1 +1 @@
1
- {"version":3,"file":"rules-auditor.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/rules-auditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules-auditor.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/rules-auditor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/scoring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAQ1D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAuB1F;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAexE"}
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/scoring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA2B1D,wBAAgB,cAAc,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CA2C1F;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE,CAexE"}
@@ -3,10 +3,46 @@ const SEVERITY_PENALTY = {
3
3
  warn: 8,
4
4
  info: 2,
5
5
  };
6
+ // SPEC-255: code-specific penalties (override severity penalty)
7
+ const CODE_PENALTY = {
8
+ LINE_COUNT_CRITICAL: 25,
9
+ LINE_COUNT_WARN: 10,
10
+ AUTO_MODE_ENV_MISSING: 8,
11
+ BYPASS_PERMISSIONS_NO_ISOLATION: 20,
12
+ };
13
+ // SPEC-255: codes with per-finding deduction and total cap
14
+ const CODE_PER_FINDING = {
15
+ REDUNDANT_INSTRUCTION: 3,
16
+ AMBIGUOUS_INSTRUCTION: 2,
17
+ };
18
+ const CODE_MAX_TOTAL = {
19
+ REDUNDANT_INSTRUCTION: 15,
20
+ AMBIGUOUS_INSTRUCTION: 10,
21
+ };
6
22
  export function calculateScore(findings) {
7
23
  let score = 100;
24
+ // Track accumulated deductions for capped codes
25
+ const codeAccumulated = {};
8
26
  for (const f of findings) {
9
- score -= SEVERITY_PENALTY[f.severity] ?? 0;
27
+ const code = f.code;
28
+ if (code !== undefined && CODE_PENALTY[code] !== undefined) {
29
+ // Use code-specific flat penalty instead of severity penalty
30
+ score -= CODE_PENALTY[code] ?? 0;
31
+ }
32
+ else if (code !== undefined && CODE_PER_FINDING[code] !== undefined) {
33
+ // Per-finding deduction with a total cap
34
+ const perFinding = CODE_PER_FINDING[code] ?? 0;
35
+ const maxTotal = CODE_MAX_TOTAL[code] ?? Infinity;
36
+ const accumulated = codeAccumulated[code] ?? 0;
37
+ const actual = Math.min(perFinding, maxTotal - accumulated);
38
+ if (actual > 0) {
39
+ score -= actual;
40
+ codeAccumulated[code] = accumulated + actual;
41
+ }
42
+ }
43
+ else {
44
+ score -= SEVERITY_PENALTY[f.severity] ?? 0;
45
+ }
10
46
  }
11
47
  score = Math.max(0, score);
12
48
  let grade;
@@ -1 +1 @@
1
- {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/scoring.ts"],"names":[],"mappings":"AAGA,MAAM,gBAAgB,GAA2B;IAC/C,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,QAAyB;IACtD,IAAI,KAAK,GAAG,GAAG,CAAC;IAEhB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,KAAK,IAAI,gBAAgB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAE3B,IAAI,KAAa,CAAC;IAClB,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;SAAM,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACvB,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;SAAM,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACvB,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;SAAM,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACvB,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;SAAM,CAAC;QACN,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAyB;IACrD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAE9F,MAAM,aAAa,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAEvE,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,GAAG,EAAE,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/scoring.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"settings-auditor.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/settings-auditor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AAsBxE,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAyEjF"}
1
+ {"version":3,"file":"settings-auditor.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/settings-auditor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AA2ExE,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAgCjF"}
@@ -20,50 +20,67 @@ async function pathExists(p) {
20
20
  return false;
21
21
  }
22
22
  }
23
- export async function auditSettings(projectPath) {
23
+ function auditSingleSettings(data, label) {
24
24
  const findings = [];
25
- const settingsPath = join(projectPath, '.claude', 'settings.json');
26
- const localSettingsPath = join(projectPath, '.claude', 'settings.local.json');
27
- // Check main settings
28
- const settings = await readSettings(settingsPath);
29
- const localSettings = await readSettings(localSettingsPath);
30
- const allSettings = [
31
- { data: settings, label: 'settings.json' },
32
- { data: localSettings, label: 'settings.local.json' },
33
- ];
34
- for (const { data, label } of allSettings) {
35
- if (!data) {
36
- continue;
37
- }
38
- // Check for obsolete permission patterns
39
- const allowList = data.permissions?.allow ?? [];
40
- const obsoletePatterns = ['mcp__specforge__', 'mcp__sdd__'];
41
- for (const pattern of obsoletePatterns) {
42
- const obsolete = allowList.filter((p) => p.includes(pattern));
43
- if (obsolete.length > 0) {
44
- findings.push({
45
- area: 'settings',
46
- severity: 'warn',
47
- message: `${label} has ${String(obsolete.length)} obsolete permission(s) matching "${pattern}"`,
48
- suggestion: `Remove obsolete entries from permissions.allow: ${obsolete.join(', ')}`,
49
- docsRef: DOCS_REF,
50
- });
51
- }
52
- }
53
- // Check autoMemoryEnabled
54
- if (data.autoMemoryEnabled === false) {
25
+ const allowList = data.permissions?.allow ?? [];
26
+ for (const pattern of ['mcp__specforge__', 'mcp__sdd__']) {
27
+ const obsolete = allowList.filter((p) => p.includes(pattern));
28
+ if (obsolete.length > 0) {
55
29
  findings.push({
56
30
  area: 'settings',
57
- severity: 'info',
58
- message: `${label} has autoMemoryEnabled: false auto-memory is disabled`,
59
- suggestion: 'Consider enabling auto-memory for cross-session learning',
31
+ severity: 'warn',
32
+ message: `${label} has ${String(obsolete.length)} obsolete permission(s) matching "${pattern}"`,
33
+ suggestion: `Remove obsolete entries from permissions.allow: ${obsolete.join(', ')}`,
60
34
  docsRef: DOCS_REF,
61
35
  });
62
36
  }
63
37
  }
64
- // Check for skills directory
65
- const skillsDir = join(projectPath, '.claude', 'skills');
66
- if (!(await pathExists(skillsDir))) {
38
+ if (data.autoMemoryEnabled === false) {
39
+ findings.push({
40
+ area: 'settings',
41
+ severity: 'info',
42
+ message: `${label} has autoMemoryEnabled: false — auto-memory is disabled`,
43
+ suggestion: 'Consider enabling auto-memory for cross-session learning',
44
+ docsRef: DOCS_REF,
45
+ });
46
+ }
47
+ const defaultMode = data.permissions?.defaultMode;
48
+ if ((defaultMode === 'auto' || defaultMode === 'acceptEdits') &&
49
+ data.autoMode?.environment === undefined) {
50
+ findings.push({
51
+ area: 'settings',
52
+ severity: 'warn',
53
+ code: 'AUTO_MODE_ENV_MISSING',
54
+ message: `${label} has permissions.defaultMode="${defaultMode}" but no autoMode.environment configured`,
55
+ suggestion: 'Configure autoMode.environment (e.g., "docker", "vm") to define trusted repos/buckets for auto-mode',
56
+ docsRef: DOCS_REF,
57
+ });
58
+ }
59
+ if (defaultMode === 'bypassPermissions') {
60
+ findings.push({
61
+ area: 'settings',
62
+ severity: 'critical',
63
+ code: 'BYPASS_PERMISSIONS_NO_ISOLATION',
64
+ message: `${label} has permissions.defaultMode="bypassPermissions" — all permission checks are disabled`,
65
+ suggestion: 'Only use bypassPermissions inside isolated containers or VMs. Remove from developer workstations.',
66
+ docsRef: DOCS_REF,
67
+ });
68
+ }
69
+ return findings;
70
+ }
71
+ export async function auditSettings(projectPath) {
72
+ const findings = [];
73
+ const pairs = [
74
+ { path: join(projectPath, '.claude', 'settings.json'), label: 'settings.json' },
75
+ { path: join(projectPath, '.claude', 'settings.local.json'), label: 'settings.local.json' },
76
+ ];
77
+ for (const { path: p, label } of pairs) {
78
+ const data = await readSettings(p);
79
+ if (data) {
80
+ findings.push(...auditSingleSettings(data, label));
81
+ }
82
+ }
83
+ if (!(await pathExists(join(projectPath, '.claude', 'skills')))) {
67
84
  findings.push({
68
85
  area: 'settings',
69
86
  severity: 'info',
@@ -72,9 +89,7 @@ export async function auditSettings(projectPath) {
72
89
  docsRef: DOCS_REF,
73
90
  });
74
91
  }
75
- // Check for hooks configuration
76
- const hooksDir = join(projectPath, '.claude', 'hooks');
77
- if (!(await pathExists(hooksDir))) {
92
+ if (!(await pathExists(join(projectPath, '.claude', 'hooks')))) {
78
93
  findings.push({
79
94
  area: 'settings',
80
95
  severity: 'info',
@@ -1 +1 @@
1
- {"version":3,"file":"settings-auditor.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/settings-auditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"settings-auditor.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/settings-auditor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-schemas.d.ts","sourceRoot":"","sources":["../../src/engine/config-schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,YAAY,EAAE,uBAAuB,IAAI,0BAA0B,EAAE,sBAAsB,EAAE,CAAC;AAQ9F,eAAO,MAAM,0BAA0B;;;;;;;;;;;;iBAQrC,CAAC;AAEH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;kBAAsC,CAAC;AA0BpF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBjC,CAAC"}
1
+ {"version":3,"file":"config-schemas.d.ts","sourceRoot":"","sources":["../../src/engine/config-schemas.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,YAAY,EAAE,uBAAuB,IAAI,0BAA0B,EAAE,sBAAsB,EAAE,CAAC;AAQ9F,eAAO,MAAM,0BAA0B;;;;;;;;;;;;iBAQrC,CAAC;AAEH,eAAO,MAAM,gCAAgC;;;;;;;;;;;;kBAAsC,CAAC;AA0BpF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBjC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  // engine/config-schemas.ts — Zod schemas for JSON config validation (SPEC-205)
2
+ /* v8 ignore file */
2
3
  // Each area that uses ConfigLoader/ObjectConfigLoader defines its schema here.
3
4
  import { z } from 'zod';
4
5
  // ---------------------------------------------------------------------------
@@ -1 +1 @@
1
- {"version":3,"file":"config-schemas.js","sourceRoot":"","sources":["../../src/engine/config-schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config-schemas.js","sourceRoot":"","sources":["../../src/engine/config-schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { BtwHint } from '../../types/index.js';
2
+ /**
3
+ * Returns true if /btw should be suggested based on context usage.
4
+ * Suggests /btw when context >= 60% to avoid contaminating session.
5
+ */
6
+ export declare function shouldSuggestBtw(contextPercent: number): boolean;
7
+ /**
8
+ * Builds a formatted hint explaining /btw and when to use it.
9
+ */
10
+ export declare function buildBtwHint(reason: string): BtwHint;
11
+ //# sourceMappingURL=btw-advisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btw-advisor.d.ts","sourceRoot":"","sources":["../../../src/engine/context-advisor/btw-advisor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAiBpD"}
@@ -0,0 +1,29 @@
1
+ // engine/context-advisor/btw-advisor.ts — SPEC-256 Context-Safe Side Queries advisor
2
+ /**
3
+ * Returns true if /btw should be suggested based on context usage.
4
+ * Suggests /btw when context >= 60% to avoid contaminating session.
5
+ */
6
+ export function shouldSuggestBtw(contextPercent) {
7
+ return contextPercent >= 60;
8
+ }
9
+ /**
10
+ * Builds a formatted hint explaining /btw and when to use it.
11
+ */
12
+ export function buildBtwHint(reason) {
13
+ return {
14
+ command: '/btw your question here',
15
+ description: 'Asks a side question without entering it into conversation history. Answer appears in a dismissible overlay.',
16
+ whenToUse: [
17
+ 'Checking a version number or API detail mid-task',
18
+ 'Quick "does X exist?" questions',
19
+ 'Verifying a convention without tracking the answer',
20
+ 'Reading docs while implementing',
21
+ ],
22
+ whenNotToUse: [
23
+ 'Implementation decisions that should be tracked',
24
+ 'Questions whose answers Claude will need to act on',
25
+ ],
26
+ reason,
27
+ };
28
+ }
29
+ //# sourceMappingURL=btw-advisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"btw-advisor.js","sourceRoot":"","sources":["../../../src/engine/context-advisor/btw-advisor.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAIrF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAsB;IACrD,OAAO,cAAc,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO;QACL,OAAO,EAAE,yBAAyB;QAClC,WAAW,EACT,8GAA8G;QAChH,SAAS,EAAE;YACT,kDAAkD;YAClD,iCAAiC;YACjC,oDAAoD;YACpD,iCAAiC;SAClC;QACD,YAAY,EAAE;YACZ,iDAAiD;YACjD,oDAAoD;SACrD;QACD,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { LoadedFacilitateContext } from '../../types/index.js';
2
+ /**
3
+ * Load spec context directly from disk — no MCP tool calls.
4
+ * Gracefully handles empty/missing project directories.
5
+ */
6
+ export declare function loadContext(projectPath: string, keywords: string[]): Promise<LoadedFacilitateContext>;
7
+ /**
8
+ * Load context from a planu/ specs directory (alternative path — reads spec.md frontmatter).
9
+ * Used when data/ is not available but planu/ is present.
10
+ */
11
+ export declare function loadContextFromPlanuDir(planuSpecsDir: string, keywords: string[]): Promise<LoadedFacilitateContext>;
12
+ //# sourceMappingURL=context-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-loader.d.ts","sourceRoot":"","sources":["../../../src/engine/facilitate/context-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,uBAAuB,EAGxB,MAAM,sBAAsB,CAAC;AAyF9B;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,uBAAuB,CAAC,CAwBlC;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,uBAAuB,CAAC,CAyClC"}