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,53 @@
1
+ /**
2
+ * Init Command
3
+ *
4
+ * Initialize .context directory structure in a project with:
5
+ * - Interactive agent selection
6
+ * - Template file generation
7
+ * - Existing directory detection
8
+ */
9
+ /**
10
+ * Init command options
11
+ */
12
+ export interface InitOptions {
13
+ /** Force overwrite existing .context */
14
+ force?: boolean;
15
+ /** Run without interactive prompts */
16
+ interactive?: boolean;
17
+ /** Launch migration wizard */
18
+ wizard?: boolean;
19
+ /** Dry run mode - show what would happen */
20
+ dryRun?: boolean;
21
+ /** Run enhanced bootstrap (LLM-powered context generation) after init (default: true) */
22
+ bootstrap?: boolean;
23
+ }
24
+ /**
25
+ * Agent selection type
26
+ */
27
+ export type AgentSelection = 'cursor' | 'claude' | 'all';
28
+ /**
29
+ * Check if .context directory exists
30
+ */
31
+ export declare function contextExists(projectRoot: string): boolean;
32
+ /**
33
+ * Detect existing context files (for migration)
34
+ */
35
+ export declare function detectExistingFiles(projectRoot: string): {
36
+ cursorrules: boolean;
37
+ claudeMd: boolean;
38
+ agentsMd: boolean;
39
+ };
40
+ /**
41
+ * Initialize .context directory structure
42
+ */
43
+ export declare function initializeContext(projectRoot: string, agents: AgentSelection, options?: {
44
+ dryRun?: boolean;
45
+ }): Promise<{
46
+ created: string[];
47
+ skipped: string[];
48
+ }>;
49
+ /**
50
+ * Run the init command
51
+ */
52
+ export declare function runInit(options: InitOptions): Promise<number>;
53
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAUH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wCAAwC;IACxC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,sCAAsC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,yFAAyF;IACzF,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;AAqDzD;;GAEG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAG1D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG;IACxD,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAMA;AAcD;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,cAAc,EACtB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAkDnD;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA0FnE"}
@@ -0,0 +1,254 @@
1
+ "use strict";
2
+ /**
3
+ * Init Command
4
+ *
5
+ * Initialize .context directory structure in a project with:
6
+ * - Interactive agent selection
7
+ * - Template file generation
8
+ * - Existing directory detection
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.contextExists = contextExists;
48
+ exports.detectExistingFiles = detectExistingFiles;
49
+ exports.initializeContext = initializeContext;
50
+ exports.runInit = runInit;
51
+ const fs = __importStar(require("fs"));
52
+ const path = __importStar(require("path"));
53
+ const chalk_1 = __importDefault(require("chalk"));
54
+ const inquirer_1 = __importDefault(require("inquirer"));
55
+ const config_1 = require("../schemas/config");
56
+ const yaml_1 = __importDefault(require("yaml"));
57
+ const bootstrap_1 = require("../bootstrap");
58
+ /**
59
+ * Get path to templates directory
60
+ */
61
+ function getTemplatesDir() {
62
+ // In development: templates/ relative to project root
63
+ // In production: relative to dist/
64
+ const devPath = path.join(__dirname, '..', '..', 'templates');
65
+ const prodPath = path.join(__dirname, '..', '..', '..', 'templates');
66
+ if (fs.existsSync(devPath)) {
67
+ return devPath;
68
+ }
69
+ return prodPath;
70
+ }
71
+ /**
72
+ * Read template file content
73
+ */
74
+ function readTemplate(templateName) {
75
+ const templatesDir = getTemplatesDir();
76
+ const templatePath = path.join(templatesDir, templateName);
77
+ return fs.readFileSync(templatePath, 'utf-8');
78
+ }
79
+ /**
80
+ * Generate config.yaml based on agent selection
81
+ */
82
+ function generateConfig(agents) {
83
+ // Deep copy to avoid mutating DEFAULT_CONFIG
84
+ const config = JSON.parse(JSON.stringify(config_1.DEFAULT_CONFIG));
85
+ if (agents === 'cursor') {
86
+ delete config.compile.claude;
87
+ delete config.compile.agents;
88
+ }
89
+ else if (agents === 'claude') {
90
+ delete config.compile.cursor;
91
+ delete config.compile.agents;
92
+ }
93
+ // 'all' keeps everything
94
+ return yaml_1.default.stringify(config);
95
+ }
96
+ /**
97
+ * Check if .context directory exists
98
+ */
99
+ function contextExists(projectRoot) {
100
+ const contextDir = path.join(projectRoot, '.context');
101
+ return fs.existsSync(contextDir);
102
+ }
103
+ /**
104
+ * Detect existing context files (for migration)
105
+ */
106
+ function detectExistingFiles(projectRoot) {
107
+ return {
108
+ cursorrules: fs.existsSync(path.join(projectRoot, '.cursorrules')),
109
+ claudeMd: fs.existsSync(path.join(projectRoot, 'CLAUDE.md')),
110
+ agentsMd: fs.existsSync(path.join(projectRoot, 'AGENTS.md')),
111
+ };
112
+ }
113
+ /**
114
+ * Create backup of existing .context directory
115
+ */
116
+ async function backupContext(projectRoot) {
117
+ const contextDir = path.join(projectRoot, '.context');
118
+ const timestamp = Date.now();
119
+ const backupDir = path.join(projectRoot, `.context.backup.${timestamp}`);
120
+ await fs.promises.rename(contextDir, backupDir);
121
+ return backupDir;
122
+ }
123
+ /**
124
+ * Initialize .context directory structure
125
+ */
126
+ async function initializeContext(projectRoot, agents, options = {}) {
127
+ const contextDir = path.join(projectRoot, '.context');
128
+ const rulesDir = path.join(contextDir, 'rules');
129
+ const created = [];
130
+ const skipped = [];
131
+ // Create directories
132
+ const directories = [contextDir, rulesDir];
133
+ for (const dir of directories) {
134
+ if (!options.dryRun) {
135
+ await fs.promises.mkdir(dir, { recursive: true });
136
+ }
137
+ created.push(dir);
138
+ }
139
+ // Define template files
140
+ const templates = [
141
+ { source: 'project.md', target: path.join(contextDir, 'project.md') },
142
+ { source: 'architecture.md', target: path.join(contextDir, 'architecture.md') },
143
+ { source: 'rules/example.md', target: path.join(rulesDir, 'example.md') },
144
+ ];
145
+ // Write template files
146
+ for (const template of templates) {
147
+ if (fs.existsSync(template.target)) {
148
+ skipped.push(template.target);
149
+ continue;
150
+ }
151
+ if (!options.dryRun) {
152
+ const content = readTemplate(template.source);
153
+ await fs.promises.writeFile(template.target, content, 'utf-8');
154
+ }
155
+ created.push(template.target);
156
+ }
157
+ // Generate and write config.yaml
158
+ const configPath = path.join(contextDir, 'config.yaml');
159
+ if (!fs.existsSync(configPath)) {
160
+ if (!options.dryRun) {
161
+ const configContent = generateConfig(agents);
162
+ await fs.promises.writeFile(configPath, configContent, 'utf-8');
163
+ }
164
+ created.push(configPath);
165
+ }
166
+ else {
167
+ skipped.push(configPath);
168
+ }
169
+ return { created, skipped };
170
+ }
171
+ /**
172
+ * Run the init command
173
+ */
174
+ async function runInit(options) {
175
+ const projectRoot = process.cwd();
176
+ console.log(chalk_1.default.blue('\n🚀 Initializing .context directory\n'));
177
+ // Check for existing .context
178
+ if (contextExists(projectRoot)) {
179
+ if (!options.force) {
180
+ console.log(chalk_1.default.yellow('⚠️ .context directory already exists.'));
181
+ console.log(chalk_1.default.gray(' Use --force to overwrite (creates backup)'));
182
+ return 1;
183
+ }
184
+ // Backup existing
185
+ const backupPath = await backupContext(projectRoot);
186
+ console.log(chalk_1.default.gray(` Backed up to: ${path.basename(backupPath)}`));
187
+ }
188
+ // Detect existing context files
189
+ const existing = detectExistingFiles(projectRoot);
190
+ const hasExisting = existing.cursorrules || existing.claudeMd || existing.agentsMd;
191
+ if (hasExisting && !options.wizard && options.interactive !== false) {
192
+ console.log(chalk_1.default.yellow('📁 Found existing context files:'));
193
+ if (existing.cursorrules)
194
+ console.log(chalk_1.default.gray(' - .cursorrules'));
195
+ if (existing.claudeMd)
196
+ console.log(chalk_1.default.gray(' - CLAUDE.md'));
197
+ if (existing.agentsMd)
198
+ console.log(chalk_1.default.gray(' - AGENTS.md'));
199
+ console.log(chalk_1.default.gray('\n Run with --wizard for guided migration.\n'));
200
+ }
201
+ // Select agents
202
+ let agents = 'all';
203
+ if (options.interactive !== false) {
204
+ const answers = await inquirer_1.default.prompt([
205
+ {
206
+ type: 'list',
207
+ name: 'agents',
208
+ message: 'Which AI agents do you want to target?',
209
+ choices: [
210
+ { name: 'All agents (Cursor, Claude Code, Codex)', value: 'all' },
211
+ { name: 'Cursor IDE only', value: 'cursor' },
212
+ { name: 'Claude Code only', value: 'claude' },
213
+ ],
214
+ default: 'all',
215
+ },
216
+ ]);
217
+ agents = answers.agents;
218
+ }
219
+ // Initialize
220
+ const { created, skipped } = await initializeContext(projectRoot, agents, {
221
+ dryRun: options.dryRun,
222
+ });
223
+ // Output results
224
+ if (options.dryRun) {
225
+ console.log(chalk_1.default.cyan('\n📋 Dry run - would create:'));
226
+ }
227
+ else {
228
+ console.log(chalk_1.default.green('\n✅ Created:'));
229
+ }
230
+ for (const file of created) {
231
+ const relative = path.relative(projectRoot, file);
232
+ console.log(chalk_1.default.gray(` ${relative}`));
233
+ }
234
+ if (skipped.length > 0) {
235
+ console.log(chalk_1.default.yellow('\n⏭️ Skipped (already exist):'));
236
+ for (const file of skipped) {
237
+ const relative = path.relative(projectRoot, file);
238
+ console.log(chalk_1.default.gray(` ${relative}`));
239
+ }
240
+ }
241
+ const shouldBootstrap = options.bootstrap !== false && !options.dryRun;
242
+ if (shouldBootstrap) {
243
+ const result = await (0, bootstrap_1.runEnhancedBootstrap)(projectRoot, { autoBuild: true });
244
+ return result.success ? 0 : 1;
245
+ }
246
+ // Standard next steps
247
+ console.log(chalk_1.default.blue('\n📝 Next steps:'));
248
+ console.log(chalk_1.default.gray(' 1. Edit .context/project.md with your project info'));
249
+ console.log(chalk_1.default.gray(' 2. Add rules to .context/rules/'));
250
+ console.log(chalk_1.default.gray(' 3. Run: ctx build'));
251
+ console.log(chalk_1.default.gray('\n Tip: Run `ctx bootstrap --auto-build` to generate rules with an LLM'));
252
+ return 0;
253
+ }
254
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Lint Command
3
+ *
4
+ * Validate rules without building:
5
+ * - Run static analysis
6
+ * - Output errors and warnings
7
+ * - Support JSON output format
8
+ * - Support file path targeting
9
+ */
10
+ /**
11
+ * Lint command options
12
+ */
13
+ export interface LintCommandOptions {
14
+ /** Output in JSON format */
15
+ json?: boolean;
16
+ /** Specific files to lint */
17
+ files?: string[];
18
+ /** Show detailed output */
19
+ verbose?: boolean;
20
+ /** Suppress output except errors */
21
+ quiet?: boolean;
22
+ }
23
+ /**
24
+ * JSON output format
25
+ */
26
+ export interface LintJsonOutput {
27
+ success: boolean;
28
+ rulesLinted: number;
29
+ errors: Array<{
30
+ type: string;
31
+ message: string;
32
+ path: string;
33
+ line?: number;
34
+ }>;
35
+ warnings: Array<{
36
+ type: string;
37
+ message: string;
38
+ path: string;
39
+ line?: number;
40
+ }>;
41
+ }
42
+ /**
43
+ * Run the lint command
44
+ */
45
+ export declare function runLint(options: LintCommandOptions): Promise<number>;
46
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AASH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,4BAA4B;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6BAA6B;IAC7B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAmK1E"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ /**
3
+ * Lint Command
4
+ *
5
+ * Validate rules without building:
6
+ * - Run static analysis
7
+ * - Output errors and warnings
8
+ * - Support JSON output format
9
+ * - Support file path targeting
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.runLint = runLint;
49
+ const path = __importStar(require("path"));
50
+ const fs = __importStar(require("fs"));
51
+ const chalk_1 = __importDefault(require("chalk"));
52
+ const loader_1 = require("../config/loader");
53
+ const rule_parser_1 = require("../parser/rule-parser");
54
+ const static_analysis_1 = require("../analysis/static-analysis");
55
+ /**
56
+ * Run the lint command
57
+ */
58
+ async function runLint(options) {
59
+ const projectRoot = process.cwd();
60
+ // Check if .context exists
61
+ const contextDir = path.join(projectRoot, '.context');
62
+ if (!fs.existsSync(contextDir)) {
63
+ if (options.json) {
64
+ const output = {
65
+ success: false,
66
+ rulesLinted: 0,
67
+ errors: [{
68
+ type: 'INIT_ERROR',
69
+ message: '.context directory not found. Run `ctx init` first.',
70
+ path: projectRoot,
71
+ }],
72
+ warnings: [],
73
+ };
74
+ console.log(JSON.stringify(output, null, 2));
75
+ }
76
+ else {
77
+ console.log(chalk_1.default.red('\n❌ Error: .context directory not found.'));
78
+ console.log(chalk_1.default.gray(' Run `ctx init` first to initialize your project.'));
79
+ }
80
+ return 2;
81
+ }
82
+ // Load configuration
83
+ let config;
84
+ try {
85
+ const loadResult = (0, loader_1.loadConfig)(projectRoot);
86
+ config = loadResult.config;
87
+ }
88
+ catch (error) {
89
+ if (options.json) {
90
+ const output = {
91
+ success: false,
92
+ rulesLinted: 0,
93
+ errors: [{
94
+ type: 'CONFIG_ERROR',
95
+ message: error.message,
96
+ path: path.join(contextDir, 'config.yaml'),
97
+ }],
98
+ warnings: [],
99
+ };
100
+ console.log(JSON.stringify(output, null, 2));
101
+ }
102
+ else {
103
+ console.log(chalk_1.default.red(`\n❌ Configuration error: ${error.message}`));
104
+ }
105
+ return 2;
106
+ }
107
+ // Parse rules
108
+ if (!options.quiet && !options.json) {
109
+ console.log(chalk_1.default.blue('\n🔍 Linting context rules...\n'));
110
+ }
111
+ const parseOptions = {
112
+ projectRoot,
113
+ rulesDir: path.join(contextDir, 'rules'),
114
+ };
115
+ const { rules, errors: parseErrors } = (0, rule_parser_1.parseAllRules)(parseOptions);
116
+ // Filter to specific files if provided
117
+ let rulesToLint = rules;
118
+ if (options.files && options.files.length > 0) {
119
+ const targetPaths = options.files.map(f => path.resolve(projectRoot, f));
120
+ rulesToLint = rules.filter(r => targetPaths.includes(r.absolutePath));
121
+ }
122
+ // Collect all issues
123
+ const allErrors = [];
124
+ const allWarnings = [];
125
+ // Add parse errors
126
+ for (const err of parseErrors) {
127
+ allErrors.push({
128
+ type: 'PARSE_ERROR',
129
+ message: err.message,
130
+ path: err.path,
131
+ line: err.line,
132
+ });
133
+ }
134
+ // Run static analysis
135
+ if (parseErrors.length === 0 && rulesToLint.length > 0) {
136
+ const analysisOptions = {
137
+ projectRoot,
138
+ config,
139
+ };
140
+ const analysisResult = (0, static_analysis_1.analyzeRules)(rulesToLint, analysisOptions);
141
+ // Add analysis errors
142
+ for (const err of analysisResult.errors) {
143
+ allErrors.push({
144
+ type: err.type,
145
+ message: err.message,
146
+ path: err.path,
147
+ line: err.line,
148
+ });
149
+ }
150
+ // Add analysis warnings
151
+ for (const warn of analysisResult.warnings) {
152
+ allWarnings.push({
153
+ type: warn.type,
154
+ message: warn.message,
155
+ path: warn.path,
156
+ });
157
+ }
158
+ }
159
+ // Output results
160
+ const success = allErrors.length === 0;
161
+ if (options.json) {
162
+ const output = {
163
+ success,
164
+ rulesLinted: rulesToLint.length,
165
+ errors: allErrors,
166
+ warnings: allWarnings,
167
+ };
168
+ console.log(JSON.stringify(output, null, 2));
169
+ }
170
+ else {
171
+ // Human-readable output
172
+ if (!options.quiet) {
173
+ console.log(chalk_1.default.gray(`Linted ${rulesToLint.length} rule(s)\n`));
174
+ }
175
+ if (allErrors.length > 0) {
176
+ console.log(chalk_1.default.red('Errors:'));
177
+ for (const err of allErrors) {
178
+ const location = err.line ? `${err.path}:${err.line}` : err.path;
179
+ console.log(chalk_1.default.red(` ❌ [${err.type}] ${err.message}`));
180
+ console.log(chalk_1.default.gray(` ${location}`));
181
+ }
182
+ console.log('');
183
+ }
184
+ if (allWarnings.length > 0) {
185
+ console.log(chalk_1.default.yellow('Warnings:'));
186
+ for (const warn of allWarnings) {
187
+ const location = warn.line ? `${warn.path}:${warn.line}` : warn.path;
188
+ console.log(chalk_1.default.yellow(` ⚠️ [${warn.type}] ${warn.message}`));
189
+ console.log(chalk_1.default.gray(` ${location}`));
190
+ }
191
+ console.log('');
192
+ }
193
+ if (success) {
194
+ if (!options.quiet) {
195
+ if (allWarnings.length > 0) {
196
+ console.log(chalk_1.default.yellow(`✅ Lint passed with ${allWarnings.length} warning(s)`));
197
+ }
198
+ else {
199
+ console.log(chalk_1.default.green('✅ Lint passed - no issues found'));
200
+ }
201
+ }
202
+ }
203
+ else {
204
+ console.log(chalk_1.default.red(`❌ Lint failed - ${allErrors.length} error(s) found`));
205
+ }
206
+ }
207
+ // Return appropriate exit code
208
+ return success ? 0 : 1;
209
+ }
210
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CH,0BAmKC;AA/MD,2CAA6B;AAC7B,uCAAyB;AACzB,kDAA0B;AAC1B,6CAA8C;AAC9C,uDAAoE;AACpE,iEAA4F;AAoC5F;;GAEG;AACI,KAAK,UAAU,OAAO,CAAC,OAA2B;IACvD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,2BAA2B;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,MAAM,GAAmB;gBAC7B,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,CAAC;gBACd,MAAM,EAAE,CAAC;wBACP,IAAI,EAAE,YAAY;wBAClB,OAAO,EAAE,qDAAqD;wBAC9D,IAAI,EAAE,WAAW;qBAClB,CAAC;gBACF,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,MAAM,GAAmB;gBAC7B,OAAO,EAAE,KAAK;gBACd,WAAW,EAAE,CAAC;gBACd,MAAM,EAAE,CAAC;wBACP,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAG,KAAe,CAAC,OAAO;wBACjC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC;qBAC3C,CAAC;gBACF,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,4BAA6B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,cAAc;IACd,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,YAAY,GAAiB;QACjC,WAAW;QACX,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC;KACzC,CAAC;IAEF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,2BAAa,EAAC,YAAY,CAAC,CAAC;IAEnE,uCAAuC;IACvC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QACzE,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;IACxE,CAAC;IAED,qBAAqB;IACrB,MAAM,SAAS,GAA0E,EAAE,CAAC;IAC5F,MAAM,WAAW,GAA0E,EAAE,CAAC;IAE9F,mBAAmB;IACnB,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,eAAe,GAAoB;YACvC,WAAW;YACX,MAAM;SACP,CAAC;QAEF,MAAM,cAAc,GAAmB,IAAA,8BAAY,EAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAElF,sBAAsB;QACtB,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;YACxC,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,IAAI,EAAE,GAAG,CAAC,IAAI;aACf,CAAC,CAAC;QACL,CAAC;QAED,wBAAwB;QACxB,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,QAAQ,EAAE,CAAC;YAC3C,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;IAEvC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,MAAM,GAAmB;YAC7B,OAAO;YACP,WAAW,EAAE,WAAW,CAAC,MAAM;YAC/B,MAAM,EAAE,SAAS;YACjB,QAAQ,EAAE,WAAW;SACtB,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,wBAAwB;QACxB,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,UAAU,WAAW,CAAC,MAAM,YAAY,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;YAClC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;YACvC,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;gBAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAClE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,QAAQ,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,sBAAsB,WAAW,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC;gBACnF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,mBAAmB,SAAS,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Migrate Command
3
+ *
4
+ * Migration operations for legacy context files:
5
+ * - Analyze: Detect and report legacy files
6
+ * - Attach: Create .context alongside legacy files
7
+ * - Complete: Remove legacy files after confirmation
8
+ */
9
+ /**
10
+ * Migrate command options
11
+ */
12
+ export interface MigrateCommandOptions {
13
+ /** Analyze mode - detect and report */
14
+ analyze?: boolean;
15
+ /** Attach mode - create alongside */
16
+ attach?: boolean;
17
+ /** Complete mode - remove legacy */
18
+ complete?: boolean;
19
+ /** Skip confirmation prompts */
20
+ force?: boolean;
21
+ /** Dry run - show what would happen */
22
+ dryRun?: boolean;
23
+ }
24
+ /**
25
+ * Run the migrate command
26
+ */
27
+ export declare function runMigrate(options: MigrateCommandOptions): Promise<number>;
28
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/cli/migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gCAAgC;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA6TD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkChF"}