@ctxkit/cli 0.2.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 (85) hide show
  1. package/dist/commands/apply.d.ts +3 -0
  2. package/dist/commands/apply.d.ts.map +1 -0
  3. package/dist/commands/apply.js +45 -0
  4. package/dist/commands/apply.js.map +1 -0
  5. package/dist/commands/bootstrap-cmd.d.ts +3 -0
  6. package/dist/commands/bootstrap-cmd.d.ts.map +1 -0
  7. package/dist/commands/bootstrap-cmd.js +104 -0
  8. package/dist/commands/bootstrap-cmd.js.map +1 -0
  9. package/dist/commands/codex.d.ts +3 -0
  10. package/dist/commands/codex.d.ts.map +1 -0
  11. package/dist/commands/codex.js +64 -0
  12. package/dist/commands/codex.js.map +1 -0
  13. package/dist/commands/conflicts-cmd.d.ts +3 -0
  14. package/dist/commands/conflicts-cmd.d.ts.map +1 -0
  15. package/dist/commands/conflicts-cmd.js +178 -0
  16. package/dist/commands/conflicts-cmd.js.map +1 -0
  17. package/dist/commands/daemon.d.ts +4 -0
  18. package/dist/commands/daemon.d.ts.map +1 -0
  19. package/dist/commands/daemon.js +107 -0
  20. package/dist/commands/daemon.js.map +1 -0
  21. package/dist/commands/drift.d.ts +3 -0
  22. package/dist/commands/drift.d.ts.map +1 -0
  23. package/dist/commands/drift.js +65 -0
  24. package/dist/commands/drift.js.map +1 -0
  25. package/dist/commands/history-cmd.d.ts +3 -0
  26. package/dist/commands/history-cmd.d.ts.map +1 -0
  27. package/dist/commands/history-cmd.js +100 -0
  28. package/dist/commands/history-cmd.js.map +1 -0
  29. package/dist/commands/hooks-cmd.d.ts +3 -0
  30. package/dist/commands/hooks-cmd.d.ts.map +1 -0
  31. package/dist/commands/hooks-cmd.js +98 -0
  32. package/dist/commands/hooks-cmd.js.map +1 -0
  33. package/dist/commands/index-cmd.d.ts +3 -0
  34. package/dist/commands/index-cmd.d.ts.map +1 -0
  35. package/dist/commands/index-cmd.js +112 -0
  36. package/dist/commands/index-cmd.js.map +1 -0
  37. package/dist/commands/init.d.ts +3 -0
  38. package/dist/commands/init.d.ts.map +1 -0
  39. package/dist/commands/init.js +158 -0
  40. package/dist/commands/init.js.map +1 -0
  41. package/dist/commands/inject.d.ts +3 -0
  42. package/dist/commands/inject.d.ts.map +1 -0
  43. package/dist/commands/inject.js +68 -0
  44. package/dist/commands/inject.js.map +1 -0
  45. package/dist/commands/migrate-cmd.d.ts +3 -0
  46. package/dist/commands/migrate-cmd.d.ts.map +1 -0
  47. package/dist/commands/migrate-cmd.js +132 -0
  48. package/dist/commands/migrate-cmd.js.map +1 -0
  49. package/dist/commands/plugin.d.ts +3 -0
  50. package/dist/commands/plugin.d.ts.map +1 -0
  51. package/dist/commands/plugin.js +327 -0
  52. package/dist/commands/plugin.js.map +1 -0
  53. package/dist/commands/pr-context-cmd.d.ts +3 -0
  54. package/dist/commands/pr-context-cmd.d.ts.map +1 -0
  55. package/dist/commands/pr-context-cmd.js +128 -0
  56. package/dist/commands/pr-context-cmd.js.map +1 -0
  57. package/dist/commands/propose.d.ts +3 -0
  58. package/dist/commands/propose.d.ts.map +1 -0
  59. package/dist/commands/propose.js +109 -0
  60. package/dist/commands/propose.js.map +1 -0
  61. package/dist/commands/run.d.ts +3 -0
  62. package/dist/commands/run.d.ts.map +1 -0
  63. package/dist/commands/run.js +133 -0
  64. package/dist/commands/run.js.map +1 -0
  65. package/dist/commands/sessions.d.ts +3 -0
  66. package/dist/commands/sessions.d.ts.map +1 -0
  67. package/dist/commands/sessions.js +93 -0
  68. package/dist/commands/sessions.js.map +1 -0
  69. package/dist/commands/speckit-cmd.d.ts +3 -0
  70. package/dist/commands/speckit-cmd.d.ts.map +1 -0
  71. package/dist/commands/speckit-cmd.js +196 -0
  72. package/dist/commands/speckit-cmd.js.map +1 -0
  73. package/dist/commands/validate.d.ts +3 -0
  74. package/dist/commands/validate.d.ts.map +1 -0
  75. package/dist/commands/validate.js +75 -0
  76. package/dist/commands/validate.js.map +1 -0
  77. package/dist/index.d.ts +3 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +49 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/services/agents-md.d.ts +34 -0
  82. package/dist/services/agents-md.d.ts.map +1 -0
  83. package/dist/services/agents-md.js +248 -0
  84. package/dist/services/agents-md.js.map +1 -0
  85. package/package.json +45 -0
