claudex-setup 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -15,6 +15,13 @@
15
15
  - README and docs now reflect snapshot artifacts, governance export, and the Claude-native skill path
16
16
  - packaged content and public-facing counts are now aligned with the current CLAUDEX state
17
17
 
18
+ ## [1.13.0] - 2026-04-03
19
+
20
+ ### Added
21
+ - 10 new checks (74→84): project description, directory structure, multiple hook types, stop-failure hook, skill paths, MCP env config, gitignore local settings, .env.example, package scripts, type checking
22
+ - 15 new tests (58→73): history/compare/trend, new checks structure, CLI commands, deny depth, negative instructions, --require flag
23
+ - All references updated to 74→84 checks
24
+
18
25
  ## [1.12.0] - 2026-04-03
19
26
 
20
27
  ### Added
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # claudex-setup
2
2
 
3
- > Score your repo's Claude Code setup against 74 checks. See what's missing, apply only what you approve with rollback, and benchmark the impact — without breaking existing config.
3
+ > Score your repo's Claude Code setup against 84 checks. See what's missing, apply only what you approve with rollback, and benchmark the impact — without breaking existing config.
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/claudex-setup)](https://www.npmjs.com/package/claudex-setup)
6
6
  [![npm downloads](https://img.shields.io/npm/dm/claudex-setup)](https://www.npmjs.com/package/claudex-setup)
@@ -89,7 +89,7 @@ Most common gaps found: missing secrets protection, no deny rules, no mermaid di
89
89
  design: none (0/2)
90
90
  devops: none (0/4)
91
91
 
92
- 29/74 checks passing
92
+ 29/84 checks passing
93
93
  Next command: npx claudex-setup setup
94
94
  ```
95
95
 
@@ -105,7 +105,7 @@ That prints a compact top-3 quick scan with one clear next command.
105
105
 
106
106
  | Command | What it does |
107
107
  |---------|-------------|
108
- | `npx claudex-setup` | **Discover** - Score 0-100 against 74 checks |
108
+ | `npx claudex-setup` | **Discover** - Score 0-100 against 84 checks |
109
109
  | `npx claudex-setup discover` | **Discover** - Alias for audit mode |
110
110
  | `npx claudex-setup setup` | **Starter** - Smart CLAUDE.md + hooks + commands + agents |
111
111
  | `npx claudex-setup starter` | **Starter** - Alias for setup mode |
@@ -305,7 +305,7 @@ jobs:
305
305
  runs-on: ubuntu-latest
306
306
  steps:
307
307
  - uses: actions/checkout@v4
308
- - uses: DnaFin/claudex-setup@v1.12.0
308
+ - uses: DnaFin/claudex-setup@v1.13.0
309
309
  with:
310
310
  threshold: 50
311
311
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudex-setup",
3
- "version": "1.12.0",
3
+ "version": "1.13.0",
4
4
  "description": "Score your repo's Claude Code setup against 62 checks. See gaps, apply fixes selectively with rollback, govern hooks and permissions, and benchmark impact — without breaking existing config.",
5
5
  "main": "src/index.js",
6
6
  "bin": {
package/src/techniques.js CHANGED
@@ -1114,6 +1114,142 @@ const TECHNIQUES = {
1114
1114
  template: null
1115
1115
  },
1116
1116
 
1117
+ // --- New checks: depth round 2 ---
1118
+ projectDescriptionInClaudeMd: {
1119
+ id: 2022,
1120
+ name: 'CLAUDE.md describes what the project does',
1121
+ check: (ctx) => {
1122
+ const md = ctx.fileContent('CLAUDE.md') || '';
1123
+ return /what.*does|overview|purpose|about|description|project.*is/i.test(md) && md.length > 100;
1124
+ },
1125
+ impact: 'high', rating: 4, category: 'memory',
1126
+ fix: 'Start CLAUDE.md with a clear project description. Claude needs to know what your project does.',
1127
+ template: null
1128
+ },
1129
+
1130
+ directoryStructureInClaudeMd: {
1131
+ id: 2023,
1132
+ name: 'CLAUDE.md documents directory structure',
1133
+ check: (ctx) => {
1134
+ const md = ctx.fileContent('CLAUDE.md') || '';
1135
+ return /src\/|app\/|lib\/|structure|director|folder/i.test(md);
1136
+ },
1137
+ impact: 'medium', rating: 4, category: 'memory',
1138
+ fix: 'Document your directory structure in CLAUDE.md so Claude navigates your codebase efficiently.',
1139
+ template: null
1140
+ },
1141
+
1142
+ multipleHookTypes: {
1143
+ id: 2024,
1144
+ name: '2+ hook event types configured',
1145
+ check: (ctx) => {
1146
+ const shared = ctx.jsonFile('.claude/settings.json') || {};
1147
+ const local = ctx.jsonFile('.claude/settings.local.json') || {};
1148
+ const hooks = { ...(shared.hooks || {}), ...(local.hooks || {}) };
1149
+ return Object.keys(hooks).length >= 2;
1150
+ },
1151
+ impact: 'medium', rating: 3, category: 'automation',
1152
+ fix: 'Add at least 2 hook types (e.g. PostToolUse for linting + SessionStart for initialization).',
1153
+ template: null
1154
+ },
1155
+
1156
+ stopFailureHook: {
1157
+ id: 2025,
1158
+ name: 'StopFailure or error handling hook',
1159
+ check: (ctx) => {
1160
+ const shared = ctx.jsonFile('.claude/settings.json') || {};
1161
+ const local = ctx.jsonFile('.claude/settings.local.json') || {};
1162
+ return !!(shared.hooks?.StopFailure || shared.hooks?.Stop || local.hooks?.StopFailure || local.hooks?.Stop);
1163
+ },
1164
+ impact: 'low', rating: 3, category: 'automation',
1165
+ fix: 'Add a StopFailure hook to log errors for debugging. Helps track why Claude stops unexpectedly.',
1166
+ template: null
1167
+ },
1168
+
1169
+ skillUsesPaths: {
1170
+ id: 2026,
1171
+ name: 'At least one skill uses paths for scoping',
1172
+ check: (ctx) => {
1173
+ if (!ctx.hasDir('.claude/skills')) return null;
1174
+ const files = ctx.dirFiles('.claude/skills');
1175
+ if (files.length === 0) return null;
1176
+ for (const f of files) {
1177
+ const content = ctx.fileContent(`.claude/skills/${f}`) || '';
1178
+ if (/paths:/i.test(content)) return true;
1179
+ }
1180
+ return false;
1181
+ },
1182
+ impact: 'low', rating: 3, category: 'workflow',
1183
+ fix: 'Add paths to skill frontmatter to scope when skills activate (e.g. paths: ["src/**/*.ts"]).',
1184
+ template: null
1185
+ },
1186
+
1187
+ mcpHasEnvConfig: {
1188
+ id: 2027,
1189
+ name: 'MCP servers have environment configuration',
1190
+ check: (ctx) => {
1191
+ const shared = ctx.jsonFile('.claude/settings.json') || {};
1192
+ const local = ctx.jsonFile('.claude/settings.local.json') || {};
1193
+ const mcp = ctx.jsonFile('.mcp.json') || {};
1194
+ const allServers = { ...(shared.mcpServers || {}), ...(local.mcpServers || {}), ...(mcp.mcpServers || {}) };
1195
+ if (Object.keys(allServers).length === 0) return null;
1196
+ return Object.values(allServers).some(s => s.env && Object.keys(s.env).length > 0);
1197
+ },
1198
+ impact: 'low', rating: 3, category: 'tools',
1199
+ fix: 'Configure environment variables for MCP servers that need authentication (e.g. GITHUB_TOKEN).',
1200
+ template: null
1201
+ },
1202
+
1203
+ gitIgnoreClaudeLocal: {
1204
+ id: 2028,
1205
+ name: '.gitignore excludes settings.local.json',
1206
+ check: (ctx) => {
1207
+ const gitignore = ctx.fileContent('.gitignore') || '';
1208
+ return /settings\.local\.json|settings\.local/i.test(gitignore);
1209
+ },
1210
+ impact: 'medium', rating: 4, category: 'git',
1211
+ fix: 'Add .claude/settings.local.json to .gitignore. Personal overrides should not be committed.',
1212
+ template: null
1213
+ },
1214
+
1215
+ envExampleExists: {
1216
+ id: 2029,
1217
+ name: '.env.example or .env.template exists',
1218
+ check: (ctx) => {
1219
+ return !!(ctx.fileContent('.env.example') || ctx.fileContent('.env.template') || ctx.fileContent('.env.sample'));
1220
+ },
1221
+ impact: 'low', rating: 3, category: 'hygiene',
1222
+ fix: 'Add .env.example so new developers know which environment variables are needed.',
1223
+ template: null
1224
+ },
1225
+
1226
+ packageJsonHasScripts: {
1227
+ id: 2030,
1228
+ name: 'package.json has dev/test/build scripts',
1229
+ check: (ctx) => {
1230
+ const pkg = ctx.jsonFile('package.json');
1231
+ if (!pkg) return null;
1232
+ const scripts = pkg.scripts || {};
1233
+ const has = (k) => !!scripts[k];
1234
+ return has('test') || has('dev') || has('build') || has('start');
1235
+ },
1236
+ impact: 'medium', rating: 3, category: 'hygiene',
1237
+ fix: 'Add scripts to package.json (test, dev, build). Claude uses these for verification.',
1238
+ template: null
1239
+ },
1240
+
1241
+ typeCheckingConfigured: {
1242
+ id: 2031,
1243
+ name: 'Type checking configured (TypeScript or similar)',
1244
+ check: (ctx) => {
1245
+ return !!(ctx.fileContent('tsconfig.json') || ctx.fileContent('jsconfig.json') ||
1246
+ ctx.fileContent('pyrightconfig.json') || ctx.fileContent('mypy.ini'));
1247
+ },
1248
+ impact: 'medium', rating: 3, category: 'quality',
1249
+ fix: 'Add type checking configuration. Type-safe code produces fewer Claude errors.',
1250
+ template: null
1251
+ },
1252
+
1117
1253
  noDeprecatedPatterns: {
1118
1254
  id: 2009,
1119
1255
  name: 'No deprecated patterns detected',