@nerviq/cli 1.18.0 → 1.20.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.
- package/LICENSE +23 -23
- package/README.md +2 -2
- package/bin/cli.js +131 -130
- package/package.json +2 -1
- package/src/activity.js +1039 -1039
- package/src/adoption-advisor.js +299 -299
- package/src/aider/config-parser.js +166 -166
- package/src/aider/context.js +158 -158
- package/src/aider/deep-review.js +316 -316
- package/src/aider/domain-packs.js +303 -303
- package/src/aider/freshness.js +93 -93
- package/src/aider/governance.js +253 -253
- package/src/aider/interactive.js +334 -334
- package/src/aider/mcp-packs.js +329 -329
- package/src/aider/patch.js +214 -214
- package/src/aider/plans.js +186 -186
- package/src/aider/premium.js +360 -360
- package/src/aider/setup.js +404 -404
- package/src/aider/techniques.js +16 -16
- package/src/analyze.js +951 -951
- package/src/anti-patterns.js +485 -485
- package/src/audit/instruction-files.js +180 -180
- package/src/audit/recommendations.js +577 -577
- package/src/auto-suggest.js +154 -154
- package/src/badge.js +13 -13
- package/src/behavioral-drift.js +801 -801
- package/src/benchmark.js +67 -67
- package/src/catalog.js +103 -103
- package/src/certification.js +128 -128
- package/src/codex/config-parser.js +183 -183
- package/src/codex/context.js +223 -223
- package/src/codex/deep-review.js +493 -493
- package/src/codex/domain-packs.js +394 -394
- package/src/codex/freshness.js +84 -84
- package/src/codex/governance.js +192 -192
- package/src/codex/interactive.js +618 -618
- package/src/codex/mcp-packs.js +914 -914
- package/src/codex/patch.js +209 -209
- package/src/codex/plans.js +251 -251
- package/src/codex/premium.js +614 -614
- package/src/codex/setup.js +591 -591
- package/src/context.js +320 -320
- package/src/continuous-ops.js +681 -681
- package/src/copilot/activity.js +309 -309
- package/src/copilot/deep-review.js +346 -346
- package/src/copilot/domain-packs.js +372 -372
- package/src/copilot/freshness.js +57 -57
- package/src/copilot/governance.js +222 -222
- package/src/copilot/interactive.js +406 -406
- package/src/copilot/mcp-packs.js +826 -826
- package/src/copilot/plans.js +253 -253
- package/src/copilot/premium.js +451 -451
- package/src/copilot/setup.js +488 -488
- package/src/cost-tracking.js +61 -61
- package/src/cursor/activity.js +301 -301
- package/src/cursor/config-parser.js +265 -265
- package/src/cursor/context.js +256 -256
- package/src/cursor/deep-review.js +334 -334
- package/src/cursor/domain-packs.js +368 -368
- package/src/cursor/freshness.js +65 -65
- package/src/cursor/governance.js +229 -229
- package/src/cursor/interactive.js +391 -391
- package/src/cursor/mcp-packs.js +828 -828
- package/src/cursor/plans.js +254 -254
- package/src/cursor/premium.js +469 -469
- package/src/cursor/setup.js +488 -488
- package/src/dashboard.js +493 -493
- package/src/deep-review.js +428 -428
- package/src/deprecation.js +98 -98
- package/src/diff-only.js +280 -280
- package/src/doctor.js +119 -119
- package/src/domain-pack-expansion.js +1033 -1033
- package/src/domain-packs.js +387 -387
- package/src/feedback.js +178 -178
- package/src/fix-engine.js +783 -783
- package/src/fix-prompts.js +122 -122
- package/src/formatters/sarif.js +115 -115
- package/src/freshness.js +74 -74
- package/src/gemini/config-parser.js +275 -275
- package/src/gemini/context.js +290 -221
- package/src/gemini/deep-review.js +559 -559
- package/src/gemini/domain-packs.js +393 -393
- package/src/gemini/freshness.js +66 -66
- package/src/gemini/governance.js +201 -201
- package/src/gemini/interactive.js +860 -860
- package/src/gemini/mcp-packs.js +915 -915
- package/src/gemini/plans.js +269 -269
- package/src/gemini/premium.js +760 -760
- package/src/gemini/setup.js +692 -692
- package/src/gemini/techniques.js +105 -33
- package/src/governance.js +72 -72
- package/src/harmony/add.js +68 -68
- package/src/harmony/advisor.js +333 -333
- package/src/harmony/canon.js +565 -565
- package/src/harmony/cli.js +591 -591
- package/src/harmony/drift.js +401 -401
- package/src/harmony/governance.js +313 -313
- package/src/harmony/memory.js +239 -239
- package/src/harmony/sync.js +475 -475
- package/src/harmony/watch.js +370 -370
- package/src/hook-validation.js +342 -342
- package/src/index.js +271 -271
- package/src/init.js +184 -184
- package/src/instruction-surfaces.js +185 -185
- package/src/integrations.js +144 -144
- package/src/interactive.js +118 -118
- package/src/locales/en.json +1 -1
- package/src/locales/es.json +1 -1
- package/src/mcp-packs.js +830 -830
- package/src/mcp-server.js +726 -726
- package/src/mcp-validation.js +337 -337
- package/src/nerviq-sync.json +7 -7
- package/src/opencode/config-parser.js +109 -109
- package/src/opencode/context.js +247 -247
- package/src/opencode/deep-review.js +313 -313
- package/src/opencode/domain-packs.js +262 -262
- package/src/opencode/freshness.js +66 -66
- package/src/opencode/governance.js +159 -159
- package/src/opencode/interactive.js +392 -392
- package/src/opencode/mcp-packs.js +705 -705
- package/src/opencode/patch.js +184 -184
- package/src/opencode/plans.js +231 -231
- package/src/opencode/premium.js +413 -413
- package/src/opencode/setup.js +449 -449
- package/src/opencode/techniques.js +27 -27
- package/src/operating-profile.js +574 -574
- package/src/org.js +152 -152
- package/src/permission-rules.js +218 -218
- package/src/plans.js +839 -839
- package/src/platform-change-manifest.js +86 -86
- package/src/plugins.js +110 -110
- package/src/policy-layers.js +210 -210
- package/src/profiles.js +124 -124
- package/src/prompt-injection.js +74 -74
- package/src/public-api.js +173 -173
- package/src/recommendation-rules.js +84 -84
- package/src/repo-archetype.js +386 -386
- package/src/secret-patterns.js +39 -39
- package/src/server.js +527 -527
- package/src/setup/analysis.js +607 -607
- package/src/setup/runtime.js +172 -172
- package/src/setup.js +677 -677
- package/src/shared/capabilities.js +194 -194
- package/src/source-urls.js +132 -132
- package/src/stack-checks.js +565 -565
- package/src/supplemental-checks.js +13 -13
- package/src/synergy/adaptive.js +261 -261
- package/src/synergy/compensation.js +137 -137
- package/src/synergy/evidence.js +193 -193
- package/src/synergy/learning.js +199 -199
- package/src/synergy/patterns.js +227 -227
- package/src/synergy/ranking.js +83 -83
- package/src/synergy/report.js +165 -165
- package/src/synergy/routing.js +146 -146
- package/src/techniques/api.js +407 -407
- package/src/techniques/automation.js +316 -316
- package/src/techniques/compliance.js +257 -257
- package/src/techniques/hygiene.js +294 -294
- package/src/techniques/instructions.js +243 -243
- package/src/techniques/observability.js +226 -226
- package/src/techniques/optimization.js +142 -142
- package/src/techniques/quality.js +318 -318
- package/src/techniques/security.js +237 -237
- package/src/techniques/shared.js +443 -443
- package/src/techniques/stacks.js +2294 -2294
- package/src/techniques/tools.js +106 -106
- package/src/techniques/workflow.js +413 -413
- package/src/techniques.js +81 -81
- package/src/terminology.js +73 -73
- package/src/token-estimate.js +35 -35
- package/src/usage-patterns.js +99 -99
- package/src/verification-metadata.js +145 -145
- package/src/watch.js +247 -247
- package/src/windsurf/activity.js +302 -302
- package/src/windsurf/config-parser.js +267 -267
- package/src/windsurf/context.js +249 -249
- package/src/windsurf/deep-review.js +337 -337
- package/src/windsurf/domain-packs.js +370 -370
- package/src/windsurf/freshness.js +36 -36
- package/src/windsurf/governance.js +231 -231
- package/src/windsurf/interactive.js +388 -388
- package/src/windsurf/mcp-packs.js +792 -792
- package/src/windsurf/plans.js +247 -247
- package/src/windsurf/premium.js +468 -468
- package/src/windsurf/setup.js +471 -471
- package/src/windsurf/techniques.js +17 -17
- package/src/workspace.js +375 -375
|
@@ -1,243 +1,243 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Instructions technique fragments.
|
|
3
|
-
* Generated mechanically from the legacy techniques.js monolith during HR-09.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const {
|
|
7
|
-
path,
|
|
8
|
-
getClaudeHookContents,
|
|
9
|
-
} = require('./shared');
|
|
10
|
-
|
|
11
|
-
module.exports = {
|
|
12
|
-
claudeMd: {
|
|
13
|
-
id: 1,
|
|
14
|
-
name: 'CLAUDE.md project instructions',
|
|
15
|
-
check: (ctx) => ctx.files.includes('CLAUDE.md') || ctx.files.includes('.claude/CLAUDE.md'),
|
|
16
|
-
impact: 'critical',
|
|
17
|
-
rating: 5,
|
|
18
|
-
category: 'memory',
|
|
19
|
-
fix: 'Create CLAUDE.md with project-specific instructions, build commands, and coding conventions.',
|
|
20
|
-
template: 'claude-md'
|
|
21
|
-
},
|
|
22
|
-
|
|
23
|
-
mermaidArchitecture: {
|
|
24
|
-
id: 51,
|
|
25
|
-
name: 'Mermaid architecture diagram',
|
|
26
|
-
check: (ctx) => {
|
|
27
|
-
const md = ctx.claudeMdContent() || '';
|
|
28
|
-
return md.includes('mermaid') || md.includes('graph ') || md.includes('flowchart ');
|
|
29
|
-
},
|
|
30
|
-
impact: 'high',
|
|
31
|
-
rating: 5,
|
|
32
|
-
category: 'memory',
|
|
33
|
-
fix: 'Add a Mermaid diagram to CLAUDE.md showing project architecture. Saves 73% tokens vs prose.',
|
|
34
|
-
template: 'mermaid'
|
|
35
|
-
},
|
|
36
|
-
|
|
37
|
-
pathRules: {
|
|
38
|
-
id: 3,
|
|
39
|
-
name: 'Path-specific rules',
|
|
40
|
-
check: (ctx) => ctx.hasDir('.claude/rules') && ctx.dirFiles('.claude/rules').length > 0,
|
|
41
|
-
impact: 'medium',
|
|
42
|
-
rating: 4,
|
|
43
|
-
category: 'memory',
|
|
44
|
-
fix: 'Add rules for different file types (frontend vs backend conventions).',
|
|
45
|
-
template: 'rules'
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
importSyntax: {
|
|
49
|
-
id: 763,
|
|
50
|
-
name: 'CLAUDE.md uses @path imports for modularity',
|
|
51
|
-
check: (ctx) => {
|
|
52
|
-
const md = ctx.claudeMdContent() || '';
|
|
53
|
-
// Current syntax is @path/to/file (no "import" keyword)
|
|
54
|
-
return /@\S+\.(md|txt|json|yml|yaml|toml)/i.test(md) || /@\w+\//.test(md);
|
|
55
|
-
},
|
|
56
|
-
impact: 'medium',
|
|
57
|
-
rating: 4,
|
|
58
|
-
category: 'memory',
|
|
59
|
-
fix: 'Use @path syntax in CLAUDE.md to split instructions into focused modules (e.g. @docs/coding-style.md). You can also use .claude/rules/ for path-specific rules.',
|
|
60
|
-
template: null
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
underlines200: {
|
|
64
|
-
id: 681,
|
|
65
|
-
name: 'CLAUDE.md under 200 lines (concise)',
|
|
66
|
-
check: (ctx) => {
|
|
67
|
-
const md = ctx.claudeMdContent() || '';
|
|
68
|
-
return md.split('\n').length <= 200;
|
|
69
|
-
},
|
|
70
|
-
impact: 'medium',
|
|
71
|
-
rating: 4,
|
|
72
|
-
category: 'memory',
|
|
73
|
-
fix: 'Keep CLAUDE.md under 200 lines. Use @import or .claude/rules/ to split large instructions.',
|
|
74
|
-
template: null
|
|
75
|
-
},
|
|
76
|
-
|
|
77
|
-
xmlTags: {
|
|
78
|
-
id: 96,
|
|
79
|
-
name: 'XML tags for structured prompts',
|
|
80
|
-
check: (ctx) => {
|
|
81
|
-
const md = ctx.claudeMdContent() || '';
|
|
82
|
-
// Give credit for XML tags OR well-structured markdown with clear sections
|
|
83
|
-
const hasXml = md.includes('<constraints') || md.includes('<rules') ||
|
|
84
|
-
md.includes('<validation') || md.includes('<instructions');
|
|
85
|
-
const hasStructuredMd = (md.includes('## Rules') || md.includes('## Constraints') ||
|
|
86
|
-
md.includes('## Do not') || md.includes('## Never') || md.includes('## Important')) &&
|
|
87
|
-
md.split('\n').length > 20;
|
|
88
|
-
return hasXml || hasStructuredMd;
|
|
89
|
-
},
|
|
90
|
-
impact: 'medium',
|
|
91
|
-
rating: 4,
|
|
92
|
-
category: 'prompting',
|
|
93
|
-
fix: 'Add clear rules sections to CLAUDE.md. XML tags (<constraints>) are optional but improve clarity.',
|
|
94
|
-
template: null
|
|
95
|
-
},
|
|
96
|
-
|
|
97
|
-
fewShotExamples: {
|
|
98
|
-
id: 9,
|
|
99
|
-
name: 'CLAUDE.md contains code examples',
|
|
100
|
-
check: (ctx) => {
|
|
101
|
-
const md = ctx.claudeMdContent() || '';
|
|
102
|
-
return (md.match(/```/g) || []).length >= 2;
|
|
103
|
-
},
|
|
104
|
-
impact: 'high',
|
|
105
|
-
rating: 5,
|
|
106
|
-
category: 'prompting',
|
|
107
|
-
fix: 'Add code examples (few-shot) in CLAUDE.md to show preferred patterns and conventions.',
|
|
108
|
-
template: null
|
|
109
|
-
},
|
|
110
|
-
|
|
111
|
-
roleDefinition: {
|
|
112
|
-
id: 10,
|
|
113
|
-
name: 'CLAUDE.md defines a role or persona',
|
|
114
|
-
check: (ctx) => {
|
|
115
|
-
const md = ctx.claudeMdContent() || '';
|
|
116
|
-
return /^you are a |^your role is|^act as a |persona:|behave as a /im.test(md);
|
|
117
|
-
},
|
|
118
|
-
impact: 'medium',
|
|
119
|
-
rating: 4,
|
|
120
|
-
category: 'prompting',
|
|
121
|
-
fix: 'Define a role or persona in CLAUDE.md (e.g. "You are a senior backend engineer...").',
|
|
122
|
-
template: null
|
|
123
|
-
},
|
|
124
|
-
|
|
125
|
-
constraintBlocks: {
|
|
126
|
-
id: 9601,
|
|
127
|
-
name: 'XML constraint blocks in CLAUDE.md',
|
|
128
|
-
check: (ctx) => {
|
|
129
|
-
const md = ctx.claudeMdContent() || '';
|
|
130
|
-
return /<constraints|<rules|<requirements|<boundaries/i.test(md);
|
|
131
|
-
},
|
|
132
|
-
impact: 'high',
|
|
133
|
-
rating: 5,
|
|
134
|
-
category: 'prompting',
|
|
135
|
-
fix: 'Wrap critical rules in <constraints> XML blocks for 40% better adherence.',
|
|
136
|
-
template: null
|
|
137
|
-
},
|
|
138
|
-
|
|
139
|
-
claudeLocalMd: {
|
|
140
|
-
id: 2002,
|
|
141
|
-
name: 'CLAUDE.local.md for personal overrides',
|
|
142
|
-
check: (ctx) => {
|
|
143
|
-
// CLAUDE.local.md is for personal, non-committed overrides
|
|
144
|
-
return ctx.files.includes('CLAUDE.local.md') || ctx.files.includes('.claude/CLAUDE.local.md');
|
|
145
|
-
},
|
|
146
|
-
impact: 'low',
|
|
147
|
-
rating: 2,
|
|
148
|
-
category: 'memory',
|
|
149
|
-
fix: 'Create CLAUDE.local.md for personal preferences that should not be committed (add to .gitignore).',
|
|
150
|
-
template: null
|
|
151
|
-
},
|
|
152
|
-
|
|
153
|
-
autoMemoryAwareness: {
|
|
154
|
-
id: 2012,
|
|
155
|
-
name: 'Auto-memory or memory management mentioned',
|
|
156
|
-
check: (ctx) => {
|
|
157
|
-
const md = ctx.claudeMdContent() || '';
|
|
158
|
-
return /auto.?memory|memory.*manage|remember|persistent.*context/i.test(md);
|
|
159
|
-
},
|
|
160
|
-
impact: 'low', rating: 3, category: 'memory',
|
|
161
|
-
fix: 'Claude Code supports auto-memory for cross-session learning. Mention your memory strategy if relevant.',
|
|
162
|
-
template: null
|
|
163
|
-
},
|
|
164
|
-
|
|
165
|
-
negativeInstructions: {
|
|
166
|
-
id: 2019,
|
|
167
|
-
name: 'CLAUDE.md includes "do not" instructions',
|
|
168
|
-
check: (ctx) => {
|
|
169
|
-
const md = ctx.claudeMdContent() || '';
|
|
170
|
-
return /do not|don't|never|avoid|must not/i.test(md);
|
|
171
|
-
},
|
|
172
|
-
impact: 'medium', rating: 4, category: 'prompting',
|
|
173
|
-
fix: 'Add explicit "do not" rules to CLAUDE.md. Negative constraints reduce common mistakes.',
|
|
174
|
-
template: null
|
|
175
|
-
},
|
|
176
|
-
|
|
177
|
-
outputStyleGuidance: {
|
|
178
|
-
id: 2020,
|
|
179
|
-
name: 'CLAUDE.md includes output or style guidance',
|
|
180
|
-
check: (ctx) => {
|
|
181
|
-
const md = ctx.claudeMdContent() || '';
|
|
182
|
-
return /coding style|naming convention|code style|style guide|formatting rules|\bprefer\b.*\b(single|double|tabs|spaces|camel|snake|kebab|named|default|const|let|arrow|function)\b/i.test(md);
|
|
183
|
-
},
|
|
184
|
-
impact: 'medium', rating: 3, category: 'prompting',
|
|
185
|
-
fix: 'Add coding style and naming conventions to CLAUDE.md so Claude matches your project patterns.',
|
|
186
|
-
template: null
|
|
187
|
-
},
|
|
188
|
-
|
|
189
|
-
projectDescriptionInClaudeMd: {
|
|
190
|
-
id: 2022,
|
|
191
|
-
name: 'CLAUDE.md describes what the project does',
|
|
192
|
-
check: (ctx) => {
|
|
193
|
-
const md = ctx.claudeMdContent() || '';
|
|
194
|
-
return /what.*does|overview|purpose|about|description|project.*is/i.test(md) && md.length > 100;
|
|
195
|
-
},
|
|
196
|
-
impact: 'high', rating: 4, category: 'memory',
|
|
197
|
-
fix: 'Start CLAUDE.md with a clear project description. Claude needs to know what your project does.',
|
|
198
|
-
template: null
|
|
199
|
-
},
|
|
200
|
-
|
|
201
|
-
directoryStructureInClaudeMd: {
|
|
202
|
-
id: 2023,
|
|
203
|
-
name: 'CLAUDE.md documents directory structure',
|
|
204
|
-
check: (ctx) => {
|
|
205
|
-
const md = ctx.claudeMdContent() || '';
|
|
206
|
-
return /src\/|app\/|lib\/|structure|director|folder/i.test(md);
|
|
207
|
-
},
|
|
208
|
-
impact: 'medium', rating: 4, category: 'memory',
|
|
209
|
-
fix: 'Document your directory structure in CLAUDE.md so Claude navigates your codebase efficiently.',
|
|
210
|
-
template: null
|
|
211
|
-
},
|
|
212
|
-
|
|
213
|
-
hookExitCodesDefined: {
|
|
214
|
-
id: 110003,
|
|
215
|
-
name: 'Hook scripts handle exit codes correctly',
|
|
216
|
-
check: (ctx) => {
|
|
217
|
-
const hookContents = getClaudeHookContents(ctx);
|
|
218
|
-
if (hookContents.length === 0) return null;
|
|
219
|
-
return hookContents.some(content => /process\.exit|exit\s+[012]|sys\.exit|return\s+[012]/i.test(content));
|
|
220
|
-
},
|
|
221
|
-
impact: 'low', rating: 3, category: 'governance',
|
|
222
|
-
fix: 'Hooks should use explicit exit codes: 0=success, 1=warning, 2=block. See Claude Code docs.',
|
|
223
|
-
template: null,
|
|
224
|
-
confidence: 0.7,
|
|
225
|
-
},
|
|
226
|
-
|
|
227
|
-
loopSafetyBoundaries: {
|
|
228
|
-
id: 110004,
|
|
229
|
-
name: 'Loop safety boundaries configured',
|
|
230
|
-
check: (ctx) => {
|
|
231
|
-
const md = ctx.claudeMdContent() || '';
|
|
232
|
-
const settings = ctx.fileContent('.claude/settings.json') || '';
|
|
233
|
-
const hookContents = getClaudeHookContents(ctx).join('\n');
|
|
234
|
-
const loopSafetyConfig = [md, settings, hookContents].filter(Boolean).join('\n');
|
|
235
|
-
|
|
236
|
-
return /max[-_ ]?turns|maxTurns|max[-_ ]?tokens|maxTokens|loop(?:[-_ ]?(?:limit|limits|safety|guard|budget|boundary|boundaries))|iteration(?:[-_ ]?(?:limit|limits|guard|budget|cap|caps|count|max(?:imum)?))/i.test(loopSafetyConfig);
|
|
237
|
-
},
|
|
238
|
-
impact: 'medium', rating: 4, category: 'governance',
|
|
239
|
-
fix: 'Document loop safety limits such as maxTurns, maxTokens, or iteration caps in CLAUDE.md, settings, or hook guards.',
|
|
240
|
-
template: null,
|
|
241
|
-
confidence: 0.8,
|
|
242
|
-
},
|
|
243
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Instructions technique fragments.
|
|
3
|
+
* Generated mechanically from the legacy techniques.js monolith during HR-09.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const {
|
|
7
|
+
path,
|
|
8
|
+
getClaudeHookContents,
|
|
9
|
+
} = require('./shared');
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
claudeMd: {
|
|
13
|
+
id: 1,
|
|
14
|
+
name: 'CLAUDE.md project instructions',
|
|
15
|
+
check: (ctx) => ctx.files.includes('CLAUDE.md') || ctx.files.includes('.claude/CLAUDE.md'),
|
|
16
|
+
impact: 'critical',
|
|
17
|
+
rating: 5,
|
|
18
|
+
category: 'memory',
|
|
19
|
+
fix: 'Create CLAUDE.md with project-specific instructions, build commands, and coding conventions.',
|
|
20
|
+
template: 'claude-md'
|
|
21
|
+
},
|
|
22
|
+
|
|
23
|
+
mermaidArchitecture: {
|
|
24
|
+
id: 51,
|
|
25
|
+
name: 'Mermaid architecture diagram',
|
|
26
|
+
check: (ctx) => {
|
|
27
|
+
const md = ctx.claudeMdContent() || '';
|
|
28
|
+
return md.includes('mermaid') || md.includes('graph ') || md.includes('flowchart ');
|
|
29
|
+
},
|
|
30
|
+
impact: 'high',
|
|
31
|
+
rating: 5,
|
|
32
|
+
category: 'memory',
|
|
33
|
+
fix: 'Add a Mermaid diagram to CLAUDE.md showing project architecture. Saves 73% tokens vs prose.',
|
|
34
|
+
template: 'mermaid'
|
|
35
|
+
},
|
|
36
|
+
|
|
37
|
+
pathRules: {
|
|
38
|
+
id: 3,
|
|
39
|
+
name: 'Path-specific rules',
|
|
40
|
+
check: (ctx) => ctx.hasDir('.claude/rules') && ctx.dirFiles('.claude/rules').length > 0,
|
|
41
|
+
impact: 'medium',
|
|
42
|
+
rating: 4,
|
|
43
|
+
category: 'memory',
|
|
44
|
+
fix: 'Add rules for different file types (frontend vs backend conventions).',
|
|
45
|
+
template: 'rules'
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
importSyntax: {
|
|
49
|
+
id: 763,
|
|
50
|
+
name: 'CLAUDE.md uses @path imports for modularity',
|
|
51
|
+
check: (ctx) => {
|
|
52
|
+
const md = ctx.claudeMdContent() || '';
|
|
53
|
+
// Current syntax is @path/to/file (no "import" keyword)
|
|
54
|
+
return /@\S+\.(md|txt|json|yml|yaml|toml)/i.test(md) || /@\w+\//.test(md);
|
|
55
|
+
},
|
|
56
|
+
impact: 'medium',
|
|
57
|
+
rating: 4,
|
|
58
|
+
category: 'memory',
|
|
59
|
+
fix: 'Use @path syntax in CLAUDE.md to split instructions into focused modules (e.g. @docs/coding-style.md). You can also use .claude/rules/ for path-specific rules.',
|
|
60
|
+
template: null
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
underlines200: {
|
|
64
|
+
id: 681,
|
|
65
|
+
name: 'CLAUDE.md under 200 lines (concise)',
|
|
66
|
+
check: (ctx) => {
|
|
67
|
+
const md = ctx.claudeMdContent() || '';
|
|
68
|
+
return md.split('\n').length <= 200;
|
|
69
|
+
},
|
|
70
|
+
impact: 'medium',
|
|
71
|
+
rating: 4,
|
|
72
|
+
category: 'memory',
|
|
73
|
+
fix: 'Keep CLAUDE.md under 200 lines. Use @import or .claude/rules/ to split large instructions.',
|
|
74
|
+
template: null
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
xmlTags: {
|
|
78
|
+
id: 96,
|
|
79
|
+
name: 'XML tags for structured prompts',
|
|
80
|
+
check: (ctx) => {
|
|
81
|
+
const md = ctx.claudeMdContent() || '';
|
|
82
|
+
// Give credit for XML tags OR well-structured markdown with clear sections
|
|
83
|
+
const hasXml = md.includes('<constraints') || md.includes('<rules') ||
|
|
84
|
+
md.includes('<validation') || md.includes('<instructions');
|
|
85
|
+
const hasStructuredMd = (md.includes('## Rules') || md.includes('## Constraints') ||
|
|
86
|
+
md.includes('## Do not') || md.includes('## Never') || md.includes('## Important')) &&
|
|
87
|
+
md.split('\n').length > 20;
|
|
88
|
+
return hasXml || hasStructuredMd;
|
|
89
|
+
},
|
|
90
|
+
impact: 'medium',
|
|
91
|
+
rating: 4,
|
|
92
|
+
category: 'prompting',
|
|
93
|
+
fix: 'Add clear rules sections to CLAUDE.md. XML tags (<constraints>) are optional but improve clarity.',
|
|
94
|
+
template: null
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
fewShotExamples: {
|
|
98
|
+
id: 9,
|
|
99
|
+
name: 'CLAUDE.md contains code examples',
|
|
100
|
+
check: (ctx) => {
|
|
101
|
+
const md = ctx.claudeMdContent() || '';
|
|
102
|
+
return (md.match(/```/g) || []).length >= 2;
|
|
103
|
+
},
|
|
104
|
+
impact: 'high',
|
|
105
|
+
rating: 5,
|
|
106
|
+
category: 'prompting',
|
|
107
|
+
fix: 'Add code examples (few-shot) in CLAUDE.md to show preferred patterns and conventions.',
|
|
108
|
+
template: null
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
roleDefinition: {
|
|
112
|
+
id: 10,
|
|
113
|
+
name: 'CLAUDE.md defines a role or persona',
|
|
114
|
+
check: (ctx) => {
|
|
115
|
+
const md = ctx.claudeMdContent() || '';
|
|
116
|
+
return /^you are a |^your role is|^act as a |persona:|behave as a /im.test(md);
|
|
117
|
+
},
|
|
118
|
+
impact: 'medium',
|
|
119
|
+
rating: 4,
|
|
120
|
+
category: 'prompting',
|
|
121
|
+
fix: 'Define a role or persona in CLAUDE.md (e.g. "You are a senior backend engineer...").',
|
|
122
|
+
template: null
|
|
123
|
+
},
|
|
124
|
+
|
|
125
|
+
constraintBlocks: {
|
|
126
|
+
id: 9601,
|
|
127
|
+
name: 'XML constraint blocks in CLAUDE.md',
|
|
128
|
+
check: (ctx) => {
|
|
129
|
+
const md = ctx.claudeMdContent() || '';
|
|
130
|
+
return /<constraints|<rules|<requirements|<boundaries/i.test(md);
|
|
131
|
+
},
|
|
132
|
+
impact: 'high',
|
|
133
|
+
rating: 5,
|
|
134
|
+
category: 'prompting',
|
|
135
|
+
fix: 'Wrap critical rules in <constraints> XML blocks for 40% better adherence.',
|
|
136
|
+
template: null
|
|
137
|
+
},
|
|
138
|
+
|
|
139
|
+
claudeLocalMd: {
|
|
140
|
+
id: 2002,
|
|
141
|
+
name: 'CLAUDE.local.md for personal overrides',
|
|
142
|
+
check: (ctx) => {
|
|
143
|
+
// CLAUDE.local.md is for personal, non-committed overrides
|
|
144
|
+
return ctx.files.includes('CLAUDE.local.md') || ctx.files.includes('.claude/CLAUDE.local.md');
|
|
145
|
+
},
|
|
146
|
+
impact: 'low',
|
|
147
|
+
rating: 2,
|
|
148
|
+
category: 'memory',
|
|
149
|
+
fix: 'Create CLAUDE.local.md for personal preferences that should not be committed (add to .gitignore).',
|
|
150
|
+
template: null
|
|
151
|
+
},
|
|
152
|
+
|
|
153
|
+
autoMemoryAwareness: {
|
|
154
|
+
id: 2012,
|
|
155
|
+
name: 'Auto-memory or memory management mentioned',
|
|
156
|
+
check: (ctx) => {
|
|
157
|
+
const md = ctx.claudeMdContent() || '';
|
|
158
|
+
return /auto.?memory|memory.*manage|remember|persistent.*context/i.test(md);
|
|
159
|
+
},
|
|
160
|
+
impact: 'low', rating: 3, category: 'memory',
|
|
161
|
+
fix: 'Claude Code supports auto-memory for cross-session learning. Mention your memory strategy if relevant.',
|
|
162
|
+
template: null
|
|
163
|
+
},
|
|
164
|
+
|
|
165
|
+
negativeInstructions: {
|
|
166
|
+
id: 2019,
|
|
167
|
+
name: 'CLAUDE.md includes "do not" instructions',
|
|
168
|
+
check: (ctx) => {
|
|
169
|
+
const md = ctx.claudeMdContent() || '';
|
|
170
|
+
return /do not|don't|never|avoid|must not/i.test(md);
|
|
171
|
+
},
|
|
172
|
+
impact: 'medium', rating: 4, category: 'prompting',
|
|
173
|
+
fix: 'Add explicit "do not" rules to CLAUDE.md. Negative constraints reduce common mistakes.',
|
|
174
|
+
template: null
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
outputStyleGuidance: {
|
|
178
|
+
id: 2020,
|
|
179
|
+
name: 'CLAUDE.md includes output or style guidance',
|
|
180
|
+
check: (ctx) => {
|
|
181
|
+
const md = ctx.claudeMdContent() || '';
|
|
182
|
+
return /coding style|naming convention|code style|style guide|formatting rules|\bprefer\b.*\b(single|double|tabs|spaces|camel|snake|kebab|named|default|const|let|arrow|function)\b/i.test(md);
|
|
183
|
+
},
|
|
184
|
+
impact: 'medium', rating: 3, category: 'prompting',
|
|
185
|
+
fix: 'Add coding style and naming conventions to CLAUDE.md so Claude matches your project patterns.',
|
|
186
|
+
template: null
|
|
187
|
+
},
|
|
188
|
+
|
|
189
|
+
projectDescriptionInClaudeMd: {
|
|
190
|
+
id: 2022,
|
|
191
|
+
name: 'CLAUDE.md describes what the project does',
|
|
192
|
+
check: (ctx) => {
|
|
193
|
+
const md = ctx.claudeMdContent() || '';
|
|
194
|
+
return /what.*does|overview|purpose|about|description|project.*is/i.test(md) && md.length > 100;
|
|
195
|
+
},
|
|
196
|
+
impact: 'high', rating: 4, category: 'memory',
|
|
197
|
+
fix: 'Start CLAUDE.md with a clear project description. Claude needs to know what your project does.',
|
|
198
|
+
template: null
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
directoryStructureInClaudeMd: {
|
|
202
|
+
id: 2023,
|
|
203
|
+
name: 'CLAUDE.md documents directory structure',
|
|
204
|
+
check: (ctx) => {
|
|
205
|
+
const md = ctx.claudeMdContent() || '';
|
|
206
|
+
return /src\/|app\/|lib\/|structure|director|folder/i.test(md);
|
|
207
|
+
},
|
|
208
|
+
impact: 'medium', rating: 4, category: 'memory',
|
|
209
|
+
fix: 'Document your directory structure in CLAUDE.md so Claude navigates your codebase efficiently.',
|
|
210
|
+
template: null
|
|
211
|
+
},
|
|
212
|
+
|
|
213
|
+
hookExitCodesDefined: {
|
|
214
|
+
id: 110003,
|
|
215
|
+
name: 'Hook scripts handle exit codes correctly',
|
|
216
|
+
check: (ctx) => {
|
|
217
|
+
const hookContents = getClaudeHookContents(ctx);
|
|
218
|
+
if (hookContents.length === 0) return null;
|
|
219
|
+
return hookContents.some(content => /process\.exit|exit\s+[012]|sys\.exit|return\s+[012]/i.test(content));
|
|
220
|
+
},
|
|
221
|
+
impact: 'low', rating: 3, category: 'governance',
|
|
222
|
+
fix: 'Hooks should use explicit exit codes: 0=success, 1=warning, 2=block. See Claude Code docs.',
|
|
223
|
+
template: null,
|
|
224
|
+
confidence: 0.7,
|
|
225
|
+
},
|
|
226
|
+
|
|
227
|
+
loopSafetyBoundaries: {
|
|
228
|
+
id: 110004,
|
|
229
|
+
name: 'Loop safety boundaries configured',
|
|
230
|
+
check: (ctx) => {
|
|
231
|
+
const md = ctx.claudeMdContent() || '';
|
|
232
|
+
const settings = ctx.fileContent('.claude/settings.json') || '';
|
|
233
|
+
const hookContents = getClaudeHookContents(ctx).join('\n');
|
|
234
|
+
const loopSafetyConfig = [md, settings, hookContents].filter(Boolean).join('\n');
|
|
235
|
+
|
|
236
|
+
return /max[-_ ]?turns|maxTurns|max[-_ ]?tokens|maxTokens|loop(?:[-_ ]?(?:limit|limits|safety|guard|budget|boundary|boundaries))|iteration(?:[-_ ]?(?:limit|limits|guard|budget|cap|caps|count|max(?:imum)?))/i.test(loopSafetyConfig);
|
|
237
|
+
},
|
|
238
|
+
impact: 'medium', rating: 4, category: 'governance',
|
|
239
|
+
fix: 'Document loop safety limits such as maxTurns, maxTokens, or iteration caps in CLAUDE.md, settings, or hook guards.',
|
|
240
|
+
template: null,
|
|
241
|
+
confidence: 0.8,
|
|
242
|
+
},
|
|
243
|
+
};
|