@planu/cli 0.90.2 → 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 (226) 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/team-planner/writer-reviewer.d.ts +12 -0
  76. package/dist/engine/team-planner/writer-reviewer.d.ts.map +1 -0
  77. package/dist/engine/team-planner/writer-reviewer.js +48 -0
  78. package/dist/engine/team-planner/writer-reviewer.js.map +1 -0
  79. package/dist/engine/tool-groups/group-manager.js.map +1 -1
  80. package/dist/index.js +11 -1
  81. package/dist/index.js.map +1 -1
  82. package/dist/storage/drift-cache-store.js.map +1 -1
  83. package/dist/storage/error-telemetry-store.js.map +1 -1
  84. package/dist/storage/federation-store.js.map +1 -1
  85. package/dist/storage/global-store.js.map +1 -1
  86. package/dist/storage/living-dashboard-store.js.map +1 -1
  87. package/dist/storage/metrics-store.js.map +1 -1
  88. package/dist/storage/rbac-store.js.map +1 -1
  89. package/dist/storage/spec-observability-store.js.map +1 -1
  90. package/dist/storage/worker-metrics-store.js.map +1 -1
  91. package/dist/storage/worker-store.js.map +1 -1
  92. package/dist/tools/checkpoint-handler.d.ts.map +1 -1
  93. package/dist/tools/checkpoint-handler.js +11 -0
  94. package/dist/tools/checkpoint-handler.js.map +1 -1
  95. package/dist/tools/clarify-requirements/interview-mode.d.ts +42 -0
  96. package/dist/tools/clarify-requirements/interview-mode.d.ts.map +1 -0
  97. package/dist/tools/clarify-requirements/interview-mode.js +342 -0
  98. package/dist/tools/clarify-requirements/interview-mode.js.map +1 -0
  99. package/dist/tools/configure-workers-handler.d.ts.map +1 -1
  100. package/dist/tools/configure-workers-handler.js +81 -0
  101. package/dist/tools/configure-workers-handler.js.map +1 -1
  102. package/dist/tools/facilitate.d.ts +1 -5
  103. package/dist/tools/facilitate.d.ts.map +1 -1
  104. package/dist/tools/facilitate.js +100 -23
  105. package/dist/tools/facilitate.js.map +1 -1
  106. package/dist/tools/generate-automation-guide.d.ts +10 -0
  107. package/dist/tools/generate-automation-guide.d.ts.map +1 -0
  108. package/dist/tools/generate-automation-guide.js +222 -0
  109. package/dist/tools/generate-automation-guide.js.map +1 -0
  110. package/dist/tools/generate-batch-script.d.ts +27 -0
  111. package/dist/tools/generate-batch-script.d.ts.map +1 -0
  112. package/dist/tools/generate-batch-script.js +77 -0
  113. package/dist/tools/generate-batch-script.js.map +1 -0
  114. package/dist/tools/generate-sub-agent.d.ts.map +1 -1
  115. package/dist/tools/generate-sub-agent.js +16 -2
  116. package/dist/tools/generate-sub-agent.js.map +1 -1
  117. package/dist/tools/git/branch-ops.d.ts +18 -0
  118. package/dist/tools/git/branch-ops.d.ts.map +1 -1
  119. package/dist/tools/git/branch-ops.js +121 -0
  120. package/dist/tools/git/branch-ops.js.map +1 -1
  121. package/dist/tools/git/pr-ops.d.ts.map +1 -1
  122. package/dist/tools/git/pr-ops.js +7 -0
  123. package/dist/tools/git/pr-ops.js.map +1 -1
  124. package/dist/tools/init-project/handler.d.ts.map +1 -1
  125. package/dist/tools/init-project/handler.js +4 -1
  126. package/dist/tools/init-project/handler.js.map +1 -1
  127. package/dist/tools/init-project/hooks-configurator.d.ts +17 -0
  128. package/dist/tools/init-project/hooks-configurator.d.ts.map +1 -0
  129. package/dist/tools/init-project/hooks-configurator.js +102 -0
  130. package/dist/tools/init-project/hooks-configurator.js.map +1 -0
  131. package/dist/tools/init-project/planu-workflow-generator.d.ts +21 -0
  132. package/dist/tools/init-project/planu-workflow-generator.d.ts.map +1 -0
  133. package/dist/tools/init-project/planu-workflow-generator.js +73 -0
  134. package/dist/tools/init-project/planu-workflow-generator.js.map +1 -0
  135. package/dist/tools/init-project/rules-generator.d.ts +15 -0
  136. package/dist/tools/init-project/rules-generator.d.ts.map +1 -0
  137. package/dist/tools/init-project/rules-generator.js +110 -0
  138. package/dist/tools/init-project/rules-generator.js.map +1 -0
  139. package/dist/tools/init-project/scaffold-writer.d.ts +3 -0
  140. package/dist/tools/init-project/scaffold-writer.d.ts.map +1 -1
  141. package/dist/tools/init-project/scaffold-writer.js +33 -0
  142. package/dist/tools/init-project/scaffold-writer.js.map +1 -1
  143. package/dist/tools/integrate-pm.js.map +1 -1
  144. package/dist/tools/list-sessions.d.ts.map +1 -1
  145. package/dist/tools/list-sessions.js +8 -0
  146. package/dist/tools/list-sessions.js.map +1 -1
  147. package/dist/tools/manage-git.d.ts.map +1 -1
  148. package/dist/tools/manage-git.js +15 -1
  149. package/dist/tools/manage-git.js.map +1 -1
  150. package/dist/tools/orchestrate/state.js.map +1 -1
  151. package/dist/tools/recommend-model-handler.d.ts.map +1 -1
  152. package/dist/tools/recommend-model-handler.js +7 -0
  153. package/dist/tools/recommend-model-handler.js.map +1 -1
  154. package/dist/tools/register-facilitator-tools.d.ts.map +1 -1
  155. package/dist/tools/register-facilitator-tools.js +12 -7
  156. package/dist/tools/register-facilitator-tools.js.map +1 -1
  157. package/dist/tools/register-generate-automation-guide.d.ts +3 -0
  158. package/dist/tools/register-generate-automation-guide.d.ts.map +1 -0
  159. package/dist/tools/register-generate-automation-guide.js +10 -0
  160. package/dist/tools/register-generate-automation-guide.js.map +1 -0
  161. package/dist/tools/register-generate-batch-script.d.ts +3 -0
  162. package/dist/tools/register-generate-batch-script.d.ts.map +1 -0
  163. package/dist/tools/register-generate-batch-script.js +10 -0
  164. package/dist/tools/register-generate-batch-script.js.map +1 -0
  165. package/dist/tools/register-hooks-tools.d.ts.map +1 -1
  166. package/dist/tools/register-hooks-tools.js +27 -0
  167. package/dist/tools/register-hooks-tools.js.map +1 -1
  168. package/dist/tools/register-platform-tools/design-stack-tools.d.ts.map +1 -1
  169. package/dist/tools/register-platform-tools/design-stack-tools.js +4 -0
  170. package/dist/tools/register-platform-tools/design-stack-tools.js.map +1 -1
  171. package/dist/tools/restore-session.d.ts.map +1 -1
  172. package/dist/tools/restore-session.js +10 -0
  173. package/dist/tools/restore-session.js.map +1 -1
  174. package/dist/tools/schemas/ide-config.d.ts +2 -2
  175. package/dist/tools/schemas/workers-schema.d.ts +1 -0
  176. package/dist/tools/schemas/workers-schema.d.ts.map +1 -1
  177. package/dist/tools/schemas/workers-schema.js +10 -2
  178. package/dist/tools/schemas/workers-schema.js.map +1 -1
  179. package/dist/tools/start-hooks.d.ts.map +1 -1
  180. package/dist/tools/start-hooks.js +104 -1
  181. package/dist/tools/start-hooks.js.map +1 -1
  182. package/dist/tools/status-handler.d.ts.map +1 -1
  183. package/dist/tools/status-handler.js +9 -0
  184. package/dist/tools/status-handler.js.map +1 -1
  185. package/dist/types/analysis.d.ts +8 -0
  186. package/dist/types/analysis.d.ts.map +1 -1
  187. package/dist/types/batch-script.d.ts +36 -0
  188. package/dist/types/batch-script.d.ts.map +1 -0
  189. package/dist/types/batch-script.js +3 -0
  190. package/dist/types/batch-script.js.map +1 -0
  191. package/dist/types/ci.d.ts +4 -0
  192. package/dist/types/ci.d.ts.map +1 -1
  193. package/dist/types/common/tech-enums.d.ts +1 -1
  194. package/dist/types/common/tech-enums.d.ts.map +1 -1
  195. package/dist/types/execution.d.ts +9 -0
  196. package/dist/types/execution.d.ts.map +1 -1
  197. package/dist/types/facilitator.d.ts +67 -0
  198. package/dist/types/facilitator.d.ts.map +1 -1
  199. package/dist/types/file-hooks.d.ts +7 -0
  200. package/dist/types/file-hooks.d.ts.map +1 -1
  201. package/dist/types/file-hooks.js +0 -1
  202. package/dist/types/file-hooks.js.map +1 -1
  203. package/dist/types/git.d.ts +12 -0
  204. package/dist/types/git.d.ts.map +1 -1
  205. package/dist/types/hooks.d.ts +77 -0
  206. package/dist/types/hooks.d.ts.map +1 -1
  207. package/dist/types/index.d.ts +1 -0
  208. package/dist/types/index.d.ts.map +1 -1
  209. package/dist/types/index.js +1 -0
  210. package/dist/types/index.js.map +1 -1
  211. package/dist/types/model-routing.d.ts +16 -0
  212. package/dist/types/model-routing.d.ts.map +1 -1
  213. package/dist/types/project/planu-config.d.ts +6 -0
  214. package/dist/types/project/planu-config.d.ts.map +1 -1
  215. package/dist/types/session.d.ts +2 -0
  216. package/dist/types/session.d.ts.map +1 -1
  217. package/dist/types/stack/recommend.d.ts +1 -0
  218. package/dist/types/stack/recommend.d.ts.map +1 -1
  219. package/dist/types/status.d.ts +7 -0
  220. package/dist/types/status.d.ts.map +1 -1
  221. package/dist/types/team-planner.d.ts +18 -0
  222. package/dist/types/team-planner.d.ts.map +1 -1
  223. package/dist/types/workers.d.ts +1 -1
  224. package/dist/types/workers.d.ts.map +1 -1
  225. package/package.json +10 -10
  226. package/src/config/license-plans.json +3 -1