@@ -0,0 +1,65 @@
1
+ import { Command } from 'commander';
2
+ import { resolve, join, dirname } from 'node:path';
3
+ import { existsSync } from 'node:fs';
4
+ import { detectDrift, detectAllDrift } from '@ctxkit/core';
5
+ export const driftCommand = new Command('drift')
6
+ .description('Check .ctx files for stale references and drift')
7
+ .argument('[path]', 'Path to .ctx file or repo root to scan all', '.')
8
+ .action((pathArg) => {
9
+ const targetPath = resolve(pathArg);
10
+ const repoRoot = findRepoRoot(targetPath);
11
+ if (targetPath.endsWith('.ctx') && existsSync(targetPath)) {
12
+ // Single .ctx file
13
+ const result = detectDrift(targetPath, repoRoot);
14
+ printDriftResult(result);
15
+ }
16
+ else {
17
+ // Scan all .ctx files from the target directory
18
+ const scanRoot = existsSync(join(targetPath, '.git')) ? targetPath : repoRoot;
19
+ const results = detectAllDrift(scanRoot);
20
+ if (results.length === 0) {
21
+ console.log('No .ctx files found.');
22
+ return;
23
+ }
24
+ let totalStale = 0;
25
+ for (const result of results) {
26
+ if (result.stale_entries.length > 0) {
27
+ printDriftResult(result);
28
+ console.log();
29
+ }
30
+ totalStale += result.total_stale;
31
+ }
32
+ if (totalStale === 0) {
33
+ console.log(`All ${results.length} .ctx file(s) are up to date.`);
34
+ }
35
+ else {
36
+ console.log(`\nTotal: ${totalStale} stale entry/entries across ${results.length} .ctx file(s)`);
37
+ process.exitCode = 1;
38
+ }
39
+ }
40
+ });
41
+ function printDriftResult(result) {
42
+ if (result.total_stale === 0) {
43
+ console.log(`✓ ${result.ctx_path} — no drift detected`);
44
+ return;
45
+ }
46
+ console.log(`✗ ${result.ctx_path} — ${result.total_stale} stale entry/entries:`);
47
+ for (const entry of result.stale_entries) {
48
+ console.log(` ${entry.section}/${entry.entry_id}`);
49
+ console.log(` Reason: ${entry.reason}`);
50
+ console.log(` Details: ${entry.details}`);
51
+ console.log(` Verified at: ${entry.verified_at}`);
52
+ }
53
+ }
54
+ function findRepoRoot(startDir) {
55
+ let current = startDir;
56
+ while (true) {
57
+ if (existsSync(join(current, '.git')))
58
+ return current;
59
+ const parent = dirname(current);
60
+ if (parent === current)
61
+ return startDir;
62
+ current = parent;
63
+ }
64
+ }
65
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const historyCommand: Command;
3
+ //# sourceMappingURL=history-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/history-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,cAAc,SAyFvB,CAAC"}
@@ -0,0 +1,100 @@
1
+ import { Command } from 'commander';
2
+ import { accessSync, readFileSync } from 'node:fs';
3
+ import { resolve, relative, join, dirname } from 'node:path';
4
+ import { parseCtxFile, readMergedHistory } from '@ctxkit/core';
5
+ export const historyCommand = new Command('history')
6
+ .description('Show version history for a .ctx file')
7
+ .argument('[path]', 'Path to .ctx file', '.ctx')
8
+ .option('--cwd <dir>', 'Working directory', process.cwd())
9
+ .option('--all', 'Include archived history entries', false)
10
+ .option('--count <n>', 'Number of entries to show', '10')
11
+ .option('--diff <range>', 'Show diff between versions (e.g., 1..5)')
12
+ .option('--json', 'Output as JSON', false)
13
+ .action((ctxPath, options) => {
14
+ const cwd = resolve(options.cwd);
15
+ const fullPath = resolve(cwd, ctxPath);
16
+ const repoRoot = findRepoRoot(cwd);
17
+ const relativePath = relative(repoRoot, fullPath);
18
+ let content;
19
+ try {
20
+ content = readFileSync(fullPath, 'utf-8');
21
+ }
22
+ catch {
23
+ console.error(`Error: Cannot read ${fullPath}`);
24
+ process.exit(1);
25
+ }
26
+ const { ctx } = parseCtxFile(content);
27
+ // Handle diff mode
28
+ if (options.diff) {
29
+ const [fromStr, toStr] = options.diff.split('..');
30
+ const from = parseInt(fromStr, 10);
31
+ const to = parseInt(toStr, 10);
32
+ if (isNaN(from) || isNaN(to)) {
33
+ console.error('Error: Invalid diff range. Use format: N..M');
34
+ process.exit(1);
35
+ }
36
+ // For a real diff we'd need version snapshots — use diff_summary from history entries
37
+ const history = options.all
38
+ ? readMergedHistory(ctx, relativePath, repoRoot)
39
+ : (ctx._history ?? []);
40
+ const relevant = history.filter((h) => h.version > from && h.version <= to);
41
+ if (options.json) {
42
+ console.log(JSON.stringify({
43
+ from_version: from,
44
+ to_version: to,
45
+ entries: relevant,
46
+ summary: relevant.map((h) => h.diff_summary).join('; '),
47
+ }, null, 2));
48
+ return;
49
+ }
50
+ console.log(`\nDiff: v${from}..v${to}`);
51
+ for (const entry of relevant) {
52
+ console.log(` v${entry.version} (${entry.timestamp}) by ${entry.author}: ${entry.diff_summary}`);
53
+ }
54
+ return;
55
+ }
56
+ // Show history
57
+ const count = parseInt(options.count, 10);
58
+ const history = options.all
59
+ ? readMergedHistory(ctx, relativePath, repoRoot)
60
+ : (ctx._history ?? []);
61
+ const shown = history.slice(0, count);
62
+ if (options.json) {
63
+ console.log(JSON.stringify({
64
+ path: relativePath,
65
+ current_version: ctx.version,
66
+ entries: shown,
67
+ has_more: history.length > count,
68
+ }, null, 2));
69
+ return;
70
+ }
71
+ console.log(`\n${relativePath} (v${ctx.version})`);
72
+ if (shown.length === 0) {
73
+ console.log(' No history entries');
74
+ return;
75
+ }
76
+ for (const entry of shown) {
77
+ console.log(` v${entry.version} | ${entry.timestamp} | ${entry.author} | ${entry.diff_summary}`);
78
+ if (entry.reason)
79
+ console.log(` Reason: ${entry.reason}`);
80
+ }
81
+ if (history.length > count) {
82
+ console.log(` ... ${history.length - count} more entries (use --all or --count)`);
83
+ }
84
+ });
85
+ function findRepoRoot(startDir) {
86
+ let dir = startDir;
87
+ while (true) {
88
+ try {
89
+ accessSync(join(dir, '.git'));
90
+ return dir;
91
+ }
92
+ catch {
93
+ const parent = dirname(dir);
94
+ if (parent === dir)
95
+ return startDir;
96
+ dir = parent;
97
+ }
98
+ }
99
+ }
100
+ //# sourceMappingURL=history-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-cmd.js","sourceRoot":"","sources":["../../src/commands/history-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const hooksCommand: Command;
3
+ //# sourceMappingURL=hooks-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/hooks-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,YAAY,SACY,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { Command } from 'commander';
2
+ import { writeFileSync, existsSync, mkdirSync, chmodSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { execSync } from 'node:child_process';
5
+ export const hooksCommand = new Command('hooks')
6
+ .description('Git hook management');
7
+ hooksCommand
8
+ .command('init')
9
+ .description('Install git hooks for context validation')
10
+ .option('--force', 'Overwrite existing hooks')
11
+ .action(async (options) => {
12
+ try {
13
+ let repoRoot;
14
+ try {
15
+ repoRoot = execSync('git rev-parse --show-toplevel', {
16
+ encoding: 'utf-8',
17
+ timeout: 3000,
18
+ stdio: ['pipe', 'pipe', 'pipe'],
19
+ }).trim();
20
+ }
21
+ catch {
22
+ console.error('Error: Not a git repository');
23
+ process.exit(1);
24
+ return;
25
+ }
26
+ const hooksDir = join(repoRoot, '.git', 'hooks');
27
+ if (!existsSync(hooksDir)) {
28
+ mkdirSync(hooksDir, { recursive: true });
29
+ }
30
+ const hooks = [
31
+ {
32
+ name: 'pre-commit',
33
+ content: `#!/bin/sh
34
+ # ctxkit pre-commit hook — validates .ctx files before committing
35
+ # Installed by: ctxkit hooks init
36
+
37
+ # Check if ctxkit is available
38
+ if ! command -v ctxkit &> /dev/null; then
39
+ echo "[ctxkit] Warning: ctxkit not found, skipping .ctx validation"
40
+ exit 0
41
+ fi
42
+
43
+ # Get list of staged .ctx files
44
+ STAGED_CTX=$(git diff --cached --name-only --diff-filter=ACM | grep '\\.ctx$' || true)
45
+
46
+ if [ -n "$STAGED_CTX" ]; then
47
+ echo "[ctxkit] Validating staged .ctx files..."
48
+ ctxkit validate --json > /dev/null 2>&1
49
+ if [ $? -ne 0 ]; then
50
+ echo "[ctxkit] Validation failed. Fix issues before committing."
51
+ exit 1
52
+ fi
53
+ echo "[ctxkit] All .ctx files valid."
54
+ fi
55
+ `,
56
+ },
57
+ {
58
+ name: 'post-commit',
59
+ content: `#!/bin/sh
60
+ # ctxkit post-commit hook — updates .ctxl index after commit
61
+ # Installed by: ctxkit hooks init
62
+
63
+ # Check if ctxkit is available
64
+ if ! command -v ctxkit &> /dev/null; then
65
+ exit 0
66
+ fi
67
+
68
+ # Check if any .ctx files were changed
69
+ CHANGED_CTX=$(git diff-tree --no-commit-id --name-only -r HEAD | grep '\\.ctx$' || true)
70
+
71
+ if [ -n "$CHANGED_CTX" ]; then
72
+ echo "[ctxkit] Updating .ctxl index..."
73
+ ctxkit index generate --json > /dev/null 2>&1 || true
74
+ fi
75
+ `,
76
+ },
77
+ ];
78
+ const installed = [];
79
+ for (const hook of hooks) {
80
+ const hookPath = join(hooksDir, hook.name);
81
+ if (existsSync(hookPath) && !options.force) {
82
+ console.error(`Hook already exists: ${hook.name}. Use --force to overwrite.`);
83
+ process.exit(1);
84
+ return;
85
+ }
86
+ writeFileSync(hookPath, hook.content, 'utf-8');
87
+ chmodSync(hookPath, 0o755);
88
+ installed.push(hook.name);
89
+ }
90
+ console.log(`Installed hooks: ${installed.join(', ')}`);
91
+ }
92
+ catch (error) {
93
+ const message = error instanceof Error ? error.message : String(error);
94
+ console.error(`Error: ${message}`);
95
+ process.exit(1);
96
+ }
97
+ });
98
+ //# sourceMappingURL=hooks-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-cmd.js","sourceRoot":"","sources":["../../src/commands/hooks-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,qBAAqB,CAAC,CAAC;AAEtC,YAAY;KACT,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC7C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,IAAI,CAAC;QACH,IAAI,QAAgB,CAAC;QACrB,IAAI,CAAC;YACH,QAAQ,GAAG,QAAQ,CAAC,+BAA+B,EAAE;gBACnD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;gBACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;aAChC,CAAC,CAAC,IAAI,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,KAAK,GAA6C;YACtD;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE;;;;;;;;;;;;;;;;;;;;;;CAsBlB;aACQ;YACD;gBACE,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE;;;;;;;;;;;;;;;;CAgBlB;aACQ;SACF,CAAC;QAEF,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAE3C,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC3C,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,6BAA6B,CAAC,CAAC;gBAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC/C,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const indexCommand: Command;
3
+ //# sourceMappingURL=index-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.d.ts","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,YAAY,SACe,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { Command } from 'commander';
2
+ import { generateIndex, writeIndex, readIndex, selectFromIndex } from '@ctxkit/core';
3
+ import { resolve, join, dirname } from 'node:path';
4
+ import { accessSync } from 'node:fs';
5
+ export const indexCommand = new Command('index')
6
+ .description('Manage the .ctxl index');
7
+ indexCommand
8
+ .command('generate')
9
+ .description('Generate or regenerate the .ctxl index from existing .ctx files')
10
+ .option('--cwd <path>', 'Repository root', process.cwd())
11
+ .option('--repo <name>', 'Repository name')
12
+ .option('--force', 'Force regeneration even if index exists', false)
13
+ .option('--json', 'Output as JSON', false)
14
+ .action((options) => {
15
+ const repoRoot = resolve(options.cwd);
16
+ const index = generateIndex(repoRoot, options.repo);
17
+ const indexPath = writeIndex(repoRoot, index);
18
+ if (options.json) {
19
+ console.log(JSON.stringify({
20
+ index_path: indexPath,
21
+ entries_count: index.entries.length,
22
+ total_tokens: index.entries.reduce((sum, e) => sum + e.token_estimate, 0),
23
+ dependencies_found: Object.values(index.graph).reduce((sum, n) => sum + n.depends_on.length, 0),
24
+ generated_at: index.generated_at,
25
+ }, null, 2));
26
+ return;
27
+ }
28
+ console.log(`Generated .ctxl index with ${index.entries.length} entries`);
29
+ console.log(` Total tokens: ${index.entries.reduce((sum, e) => sum + e.token_estimate, 0)}`);
30
+ console.log(` Dependencies: ${Object.values(index.graph).reduce((sum, n) => sum + n.depends_on.length, 0)}`);
31
+ console.log(` Path: ${indexPath}`);
32
+ });
33
+ indexCommand
34
+ .command('select')
35
+ .description('Select context from the index for a task')
36
+ .requiredOption('--prompt <text>', 'The task prompt')
37
+ .option('--cwd <path>', 'Working directory', process.cwd())
38
+ .option('--budget <tokens>', 'Token budget', '4000')
39
+ .option('--json', 'Output as JSON', false)
40
+ .action((options) => {
41
+ const cwd = resolve(options.cwd);
42
+ const repoRoot = findRepoRoot(cwd);
43
+ const budgetTokens = parseInt(options.budget, 10);
44
+ const index = readIndex(repoRoot);
45
+ if (!index) {
46
+ console.error('Error: No .ctxl index found. Run `ctxkit index generate` first.');
47
+ process.exit(1);
48
+ }
49
+ const result = selectFromIndex(index, {
50
+ prompt: options.prompt,
51
+ cwd,
52
+ repoRoot,
53
+ budgetTokens,
54
+ });
55
+ if (options.json) {
56
+ console.log(JSON.stringify(result, null, 2));
57
+ return;
58
+ }
59
+ console.log(`\nSelected ${result.selected.length} .ctx files:`);
60
+ for (const s of result.selected) {
61
+ console.log(` ${s.entry.path} (score: ${s.score}, reasons: ${s.reasons.join(', ')})`);
62
+ }
63
+ if (result.omitted.length > 0) {
64
+ console.log(`\nOmitted ${result.omitted.length} .ctx files:`);
65
+ for (const o of result.omitted) {
66
+ console.log(` ${o.entry.path}: ${o.reason}`);
67
+ }
68
+ }
69
+ console.log(`\nBudget used: ${result.budget_used.total} tokens`);
70
+ });
71
+ indexCommand
72
+ .command('show')
73
+ .description('Display the current .ctxl index')
74
+ .option('--cwd <path>', 'Repository root', process.cwd())
75
+ .option('--json', 'Output as JSON', false)
76
+ .action((options) => {
77
+ const repoRoot = resolve(options.cwd);
78
+ const index = readIndex(repoRoot);
79
+ if (!index) {
80
+ console.error('Error: No .ctxl index found. Run `ctxkit index generate` first.');
81
+ process.exit(1);
82
+ }
83
+ if (options.json) {
84
+ console.log(JSON.stringify(index, null, 2));
85
+ return;
86
+ }
87
+ console.log(`\n.ctxl Index (${index.entries.length} entries)`);
88
+ console.log(` Generated: ${index.generated_at}`);
89
+ console.log(` Updated: ${index.updated_at}`);
90
+ console.log(`\nEntries:`);
91
+ for (const entry of index.entries) {
92
+ console.log(` ${entry.path} (v${entry.ctx_version}, ${entry.token_estimate} tokens, tags: [${entry.tags.join(', ')}])`);
93
+ }
94
+ console.log(`\nScoring: locality=${index.defaults.scoring.locality_weight} recency=${index.defaults.scoring.recency_weight} tags=${index.defaults.scoring.tag_match_weight}`);
95
+ console.log(`Budget: total=${index.defaults.budget.total} contracts=${index.defaults.budget.contracts} local=${index.defaults.budget.local_ctx} related=${index.defaults.budget.related_ctx}`);
96
+ });
97
+ function findRepoRoot(startDir) {
98
+ let dir = startDir;
99
+ while (true) {
100
+ try {
101
+ accessSync(join(dir, '.git'));
102
+ return dir;
103
+ }
104
+ catch {
105
+ const parent = dirname(dir);
106
+ if (parent === dir)
107
+ return startDir; // reached root
108
+ dir = parent;
109
+ }
110
+ }
111
+ }
112
+ //# sourceMappingURL=index-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-cmd.js","sourceRoot":"","sources":["../../src/commands/index-cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SAuBpB,CAAC"}
@@ -0,0 +1,158 @@
1
+ import { Command } from 'commander';
2
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
3
+ import { resolve, join, basename } from 'node:path';
4
+ import { serializeCtxFile } from '@ctxkit/core';
5
+ export const initCommand = new Command('init')
6
+ .description('Initialize a .ctx file by scanning directory metadata')
7
+ .option('--dir <path>', 'Target directory', process.cwd())
8
+ .option('--force', 'Overwrite existing .ctx file', false)
9
+ .action((options) => {
10
+ const targetDir = resolve(options.dir);
11
+ const ctxPath = join(targetDir, '.ctx');
12
+ if (existsSync(ctxPath) && !options.force) {
13
+ console.error(`Error: .ctx file already exists at ${ctxPath}`);
14
+ console.error('Use --force to overwrite.');
15
+ process.exitCode = 1;
16
+ return;
17
+ }
18
+ const ctx = scanAndGenerate(targetDir);
19
+ writeFileSync(ctxPath, serializeCtxFile(ctx), 'utf-8');
20
+ console.log(`Created .ctx at ${ctxPath}`);
21
+ console.log(` Summary: ${ctx.summary}`);
22
+ console.log(` Key files: ${ctx.key_files.length}`);
23
+ console.log(` Commands: ${Object.keys(ctx.commands).length}`);
24
+ console.log(` Tags: ${ctx.tags.join(', ') || '(none)'}`);
25
+ });
26
+ function scanAndGenerate(dir) {
27
+ const dirName = basename(dir);
28
+ let summary = `Context for ${dirName}`;
29
+ const keyFiles = [];
30
+ const commands = {};
31
+ const tags = [];
32
+ // Scan package.json
33
+ const pkgPath = join(dir, 'package.json');
34
+ if (existsSync(pkgPath)) {
35
+ try {
36
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
37
+ if (pkg.description) {
38
+ summary = pkg.description;
39
+ }
40
+ else if (pkg.name) {
41
+ summary = `${pkg.name} project`;
42
+ }
43
+ keyFiles.push({
44
+ path: 'package.json',
45
+ purpose: 'Package manifest and dependency definitions',
46
+ tags: ['config'],
47
+ verified_at: new Date().toISOString().split('T')[0],
48
+ locked: false,
49
+ owner: null,
50
+ });
51
+ // Extract scripts as commands
52
+ if (pkg.scripts && typeof pkg.scripts === 'object') {
53
+ for (const [name, script] of Object.entries(pkg.scripts)) {
54
+ if (typeof script === 'string') {
55
+ commands[name] = script;
56
+ }
57
+ }
58
+ }
59
+ // Extract tags from keywords
60
+ if (Array.isArray(pkg.keywords)) {
61
+ tags.push(...pkg.keywords.map(String));
62
+ }
63
+ // Detect tech stack
64
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
65
+ if (allDeps.typescript)
66
+ tags.push('typescript');
67
+ if (allDeps.react)
68
+ tags.push('react');
69
+ if (allDeps.vue)
70
+ tags.push('vue');
71
+ if (allDeps.express || allDeps.hono || allDeps.fastify)
72
+ tags.push('api');
73
+ if (allDeps.vitest || allDeps.jest || allDeps.mocha)
74
+ tags.push('testing');
75
+ }
76
+ catch {
77
+ // Ignore parse errors
78
+ }
79
+ }
80
+ // Scan tsconfig.json
81
+ const tsconfigPath = join(dir, 'tsconfig.json');
82
+ if (existsSync(tsconfigPath)) {
83
+ keyFiles.push({
84
+ path: 'tsconfig.json',
85
+ purpose: 'TypeScript compiler configuration',
86
+ tags: ['config', 'typescript'],
87
+ verified_at: new Date().toISOString().split('T')[0],
88
+ locked: false,
89
+ owner: null,
90
+ });
91
+ if (!tags.includes('typescript')) {
92
+ tags.push('typescript');
93
+ }
94
+ }
95
+ // Scan README
96
+ const readmeNames = ['README.md', 'README', 'readme.md'];
97
+ for (const name of readmeNames) {
98
+ const readmePath = join(dir, name);
99
+ if (existsSync(readmePath)) {
100
+ keyFiles.push({
101
+ path: name,
102
+ purpose: 'Project documentation and overview',
103
+ tags: ['docs'],
104
+ verified_at: new Date().toISOString().split('T')[0],
105
+ locked: false,
106
+ owner: null,
107
+ });
108
+ // Try to extract a better summary from first line of README
109
+ try {
110
+ const content = readFileSync(readmePath, 'utf-8');
111
+ const firstLine = content.split('\n').find((l) => l.trim() && !l.startsWith('#') && !l.startsWith('!'));
112
+ if (firstLine && firstLine.trim().length > 10) {
113
+ summary = firstLine.trim().slice(0, 200);
114
+ }
115
+ }
116
+ catch {
117
+ // Ignore
118
+ }
119
+ break;
120
+ }
121
+ }
122
+ // Scan common entry points
123
+ const entryPoints = [
124
+ { file: 'src/index.ts', purpose: 'Main entry point' },
125
+ { file: 'src/index.js', purpose: 'Main entry point' },
126
+ { file: 'src/main.ts', purpose: 'Application entry point' },
127
+ { file: 'src/main.tsx', purpose: 'Application entry point' },
128
+ { file: 'src/app.ts', purpose: 'Application setup' },
129
+ { file: 'index.ts', purpose: 'Main entry point' },
130
+ { file: 'index.js', purpose: 'Main entry point' },
131
+ ];
132
+ for (const entry of entryPoints) {
133
+ if (existsSync(join(dir, entry.file))) {
134
+ keyFiles.push({
135
+ path: entry.file,
136
+ purpose: entry.purpose,
137
+ tags: ['entry'],
138
+ verified_at: new Date().toISOString().split('T')[0],
139
+ locked: false,
140
+ owner: null,
141
+ });
142
+ break; // Only add the first found entry point
143
+ }
144
+ }
145
+ return {
146
+ version: 1,
147
+ summary,
148
+ key_files: keyFiles,
149
+ contracts: [],
150
+ decisions: [],
151
+ commands,
152
+ gotchas: [],
153
+ tags: [...new Set(tags)],
154
+ refs: [],
155
+ ignore: { never_read: [], never_log: [] },
156
+ };
157
+ }
158
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const injectCommand: Command;
3
+ //# sourceMappingURL=inject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inject.d.ts","sourceRoot":"","sources":["../../src/commands/inject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SAgEtB,CAAC"}