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,524 @@
1
+ "use strict";
2
+ /**
3
+ * Build Orchestration
4
+ *
5
+ * Coordinates the full build pipeline:
6
+ * - Rule discovery and parsing
7
+ * - Static analysis validation
8
+ * - Multi-target compilation
9
+ * - Incremental build support
10
+ * - Error handling and recovery
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.BuildOrchestrator = void 0;
47
+ exports.executeBuild = executeBuild;
48
+ exports.formatBuildResult = formatBuildResult;
49
+ const fs = __importStar(require("fs"));
50
+ const path = __importStar(require("path"));
51
+ const loader_1 = require("../config/loader");
52
+ const rule_parser_1 = require("../parser/rule-parser");
53
+ const static_analysis_1 = require("../analysis/static-analysis");
54
+ const cursor_compiler_1 = require("../compiler/cursor-compiler");
55
+ const claude_compiler_1 = require("../compiler/claude-compiler");
56
+ const agents_compiler_1 = require("../compiler/agents-compiler");
57
+ const manifest_1 = require("./manifest");
58
+ const atomic_1 = require("./atomic");
59
+ const lock_1 = require("./lock");
60
+ const BUILD_METADATA_FOOTER_REGEX = /\n<!-- ctx build metadata -->\n<!-- timestamp: [^\n]+ -->\n<!-- checksum: sha256:[a-f0-9]{64} -->\s*$/;
61
+ const EMBEDDED_CHECKSUM_REGEX = /<!--\s*checksum:\s*(sha256:[a-f0-9]{64})\s*-->/i;
62
+ function normalizeNewlines(content) {
63
+ return content.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
64
+ }
65
+ function stripBuildMetadataFooter(content) {
66
+ const withoutFooter = content.replace(BUILD_METADATA_FOOTER_REGEX, '');
67
+ return normalizeNewlines(withoutFooter);
68
+ }
69
+ function hasBuildMetadataFooter(content) {
70
+ return BUILD_METADATA_FOOTER_REGEX.test(content);
71
+ }
72
+ function extractEmbeddedChecksum(content) {
73
+ const match = content.match(EMBEDDED_CHECKSUM_REGEX);
74
+ return match ? match[1] : null;
75
+ }
76
+ /**
77
+ * Build orchestrator
78
+ */
79
+ class BuildOrchestrator {
80
+ config;
81
+ projectRoot;
82
+ quiet;
83
+ constructor(projectRoot, config, options) {
84
+ this.projectRoot = projectRoot;
85
+ this.config = config;
86
+ this.quiet = options?.quiet ?? false;
87
+ }
88
+ /**
89
+ * Execute full build pipeline
90
+ */
91
+ async build(options) {
92
+ const startTime = Date.now();
93
+ const result = {
94
+ success: false,
95
+ stats: {
96
+ duration: 0,
97
+ rulesProcessed: 0,
98
+ rulesChanged: 0,
99
+ filesGenerated: 0,
100
+ totalTokens: 0,
101
+ incremental: !options.force,
102
+ targets: options.targets || this.getDefaultTargets(),
103
+ },
104
+ compilations: new Map(),
105
+ errors: [],
106
+ warnings: [],
107
+ };
108
+ try {
109
+ // Use lock guard for the entire build
110
+ await (0, lock_1.withLock)(this.projectRoot, result.stats.targets.join(','), async () => {
111
+ // Clean up stale temp files from previous crashed builds
112
+ const contextDir = path.join(this.projectRoot, '.context');
113
+ await (0, atomic_1.cleanupStaleTempFiles)(contextDir);
114
+ // Step 1: Discover and parse rules
115
+ this.log('Discovering rules...');
116
+ const parseOptions = {
117
+ projectRoot: this.projectRoot,
118
+ rulesDir: path.join(this.projectRoot, '.context', 'rules'),
119
+ };
120
+ const { rules, errors: parseErrors } = (0, rule_parser_1.parseAllRules)(parseOptions);
121
+ if (parseErrors.length > 0) {
122
+ result.errors.push(...parseErrors.map(e => `Parse error: ${e.message} (${e.path}:${e.line || 0})`));
123
+ // Fail build on any parse errors - invalid rules should block the build
124
+ result.stats.duration = Date.now() - startTime;
125
+ return;
126
+ }
127
+ result.stats.rulesProcessed = rules.length;
128
+ this.log(`Found ${rules.length} rules`);
129
+ const targets = options.targets || this.getDefaultTargets();
130
+ // Track all relevant source files for incremental builds
131
+ const sourceFiles = rules.map(r => r.absolutePath);
132
+ const projectMdPath = path.join(this.projectRoot, '.context', 'project.md');
133
+ const architectureMdPath = path.join(this.projectRoot, '.context', 'architecture.md');
134
+ const configYamlPath = path.join(this.projectRoot, '.context', 'config.yaml');
135
+ if (await fileExists(projectMdPath))
136
+ sourceFiles.push(projectMdPath);
137
+ if (await fileExists(architectureMdPath))
138
+ sourceFiles.push(architectureMdPath);
139
+ if (await fileExists(configYamlPath))
140
+ sourceFiles.push(configYamlPath);
141
+ // Step 2: Static analysis (unless skipped)
142
+ if (!options.skipValidation) {
143
+ this.log('Running static analysis...');
144
+ const analysisOptions = {
145
+ projectRoot: this.projectRoot,
146
+ config: this.config,
147
+ };
148
+ result.analysis = (0, static_analysis_1.analyzeRules)(rules, analysisOptions);
149
+ // Check for blocking errors
150
+ if (result.analysis.errors.length > 0) {
151
+ result.errors.push(...result.analysis.errors.map(e => `${e.type}: ${e.message} (${e.path}${e.line ? `:${e.line}` : ''})`));
152
+ result.stats.duration = Date.now() - startTime;
153
+ return;
154
+ }
155
+ // Collect warnings
156
+ result.warnings.push(...result.analysis.warnings.map(w => `${w.type}: ${w.message} (${w.path})`));
157
+ }
158
+ // Step 3: Check for incremental build
159
+ const manifest = options.force ? null : await (0, manifest_1.readManifest)(this.projectRoot);
160
+ let changedRules = rules;
161
+ if (manifest && !options.force) {
162
+ this.log('Checking for changes...');
163
+ const changes = await (0, manifest_1.detectChanges)(this.projectRoot, sourceFiles, manifest);
164
+ const changedPaths = new Set([...changes.added, ...changes.modified]);
165
+ changedRules = rules.filter((r) => changedPaths.has(path.relative(this.projectRoot, r.absolutePath)));
166
+ result.stats.rulesChanged = changedRules.length;
167
+ result.stats.incremental = true;
168
+ const hasAnySourceChanges = changes.added.length > 0 || changes.modified.length > 0 || changes.removed.length > 0;
169
+ if (!options.check && !hasAnySourceChanges) {
170
+ const okToSkip = await verifyAndHealOutputsForIncrementalSkip(this.projectRoot, targets, manifest, rules.length);
171
+ if (okToSkip) {
172
+ this.log('No changes detected, skipping compilation');
173
+ result.success = true;
174
+ result.stats.duration = Date.now() - startTime;
175
+ return;
176
+ }
177
+ this.log('No source changes detected, but outputs need regeneration');
178
+ }
179
+ this.log(`${changedRules.length} rules changed, ${changes.removed.length} removed`);
180
+ }
181
+ else {
182
+ result.stats.incremental = false;
183
+ result.stats.rulesChanged = rules.length;
184
+ }
185
+ // Step 4: Compile for each target
186
+ const pendingWrites = [];
187
+ const outputDependencies = [];
188
+ const cursorExpectedOutputs = new Set();
189
+ for (const target of targets) {
190
+ this.log(`Compiling for ${target}...`);
191
+ // Create compiler context
192
+ const compilerContext = {
193
+ projectRoot: this.projectRoot,
194
+ config: this.config,
195
+ rules: rules,
196
+ writeToDisk: false,
197
+ };
198
+ let compilationResult;
199
+ switch (target) {
200
+ case 'cursor': {
201
+ const cursorCompiler = new cursor_compiler_1.CursorCompiler(compilerContext);
202
+ compilationResult = await cursorCompiler.compile();
203
+ break;
204
+ }
205
+ case 'claude': {
206
+ const claudeCompiler = new claude_compiler_1.ClaudeCompiler(compilerContext);
207
+ compilationResult = await claudeCompiler.compile();
208
+ break;
209
+ }
210
+ case 'agents': {
211
+ const agentsCompiler = new agents_compiler_1.AgentsCompiler(compilerContext);
212
+ compilationResult = await agentsCompiler.compile();
213
+ break;
214
+ }
215
+ default:
216
+ result.errors.push(`Unknown target: ${target}`);
217
+ continue;
218
+ }
219
+ result.compilations.set(target, compilationResult);
220
+ // Collect errors and warnings
221
+ result.errors.push(...compilationResult.errors.map(e => `[${target}] ${e.message}`));
222
+ result.warnings.push(...compilationResult.warnings.map(w => `[${target}] ${w.message}`));
223
+ // Track expected cursor outputs for cleanup/check
224
+ if (target === 'cursor') {
225
+ for (const output of compilationResult.outputs) {
226
+ cursorExpectedOutputs.add(output.path);
227
+ }
228
+ }
229
+ // Track output dependencies
230
+ for (const output of compilationResult.outputs) {
231
+ outputDependencies.push({
232
+ outputPath: output.path,
233
+ sourceRules: rules.map(r => path.relative(this.projectRoot, r.absolutePath)),
234
+ generatedAt: Date.now(),
235
+ });
236
+ }
237
+ result.stats.totalTokens += compilationResult.stats.totalTokens;
238
+ }
239
+ // Step 5: Compare with disk (check mode) or prepare writes
240
+ for (const compilationResult of result.compilations.values()) {
241
+ for (const output of compilationResult.outputs) {
242
+ const absoluteTargetPath = path.join(this.projectRoot, output.path);
243
+ if (options.check) {
244
+ const existing = await readFileOrNull(absoluteTargetPath);
245
+ if (existing === null) {
246
+ result.errors.push(`[check] Missing output: ${output.path} (run \`ctx build\`)`);
247
+ continue;
248
+ }
249
+ const existingNormalized = stripBuildMetadataFooter(existing);
250
+ const generatedNormalized = stripBuildMetadataFooter(output.content);
251
+ if (existingNormalized !== generatedNormalized) {
252
+ result.errors.push(`[check] Output out of date: ${output.path} (run \`ctx build\`)`);
253
+ }
254
+ continue;
255
+ }
256
+ // Normal build: only write if "real content" changed (ignore metadata timestamp churn)
257
+ const existing = await readFileOrNull(absoluteTargetPath);
258
+ if (existing !== null) {
259
+ const existingNormalized = stripBuildMetadataFooter(existing);
260
+ const generatedNormalized = stripBuildMetadataFooter(output.content);
261
+ if (existingNormalized === generatedNormalized) {
262
+ continue;
263
+ }
264
+ }
265
+ pendingWrites.push({
266
+ targetPath: absoluteTargetPath,
267
+ content: output.content,
268
+ });
269
+ }
270
+ }
271
+ // Check for stale generated Cursor outputs
272
+ const cursorCompilation = result.compilations.get('cursor');
273
+ if (targets.includes('cursor') && cursorCompilation?.success) {
274
+ const stale = await findStaleGeneratedCursorOutputs(this.projectRoot, cursorExpectedOutputs);
275
+ if (options.check) {
276
+ for (const stalePath of stale) {
277
+ result.errors.push(`[check] Stale generated output: ${stalePath} (run \`ctx build\`)`);
278
+ }
279
+ }
280
+ }
281
+ if (options.check) {
282
+ result.success = result.errors.length === 0;
283
+ result.stats.duration = Date.now() - startTime;
284
+ return;
285
+ }
286
+ // Step 6: Atomic write all outputs
287
+ if (pendingWrites.length > 0) {
288
+ this.log('Writing outputs atomically...');
289
+ const txResult = await (0, atomic_1.transaction)(pendingWrites);
290
+ if (!txResult.success) {
291
+ result.errors.push(...txResult.errors.map(e => `Failed to write ${e.path}: ${e.error.message}`));
292
+ result.stats.duration = Date.now() - startTime;
293
+ return;
294
+ }
295
+ this.log(`Wrote ${txResult.writtenFiles.length} files`);
296
+ result.stats.filesGenerated += txResult.writtenFiles.length;
297
+ }
298
+ // Cleanup stale generated Cursor outputs after successful write
299
+ if (targets.includes('cursor') && cursorCompilation?.success) {
300
+ const stale = await findStaleGeneratedCursorOutputs(this.projectRoot, cursorExpectedOutputs);
301
+ for (const stalePath of stale) {
302
+ try {
303
+ await fs.promises.unlink(path.join(this.projectRoot, stalePath));
304
+ }
305
+ catch {
306
+ // Ignore cleanup errors
307
+ }
308
+ }
309
+ }
310
+ // Step 7: Update manifest
311
+ const configHash = await calculateConfigHash(this.projectRoot, this.config);
312
+ const allSourcePaths = sourceFiles;
313
+ const newManifest = await (0, manifest_1.updateManifest)(this.projectRoot, allSourcePaths, targets.join(','), outputDependencies, configHash);
314
+ await (0, manifest_1.writeManifest)(this.projectRoot, newManifest);
315
+ this.log('Updated build manifest');
316
+ result.success = true;
317
+ });
318
+ }
319
+ catch (error) {
320
+ const errorMessage = error.message;
321
+ // Check if it's a lock error
322
+ if (errorMessage.includes('Build already in progress')) {
323
+ result.errors.push(errorMessage);
324
+ }
325
+ else {
326
+ result.errors.push(`Build failed: ${errorMessage}`);
327
+ }
328
+ }
329
+ result.stats.duration = Date.now() - startTime;
330
+ return result;
331
+ }
332
+ /**
333
+ * Log message (respecting quiet/verbose modes)
334
+ */
335
+ log(message) {
336
+ if (this.quiet)
337
+ return;
338
+ console.log(message);
339
+ }
340
+ /**
341
+ * Get default targets based on config
342
+ * Returns targets that have configuration, defaults to ['claude']
343
+ */
344
+ getDefaultTargets() {
345
+ const targets = [];
346
+ if (this.config.compile?.claude) {
347
+ targets.push('claude');
348
+ }
349
+ if (this.config.compile?.cursor) {
350
+ targets.push('cursor');
351
+ }
352
+ if (this.config.compile?.agents) {
353
+ targets.push('agents');
354
+ }
355
+ // Default to claude if no targets configured
356
+ return targets.length > 0 ? targets : ['claude'];
357
+ }
358
+ }
359
+ exports.BuildOrchestrator = BuildOrchestrator;
360
+ async function fileExists(filePath) {
361
+ try {
362
+ await fs.promises.access(filePath);
363
+ return true;
364
+ }
365
+ catch {
366
+ return false;
367
+ }
368
+ }
369
+ async function readFileOrNull(filePath) {
370
+ try {
371
+ return await fs.promises.readFile(filePath, 'utf-8');
372
+ }
373
+ catch {
374
+ return null;
375
+ }
376
+ }
377
+ async function calculateConfigHash(projectRoot, config) {
378
+ const configYamlPath = path.join(projectRoot, '.context', 'config.yaml');
379
+ const raw = await readFileOrNull(configYamlPath);
380
+ if (raw !== null) {
381
+ return (0, manifest_1.calculateHash)(raw);
382
+ }
383
+ return (0, manifest_1.calculateHash)(JSON.stringify(config));
384
+ }
385
+ async function verifyGeneratedOutputFile(projectRoot, relPath) {
386
+ const fullPath = path.join(projectRoot, relPath);
387
+ const content = await readFileOrNull(fullPath);
388
+ if (content === null)
389
+ return false;
390
+ const embedded = extractEmbeddedChecksum(content);
391
+ if (!embedded)
392
+ return false;
393
+ const cleanContent = stripBuildMetadataFooter(content);
394
+ const actual = (0, manifest_1.calculateHash)(cleanContent);
395
+ return embedded === actual;
396
+ }
397
+ function filterExpectedOutputsForTargets(targets, manifest) {
398
+ const expected = new Set();
399
+ for (const output of manifest.outputs) {
400
+ const outPath = output.outputPath;
401
+ if (outPath === 'CLAUDE.md' && targets.includes('claude')) {
402
+ expected.add(outPath);
403
+ }
404
+ else if (outPath === 'AGENTS.md' && targets.includes('agents')) {
405
+ expected.add(outPath);
406
+ }
407
+ else if (outPath.startsWith('.cursor/rules/') && targets.includes('cursor')) {
408
+ expected.add(outPath);
409
+ }
410
+ }
411
+ return expected;
412
+ }
413
+ async function verifyAndHealOutputsForIncrementalSkip(projectRoot, targets, manifest, ruleCount) {
414
+ const expected = filterExpectedOutputsForTargets(targets, manifest);
415
+ // If user requests a target that has never been built (no outputs in manifest), we must build.
416
+ if (targets.includes('claude') && !expected.has('CLAUDE.md'))
417
+ return false;
418
+ if (targets.includes('agents') && !expected.has('AGENTS.md'))
419
+ return false;
420
+ if (targets.includes('cursor')) {
421
+ const hasAnyCursorOutput = Array.from(expected).some((p) => p.startsWith('.cursor/rules/'));
422
+ if (ruleCount > 0 && !hasAnyCursorOutput)
423
+ return false;
424
+ }
425
+ // Verify expected outputs are present and not tampered with
426
+ for (const outPath of expected) {
427
+ if (!(await verifyGeneratedOutputFile(projectRoot, outPath))) {
428
+ return false;
429
+ }
430
+ }
431
+ // Remove stale generated Cursor outputs (e.g., after a previous partial build)
432
+ if (targets.includes('cursor')) {
433
+ const expectedCursor = new Set(Array.from(expected).filter((p) => p.startsWith('.cursor/rules/')));
434
+ const stale = await findStaleGeneratedCursorOutputs(projectRoot, expectedCursor);
435
+ if (stale.length > 0) {
436
+ for (const stalePath of stale) {
437
+ try {
438
+ await fs.promises.unlink(path.join(projectRoot, stalePath));
439
+ }
440
+ catch {
441
+ return false;
442
+ }
443
+ }
444
+ }
445
+ }
446
+ return true;
447
+ }
448
+ async function findStaleGeneratedCursorOutputs(projectRoot, expected) {
449
+ const cursorRulesDir = path.join(projectRoot, '.cursor', 'rules');
450
+ const stale = [];
451
+ if (!(await fileExists(cursorRulesDir))) {
452
+ return stale;
453
+ }
454
+ let entries;
455
+ try {
456
+ entries = await fs.promises.readdir(cursorRulesDir);
457
+ }
458
+ catch {
459
+ return stale;
460
+ }
461
+ for (const entry of entries) {
462
+ if (!entry.endsWith('.mdc'))
463
+ continue;
464
+ const relPath = `.cursor/rules/${entry}`;
465
+ if (expected.has(relPath))
466
+ continue;
467
+ const fullPath = path.join(projectRoot, relPath);
468
+ const content = await readFileOrNull(fullPath);
469
+ if (content && hasBuildMetadataFooter(content)) {
470
+ stale.push(relPath);
471
+ }
472
+ }
473
+ return stale;
474
+ }
475
+ /**
476
+ * Execute build with options
477
+ *
478
+ * Convenience function for CLI integration
479
+ */
480
+ async function executeBuild(options) {
481
+ // Load config
482
+ const loadResult = (0, loader_1.loadConfig)(options.projectRoot);
483
+ // Create orchestrator
484
+ const orchestrator = new BuildOrchestrator(options.projectRoot, loadResult.config, options);
485
+ // Execute build
486
+ return orchestrator.build(options);
487
+ }
488
+ /**
489
+ * Format build result for display
490
+ */
491
+ function formatBuildResult(result) {
492
+ const lines = [];
493
+ if (result.success) {
494
+ lines.push('✅ Build completed successfully');
495
+ }
496
+ else {
497
+ lines.push('❌ Build failed');
498
+ }
499
+ lines.push('');
500
+ lines.push(`Duration: ${result.stats.duration}ms`);
501
+ lines.push(`Rules processed: ${result.stats.rulesProcessed}`);
502
+ if (result.stats.incremental) {
503
+ lines.push(`Rules changed: ${result.stats.rulesChanged}`);
504
+ }
505
+ lines.push(`Files generated: ${result.stats.filesGenerated}`);
506
+ lines.push(`Total tokens: ${result.stats.totalTokens}`);
507
+ lines.push(`Targets: ${result.stats.targets.join(', ')}`);
508
+ if (result.errors.length > 0) {
509
+ lines.push('');
510
+ lines.push('Errors:');
511
+ for (const error of result.errors) {
512
+ lines.push(` ❌ ${error}`);
513
+ }
514
+ }
515
+ if (result.warnings.length > 0) {
516
+ lines.push('');
517
+ lines.push('Warnings:');
518
+ for (const warning of result.warnings) {
519
+ lines.push(` ⚠️ ${warning}`);
520
+ }
521
+ }
522
+ return lines.join('\n');
523
+ }
524
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/build/orchestrator.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2lBH,oCASC;AAKD,8CAsCC;AA7oBD,uCAAyB;AACzB,2CAA6B;AAE7B,6CAA8C;AAC9C,uDAAoE;AACpE,iEAA4F;AAC5F,iEAA6D;AAC7D,iEAA6D;AAC7D,iEAA6D;AAE7D,yCAQoB;AACpB,qCAA4E;AAC5E,iCAAkC;AAElC,MAAM,2BAA2B,GAC/B,uGAAuG,CAAC;AAE1G,MAAM,uBAAuB,GAAG,iDAAiD,CAAC;AAElF,SAAS,iBAAiB,CAAC,OAAe;IACxC,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IACvE,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAe;IAC7C,OAAO,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,uBAAuB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AA8DD;;GAEG;AACH,MAAa,iBAAiB;IACpB,MAAM,CAAS;IACf,WAAW,CAAS;IACpB,KAAK,CAAU;IAEvB,YAAY,WAAmB,EAAE,MAAc,EAAE,OAA+B;QAC9E,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAgB;YAC1B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE;gBACL,QAAQ,EAAE,CAAC;gBACX,cAAc,EAAE,CAAC;gBACjB,YAAY,EAAE,CAAC;gBACf,cAAc,EAAE,CAAC;gBACjB,WAAW,EAAE,CAAC;gBACd,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK;gBAC3B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE;aACrD;YACD,YAAY,EAAE,IAAI,GAAG,EAAE;YACvB,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,IAAI,CAAC;YACH,sCAAsC;YACtC,MAAM,IAAA,eAAQ,EAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE;gBAC1E,yDAAyD;gBACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;gBAC3D,MAAM,IAAA,8BAAqB,EAAC,UAAU,CAAC,CAAC;gBAExC,mCAAmC;gBACnC,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;gBACjC,MAAM,YAAY,GAAiB;oBACjC,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC;iBAC3D,CAAC;gBAEF,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,IAAA,2BAAa,EAAC,YAAY,CAAC,CAAC;gBAEnE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBACpG,wEAAwE;oBACxE,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC/C,OAAO;gBACT,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3C,IAAI,CAAC,GAAG,CAAC,SAAS,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;gBAExC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAE5D,yDAAyD;gBACzD,MAAM,WAAW,GAAa,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAC7D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;gBAC5E,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;gBACtF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;gBAE9E,IAAI,MAAM,UAAU,CAAC,aAAa,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACrE,IAAI,MAAM,UAAU,CAAC,kBAAkB,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC/E,IAAI,MAAM,UAAU,CAAC,cAAc,CAAC;oBAAE,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAEvE,2CAA2C;gBAC3C,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;oBAC5B,IAAI,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;oBACvC,MAAM,eAAe,GAAoB;wBACvC,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;qBACpB,CAAC;oBACF,MAAM,CAAC,QAAQ,GAAG,IAAA,8BAAY,EAAC,KAAK,EAAE,eAAe,CAAC,CAAC;oBAEvD,4BAA4B;oBAC5B,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBACtC,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CACvG,CAAC;wBACF,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wBAC/C,OAAO;oBACT,CAAC;oBAED,mBAAmB;oBACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAClB,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAC5E,CAAC;gBACJ,CAAC;gBAED,sCAAsC;gBACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAA,uBAAY,EAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC7E,IAAI,YAAY,GAAG,KAAK,CAAC;gBAEzB,IAAI,QAAQ,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;oBAC/B,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;oBACpC,MAAM,OAAO,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;oBAE7E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACtE,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAEtG,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC;oBAChD,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;oBAEhC,MAAM,mBAAmB,GACvB,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;oBAExF,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC;wBAC3C,MAAM,QAAQ,GAAG,MAAM,sCAAsC,CAC3D,IAAI,CAAC,WAAW,EAChB,OAAO,EACP,QAAQ,EACR,KAAK,CAAC,MAAM,CACb,CAAC;wBACF,IAAI,QAAQ,EAAE,CAAC;4BACb,IAAI,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;4BACtD,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;4BACtB,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;4BAC/C,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;oBACxE,CAAC;oBAED,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,mBAAmB,OAAO,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;gBACtF,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;oBACjC,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;gBAC3C,CAAC;gBAED,kCAAkC;gBAClC,MAAM,aAAa,GAAmB,EAAE,CAAC;gBACzC,MAAM,kBAAkB,GAAuB,EAAE,CAAC;gBAClD,MAAM,qBAAqB,GAAG,IAAI,GAAG,EAAU,CAAC;gBAEhD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC,GAAG,CAAC,iBAAiB,MAAM,KAAK,CAAC,CAAC;oBAEvC,0BAA0B;oBAC1B,MAAM,eAAe,GAAoB;wBACvC,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,KAAK,EAAE,KAAK;wBACZ,WAAW,EAAE,KAAK;qBACnB,CAAC;oBAEF,IAAI,iBAAoC,CAAC;oBAEzC,QAAQ,MAAM,EAAE,CAAC;wBACf,KAAK,QAAQ,CAAC,CAAC,CAAC;4BACd,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,eAAe,CAAC,CAAC;4BAC3D,iBAAiB,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;4BACnD,MAAM;wBACR,CAAC;wBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;4BACd,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,eAAe,CAAC,CAAC;4BAC3D,iBAAiB,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;4BACnD,MAAM;wBACR,CAAC;wBAED,KAAK,QAAQ,CAAC,CAAC,CAAC;4BACd,MAAM,cAAc,GAAG,IAAI,gCAAc,CAAC,eAAe,CAAC,CAAC;4BAC3D,iBAAiB,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,CAAC;4BACnD,MAAM;wBACR,CAAC;wBAED;4BACE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,EAAE,CAAC,CAAC;4BAChD,SAAS;oBACb,CAAC;oBAED,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;oBAEnD,8BAA8B;oBAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACrF,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBAEzF,kDAAkD;oBAClD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACxB,KAAK,MAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;4BAC/C,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;wBACzC,CAAC;oBACH,CAAC;oBAED,4BAA4B;oBAC5B,KAAK,MAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;wBAC/C,kBAAkB,CAAC,IAAI,CAAC;4BACtB,UAAU,EAAE,MAAM,CAAC,IAAI;4BACvB,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;4BAC5E,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;yBACxB,CAAC,CAAC;oBACL,CAAC;oBAED,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC;gBAClE,CAAC;gBAED,2DAA2D;gBAC3D,KAAK,MAAM,iBAAiB,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;oBAC7D,KAAK,MAAM,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;wBAC/C,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;wBAEpE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;4BAClB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,CAAC;4BAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gCACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;gCACjF,SAAS;4BACX,CAAC;4BAED,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;4BAC9D,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BACrE,IAAI,kBAAkB,KAAK,mBAAmB,EAAE,CAAC;gCAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;4BACvF,CAAC;4BACD,SAAS;wBACX,CAAC;wBAED,uFAAuF;wBACvF,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,kBAAkB,CAAC,CAAC;wBAC1D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;4BACtB,MAAM,kBAAkB,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;4BAC9D,MAAM,mBAAmB,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;4BACrE,IAAI,kBAAkB,KAAK,mBAAmB,EAAE,CAAC;gCAC/C,SAAS;4BACX,CAAC;wBACH,CAAC;wBAED,aAAa,CAAC,IAAI,CAAC;4BACjB,UAAU,EAAE,kBAAkB;4BAC9B,OAAO,EAAE,MAAM,CAAC,OAAO;yBACxB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAED,2CAA2C;gBAC3C,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC5D,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,OAAO,EAAE,CAAC;oBAC7D,MAAM,KAAK,GAAG,MAAM,+BAA+B,CACjD,IAAI,CAAC,WAAW,EAChB,qBAAqB,CACtB,CAAC;oBACF,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBAClB,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;4BAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,SAAS,sBAAsB,CAAC,CAAC;wBACzF,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBAClB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;oBAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC/C,OAAO;gBACT,CAAC;gBAED,mCAAmC;gBACnC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;oBAC1C,MAAM,QAAQ,GAAG,MAAM,IAAA,oBAAW,EAAC,aAAa,CAAC,CAAC;oBAElD,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;wBACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAC7E,CAAC;wBACF,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;wBAC/C,OAAO;oBACT,CAAC;oBAED,IAAI,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,YAAY,CAAC,MAAM,QAAQ,CAAC,CAAC;oBACxD,MAAM,CAAC,KAAK,CAAC,cAAc,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;gBAC9D,CAAC;gBAED,gEAAgE;gBAChE,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,iBAAiB,EAAE,OAAO,EAAE,CAAC;oBAC7D,MAAM,KAAK,GAAG,MAAM,+BAA+B,CACjD,IAAI,CAAC,WAAW,EAChB,qBAAqB,CACtB,CAAC;oBACF,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;wBAC9B,IAAI,CAAC;4BACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;wBACnE,CAAC;wBAAC,MAAM,CAAC;4BACP,wBAAwB;wBAC1B,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5E,MAAM,cAAc,GAAG,WAAW,CAAC;gBAEnC,MAAM,WAAW,GAAG,MAAM,IAAA,yBAAc,EACtC,IAAI,CAAC,WAAW,EAChB,cAAc,EACd,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EACjB,kBAAkB,EAClB,UAAU,CACX,CAAC;gBAEF,MAAM,IAAA,wBAAa,EAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACnD,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBAEnC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACxB,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAAI,KAAe,CAAC,OAAO,CAAC;YAE9C,6BAA6B;YAC7B,IAAI,YAAY,CAAC,QAAQ,CAAC,2BAA2B,CAAC,EAAE,CAAC;gBACvD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,GAAG,CAAC,OAAe;QACzB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED;;;OAGG;IACK,iBAAiB;QACvB,MAAM,OAAO,GAAkB,EAAE,CAAC;QAElC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QAED,6CAA6C;QAC7C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;CACF;AA7VD,8CA6VC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,WAAmB,EAAE,MAAc;IACpE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;IACjD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,IAAA,wBAAa,EAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAA,wBAAa,EAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,WAAmB,EAAE,OAAe;IAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC/C,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEnC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,MAAM,YAAY,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAA,wBAAa,EAAC,YAAY,CAAC,CAAC;IAC3C,OAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B,CAAC;AAED,SAAS,+BAA+B,CACtC,OAAsB,EACtB,QAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC;QAClC,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1D,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjE,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9E,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,sCAAsC,CACnD,WAAmB,EACnB,OAAsB,EACtB,QAAuB,EACvB,SAAiB;IAEjB,MAAM,QAAQ,GAAG,+BAA+B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEpE,+FAA+F;IAC/F,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3E,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3E,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5F,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO,KAAK,CAAC;IACzD,CAAC;IAED,4DAA4D;IAC5D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,CAAC,MAAM,yBAAyB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC/B,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CACnE,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,+BAA+B,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QACjF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,KAAK,MAAM,SAAS,IAAI,KAAK,EAAE,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC;gBAC9D,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,+BAA+B,CAC5C,WAAmB,EACnB,QAAqB;IAErB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,SAAS;QACtC,MAAM,OAAO,GAAG,iBAAiB,KAAK,EAAE,CAAC;QAEzC,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/C,IAAI,OAAO,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,YAAY,CAAC,OAAqB;IACtD,cAAc;IACd,MAAM,UAAU,GAAG,IAAA,mBAAU,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnD,sBAAsB;IACtB,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE5F,gBAAgB;IAChB,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,MAAmB;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAE9D,IAAI,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,iBAAiB,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IACxD,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE1D,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Bootstrap Module
3
+ *
4
+ * Deep codebase analysis and LLM prompt generation for intelligent
5
+ * rule bootstrapping. Supports any LLM (Claude, Cursor, Codex).
6
+ */
7
+ /**
8
+ * Analysis result for codebase
9
+ */
10
+ export interface CodebaseAnalysis {
11
+ projectName: string;
12
+ languages: LanguageInfo[];
13
+ frameworks: string[];
14
+ buildTools: string[];
15
+ testingTools: string[];
16
+ structure: DirectoryStructure;
17
+ sampleFiles: SampleFile[];
18
+ packageInfo: PackageInfo | null;
19
+ existingDocs: ExistingDoc[];
20
+ gitInfo: GitInfo | null;
21
+ }
22
+ export interface LanguageInfo {
23
+ name: string;
24
+ extensions: string[];
25
+ fileCount: number;
26
+ percentage: number;
27
+ }
28
+ export interface DirectoryStructure {
29
+ topLevel: string[];
30
+ srcStructure: string[];
31
+ hasTests: boolean;
32
+ hasDocs: boolean;
33
+ hasConfig: boolean;
34
+ }
35
+ export interface SampleFile {
36
+ path: string;
37
+ content: string;
38
+ language: string;
39
+ }
40
+ export interface PackageInfo {
41
+ name: string;
42
+ description?: string;
43
+ type: 'npm' | 'python' | 'rust' | 'go' | 'other';
44
+ dependencies: string[];
45
+ devDependencies: string[];
46
+ scripts: Record<string, string>;
47
+ }
48
+ export interface ExistingDoc {
49
+ path: string;
50
+ type: 'readme' | 'contributing' | 'cursorrules' | 'claude' | 'agents' | 'other';
51
+ excerpt: string;
52
+ }
53
+ export interface GitInfo {
54
+ remoteUrl?: string;
55
+ branch: string;
56
+ hasUncommitted: boolean;
57
+ }
58
+ /**
59
+ * Analyze the codebase deeply
60
+ */
61
+ export declare function analyzeCodebase(projectRoot: string): Promise<CodebaseAnalysis>;
62
+ /**
63
+ * Generate the universal LLM prompt using the template
64
+ */
65
+ export declare function generateBootstrapPrompt(analysis: CodebaseAnalysis): string;
66
+ /**
67
+ * Print analysis summary to console
68
+ */
69
+ export declare function printAnalysisSummary(analysis: CodebaseAnalysis): void;
70
+ /**
71
+ * Run the bootstrap process
72
+ */
73
+ export declare function runBootstrap(projectRoot: string): Promise<{
74
+ analysis: CodebaseAnalysis;
75
+ prompt: string;
76
+ }>;
77
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/cli/bootstrap.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmCH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,kBAAkB,CAAC;IAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAChC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;IACjD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,cAAc,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IAChF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAmCpF;AA+VD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CA2G1E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAsBrE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAO/G"}