@@ -193,7 +193,9 @@
193
193
  "generate_spec_from_design",
194
194
  "configure_oauth",
195
195
  "elicit_requirements",
196
- "red_team"
196
+ "red_team",
197
+ "generate_batch_script",
198
+ "generate_automation_guide"
197
199
  ],
198
200
  "alwaysAllowed": [
199
201
  "activate_license",
@@ -0,0 +1,6 @@
1
+ import type { BatchScriptInput, BatchScriptOutput } from '../../types/index.js';
2
+ /**
3
+ * Generate full and pilot bash scripts for fan-out batch processing with claude -p.
4
+ */
5
+ export declare function generateBatchScript(input: BatchScriptInput): Promise<BatchScriptOutput>;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/batch-script-generator/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAwHhF;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsD7F"}
@@ -0,0 +1,126 @@
1
+ // engine/batch-script-generator/index.ts — Fan-out batch script generator (SPEC-253)
2
+ import { writeFile, chmod } from 'node:fs/promises';
3
+ import { join } from 'node:path';
4
+ const DEFAULT_PILOT_COUNT = 3;
5
+ const DEFAULT_OUTPUT_FORMAT = 'text';
6
+ const DEFAULT_PERMISSION_MODE = 'auto';
7
+ /**
8
+ * Convert a glob pattern to a find-compatible path expression.
9
+ * e.g. "src/**\/*.ts" -> "-path './src/**\/*.ts'"
10
+ */
11
+ function globToFind(pattern) {
12
+ // Normalize: ensure pattern starts with ./
13
+ const normalized = pattern.startsWith('./') ? pattern : `./${pattern}`;
14
+ return normalized;
15
+ }
16
+ /**
17
+ * Estimate number of files from a glob pattern (heuristic based on specificity).
18
+ * Returns a rough estimate without filesystem access.
19
+ */
20
+ function estimateFileCount(fileGlob) {
21
+ if (fileGlob.includes('**')) {
22
+ return 50;
23
+ }
24
+ if (fileGlob.includes('*')) {
25
+ return 10;
26
+ }
27
+ return 1;
28
+ }
29
+ /**
30
+ * Build the main loop body used in both full and pilot scripts.
31
+ */
32
+ function buildLoopBody(taskDescription, allowedTools, outputFormat, permissionMode) {
33
+ const toolsArg = allowedTools.length > 0 ? ` --allowedTools "${allowedTools.join(',')}"` : '';
34
+ const lines = [
35
+ 'for file in "${FILES[@]}"; do',
36
+ ' echo -n "[$(($PASS + $FAIL + 1))/$TOTAL] $file ... "',
37
+ ` if claude -p "${taskDescription} for file: $file" \\`,
38
+ ];
39
+ if (toolsArg) {
40
+ lines.push(`${toolsArg} \\`);
41
+ }
42
+ lines.push(` --permission-mode ${permissionMode} \\`, ` --output-format ${outputFormat}; then`, ' echo "OK" && ((PASS++))', ' echo "OK: $file" >> "$LOG_FILE"', ' else', ' echo "FAIL" && ((FAIL++))', ' echo "FAIL: $file" >> "$LOG_FILE"', ' fi', 'done');
43
+ return lines.join('\n');
44
+ }
45
+ /**
46
+ * Build the bash script header (shebang, set, variables, file discovery).
47
+ */
48
+ function buildScriptHeader(taskDescription, specId, fileGlob, timestamp) {
49
+ const specLabel = specId ? ` — ${specId}` : '';
50
+ const findPattern = globToFind(fileGlob);
51
+ return [
52
+ '#!/usr/bin/env bash',
53
+ `# Planu batch script${specLabel} — Generated ${timestamp}`,
54
+ `# Task: ${taskDescription}`,
55
+ 'set -euo pipefail',
56
+ '',
57
+ 'SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"',
58
+ `LOG_FILE="$SCRIPT_DIR/batch-results-${timestamp.replace(/[:.]/g, '-')}.log"`,
59
+ 'FILES=()',
60
+ `while IFS= read -r -d '' f; do FILES+=("$f"); done < <(find . -path "${findPattern}" -print0 2>/dev/null)`,
61
+ 'TOTAL=${#FILES[@]}',
62
+ 'PASS=0; FAIL=0',
63
+ '',
64
+ `echo "[$(date -u +%Y-%m-%dT%H:%M:%S)] Starting batch: $TOTAL files" | tee "$LOG_FILE"`,
65
+ '',
66
+ ].join('\n');
67
+ }
68
+ /**
69
+ * Build the script footer with summary output.
70
+ */
71
+ function buildScriptFooter() {
72
+ return [
73
+ '',
74
+ 'echo ""',
75
+ 'echo "============================="',
76
+ 'echo "Done: $PASS ok / $FAIL failed / $TOTAL total"',
77
+ 'echo "Log: $LOG_FILE"',
78
+ ].join('\n');
79
+ }
80
+ /**
81
+ * Build a pilot script with only the first `pilotCount` files hardcoded.
82
+ */
83
+ function buildPilotScript(fullScript, pilotFiles) {
84
+ // Replace the FILES=() array population block with hardcoded files
85
+ const hardcoded = pilotFiles.map((f) => ` "${f}"`).join('\n');
86
+ const filesBlock = `FILES=(\n${hardcoded}\n)`;
87
+ return fullScript.replace(/FILES=\(\)\nwhile IFS=.*?done < <\(find[^\n]+\)\n/, `${filesBlock}\n`);
88
+ }
89
+ /**
90
+ * Generate full and pilot bash scripts for fan-out batch processing with claude -p.
91
+ */
92
+ export async function generateBatchScript(input) {
93
+ const { projectPath, taskDescription, fileGlob, specId, allowedTools = [], outputFormat = DEFAULT_OUTPUT_FORMAT, permissionMode = DEFAULT_PERMISSION_MODE, pilotCount = DEFAULT_PILOT_COUNT, dryRun = false, } = input;
94
+ const timestamp = new Date().toISOString().replace(/\.\d{3}Z$/, '');
95
+ const safeTimestamp = timestamp.replace(/[:.]/g, '-');
96
+ const specSlug = specId ? `${specId}-` : '';
97
+ const fullScriptName = `batch-${specSlug}${safeTimestamp}.sh`;
98
+ const pilotScriptName = `batch-pilot-${safeTimestamp}.sh`;
99
+ const fullScriptPath = join(projectPath, fullScriptName);
100
+ const pilotScriptPath = join(projectPath, pilotScriptName);
101
+ const header = buildScriptHeader(taskDescription, specId, fileGlob, timestamp);
102
+ const loopBody = buildLoopBody(taskDescription, allowedTools, outputFormat, permissionMode);
103
+ const footer = buildScriptFooter();
104
+ const fullScript = `${header}${loopBody}${footer}\n`;
105
+ // Build pilot script with placeholder files (actual files resolved at runtime)
106
+ // We use placeholders since we don't do filesystem access during generation
107
+ const pilotPlaceholders = Array.from({ length: pilotCount }, (_, i) => `./file-${String(i + 1)}-replace-me`);
108
+ const pilotScript = buildPilotScript(fullScript, pilotPlaceholders);
109
+ const estimatedFiles = estimateFileCount(fileGlob);
110
+ if (!dryRun) {
111
+ await writeFile(fullScriptPath, fullScript, { encoding: 'utf8' });
112
+ await chmod(fullScriptPath, 0o755);
113
+ await writeFile(pilotScriptPath, pilotScript, { encoding: 'utf8' });
114
+ await chmod(pilotScriptPath, 0o755);
115
+ }
116
+ return {
117
+ fullScript,
118
+ pilotScript,
119
+ fullScriptPath,
120
+ pilotScriptPath,
121
+ suggestedPilotCommand: `bash ${pilotScriptName}`,
122
+ scaleUpCommand: `bash ${fullScriptName}`,
123
+ estimatedFiles,
124
+ };
125
+ }
126
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/batch-script-generator/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/ci-generator/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EACf,gBAAgB,EAEjB,MAAM,sBAAsB,CAAC;AAS9B;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAwDlF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engine/ci-generator/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAMV,eAAe,EACf,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAsC9B;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+DlF"}
@@ -1,16 +1,42 @@
1
1
  // ci-generator/index.ts — Public API for the CI workflow generator (SPEC-066)
2
+ import { buildClaudeCommand, getJobPermissionMode } from './output-formats.js';
2
3
  import { detectCIStack } from './stack-detector.js';
3
4
  import { buildWorkflow, serializeWorkflow } from './yaml-builder.js';
4
5
  const DEFAULT_JOBS = ['lint', 'test', 'build'];
5
6
  const DEFAULT_TRIGGERS = ['push', 'pull_request'];
6
7
  const DEFAULT_WORKFLOW_NAME = 'CI';
7
8
  const DEFAULT_SPECS_DIR = 'planu/specs';
9
+ /**
10
+ * Build a Claude validate job using plan permission mode (SPEC-257).
11
+ */
12
+ function buildClaudeValidateJob(needsJobs) {
13
+ const permMode = getJobPermissionMode('validate');
14
+ const cmd = buildClaudeCommand({
15
+ prompt: 'validate all specs',
16
+ nonInteractive: true,
17
+ permissionMode: permMode,
18
+ });
19
+ const steps = [
20
+ { name: 'Checkout code', uses: 'actions/checkout@v4' },
21
+ {
22
+ name: 'Validate specs with Claude',
23
+ run: cmd,
24
+ env: { ANTHROPIC_API_KEY: '${{ secrets.ANTHROPIC_API_KEY }}' },
25
+ },
26
+ ];
27
+ return {
28
+ name: 'Claude Spec Validation',
29
+ runsOn: 'ubuntu-latest',
30
+ needs: needsJobs,
31
+ steps,
32
+ };
33
+ }
8
34
  /**
9
35
  * Generate a GitHub Actions CI workflow for a project.
10
36
  * Detects the project stack and generates a valid workflow YAML.
11
37
  */
12
38
  export async function generateCI(input) {
13
- const { projectPath, jobs = DEFAULT_JOBS, triggers = DEFAULT_TRIGGERS, nodeVersion, pythonVersion, goVersion, rustChannel, javaVersion, workflowName = DEFAULT_WORKFLOW_NAME, includeDriftStep = false, specsDir = DEFAULT_SPECS_DIR, driftSeverityThreshold = 'warning', } = input;
39
+ const { projectPath, jobs = DEFAULT_JOBS, triggers = DEFAULT_TRIGGERS, nodeVersion, pythonVersion, goVersion, rustChannel, javaVersion, workflowName = DEFAULT_WORKFLOW_NAME, includeDriftStep = false, specsDir = DEFAULT_SPECS_DIR, driftSeverityThreshold = 'warning', includeClaudeValidateJob = false, } = input;
14
40
  // Detect stack from project files, create a mutable copy
15
41
  const detected = await detectCIStack(projectPath);
16
42
  const stackContext = { ...detected };
@@ -36,6 +62,11 @@ export async function generateCI(input) {
36
62
  : undefined;
37
63
  // Build the workflow model
38
64
  const workflow = buildWorkflow(stackContext, jobs, triggers, workflowName, driftOptions);
65
+ // Add Claude validate job if requested (SPEC-257)
66
+ if (includeClaudeValidateJob) {
67
+ const existingJobs = Object.keys(workflow.jobs);
68
+ workflow.jobs['claude-validate'] = buildClaudeValidateJob(existingJobs);
69
+ }
39
70
  // Serialize to YAML
40
71
  const yamlContent = serializeWorkflow(workflow);
41
72
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/ci-generator/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAS9E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAErE,MAAM,YAAY,GAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC5D,MAAM,gBAAgB,GAAqB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;AACpE,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAExC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,EACJ,WAAW,EACX,IAAI,GAAG,YAAY,EACnB,QAAQ,GAAG,gBAAgB,EAC3B,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,WAAW,EACX,YAAY,GAAG,qBAAqB,EACpC,gBAAgB,GAAG,KAAK,EACxB,QAAQ,GAAG,iBAAiB,EAC5B,sBAAsB,GAAG,SAAS,GACnC,GAAG,KAAK,CAAC;IAEV,yDAAyD;IACzD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAErC,uDAAuD;IACvD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;IACzC,CAAC;IACD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,YAAY,CAAC,aAAa,GAAG,aAAa,CAAC;IAC7C,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC;IACrC,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;IACzC,CAAC;IACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,YAAY,CAAC,WAAW,GAAG,WAAW,CAAC;IACzC,CAAC;IAED,qCAAqC;IACrC,MAAM,YAAY,GAAgC,gBAAgB;QAChE,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,sBAAsB,EAAE;QACjD,CAAC,CAAC,SAAS,CAAC;IAEd,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;IAEzF,oBAAoB;IACpB,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAEhD,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,YAAY,EAAE,QAAQ,CAAC,QAAQ;QAC/B,WAAW;QACX,IAAI;QACJ,YAAY;QACZ,iBAAiB,EAAE,gBAAgB;KACpC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engine/ci-generator/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ClaudeOutputFormat, ClaudePermissionMode, ClaudeCommandOptions } from '../../types/index.js';
2
+ export type { ClaudeOutputFormat, ClaudePermissionMode, ClaudeCommandOptions };
3
+ /**
4
+ * Generates a claude CLI command string with correct flags
5
+ */
6
+ export declare function buildClaudeCommand(opts: ClaudeCommandOptions): string;
7
+ /**
8
+ * Generates a stream-json pipeline command: claude -p "..." --output-format stream-json | jq '...'
9
+ */
10
+ export declare function generateStreamJsonPipeline(prompt: string, jqFilter?: string): string;
11
+ /**
12
+ * Returns the recommended permission mode for a given CI job type
13
+ */
14
+ export declare function getJobPermissionMode(jobType: 'validate' | 'lint' | 'migrate' | 'container' | 'review'): ClaudePermissionMode;
15
+ //# sourceMappingURL=output-formats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-formats.d.ts","sourceRoot":"","sources":["../../../src/engine/ci-generator/output-formats.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,CAAC;AAE/E;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAsBrE;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CASpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAChE,oBAAoB,CAatB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Generates a claude CLI command string with correct flags
3
+ */
4
+ export function buildClaudeCommand(opts) {
5
+ const parts = ['claude'];
6
+ if (opts.nonInteractive === true) {
7
+ parts.push('-p', `"${opts.prompt}"`);
8
+ }
9
+ else {
10
+ parts.push(`"${opts.prompt}"`);
11
+ }
12
+ if (opts.outputFormat !== undefined && opts.outputFormat !== 'text') {
13
+ parts.push('--output-format', opts.outputFormat);
14
+ }
15
+ if (opts.permissionMode !== undefined && opts.permissionMode !== 'default') {
16
+ parts.push('--permission-mode', opts.permissionMode);
17
+ }
18
+ if (opts.allowedTools !== undefined && opts.allowedTools.length > 0) {
19
+ parts.push('--allowedTools', opts.allowedTools.join(','));
20
+ }
21
+ return parts.join(' ');
22
+ }
23
+ /**
24
+ * Generates a stream-json pipeline command: claude -p "..." --output-format stream-json | jq '...'
25
+ */
26
+ export function generateStreamJsonPipeline(prompt, jqFilter) {
27
+ const claudeCmd = buildClaudeCommand({
28
+ prompt,
29
+ outputFormat: 'stream-json',
30
+ nonInteractive: true,
31
+ });
32
+ const filter = jqFilter ?? '.';
33
+ return `${claudeCmd} | jq '${filter}'`;
34
+ }
35
+ /**
36
+ * Returns the recommended permission mode for a given CI job type
37
+ */
38
+ export function getJobPermissionMode(jobType) {
39
+ switch (jobType) {
40
+ case 'validate':
41
+ return 'plan';
42
+ case 'lint':
43
+ return 'dontAsk';
44
+ case 'migrate':
45
+ return 'auto';
46
+ case 'container':
47
+ return 'bypassPermissions';
48
+ case 'review':
49
+ return 'acceptEdits';
50
+ }
51
+ }
52
+ //# sourceMappingURL=output-formats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output-formats.js","sourceRoot":"","sources":["../../../src/engine/ci-generator/output-formats.ts"],"names":[],"mappings":"AASA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAA0B;IAC3D,MAAM,KAAK,GAAa,CAAC,QAAQ,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,KAAK,MAAM,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAc,EAAE,QAAiB;IAC1E,MAAM,SAAS,GAAG,kBAAkB,CAAC;QACnC,MAAM;QACN,YAAY,EAAE,aAAa;QAC3B,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,IAAI,GAAG,CAAC;IAC/B,OAAO,GAAG,SAAS,UAAU,MAAM,GAAG,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAiE;IAEjE,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,MAAM,CAAC;QAChB,KAAK,WAAW;YACd,OAAO,mBAAmB,CAAC;QAC7B,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"claudemd-auditor.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/claudemd-auditor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA2E1D,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkE1B"}
1
+ {"version":3,"file":"claudemd-auditor.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/claudemd-auditor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAkP1D,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAa1B"}
@@ -1,11 +1,16 @@
1
- // Planu — CLAUDE.md auditor for SPEC-092
2
- import { readFile } from 'node:fs/promises';
1
+ // Planu — CLAUDE.md auditor for SPEC-092 / SPEC-255
2
+ import { readFile, access } from 'node:fs/promises';
3
3
  import { homedir } from 'node:os';
4
4
  import { join } from 'node:path';
5
5
  const DOCS_REF = 'https://code.claude.com/docs/en/memory';
6
6
  const MAX_LINES = 200;
7
7
  const CRITICAL_LINES = 400;
8
8
  const SECTION_THRESHOLD = 20;
9
+ // SPEC-255: tighter thresholds
10
+ const V2_WARN_LINES = 150;
11
+ const V2_CRITICAL_LINES = 250;
12
+ const REDUNDANT_PATTERN = /\b(write clean|be helpful|use best practices|make sure to|always be|follow good|ensure good)\b/i;
13
+ const ACTIONABLE_VERBS = /\b(run|use|avoid|never|always|add|remove|prefer|require|must|do not|don't|check|enforce|ensure|execute|install|create|delete|update)\b/i;
9
14
  async function readFileLines(filePath) {
10
15
  try {
11
16
  const content = await readFile(filePath, 'utf-8');
@@ -15,28 +20,99 @@ async function readFileLines(filePath) {
15
20
  return null;
16
21
  }
17
22
  }
18
- function auditSingleClaudeMd(lines, label) {
19
- const findings = [];
20
- const lineCount = lines.length;
23
+ async function pathExists(p) {
24
+ try {
25
+ await access(p);
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ function auditLineCount(lineCount, label) {
33
+ if (lineCount > V2_CRITICAL_LINES) {
34
+ return {
35
+ area: 'CLAUDE.md',
36
+ severity: 'critical',
37
+ code: 'LINE_COUNT_CRITICAL',
38
+ message: `${label} has ${String(lineCount)} lines (limit: ${String(V2_CRITICAL_LINES)})`,
39
+ suggestion: 'Split into .claude/rules/ files with paths: frontmatter for scoped loading',
40
+ docsRef: DOCS_REF,
41
+ };
42
+ }
43
+ if (lineCount > V2_WARN_LINES) {
44
+ return {
45
+ area: 'CLAUDE.md',
46
+ severity: 'warn',
47
+ code: 'LINE_COUNT_WARN',
48
+ message: `${label} has ${String(lineCount)} lines (recommended: <${String(V2_WARN_LINES)})`,
49
+ suggestion: 'Move detailed sections to .claude/rules/ files to reduce context overhead',
50
+ docsRef: DOCS_REF,
51
+ };
52
+ }
53
+ /* v8 ignore start -- superseded by V2_CRITICAL_LINES check above */
21
54
  if (lineCount > CRITICAL_LINES) {
22
- findings.push({
55
+ return {
23
56
  area: 'CLAUDE.md',
24
57
  severity: 'critical',
25
58
  message: `${label} has ${String(lineCount)} lines (limit: ${String(CRITICAL_LINES)})`,
26
59
  suggestion: 'Split into .claude/rules/ files with paths: frontmatter for scoped loading',
27
60
  docsRef: DOCS_REF,
28
- });
61
+ };
29
62
  }
30
- else if (lineCount > MAX_LINES) {
31
- findings.push({
63
+ /* v8 ignore stop */
64
+ /* v8 ignore start -- superseded by V2_WARN_LINES check above */
65
+ if (lineCount > MAX_LINES) {
66
+ return {
32
67
  area: 'CLAUDE.md',
33
68
  severity: 'warn',
34
69
  message: `${label} has ${String(lineCount)} lines (recommended: <${String(MAX_LINES)})`,
35
70
  suggestion: 'Move detailed sections to .claude/rules/ files to reduce context overhead',
36
71
  docsRef: DOCS_REF,
37
- });
72
+ };
38
73
  }
39
- // Detect large sections that could be extracted to rules
74
+ /* v8 ignore stop */
75
+ return null;
76
+ }
77
+ function auditInstructionQuality(lines) {
78
+ const findings = [];
79
+ for (const line of lines) {
80
+ if (REDUNDANT_PATTERN.test(line)) {
81
+ findings.push({
82
+ area: 'CLAUDE.md',
83
+ severity: 'info',
84
+ code: 'REDUNDANT_INSTRUCTION',
85
+ message: `Redundant instruction detected: "${line.trim().slice(0, 80)}"`,
86
+ suggestion: 'Replace generic phrases with concrete, measurable instructions (e.g., "run pnpm lint" instead of "write clean code")',
87
+ docsRef: DOCS_REF,
88
+ });
89
+ }
90
+ }
91
+ for (let i = 0; i < lines.length; i++) {
92
+ const trimmed = (lines[i] ?? '').trim();
93
+ if (trimmed === '' ||
94
+ trimmed.startsWith('#') ||
95
+ trimmed.startsWith('```') ||
96
+ trimmed.startsWith('-') ||
97
+ trimmed.startsWith('*') ||
98
+ trimmed.startsWith('|')) {
99
+ continue;
100
+ }
101
+ if (trimmed.split(/\s+/).length > 10 && !ACTIONABLE_VERBS.test(trimmed)) {
102
+ findings.push({
103
+ area: 'CLAUDE.md',
104
+ severity: 'info',
105
+ code: 'AMBIGUOUS_INSTRUCTION',
106
+ message: `Ambiguous instruction on line ${String(i + 1)}: "${trimmed.slice(0, 80)}"`,
107
+ suggestion: 'Rewrite with a concrete action verb: run, use, avoid, never, always, add, remove, prefer, require',
108
+ docsRef: DOCS_REF,
109
+ });
110
+ }
111
+ }
112
+ return findings;
113
+ }
114
+ function auditSections(lines) {
115
+ const findings = [];
40
116
  let currentSectionStart = -1;
41
117
  let currentSectionLines = 0;
42
118
  for (let i = 0; i < lines.length; i++) {
@@ -59,7 +135,6 @@ function auditSingleClaudeMd(lines, label) {
59
135
  currentSectionLines++;
60
136
  }
61
137
  }
62
- // Check last section
63
138
  if (currentSectionLines > SECTION_THRESHOLD && currentSectionStart >= 0) {
64
139
  const sectionName = lines[currentSectionStart]?.replace('## ', '') ?? 'unknown';
65
140
  findings.push({
@@ -72,9 +147,16 @@ function auditSingleClaudeMd(lines, label) {
72
147
  }
73
148
  return findings;
74
149
  }
75
- export async function auditClaudeMd(projectPath, includeGlobal) {
150
+ function auditSingleClaudeMd(lines, label) {
151
+ const lineCountFinding = auditLineCount(lines.length, label);
152
+ return [
153
+ ...(lineCountFinding ? [lineCountFinding] : []),
154
+ ...auditInstructionQuality(lines),
155
+ ...auditSections(lines),
156
+ ];
157
+ }
158
+ async function auditProjectClaudeMds(projectPath) {
76
159
  const findings = [];
77
- // Check project-level CLAUDE.md locations
78
160
  const projectPaths = [join(projectPath, 'CLAUDE.md'), join(projectPath, '.claude', 'CLAUDE.md')];
79
161
  let foundProject = false;
80
162
  for (const p of projectPaths) {
@@ -82,6 +164,15 @@ export async function auditClaudeMd(projectPath, includeGlobal) {
82
164
  if (lines) {
83
165
  foundProject = true;
84
166
  findings.push(...auditSingleClaudeMd(lines, `Project CLAUDE.md (${p})`));
167
+ if (!lines.some((l) => l.startsWith('@'))) {
168
+ findings.push({
169
+ area: 'CLAUDE.md',
170
+ severity: 'info',
171
+ message: 'CLAUDE.md does not use @path imports (e.g. @README.md, @package.json)',
172
+ suggestion: 'Use @path syntax to import key files so Claude always has fresh context',
173
+ docsRef: DOCS_REF,
174
+ });
175
+ }
85
176
  }
86
177
  }
87
178
  if (!foundProject) {
@@ -93,9 +184,7 @@ export async function auditClaudeMd(projectPath, includeGlobal) {
93
184
  docsRef: DOCS_REF,
94
185
  });
95
186
  }
96
- // Check for CLAUDE.local.md
97
- const localMdLines = await readFileLines(join(projectPath, 'CLAUDE.local.md'));
98
- if (!localMdLines) {
187
+ if (!(await readFileLines(join(projectPath, 'CLAUDE.local.md')))) {
99
188
  findings.push({
100
189
  area: 'CLAUDE.md',
101
190
  severity: 'info',
@@ -104,26 +193,45 @@ export async function auditClaudeMd(projectPath, includeGlobal) {
104
193
  docsRef: DOCS_REF,
105
194
  });
106
195
  }
107
- // Check for @import syntax
196
+ return findings;
197
+ }
198
+ async function auditAgentsMdImport(projectPath) {
199
+ const projectPaths = [join(projectPath, 'CLAUDE.md'), join(projectPath, '.claude', 'CLAUDE.md')];
200
+ const agentsMdExists = await pathExists(join(projectPath, 'AGENTS.md'));
201
+ const cursorRulesExists = await pathExists(join(projectPath, '.cursor', 'rules'));
202
+ if (!agentsMdExists && !cursorRulesExists) {
203
+ return [];
204
+ }
205
+ const allLines = [];
108
206
  for (const p of projectPaths) {
109
207
  const lines = await readFileLines(p);
110
208
  if (lines) {
111
- const hasImports = lines.some((l) => l.startsWith('@'));
112
- if (!hasImports) {
113
- findings.push({
114
- area: 'CLAUDE.md',
115
- severity: 'info',
116
- message: 'CLAUDE.md does not use @path imports (e.g. @README.md, @package.json)',
117
- suggestion: 'Use @path syntax to import key files so Claude always has fresh context',
118
- docsRef: DOCS_REF,
119
- });
120
- }
209
+ allLines.push(...lines);
121
210
  }
122
211
  }
123
- // Global CLAUDE.md
212
+ if (allLines.some((l) => l.includes('@AGENTS.md'))) {
213
+ return [];
214
+ }
215
+ const detected = agentsMdExists ? 'AGENTS.md' : '.cursor/rules';
216
+ return [
217
+ {
218
+ area: 'CLAUDE.md',
219
+ severity: 'warn',
220
+ code: 'AGENTS_MD_NOT_IMPORTED',
221
+ message: `Project has ${detected} but CLAUDE.md does not import @AGENTS.md`,
222
+ suggestion: 'Add "@AGENTS.md" to CLAUDE.md so Claude Code loads cross-tool conventions',
223
+ docsRef: DOCS_REF,
224
+ },
225
+ ];
226
+ }
227
+ export async function auditClaudeMd(projectPath, includeGlobal) {
228
+ const [projectFindings, agentsFindings] = await Promise.all([
229
+ auditProjectClaudeMds(projectPath),
230
+ auditAgentsMdImport(projectPath),
231
+ ]);
232
+ const findings = [...projectFindings, ...agentsFindings];
124
233
  if (includeGlobal) {
125
- const globalPath = join(homedir(), '.claude', 'CLAUDE.md');
126
- const globalLines = await readFileLines(globalPath);
234
+ const globalLines = await readFileLines(join(homedir(), '.claude', 'CLAUDE.md'));
127
235
  if (globalLines) {
128
236
  findings.push(...auditSingleClaudeMd(globalLines, 'Global ~/.claude/CLAUDE.md'));
129
237
  }
@@ -1 +1 @@
1
- {"version":3,"file":"claudemd-auditor.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/claudemd-auditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claudemd-auditor.js","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/claudemd-auditor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rules-auditor.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/rules-auditor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAoE1D,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAc1B"}
1
+ {"version":3,"file":"rules-auditor.d.ts","sourceRoot":"","sources":["../../../src/engine/claude-config-auditor/rules-auditor.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA8G1D,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC,aAAa,EAAE,CAAC,CAkB1B"}