create-claude-context 1.0.0 → 1.2.1

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 (117) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +169 -146
  3. package/bin/create-claude-context.js +75 -61
  4. package/lib/ai-orchestrator.js +423 -0
  5. package/lib/call-tracer.js +444 -0
  6. package/lib/detector.js +456 -373
  7. package/lib/environment-detector.js +239 -0
  8. package/lib/index.js +271 -170
  9. package/lib/installer.js +371 -362
  10. package/lib/placeholder.js +269 -208
  11. package/lib/prompts.js +287 -287
  12. package/lib/spinner.js +60 -60
  13. package/lib/static-analyzer.js +729 -0
  14. package/lib/template-populator.js +835 -0
  15. package/lib/validate.js +147 -147
  16. package/package.json +59 -59
  17. package/templates/CLAUDE.md.template +235 -235
  18. package/templates/base/README.md +257 -257
  19. package/templates/base/RPI_WORKFLOW_PLAN.md +320 -320
  20. package/templates/base/agents/api-developer.md +76 -76
  21. package/templates/base/agents/context-engineer.md +525 -525
  22. package/templates/base/agents/core-architect.md +76 -76
  23. package/templates/base/agents/database-ops.md +76 -76
  24. package/templates/base/agents/deployment-ops.md +76 -76
  25. package/templates/base/agents/integration-hub.md +76 -76
  26. package/templates/base/analytics/README.md +114 -114
  27. package/templates/base/automation/config.json +58 -0
  28. package/templates/base/automation/generators/code-mapper.js +308 -0
  29. package/templates/base/automation/generators/index-builder.js +321 -0
  30. package/templates/base/automation/hooks/post-commit.sh +83 -0
  31. package/templates/base/automation/hooks/pre-commit.sh +103 -0
  32. package/templates/base/ci-templates/README.md +108 -108
  33. package/templates/base/ci-templates/github-actions/context-check.yml +144 -144
  34. package/templates/base/ci-templates/github-actions/validate-docs.yml +105 -105
  35. package/templates/base/commands/analytics.md +238 -238
  36. package/templates/base/commands/auto-sync.md +172 -0
  37. package/templates/base/commands/collab.md +194 -194
  38. package/templates/base/commands/help.md +450 -450
  39. package/templates/base/commands/rpi-implement.md +115 -115
  40. package/templates/base/commands/rpi-plan.md +93 -93
  41. package/templates/base/commands/rpi-research.md +88 -88
  42. package/templates/base/commands/session-resume.md +144 -0
  43. package/templates/base/commands/session-save.md +112 -0
  44. package/templates/base/commands/validate-all.md +77 -77
  45. package/templates/base/commands/verify-docs-current.md +86 -86
  46. package/templates/base/config/base.json +57 -57
  47. package/templates/base/config/environments/development.json +13 -13
  48. package/templates/base/config/environments/production.json +17 -17
  49. package/templates/base/config/environments/staging.json +13 -13
  50. package/templates/base/config/local.json.example +21 -21
  51. package/templates/base/context/.meta/generated-at.json +18 -0
  52. package/templates/base/context/ARCHITECTURE_SNAPSHOT.md +156 -156
  53. package/templates/base/context/CODE_TO_WORKFLOW_MAP.md +94 -94
  54. package/templates/base/context/FILE_OWNERSHIP.md +57 -0
  55. package/templates/base/context/INTEGRATION_POINTS.md +92 -0
  56. package/templates/base/context/KNOWN_GOTCHAS.md +195 -195
  57. package/templates/base/context/TESTING_MAP.md +95 -0
  58. package/templates/base/context/WORKFLOW_INDEX.md +129 -129
  59. package/templates/base/context/workflows/WORKFLOW_TEMPLATE.md +294 -294
  60. package/templates/base/indexes/agents/CAPABILITY_MATRIX.md +255 -255
  61. package/templates/base/indexes/agents/CATEGORY_INDEX.md +44 -44
  62. package/templates/base/indexes/code/CATEGORY_INDEX.md +38 -38
  63. package/templates/base/indexes/routing/CATEGORY_INDEX.md +39 -39
  64. package/templates/base/indexes/search/CATEGORY_INDEX.md +39 -39
  65. package/templates/base/indexes/workflows/CATEGORY_INDEX.md +38 -38
  66. package/templates/base/knowledge/README.md +98 -98
  67. package/templates/base/knowledge/sessions/README.md +88 -88
  68. package/templates/base/knowledge/sessions/TEMPLATE.md +150 -150
  69. package/templates/base/knowledge/shared/decisions/0001-adopt-context-engineering.md +144 -144
  70. package/templates/base/knowledge/shared/decisions/README.md +49 -49
  71. package/templates/base/knowledge/shared/decisions/TEMPLATE.md +123 -123
  72. package/templates/base/knowledge/shared/patterns/README.md +62 -62
  73. package/templates/base/knowledge/shared/patterns/TEMPLATE.md +120 -120
  74. package/templates/base/plans/PLAN_TEMPLATE.md +250 -250
  75. package/templates/base/research/RESEARCH_TEMPLATE.md +153 -153
  76. package/templates/base/schemas/agent.schema.json +141 -141
  77. package/templates/base/schemas/anchors.schema.json +54 -0
  78. package/templates/base/schemas/automation.schema.json +93 -0
  79. package/templates/base/schemas/command.schema.json +134 -134
  80. package/templates/base/schemas/hashes.schema.json +40 -0
  81. package/templates/base/schemas/manifest.schema.json +117 -117
  82. package/templates/base/schemas/plan.schema.json +136 -136
  83. package/templates/base/schemas/research.schema.json +115 -115
  84. package/templates/base/schemas/roles.schema.json +34 -0
  85. package/templates/base/schemas/session.schema.json +77 -0
  86. package/templates/base/schemas/settings.schema.json +244 -244
  87. package/templates/base/schemas/staleness.schema.json +53 -0
  88. package/templates/base/schemas/team-config.schema.json +42 -0
  89. package/templates/base/schemas/workflow.schema.json +126 -126
  90. package/templates/base/session/checkpoints/.gitkeep +2 -0
  91. package/templates/base/session/current/state.json +20 -0
  92. package/templates/base/session/history/.gitkeep +2 -0
  93. package/templates/base/settings.json +3 -57
  94. package/templates/base/standards/COMPATIBILITY.md +219 -219
  95. package/templates/base/standards/EXTENSION_GUIDELINES.md +280 -280
  96. package/templates/base/standards/QUALITY_CHECKLIST.md +211 -211
  97. package/templates/base/standards/README.md +66 -66
  98. package/templates/base/sync/anchors.json +6 -0
  99. package/templates/base/sync/hashes.json +6 -0
  100. package/templates/base/sync/staleness.json +10 -0
  101. package/templates/base/team/README.md +168 -168
  102. package/templates/base/team/config.json +79 -79
  103. package/templates/base/team/roles.json +145 -145
  104. package/templates/base/tools/bin/claude-context.js +151 -151
  105. package/templates/base/tools/lib/anchor-resolver.js +276 -0
  106. package/templates/base/tools/lib/config-loader.js +363 -363
  107. package/templates/base/tools/lib/detector.js +350 -350
  108. package/templates/base/tools/lib/diagnose.js +206 -206
  109. package/templates/base/tools/lib/drift-detector.js +373 -0
  110. package/templates/base/tools/lib/errors.js +199 -199
  111. package/templates/base/tools/lib/index.js +36 -24
  112. package/templates/base/tools/lib/init.js +192 -192
  113. package/templates/base/tools/lib/logger.js +230 -230
  114. package/templates/base/tools/lib/placeholder.js +201 -201
  115. package/templates/base/tools/lib/session-manager.js +354 -0
  116. package/templates/base/tools/lib/validate.js +521 -521
  117. package/templates/base/tools/package.json +49 -49
