ctxinit 0.1.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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +484 -0
  3. package/bin/ctx.js +3 -0
  4. package/dist/analysis/index.d.ts +2 -0
  5. package/dist/analysis/index.d.ts.map +1 -0
  6. package/dist/analysis/index.js +18 -0
  7. package/dist/analysis/index.js.map +1 -0
  8. package/dist/analysis/static-analysis.d.ts +79 -0
  9. package/dist/analysis/static-analysis.d.ts.map +1 -0
  10. package/dist/analysis/static-analysis.js +279 -0
  11. package/dist/analysis/static-analysis.js.map +1 -0
  12. package/dist/bootstrap/index.d.ts +8 -0
  13. package/dist/bootstrap/index.d.ts.map +1 -0
  14. package/dist/bootstrap/index.js +13 -0
  15. package/dist/bootstrap/index.js.map +1 -0
  16. package/dist/bootstrap/orchestrator.d.ts +48 -0
  17. package/dist/bootstrap/orchestrator.d.ts.map +1 -0
  18. package/dist/bootstrap/orchestrator.js +363 -0
  19. package/dist/bootstrap/orchestrator.js.map +1 -0
  20. package/dist/bootstrap/validator.d.ts +25 -0
  21. package/dist/bootstrap/validator.d.ts.map +1 -0
  22. package/dist/bootstrap/validator.js +412 -0
  23. package/dist/bootstrap/validator.js.map +1 -0
  24. package/dist/build/atomic.d.ts +74 -0
  25. package/dist/build/atomic.d.ts.map +1 -0
  26. package/dist/build/atomic.js +235 -0
  27. package/dist/build/atomic.js.map +1 -0
  28. package/dist/build/index.d.ts +10 -0
  29. package/dist/build/index.d.ts.map +1 -0
  30. package/dist/build/index.js +26 -0
  31. package/dist/build/index.js.map +1 -0
  32. package/dist/build/lock.d.ts +102 -0
  33. package/dist/build/lock.d.ts.map +1 -0
  34. package/dist/build/lock.js +297 -0
  35. package/dist/build/lock.js.map +1 -0
  36. package/dist/build/manifest.d.ts +138 -0
  37. package/dist/build/manifest.d.ts.map +1 -0
  38. package/dist/build/manifest.js +269 -0
  39. package/dist/build/manifest.js.map +1 -0
  40. package/dist/build/orchestrator.d.ts +103 -0
  41. package/dist/build/orchestrator.d.ts.map +1 -0
  42. package/dist/build/orchestrator.js +524 -0
  43. package/dist/build/orchestrator.js.map +1 -0
  44. package/dist/cli/bootstrap.d.ts +77 -0
  45. package/dist/cli/bootstrap.d.ts.map +1 -0
  46. package/dist/cli/bootstrap.js +527 -0
  47. package/dist/cli/bootstrap.js.map +1 -0
  48. package/dist/cli/build.d.ts +32 -0
  49. package/dist/cli/build.d.ts.map +1 -0
  50. package/dist/cli/build.js +156 -0
  51. package/dist/cli/build.js.map +1 -0
  52. package/dist/cli/diff.d.ts +23 -0
  53. package/dist/cli/diff.d.ts.map +1 -0
  54. package/dist/cli/diff.js +226 -0
  55. package/dist/cli/diff.js.map +1 -0
  56. package/dist/cli/hooks.d.ts +29 -0
  57. package/dist/cli/hooks.d.ts.map +1 -0
  58. package/dist/cli/hooks.js +176 -0
  59. package/dist/cli/hooks.js.map +1 -0
  60. package/dist/cli/init.d.ts +53 -0
  61. package/dist/cli/init.d.ts.map +1 -0
  62. package/dist/cli/init.js +254 -0
  63. package/dist/cli/init.js.map +1 -0
  64. package/dist/cli/lint.d.ts +46 -0
  65. package/dist/cli/lint.d.ts.map +1 -0
  66. package/dist/cli/lint.js +210 -0
  67. package/dist/cli/lint.js.map +1 -0
  68. package/dist/cli/migrate.d.ts +28 -0
  69. package/dist/cli/migrate.d.ts.map +1 -0
  70. package/dist/cli/migrate.js +350 -0
  71. package/dist/cli/migrate.js.map +1 -0
  72. package/dist/cli/verify.d.ts +21 -0
  73. package/dist/cli/verify.d.ts.map +1 -0
  74. package/dist/cli/verify.js +209 -0
  75. package/dist/cli/verify.js.map +1 -0
  76. package/dist/cli.d.ts +8 -0
  77. package/dist/cli.d.ts.map +1 -0
  78. package/dist/cli.js +262 -0
  79. package/dist/cli.js.map +1 -0
  80. package/dist/compiler/agents-compiler.d.ts +24 -0
  81. package/dist/compiler/agents-compiler.d.ts.map +1 -0
  82. package/dist/compiler/agents-compiler.js +192 -0
  83. package/dist/compiler/agents-compiler.js.map +1 -0
  84. package/dist/compiler/base-compiler.d.ts +152 -0
  85. package/dist/compiler/base-compiler.d.ts.map +1 -0
  86. package/dist/compiler/base-compiler.js +180 -0
  87. package/dist/compiler/base-compiler.js.map +1 -0
  88. package/dist/compiler/claude-compiler.d.ts +24 -0
  89. package/dist/compiler/claude-compiler.d.ts.map +1 -0
  90. package/dist/compiler/claude-compiler.js +182 -0
  91. package/dist/compiler/claude-compiler.js.map +1 -0
  92. package/dist/compiler/cursor-compiler.d.ts +33 -0
  93. package/dist/compiler/cursor-compiler.d.ts.map +1 -0
  94. package/dist/compiler/cursor-compiler.js +136 -0
  95. package/dist/compiler/cursor-compiler.js.map +1 -0
  96. package/dist/compiler/index.d.ts +7 -0
  97. package/dist/compiler/index.d.ts.map +1 -0
  98. package/dist/compiler/index.js +24 -0
  99. package/dist/compiler/index.js.map +1 -0
  100. package/dist/compiler/rule-selector.d.ts +115 -0
  101. package/dist/compiler/rule-selector.d.ts.map +1 -0
  102. package/dist/compiler/rule-selector.js +273 -0
  103. package/dist/compiler/rule-selector.js.map +1 -0
  104. package/dist/compiler/token-estimator.d.ts +74 -0
  105. package/dist/compiler/token-estimator.d.ts.map +1 -0
  106. package/dist/compiler/token-estimator.js +191 -0
  107. package/dist/compiler/token-estimator.js.map +1 -0
  108. package/dist/config/index.d.ts +2 -0
  109. package/dist/config/index.d.ts.map +1 -0
  110. package/dist/config/index.js +18 -0
  111. package/dist/config/index.js.map +1 -0
  112. package/dist/config/loader.d.ts +48 -0
  113. package/dist/config/loader.d.ts.map +1 -0
  114. package/dist/config/loader.js +175 -0
  115. package/dist/config/loader.js.map +1 -0
  116. package/dist/git/gitignore.d.ts +59 -0
  117. package/dist/git/gitignore.d.ts.map +1 -0
  118. package/dist/git/gitignore.js +268 -0
  119. package/dist/git/gitignore.js.map +1 -0
  120. package/dist/git/hooks.d.ts +34 -0
  121. package/dist/git/hooks.d.ts.map +1 -0
  122. package/dist/git/hooks.js +129 -0
  123. package/dist/git/hooks.js.map +1 -0
  124. package/dist/git/husky.d.ts +52 -0
  125. package/dist/git/husky.d.ts.map +1 -0
  126. package/dist/git/husky.js +219 -0
  127. package/dist/git/husky.js.map +1 -0
  128. package/dist/git/index.d.ts +9 -0
  129. package/dist/git/index.d.ts.map +1 -0
  130. package/dist/git/index.js +15 -0
  131. package/dist/git/index.js.map +1 -0
  132. package/dist/index.d.ts +6 -0
  133. package/dist/index.d.ts.map +1 -0
  134. package/dist/index.js +23 -0
  135. package/dist/index.js.map +1 -0
  136. package/dist/llm/base-provider.d.ts +43 -0
  137. package/dist/llm/base-provider.d.ts.map +1 -0
  138. package/dist/llm/base-provider.js +91 -0
  139. package/dist/llm/base-provider.js.map +1 -0
  140. package/dist/llm/index.d.ts +17 -0
  141. package/dist/llm/index.d.ts.map +1 -0
  142. package/dist/llm/index.js +36 -0
  143. package/dist/llm/index.js.map +1 -0
  144. package/dist/llm/prompts/bootstrap-prompt.d.ts +27 -0
  145. package/dist/llm/prompts/bootstrap-prompt.d.ts.map +1 -0
  146. package/dist/llm/prompts/bootstrap-prompt.js +278 -0
  147. package/dist/llm/prompts/bootstrap-prompt.js.map +1 -0
  148. package/dist/llm/prompts/index.d.ts +5 -0
  149. package/dist/llm/prompts/index.d.ts.map +1 -0
  150. package/dist/llm/prompts/index.js +11 -0
  151. package/dist/llm/prompts/index.js.map +1 -0
  152. package/dist/llm/provider-factory.d.ts +27 -0
  153. package/dist/llm/provider-factory.d.ts.map +1 -0
  154. package/dist/llm/provider-factory.js +213 -0
  155. package/dist/llm/provider-factory.js.map +1 -0
  156. package/dist/llm/providers/claude-api.d.ts +21 -0
  157. package/dist/llm/providers/claude-api.d.ts.map +1 -0
  158. package/dist/llm/providers/claude-api.js +110 -0
  159. package/dist/llm/providers/claude-api.js.map +1 -0
  160. package/dist/llm/providers/claude-code.d.ts +21 -0
  161. package/dist/llm/providers/claude-code.d.ts.map +1 -0
  162. package/dist/llm/providers/claude-code.js +120 -0
  163. package/dist/llm/providers/claude-code.js.map +1 -0
  164. package/dist/llm/providers/codex-cli.d.ts +25 -0
  165. package/dist/llm/providers/codex-cli.d.ts.map +1 -0
  166. package/dist/llm/providers/codex-cli.js +129 -0
  167. package/dist/llm/providers/codex-cli.js.map +1 -0
  168. package/dist/llm/providers/cursor-cli.d.ts +24 -0
  169. package/dist/llm/providers/cursor-cli.d.ts.map +1 -0
  170. package/dist/llm/providers/cursor-cli.js +106 -0
  171. package/dist/llm/providers/cursor-cli.js.map +1 -0
  172. package/dist/llm/providers/gemini-api.d.ts +20 -0
  173. package/dist/llm/providers/gemini-api.d.ts.map +1 -0
  174. package/dist/llm/providers/gemini-api.js +121 -0
  175. package/dist/llm/providers/gemini-api.js.map +1 -0
  176. package/dist/llm/providers/gemini-cli.d.ts +20 -0
  177. package/dist/llm/providers/gemini-cli.d.ts.map +1 -0
  178. package/dist/llm/providers/gemini-cli.js +109 -0
  179. package/dist/llm/providers/gemini-cli.js.map +1 -0
  180. package/dist/llm/providers/interactive.d.ts +42 -0
  181. package/dist/llm/providers/interactive.d.ts.map +1 -0
  182. package/dist/llm/providers/interactive.js +200 -0
  183. package/dist/llm/providers/interactive.js.map +1 -0
  184. package/dist/llm/providers/openai-api.d.ts +21 -0
  185. package/dist/llm/providers/openai-api.d.ts.map +1 -0
  186. package/dist/llm/providers/openai-api.js +107 -0
  187. package/dist/llm/providers/openai-api.js.map +1 -0
  188. package/dist/llm/types.d.ts +128 -0
  189. package/dist/llm/types.d.ts.map +1 -0
  190. package/dist/llm/types.js +8 -0
  191. package/dist/llm/types.js.map +1 -0
  192. package/dist/parser/index.d.ts +3 -0
  193. package/dist/parser/index.d.ts.map +1 -0
  194. package/dist/parser/index.js +19 -0
  195. package/dist/parser/index.js.map +1 -0
  196. package/dist/parser/path-security.d.ts +40 -0
  197. package/dist/parser/path-security.d.ts.map +1 -0
  198. package/dist/parser/path-security.js +183 -0
  199. package/dist/parser/path-security.js.map +1 -0
  200. package/dist/parser/rule-parser.d.ts +50 -0
  201. package/dist/parser/rule-parser.d.ts.map +1 -0
  202. package/dist/parser/rule-parser.js +203 -0
  203. package/dist/parser/rule-parser.js.map +1 -0
  204. package/dist/schemas/config.d.ts +202 -0
  205. package/dist/schemas/config.d.ts.map +1 -0
  206. package/dist/schemas/config.js +96 -0
  207. package/dist/schemas/config.js.map +1 -0
  208. package/dist/schemas/index.d.ts +3 -0
  209. package/dist/schemas/index.d.ts.map +1 -0
  210. package/dist/schemas/index.js +19 -0
  211. package/dist/schemas/index.js.map +1 -0
  212. package/dist/schemas/rule.d.ts +67 -0
  213. package/dist/schemas/rule.d.ts.map +1 -0
  214. package/dist/schemas/rule.js +44 -0
  215. package/dist/schemas/rule.js.map +1 -0
  216. package/package.json +69 -0
  217. package/templates/architecture.md +35 -0
  218. package/templates/bootstrap-prompt.md +242 -0
  219. package/templates/config.yaml +25 -0
  220. package/templates/project.md +44 -0
  221. package/templates/rules/example.md +36 -0
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * Build Command
4
+ *
5
+ * Compile rules to target formats with:
6
+ * - Full or incremental builds
7
+ * - Static analysis validation
8
+ * - Progress and statistics output
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
22
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
23
+ }) : function(o, v) {
24
+ o["default"] = v;
25
+ });
26
+ var __importStar = (this && this.__importStar) || (function () {
27
+ var ownKeys = function(o) {
28
+ ownKeys = Object.getOwnPropertyNames || function (o) {
29
+ var ar = [];
30
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
31
+ return ar;
32
+ };
33
+ return ownKeys(o);
34
+ };
35
+ return function (mod) {
36
+ if (mod && mod.__esModule) return mod;
37
+ var result = {};
38
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
39
+ __setModuleDefault(result, mod);
40
+ return result;
41
+ };
42
+ })();
43
+ var __importDefault = (this && this.__importDefault) || function (mod) {
44
+ return (mod && mod.__esModule) ? mod : { "default": mod };
45
+ };
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.runBuild = runBuild;
48
+ const path = __importStar(require("path"));
49
+ const chalk_1 = __importDefault(require("chalk"));
50
+ const loader_1 = require("../config/loader");
51
+ const orchestrator_1 = require("../build/orchestrator");
52
+ const config_1 = require("../schemas/config");
53
+ /**
54
+ * Parse and validate target arguments
55
+ */
56
+ function parseTargets(targets) {
57
+ if (!targets || targets.length === 0) {
58
+ return [];
59
+ }
60
+ const validTargets = [];
61
+ const invalidTargets = [];
62
+ for (const target of targets) {
63
+ if (config_1.BUILD_TARGETS.includes(target)) {
64
+ validTargets.push(target);
65
+ }
66
+ else {
67
+ invalidTargets.push(target);
68
+ }
69
+ }
70
+ if (invalidTargets.length > 0) {
71
+ throw new Error(`Invalid target(s): ${invalidTargets.join(', ')}. Valid targets: ${config_1.BUILD_TARGETS.join(', ')}`);
72
+ }
73
+ return validTargets;
74
+ }
75
+ /**
76
+ * Run the build command
77
+ */
78
+ async function runBuild(options) {
79
+ const projectRoot = process.cwd();
80
+ // Check if .context exists
81
+ const contextDir = path.join(projectRoot, '.context');
82
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
83
+ if (!fs.existsSync(contextDir)) {
84
+ console.log(chalk_1.default.red('\n❌ Error: .context directory not found.'));
85
+ console.log(chalk_1.default.gray(' Run `ctx init` first to initialize your project.'));
86
+ return 2;
87
+ }
88
+ // Load configuration
89
+ if (!options.quiet) {
90
+ console.log(chalk_1.default.blue('\n🔨 Building context rules...\n'));
91
+ }
92
+ let config;
93
+ try {
94
+ const loadResult = (0, loader_1.loadConfig)(projectRoot);
95
+ config = loadResult.config;
96
+ // Show warnings from config loading
97
+ if (!options.quiet && loadResult.warnings.length > 0) {
98
+ for (const warning of loadResult.warnings) {
99
+ console.log(chalk_1.default.yellow(`⚠️ ${warning}`));
100
+ }
101
+ }
102
+ }
103
+ catch (error) {
104
+ console.log(chalk_1.default.red(`\n❌ Configuration error: ${error.message}`));
105
+ return 2;
106
+ }
107
+ // Parse targets
108
+ let targets;
109
+ try {
110
+ targets = parseTargets(options.target);
111
+ }
112
+ catch (error) {
113
+ console.log(chalk_1.default.red(`\n❌ ${error.message}`));
114
+ return 2;
115
+ }
116
+ // Create orchestrator
117
+ const orchestrator = new orchestrator_1.BuildOrchestrator(projectRoot, config, {
118
+ quiet: options.quiet,
119
+ verbose: options.verbose,
120
+ });
121
+ // Build options
122
+ const buildOptions = {
123
+ projectRoot,
124
+ targets: targets.length > 0 ? targets : undefined,
125
+ force: options.force || !options.incremental,
126
+ check: options.check,
127
+ skipValidation: options.skipValidation,
128
+ verbose: options.verbose,
129
+ quiet: options.quiet,
130
+ };
131
+ // Execute build
132
+ const result = await orchestrator.build(buildOptions);
133
+ // Output results
134
+ if (!options.quiet) {
135
+ console.log('');
136
+ console.log((0, orchestrator_1.formatBuildResult)(result));
137
+ }
138
+ else if (!result.success) {
139
+ // Even in quiet mode, show errors
140
+ console.log(chalk_1.default.red('\n❌ Build failed'));
141
+ for (const error of result.errors) {
142
+ console.log(chalk_1.default.red(` ${error}`));
143
+ }
144
+ }
145
+ // Return appropriate exit code
146
+ if (!result.success) {
147
+ // Check if it's a validation error (exit code 1) or runtime error (exit code 2)
148
+ const hasValidationError = result.errors.some(e => e.includes('Validation') ||
149
+ e.includes('duplicate') ||
150
+ e.includes('Parse error') ||
151
+ e.startsWith('[check]'));
152
+ return hasValidationError ? 1 : 2;
153
+ }
154
+ return 0;
155
+ }
156
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Diff Command
3
+ *
4
+ * Compare compiled outputs with legacy files:
5
+ * - Show differences between .context-based outputs and existing files
6
+ * - Support --legacy flag for migration comparison
7
+ */
8
+ /**
9
+ * Diff command options
10
+ */
11
+ export interface DiffCommandOptions {
12
+ /** Compare with legacy files */
13
+ legacy?: boolean;
14
+ /** Show unified diff format */
15
+ unified?: boolean;
16
+ /** Show detailed output */
17
+ verbose?: boolean;
18
+ }
19
+ /**
20
+ * Run the diff command
21
+ */
22
+ export declare function runDiff(options: DiffCommandOptions): Promise<number>;
23
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/cli/diff.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAyCD;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyK1E"}
@@ -0,0 +1,226 @@
1
+ "use strict";
2
+ /**
3
+ * Diff Command
4
+ *
5
+ * Compare compiled outputs with legacy files:
6
+ * - Show differences between .context-based outputs and existing files
7
+ * - Support --legacy flag for migration comparison
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ var __importDefault = (this && this.__importDefault) || function (mod) {
43
+ return (mod && mod.__esModule) ? mod : { "default": mod };
44
+ };
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.runDiff = runDiff;
47
+ const path = __importStar(require("path"));
48
+ const fs = __importStar(require("fs"));
49
+ const chalk_1 = __importDefault(require("chalk"));
50
+ /**
51
+ * Simple line-based diff
52
+ */
53
+ function simpleDiff(oldLines, newLines) {
54
+ const output = [];
55
+ const maxLen = Math.max(oldLines.length, newLines.length);
56
+ for (let i = 0; i < maxLen; i++) {
57
+ const oldLine = oldLines[i];
58
+ const newLine = newLines[i];
59
+ if (oldLine === undefined) {
60
+ output.push(`+ ${newLine}`);
61
+ }
62
+ else if (newLine === undefined) {
63
+ output.push(`- ${oldLine}`);
64
+ }
65
+ else if (oldLine !== newLine) {
66
+ output.push(`- ${oldLine}`);
67
+ output.push(`+ ${newLine}`);
68
+ }
69
+ }
70
+ return output;
71
+ }
72
+ /**
73
+ * Run the diff command
74
+ */
75
+ async function runDiff(options) {
76
+ const projectRoot = process.cwd();
77
+ if (!options.legacy) {
78
+ console.log(chalk_1.default.yellow('\n⚠️ The diff command currently requires the --legacy flag.'));
79
+ console.log(chalk_1.default.gray(' Usage: ctx diff --legacy'));
80
+ console.log(chalk_1.default.gray(' This compares legacy context files with compiled .context outputs.\n'));
81
+ return 1;
82
+ }
83
+ console.log(chalk_1.default.blue('\n📊 Comparing legacy files with compiled outputs...\n'));
84
+ // Define comparison pairs
85
+ const comparisons = [
86
+ {
87
+ name: 'CLAUDE.md',
88
+ legacy: path.join(projectRoot, 'CLAUDE.md.legacy'),
89
+ compiled: path.join(projectRoot, 'CLAUDE.md'),
90
+ },
91
+ {
92
+ name: 'AGENTS.md',
93
+ legacy: path.join(projectRoot, 'AGENTS.md.legacy'),
94
+ compiled: path.join(projectRoot, 'AGENTS.md'),
95
+ },
96
+ {
97
+ name: '.cursorrules',
98
+ legacy: path.join(projectRoot, '.cursorrules'),
99
+ compiled: path.join(projectRoot, '.cursor', 'rules'),
100
+ },
101
+ ];
102
+ const results = [];
103
+ for (const comp of comparisons) {
104
+ const result = {
105
+ name: comp.name,
106
+ legacyPath: comp.legacy,
107
+ compiledPath: comp.compiled,
108
+ legacyExists: fs.existsSync(comp.legacy),
109
+ compiledExists: fs.existsSync(comp.compiled),
110
+ identical: false,
111
+ legacyLines: 0,
112
+ compiledLines: 0,
113
+ diffLines: [],
114
+ };
115
+ if (result.legacyExists && result.compiledExists) {
116
+ // Handle directory vs file for cursor
117
+ if (comp.name === '.cursorrules' && fs.statSync(comp.compiled).isDirectory()) {
118
+ const legacyContent = await fs.promises.readFile(comp.legacy, 'utf-8');
119
+ result.legacyLines = legacyContent.split('\n').length;
120
+ // Read all .mdc files and combine
121
+ const mdcFiles = fs.readdirSync(comp.compiled).filter(f => f.endsWith('.mdc'));
122
+ let compiledContent = '';
123
+ for (const mdcFile of mdcFiles) {
124
+ compiledContent += await fs.promises.readFile(path.join(comp.compiled, mdcFile), 'utf-8');
125
+ compiledContent += '\n---\n';
126
+ }
127
+ result.compiledLines = compiledContent.split('\n').length;
128
+ // Can't easily diff one-to-many, just note structure difference
129
+ result.identical = false;
130
+ result.diffLines = [
131
+ `Legacy: single file with ${result.legacyLines} lines`,
132
+ `Compiled: ${mdcFiles.length} .mdc file(s) with ${result.compiledLines} total lines`,
133
+ ];
134
+ }
135
+ else {
136
+ const legacyContent = await fs.promises.readFile(comp.legacy, 'utf-8');
137
+ const compiledContent = await fs.promises.readFile(comp.compiled, 'utf-8');
138
+ const legacyLines = legacyContent.split('\n');
139
+ const compiledLines = compiledContent.split('\n');
140
+ result.legacyLines = legacyLines.length;
141
+ result.compiledLines = compiledLines.length;
142
+ result.identical = legacyContent === compiledContent;
143
+ if (!result.identical) {
144
+ result.diffLines = simpleDiff(legacyLines, compiledLines);
145
+ // Limit diff output
146
+ if (result.diffLines.length > 50) {
147
+ result.diffLines = [
148
+ ...result.diffLines.slice(0, 25),
149
+ `... (${result.diffLines.length - 50} more lines) ...`,
150
+ ...result.diffLines.slice(-25),
151
+ ];
152
+ }
153
+ }
154
+ }
155
+ }
156
+ results.push(result);
157
+ }
158
+ // Output results
159
+ let hasLegacy = false;
160
+ let hasCompiled = false;
161
+ for (const result of results) {
162
+ console.log(chalk_1.default.bold(`${result.name}:`));
163
+ if (!result.legacyExists && !result.compiledExists) {
164
+ console.log(chalk_1.default.gray(' Neither legacy nor compiled file exists\n'));
165
+ continue;
166
+ }
167
+ if (!result.legacyExists) {
168
+ console.log(chalk_1.default.gray(' No legacy file found'));
169
+ if (result.compiledExists) {
170
+ hasCompiled = true;
171
+ console.log(chalk_1.default.green(` Compiled: ${result.compiledLines} lines`));
172
+ }
173
+ console.log('');
174
+ continue;
175
+ }
176
+ hasLegacy = true;
177
+ console.log(chalk_1.default.yellow(` Legacy: ${result.legacyLines} lines`));
178
+ if (!result.compiledExists) {
179
+ console.log(chalk_1.default.gray(' No compiled file (run `ctx build` first)'));
180
+ console.log('');
181
+ continue;
182
+ }
183
+ hasCompiled = true;
184
+ console.log(chalk_1.default.green(` Compiled: ${result.compiledLines} lines`));
185
+ if (result.identical) {
186
+ console.log(chalk_1.default.green(' ✅ Files are identical'));
187
+ }
188
+ else {
189
+ console.log(chalk_1.default.yellow(' ⚠️ Files differ:'));
190
+ if (options.verbose || options.unified) {
191
+ for (const line of result.diffLines) {
192
+ if (line.startsWith('+')) {
193
+ console.log(chalk_1.default.green(` ${line}`));
194
+ }
195
+ else if (line.startsWith('-')) {
196
+ console.log(chalk_1.default.red(` ${line}`));
197
+ }
198
+ else {
199
+ console.log(chalk_1.default.gray(` ${line}`));
200
+ }
201
+ }
202
+ }
203
+ else {
204
+ console.log(chalk_1.default.gray(` ${result.diffLines.length} difference(s) found`));
205
+ console.log(chalk_1.default.gray(' Use --verbose to see details'));
206
+ }
207
+ }
208
+ console.log('');
209
+ }
210
+ // Summary
211
+ if (!hasLegacy) {
212
+ console.log(chalk_1.default.gray('No legacy files found for comparison.'));
213
+ console.log(chalk_1.default.gray('To compare, rename existing files with .legacy extension:'));
214
+ console.log(chalk_1.default.gray(' mv CLAUDE.md CLAUDE.md.legacy'));
215
+ return 0;
216
+ }
217
+ if (!hasCompiled) {
218
+ console.log(chalk_1.default.yellow('No compiled outputs found.'));
219
+ console.log(chalk_1.default.gray('Run `ctx build` first to generate outputs.'));
220
+ return 1;
221
+ }
222
+ console.log(chalk_1.default.blue('💡 Migration tip:'));
223
+ console.log(chalk_1.default.gray(' After verifying the diff, run `ctx migrate --complete` to remove legacy files.'));
224
+ return 0;
225
+ }
226
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/cli/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Hooks Command
3
+ *
4
+ * CLI command for managing git hooks integration.
5
+ */
6
+ /**
7
+ * Hooks command options
8
+ */
9
+ export interface HooksCommandOptions {
10
+ /** Install hooks without prompts */
11
+ install?: boolean;
12
+ /** Remove hooks */
13
+ remove?: boolean;
14
+ /** Skip Husky installation */
15
+ skipHusky?: boolean;
16
+ /** Skip gitignore updates */
17
+ skipGitignore?: boolean;
18
+ /** Force overwrite existing hooks */
19
+ force?: boolean;
20
+ /** Dry run - show what would happen */
21
+ dryRun?: boolean;
22
+ /** Verbose output */
23
+ verbose?: boolean;
24
+ }
25
+ /**
26
+ * Run the hooks command
27
+ */
28
+ export declare function runHooks(options: HooksCommandOptions): Promise<number>;
29
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/cli/hooks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,6BAA6B;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAY5E"}
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * Hooks Command
4
+ *
5
+ * CLI command for managing git hooks integration.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.runHooks = runHooks;
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const inquirer_1 = __importDefault(require("inquirer"));
14
+ const husky_1 = require("../git/husky");
15
+ const gitignore_1 = require("../git/gitignore");
16
+ const hooks_1 = require("../git/hooks");
17
+ /**
18
+ * Run the hooks command
19
+ */
20
+ async function runHooks(options) {
21
+ const projectRoot = process.cwd();
22
+ const huskyManager = new husky_1.HuskyManager(projectRoot);
23
+ const gitignoreManager = new gitignore_1.GitignoreManager(projectRoot);
24
+ // Handle remove mode
25
+ if (options.remove) {
26
+ return removeHooks(huskyManager, gitignoreManager, options);
27
+ }
28
+ // Handle install mode (default)
29
+ return installHooks(huskyManager, gitignoreManager, options);
30
+ }
31
+ /**
32
+ * Install hooks
33
+ */
34
+ async function installHooks(huskyManager, gitignoreManager, options) {
35
+ console.log(chalk_1.default.blue('\n🔗 Setting up git hooks...\n'));
36
+ // Check Husky status
37
+ const status = await huskyManager.checkStatus();
38
+ if (options.verbose) {
39
+ console.log(chalk_1.default.gray('Husky status:'));
40
+ console.log(chalk_1.default.gray(` Installed: ${status.installed}`));
41
+ console.log(chalk_1.default.gray(` Initialized: ${status.initialized}`));
42
+ console.log(chalk_1.default.gray(` Has pre-commit: ${status.hasPreCommitHook}`));
43
+ console.log(chalk_1.default.gray(` Has ctx hook: ${status.hasCtxHook}`));
44
+ console.log('');
45
+ }
46
+ // If ctx hook already exists
47
+ if (status.hasCtxHook && !options.force) {
48
+ console.log(chalk_1.default.green('✅ ctx pre-commit hook is already configured.'));
49
+ return 0;
50
+ }
51
+ // Install Husky if needed
52
+ if (!options.skipHusky && !status.installed) {
53
+ if (options.dryRun) {
54
+ console.log(chalk_1.default.cyan('Would install Husky as dev dependency'));
55
+ }
56
+ else {
57
+ // Ask for confirmation unless --install flag is set
58
+ if (!options.install) {
59
+ const { confirmInstall } = await inquirer_1.default.prompt([
60
+ {
61
+ type: 'confirm',
62
+ name: 'confirmInstall',
63
+ message: 'Husky is not installed. Install it now?',
64
+ default: true,
65
+ },
66
+ ]);
67
+ if (!confirmInstall) {
68
+ console.log(chalk_1.default.yellow('⚠️ Skipping Husky installation.'));
69
+ console.log(chalk_1.default.gray(' You can set up the hook manually in .git/hooks/pre-commit'));
70
+ return 0;
71
+ }
72
+ }
73
+ console.log(chalk_1.default.gray('Installing Husky...'));
74
+ const installed = await huskyManager.install();
75
+ if (!installed) {
76
+ console.log(chalk_1.default.red('❌ Failed to install Husky.'));
77
+ return 2;
78
+ }
79
+ console.log(chalk_1.default.green('✅ Husky installed'));
80
+ }
81
+ }
82
+ // Initialize Husky if needed
83
+ if (!options.skipHusky && !status.initialized) {
84
+ if (options.dryRun) {
85
+ console.log(chalk_1.default.cyan('Would initialize Husky (.husky directory)'));
86
+ }
87
+ else {
88
+ console.log(chalk_1.default.gray('Initializing Husky...'));
89
+ const initialized = await huskyManager.initialize();
90
+ if (!initialized) {
91
+ console.log(chalk_1.default.red('❌ Failed to initialize Husky.'));
92
+ return 2;
93
+ }
94
+ console.log(chalk_1.default.green('✅ Husky initialized'));
95
+ }
96
+ }
97
+ // Generate and add pre-commit hook
98
+ const hookContent = (0, hooks_1.generatePreCommitHook)({
99
+ incremental: true,
100
+ autoStage: true,
101
+ verbose: options.verbose,
102
+ });
103
+ if (options.dryRun) {
104
+ console.log(chalk_1.default.cyan('\nWould create pre-commit hook:'));
105
+ console.log(chalk_1.default.gray('─'.repeat(40)));
106
+ console.log(chalk_1.default.gray(hookContent));
107
+ console.log(chalk_1.default.gray('─'.repeat(40)));
108
+ }
109
+ else {
110
+ const added = await huskyManager.addPreCommitHook(hookContent);
111
+ if (!added) {
112
+ console.log(chalk_1.default.red('❌ Failed to add pre-commit hook.'));
113
+ return 2;
114
+ }
115
+ console.log(chalk_1.default.green('✅ Pre-commit hook configured'));
116
+ }
117
+ // Update .gitignore
118
+ if (!options.skipGitignore) {
119
+ if (options.dryRun) {
120
+ const missing = await gitignoreManager.getMissingEntries();
121
+ if (missing.length > 0) {
122
+ console.log(chalk_1.default.cyan('\nWould add to .gitignore:'));
123
+ for (const entry of missing) {
124
+ console.log(chalk_1.default.gray(` ${entry}`));
125
+ }
126
+ }
127
+ }
128
+ else {
129
+ const { added } = await gitignoreManager.addCtxEntries();
130
+ if (added.length > 0) {
131
+ console.log(chalk_1.default.green('✅ Updated .gitignore'));
132
+ if (options.verbose) {
133
+ for (const entry of added) {
134
+ console.log(chalk_1.default.gray(` + ${entry}`));
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ console.log(chalk_1.default.green('\n✅ Git hooks setup complete!\n'));
141
+ console.log(chalk_1.default.gray('The pre-commit hook will:'));
142
+ console.log(chalk_1.default.gray(' 1. Run `ctx build --incremental` before each commit'));
143
+ console.log(chalk_1.default.gray(' 2. Auto-stage compiled outputs (CLAUDE.md, AGENTS.md, .cursor/rules/)'));
144
+ console.log(chalk_1.default.gray(' 3. Block commits if validation errors are found'));
145
+ return 0;
146
+ }
147
+ /**
148
+ * Remove hooks
149
+ */
150
+ async function removeHooks(huskyManager, gitignoreManager, options) {
151
+ console.log(chalk_1.default.blue('\n🔗 Removing ctx git hooks...\n'));
152
+ if (options.dryRun) {
153
+ console.log(chalk_1.default.cyan('Would remove ctx pre-commit hook'));
154
+ console.log(chalk_1.default.cyan('Would remove ctx entries from .gitignore'));
155
+ }
156
+ else {
157
+ // Remove ctx hook
158
+ const removed = await huskyManager.removeCtxHook();
159
+ if (removed) {
160
+ console.log(chalk_1.default.green('✅ Removed ctx pre-commit hook'));
161
+ }
162
+ // Remove gitignore entries
163
+ const removedEntries = await gitignoreManager.removeCtxEntries();
164
+ if (removedEntries.length > 0) {
165
+ console.log(chalk_1.default.green('✅ Removed ctx entries from .gitignore'));
166
+ if (options.verbose) {
167
+ for (const entry of removedEntries) {
168
+ console.log(chalk_1.default.gray(` - ${entry}`));
169
+ }
170
+ }
171
+ }
172
+ }
173
+ console.log(chalk_1.default.green('\n✅ Git hooks removed.'));
174
+ return 0;
175
+ }
176
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/cli/hooks.ts"],"names":[],"mappings":"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"}