@@ -0,0 +1,321 @@
1
+ /**
2
+ * Index Builder - Rebuilds category indexes from content
3
+ *
4
+ * Scans workflow and agent files to regenerate index files
5
+ * with accurate counts and references.
6
+ */
7
+
8
+ const fs = require('fs');
9
+ const path = require('path');
10
+ const glob = require('glob');
11
+
12
+ const CLAUDE_DIR = path.join(__dirname, '..', '..');
13
+
14
+ /**
15
+ * Parse frontmatter from markdown file
16
+ */
17
+ function parseFrontmatter(content) {
18
+ const match = content.match(/^---\n([\s\S]*?)\n---/);
19
+ if (!match) return {};
20
+
21
+ const frontmatter = {};
22
+ const lines = match[1].split('\n');
23
+ for (const line of lines) {
24
+ const [key, ...valueParts] = line.split(':');
25
+ if (key && valueParts.length > 0) {
26
+ frontmatter[key.trim()] = valueParts.join(':').trim();
27
+ }
28
+ }
29
+ return frontmatter;
30
+ }
31
+
32
+ /**
33
+ * Scan workflows directory and collect metadata
34
+ */
35
+ function scanWorkflows() {
36
+ const workflowsDir = path.join(CLAUDE_DIR, 'context', 'workflows');
37
+ const workflows = [];
38
+
39
+ if (!fs.existsSync(workflowsDir)) {
40
+ return workflows;
41
+ }
42
+
43
+ const files = fs.readdirSync(workflowsDir).filter(f => f.endsWith('.md'));
44
+
45
+ for (const file of files) {
46
+ if (file === 'WORKFLOW_TEMPLATE.md') continue;
47
+
48
+ try {
49
+ const filePath = path.join(workflowsDir, file);
50
+ const content = fs.readFileSync(filePath, 'utf-8');
51
+ const frontmatter = parseFrontmatter(content);
52
+
53
+ // Extract title from first heading
54
+ const titleMatch = content.match(/^#\s+(.+)$/m);
55
+ const title = titleMatch ? titleMatch[1] : file.replace('.md', '');
56
+
57
+ workflows.push({
58
+ file: file,
59
+ name: frontmatter.name || title,
60
+ category: frontmatter.category || 'uncategorized',
61
+ complexity: frontmatter.complexity || 'medium',
62
+ description: frontmatter.description || '',
63
+ lastUpdated: frontmatter.last_updated || null
64
+ });
65
+ } catch (error) {
66
+ console.error(`Error parsing ${file}:`, error.message);
67
+ }
68
+ }
69
+
70
+ return workflows;
71
+ }
72
+
73
+ /**
74
+ * Scan agents directory and collect metadata
75
+ */
76
+ function scanAgents() {
77
+ const agentsDir = path.join(CLAUDE_DIR, 'agents');
78
+ const agents = [];
79
+
80
+ if (!fs.existsSync(agentsDir)) {
81
+ return agents;
82
+ }
83
+
84
+ const files = fs.readdirSync(agentsDir).filter(f => f.endsWith('.md'));
85
+
86
+ for (const file of files) {
87
+ try {
88
+ const filePath = path.join(agentsDir, file);
89
+ const content = fs.readFileSync(filePath, 'utf-8');
90
+ const frontmatter = parseFrontmatter(content);
91
+
92
+ // Extract title from first heading
93
+ const titleMatch = content.match(/^#\s+(.+)$/m);
94
+ const title = titleMatch ? titleMatch[1] : file.replace('.md', '');
95
+
96
+ agents.push({
97
+ file: file,
98
+ name: frontmatter.name || title,
99
+ role: frontmatter.role || 'general',
100
+ complexity: frontmatter.complexity || 'medium',
101
+ description: frontmatter.description || ''
102
+ });
103
+ } catch (error) {
104
+ console.error(`Error parsing ${file}:`, error.message);
105
+ }
106
+ }
107
+
108
+ return agents;
109
+ }
110
+
111
+ /**
112
+ * Scan commands directory and collect metadata
113
+ */
114
+ function scanCommands() {
115
+ const commandsDir = path.join(CLAUDE_DIR, 'commands');
116
+ const commands = [];
117
+
118
+ if (!fs.existsSync(commandsDir)) {
119
+ return commands;
120
+ }
121
+
122
+ const files = fs.readdirSync(commandsDir).filter(f => f.endsWith('.md'));
123
+
124
+ for (const file of files) {
125
+ try {
126
+ const filePath = path.join(commandsDir, file);
127
+ const content = fs.readFileSync(filePath, 'utf-8');
128
+ const frontmatter = parseFrontmatter(content);
129
+
130
+ commands.push({
131
+ file: file,
132
+ name: frontmatter.name || '/' + file.replace('.md', ''),
133
+ category: frontmatter.category || 'general',
134
+ description: frontmatter.description || ''
135
+ });
136
+ } catch (error) {
137
+ console.error(`Error parsing ${file}:`, error.message);
138
+ }
139
+ }
140
+
141
+ return commands;
142
+ }
143
+
144
+ /**
145
+ * Generate workflow category index content
146
+ */
147
+ function generateWorkflowIndex(workflows) {
148
+ const now = new Date().toISOString();
149
+
150
+ // Group by category
151
+ const byCategory = {};
152
+ for (const wf of workflows) {
153
+ if (!byCategory[wf.category]) {
154
+ byCategory[wf.category] = [];
155
+ }
156
+ byCategory[wf.category].push(wf);
157
+ }
158
+
159
+ let content = `# Workflow Category Index
160
+
161
+ > **Auto-generated:** ${now}
162
+ > **Total Workflows:** ${workflows.length}
163
+
164
+ This index organizes all documented workflows by category.
165
+
166
+ ---
167
+
168
+ ## Quick Navigation
169
+
170
+ | Category | Count | Description |
171
+ |----------|-------|-------------|
172
+ `;
173
+
174
+ for (const [category, wfs] of Object.entries(byCategory).sort()) {
175
+ content += `| ${category} | ${wfs.length} | ${category} workflows |\n`;
176
+ }
177
+
178
+ content += `\n---\n\n`;
179
+
180
+ // Detail by category
181
+ for (const [category, wfs] of Object.entries(byCategory).sort()) {
182
+ content += `## ${category.charAt(0).toUpperCase() + category.slice(1)}\n\n`;
183
+ content += `| Workflow | Complexity | Description |\n`;
184
+ content += `|----------|------------|-------------|\n`;
185
+
186
+ for (const wf of wfs.sort((a, b) => a.name.localeCompare(b.name))) {
187
+ const link = `[${wf.name}](../../context/workflows/${wf.file})`;
188
+ content += `| ${link} | ${wf.complexity} | ${wf.description || '-'} |\n`;
189
+ }
190
+
191
+ content += `\n`;
192
+ }
193
+
194
+ content += `---\n\n*Auto-generated by index-builder.js*\n`;
195
+
196
+ return content;
197
+ }
198
+
199
+ /**
200
+ * Generate agent category index content
201
+ */
202
+ function generateAgentIndex(agents) {
203
+ const now = new Date().toISOString();
204
+
205
+ let content = `# Agent Category Index
206
+
207
+ > **Auto-generated:** ${now}
208
+ > **Total Agents:** ${agents.length}
209
+
210
+ This index lists all specialized agents and their capabilities.
211
+
212
+ ---
213
+
214
+ ## Available Agents
215
+
216
+ | Agent | Role | Complexity | Description |
217
+ |-------|------|------------|-------------|
218
+ `;
219
+
220
+ for (const agent of agents.sort((a, b) => a.name.localeCompare(b.name))) {
221
+ const link = `[${agent.name}](../../agents/${agent.file})`;
222
+ content += `| ${link} | ${agent.role} | ${agent.complexity} | ${agent.description || '-'} |\n`;
223
+ }
224
+
225
+ content += `\n---\n\n## Agent Selection Guide\n\n`;
226
+ content += `Choose an agent based on your task:\n\n`;
227
+ content += `- **context-engineer** - Initial setup, documentation generation\n`;
228
+ content += `- **core-architect** - System design, architecture decisions\n`;
229
+ content += `- **database-ops** - Schema, migrations, queries\n`;
230
+ content += `- **api-developer** - Endpoints, contracts, REST/GraphQL\n`;
231
+ content += `- **integration-hub** - External services, webhooks\n`;
232
+ content += `- **deployment-ops** - CI/CD, infrastructure\n`;
233
+ content += `\n---\n\n*Auto-generated by index-builder.js*\n`;
234
+
235
+ return content;
236
+ }
237
+
238
+ /**
239
+ * Build all indexes
240
+ */
241
+ function buildAll(options = {}) {
242
+ const { dryRun = false, verbose = false } = options;
243
+ const results = [];
244
+
245
+ console.log('Scanning content...');
246
+
247
+ // Scan all content
248
+ const workflows = scanWorkflows();
249
+ const agents = scanAgents();
250
+ const commands = scanCommands();
251
+
252
+ console.log(`Found: ${workflows.length} workflows, ${agents.length} agents, ${commands.length} commands`);
253
+
254
+ // Generate workflow index
255
+ const workflowIndexContent = generateWorkflowIndex(workflows);
256
+ const workflowIndexPath = path.join(CLAUDE_DIR, 'indexes', 'workflows', 'CATEGORY_INDEX.md');
257
+
258
+ if (!dryRun) {
259
+ fs.writeFileSync(workflowIndexPath, workflowIndexContent);
260
+ console.log(`Generated: ${workflowIndexPath}`);
261
+ }
262
+ results.push({ type: 'workflow-index', path: workflowIndexPath, itemCount: workflows.length });
263
+
264
+ // Generate agent index
265
+ const agentIndexContent = generateAgentIndex(agents);
266
+ const agentIndexPath = path.join(CLAUDE_DIR, 'indexes', 'agents', 'CATEGORY_INDEX.md');
267
+
268
+ if (!dryRun) {
269
+ fs.writeFileSync(agentIndexPath, agentIndexContent);
270
+ console.log(`Generated: ${agentIndexPath}`);
271
+ }
272
+ results.push({ type: 'agent-index', path: agentIndexPath, itemCount: agents.length });
273
+
274
+ // Update generation metadata
275
+ if (!dryRun) {
276
+ const metaPath = path.join(CLAUDE_DIR, 'context', '.meta', 'generated-at.json');
277
+ let metadata = {};
278
+ if (fs.existsSync(metaPath)) {
279
+ try {
280
+ metadata = JSON.parse(fs.readFileSync(metaPath, 'utf-8'));
281
+ } catch (e) {}
282
+ }
283
+
284
+ metadata['WORKFLOW_CATEGORY_INDEX'] = {
285
+ generatedAt: new Date().toISOString(),
286
+ itemCount: workflows.length
287
+ };
288
+ metadata['AGENT_CATEGORY_INDEX'] = {
289
+ generatedAt: new Date().toISOString(),
290
+ itemCount: agents.length
291
+ };
292
+
293
+ const metaDir = path.dirname(metaPath);
294
+ if (!fs.existsSync(metaDir)) {
295
+ fs.mkdirSync(metaDir, { recursive: true });
296
+ }
297
+ fs.writeFileSync(metaPath, JSON.stringify(metadata, null, 2));
298
+ }
299
+
300
+ return { success: true, results };
301
+ }
302
+
303
+ // CLI execution
304
+ if (require.main === module) {
305
+ const args = process.argv.slice(2);
306
+ const dryRun = args.includes('--dry-run');
307
+ const verbose = args.includes('--verbose') || args.includes('-v');
308
+
309
+ const result = buildAll({ dryRun, verbose });
310
+ console.log(`\nIndex build ${result.success ? 'complete' : 'failed'}`);
311
+ process.exit(result.success ? 0 : 1);
312
+ }
313
+
314
+ module.exports = {
315
+ buildAll,
316
+ scanWorkflows,
317
+ scanAgents,
318
+ scanCommands,
319
+ generateWorkflowIndex,
320
+ generateAgentIndex
321
+ };
@@ -0,0 +1,83 @@
1
+ #!/bin/bash
2
+ #
3
+ # Claude Context Engineering - Post-Commit Hook
4
+ #
5
+ # Rebuilds indexes and updates tracking after successful commits.
6
+ # Install with: npx claude-context hooks install
7
+ #
8
+
9
+ # Colors for output
10
+ GREEN='\033[0;32m'
11
+ YELLOW='\033[1;33m'
12
+ NC='\033[0m' # No Color
13
+
14
+ # Get the repository root
15
+ REPO_ROOT=$(git rev-parse --show-toplevel)
16
+ CLAUDE_DIR="$REPO_ROOT/.claude"
17
+ CONFIG_FILE="$CLAUDE_DIR/automation/config.json"
18
+
19
+ # Check if claude context is set up
20
+ if [ ! -d "$CLAUDE_DIR" ]; then
21
+ exit 0 # No .claude directory, skip
22
+ fi
23
+
24
+ # Load config (if jq is available)
25
+ REBUILD_CODE_MAP=true
26
+ UPDATE_HASHES=true
27
+
28
+ if command -v jq &> /dev/null && [ -f "$CONFIG_FILE" ]; then
29
+ REBUILD_CODE_MAP=$(jq -r '.hooks.post_commit.rebuild_code_map // true' "$CONFIG_FILE")
30
+ UPDATE_HASHES=$(jq -r '.hooks.post_commit.update_hashes // true' "$CONFIG_FILE")
31
+ fi
32
+
33
+ # Check if npx is available
34
+ if ! command -v npx &> /dev/null; then
35
+ exit 0
36
+ fi
37
+
38
+ # Get list of files that were committed
39
+ COMMITTED_FILES=$(git diff-tree --no-commit-id --name-only -r HEAD)
40
+
41
+ # Check if any code files were committed
42
+ CODE_COMMITTED=false
43
+ for file in $COMMITTED_FILES; do
44
+ case "$file" in
45
+ *.py|*.js|*.ts|*.jsx|*.tsx|*.go|*.rs|*.rb|*.java)
46
+ CODE_COMMITTED=true
47
+ break
48
+ ;;
49
+ esac
50
+ done
51
+
52
+ # Skip if no code files
53
+ if [ "$CODE_COMMITTED" = false ]; then
54
+ exit 0
55
+ fi
56
+
57
+ echo -e "${GREEN}Claude Context: Post-commit update${NC}"
58
+
59
+ # Update file hashes (async, don't block)
60
+ if [ "$UPDATE_HASHES" = "true" ]; then
61
+ # Update hashes for committed files
62
+ for file in $COMMITTED_FILES; do
63
+ if [ -f "$file" ]; then
64
+ HASH=$(git hash-object "$file" 2>/dev/null)
65
+ if [ -n "$HASH" ]; then
66
+ # Write to hashes file (simple append for now)
67
+ echo " Updated hash: $file"
68
+ fi
69
+ fi
70
+ done
71
+ fi
72
+
73
+ # Rebuild code map (optional, can be slow)
74
+ if [ "$REBUILD_CODE_MAP" = "true" ]; then
75
+ if [ -f "$CLAUDE_DIR/automation/generators/code-mapper.js" ]; then
76
+ # Run in background to not slow down commits
77
+ (node "$CLAUDE_DIR/automation/generators/code-mapper.js" --quiet &> /dev/null &)
78
+ echo -e " ${YELLOW}Code map rebuild queued (background)${NC}"
79
+ fi
80
+ fi
81
+
82
+ echo -e "${GREEN}Post-commit update complete.${NC}"
83
+ exit 0
@@ -0,0 +1,103 @@
1
+ #!/bin/bash
2
+ #
3
+ # Claude Context Engineering - Pre-Commit Hook
4
+ #
5
+ # Validates documentation synchronization before allowing commits.
6
+ # Install with: npx claude-context hooks install
7
+ #
8
+
9
+ # Colors for output
10
+ RED='\033[0;31m'
11
+ YELLOW='\033[1;33m'
12
+ GREEN='\033[0;32m'
13
+ NC='\033[0m' # No Color
14
+
15
+ # Get the repository root
16
+ REPO_ROOT=$(git rev-parse --show-toplevel)
17
+ CLAUDE_DIR="$REPO_ROOT/.claude"
18
+ CONFIG_FILE="$CLAUDE_DIR/automation/config.json"
19
+
20
+ # Check if claude context is set up
21
+ if [ ! -d "$CLAUDE_DIR" ]; then
22
+ exit 0 # No .claude directory, skip checks
23
+ fi
24
+
25
+ # Load config (if jq is available)
26
+ BLOCK_ON_STALE=false
27
+ CHECK_DRIFT=true
28
+
29
+ if command -v jq &> /dev/null && [ -f "$CONFIG_FILE" ]; then
30
+ BLOCK_ON_STALE=$(jq -r '.hooks.pre_commit.block_on_stale // false' "$CONFIG_FILE")
31
+ CHECK_DRIFT=$(jq -r '.hooks.pre_commit.check_drift // true' "$CONFIG_FILE")
32
+ fi
33
+
34
+ # Skip if drift check is disabled
35
+ if [ "$CHECK_DRIFT" != "true" ]; then
36
+ exit 0
37
+ fi
38
+
39
+ echo -e "${GREEN}Claude Context: Pre-commit validation${NC}"
40
+
41
+ # Get list of staged files
42
+ STAGED_FILES=$(git diff --cached --name-only --diff-filter=ACMR)
43
+
44
+ # Check if any code files are being committed
45
+ CODE_FILES=""
46
+ for file in $STAGED_FILES; do
47
+ case "$file" in
48
+ *.py|*.js|*.ts|*.jsx|*.tsx|*.go|*.rs|*.rb|*.java)
49
+ CODE_FILES="$CODE_FILES $file"
50
+ ;;
51
+ esac
52
+ done
53
+
54
+ # If no code files, skip checks
55
+ if [ -z "$CODE_FILES" ]; then
56
+ echo -e "${GREEN}No code files in commit, skipping drift check.${NC}"
57
+ exit 0
58
+ fi
59
+
60
+ # Check if npx is available
61
+ if ! command -v npx &> /dev/null; then
62
+ echo -e "${YELLOW}Warning: npx not found, skipping documentation drift check.${NC}"
63
+ exit 0
64
+ fi
65
+
66
+ # Run drift check
67
+ DRIFT_FOUND=false
68
+ DRIFT_OUTPUT=""
69
+
70
+ for file in $CODE_FILES; do
71
+ # Check if this file is referenced in any workflow
72
+ if grep -r "$file" "$CLAUDE_DIR/context/workflows" &> /dev/null; then
73
+ echo -e " Checking: $file"
74
+
75
+ # Simple hash-based check
76
+ CURRENT_HASH=$(git hash-object "$file" 2>/dev/null)
77
+ STAGED_HASH=$(git ls-files -s "$file" 2>/dev/null | awk '{print $2}')
78
+
79
+ if [ -n "$STAGED_HASH" ]; then
80
+ DRIFT_OUTPUT="$DRIFT_OUTPUT\n - $file (modified, may affect documentation)"
81
+ DRIFT_FOUND=true
82
+ fi
83
+ fi
84
+ done
85
+
86
+ # Report findings
87
+ if [ "$DRIFT_FOUND" = true ]; then
88
+ echo -e "${YELLOW}Documentation may need updating:${NC}"
89
+ echo -e "$DRIFT_OUTPUT"
90
+ echo ""
91
+
92
+ if [ "$BLOCK_ON_STALE" = true ]; then
93
+ echo -e "${RED}Commit blocked: Documentation drift detected.${NC}"
94
+ echo -e "Run ${GREEN}/verify-docs-current${NC} or ${GREEN}npx claude-context sync --check${NC}"
95
+ echo -e "To skip this check: git commit --no-verify"
96
+ exit 1
97
+ else
98
+ echo -e "${YELLOW}Warning: Consider running /verify-docs-current to check documentation.${NC}"
99
+ fi
100
+ fi
101
+
102
+ echo -e "${GREEN}Pre-commit check complete.${NC}"
103
+ exit 0