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.
- package/LICENSE +21 -0
- package/README.md +484 -0
- package/bin/ctx.js +3 -0
- package/dist/analysis/index.d.ts +2 -0
- package/dist/analysis/index.d.ts.map +1 -0
- package/dist/analysis/index.js +18 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/static-analysis.d.ts +79 -0
- package/dist/analysis/static-analysis.d.ts.map +1 -0
- package/dist/analysis/static-analysis.js +279 -0
- package/dist/analysis/static-analysis.js.map +1 -0
- package/dist/bootstrap/index.d.ts +8 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +13 -0
- package/dist/bootstrap/index.js.map +1 -0
- package/dist/bootstrap/orchestrator.d.ts +48 -0
- package/dist/bootstrap/orchestrator.d.ts.map +1 -0
- package/dist/bootstrap/orchestrator.js +363 -0
- package/dist/bootstrap/orchestrator.js.map +1 -0
- package/dist/bootstrap/validator.d.ts +25 -0
- package/dist/bootstrap/validator.d.ts.map +1 -0
- package/dist/bootstrap/validator.js +412 -0
- package/dist/bootstrap/validator.js.map +1 -0
- package/dist/build/atomic.d.ts +74 -0
- package/dist/build/atomic.d.ts.map +1 -0
- package/dist/build/atomic.js +235 -0
- package/dist/build/atomic.js.map +1 -0
- package/dist/build/index.d.ts +10 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +26 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/lock.d.ts +102 -0
- package/dist/build/lock.d.ts.map +1 -0
- package/dist/build/lock.js +297 -0
- package/dist/build/lock.js.map +1 -0
- package/dist/build/manifest.d.ts +138 -0
- package/dist/build/manifest.d.ts.map +1 -0
- package/dist/build/manifest.js +269 -0
- package/dist/build/manifest.js.map +1 -0
- package/dist/build/orchestrator.d.ts +103 -0
- package/dist/build/orchestrator.d.ts.map +1 -0
- package/dist/build/orchestrator.js +524 -0
- package/dist/build/orchestrator.js.map +1 -0
- package/dist/cli/bootstrap.d.ts +77 -0
- package/dist/cli/bootstrap.d.ts.map +1 -0
- package/dist/cli/bootstrap.js +527 -0
- package/dist/cli/bootstrap.js.map +1 -0
- package/dist/cli/build.d.ts +32 -0
- package/dist/cli/build.d.ts.map +1 -0
- package/dist/cli/build.js +156 -0
- package/dist/cli/build.js.map +1 -0
- package/dist/cli/diff.d.ts +23 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +226 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/hooks.d.ts +29 -0
- package/dist/cli/hooks.d.ts.map +1 -0
- package/dist/cli/hooks.js +176 -0
- package/dist/cli/hooks.js.map +1 -0
- package/dist/cli/init.d.ts +53 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +254 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/lint.d.ts +46 -0
- package/dist/cli/lint.d.ts.map +1 -0
- package/dist/cli/lint.js +210 -0
- package/dist/cli/lint.js.map +1 -0
- package/dist/cli/migrate.d.ts +28 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +350 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli/verify.d.ts +21 -0
- package/dist/cli/verify.d.ts.map +1 -0
- package/dist/cli/verify.js +209 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +262 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler/agents-compiler.d.ts +24 -0
- package/dist/compiler/agents-compiler.d.ts.map +1 -0
- package/dist/compiler/agents-compiler.js +192 -0
- package/dist/compiler/agents-compiler.js.map +1 -0
- package/dist/compiler/base-compiler.d.ts +152 -0
- package/dist/compiler/base-compiler.d.ts.map +1 -0
- package/dist/compiler/base-compiler.js +180 -0
- package/dist/compiler/base-compiler.js.map +1 -0
- package/dist/compiler/claude-compiler.d.ts +24 -0
- package/dist/compiler/claude-compiler.d.ts.map +1 -0
- package/dist/compiler/claude-compiler.js +182 -0
- package/dist/compiler/claude-compiler.js.map +1 -0
- package/dist/compiler/cursor-compiler.d.ts +33 -0
- package/dist/compiler/cursor-compiler.d.ts.map +1 -0
- package/dist/compiler/cursor-compiler.js +136 -0
- package/dist/compiler/cursor-compiler.js.map +1 -0
- package/dist/compiler/index.d.ts +7 -0
- package/dist/compiler/index.d.ts.map +1 -0
- package/dist/compiler/index.js +24 -0
- package/dist/compiler/index.js.map +1 -0
- package/dist/compiler/rule-selector.d.ts +115 -0
- package/dist/compiler/rule-selector.d.ts.map +1 -0
- package/dist/compiler/rule-selector.js +273 -0
- package/dist/compiler/rule-selector.js.map +1 -0
- package/dist/compiler/token-estimator.d.ts +74 -0
- package/dist/compiler/token-estimator.d.ts.map +1 -0
- package/dist/compiler/token-estimator.js +191 -0
- package/dist/compiler/token-estimator.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +18 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +48 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +175 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/git/gitignore.d.ts +59 -0
- package/dist/git/gitignore.d.ts.map +1 -0
- package/dist/git/gitignore.js +268 -0
- package/dist/git/gitignore.js.map +1 -0
- package/dist/git/hooks.d.ts +34 -0
- package/dist/git/hooks.d.ts.map +1 -0
- package/dist/git/hooks.js +129 -0
- package/dist/git/hooks.js.map +1 -0
- package/dist/git/husky.d.ts +52 -0
- package/dist/git/husky.d.ts.map +1 -0
- package/dist/git/husky.js +219 -0
- package/dist/git/husky.js.map +1 -0
- package/dist/git/index.d.ts +9 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +15 -0
- package/dist/git/index.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/base-provider.d.ts +43 -0
- package/dist/llm/base-provider.d.ts.map +1 -0
- package/dist/llm/base-provider.js +91 -0
- package/dist/llm/base-provider.js.map +1 -0
- package/dist/llm/index.d.ts +17 -0
- package/dist/llm/index.d.ts.map +1 -0
- package/dist/llm/index.js +36 -0
- package/dist/llm/index.js.map +1 -0
- package/dist/llm/prompts/bootstrap-prompt.d.ts +27 -0
- package/dist/llm/prompts/bootstrap-prompt.d.ts.map +1 -0
- package/dist/llm/prompts/bootstrap-prompt.js +278 -0
- package/dist/llm/prompts/bootstrap-prompt.js.map +1 -0
- package/dist/llm/prompts/index.d.ts +5 -0
- package/dist/llm/prompts/index.d.ts.map +1 -0
- package/dist/llm/prompts/index.js +11 -0
- package/dist/llm/prompts/index.js.map +1 -0
- package/dist/llm/provider-factory.d.ts +27 -0
- package/dist/llm/provider-factory.d.ts.map +1 -0
- package/dist/llm/provider-factory.js +213 -0
- package/dist/llm/provider-factory.js.map +1 -0
- package/dist/llm/providers/claude-api.d.ts +21 -0
- package/dist/llm/providers/claude-api.d.ts.map +1 -0
- package/dist/llm/providers/claude-api.js +110 -0
- package/dist/llm/providers/claude-api.js.map +1 -0
- package/dist/llm/providers/claude-code.d.ts +21 -0
- package/dist/llm/providers/claude-code.d.ts.map +1 -0
- package/dist/llm/providers/claude-code.js +120 -0
- package/dist/llm/providers/claude-code.js.map +1 -0
- package/dist/llm/providers/codex-cli.d.ts +25 -0
- package/dist/llm/providers/codex-cli.d.ts.map +1 -0
- package/dist/llm/providers/codex-cli.js +129 -0
- package/dist/llm/providers/codex-cli.js.map +1 -0
- package/dist/llm/providers/cursor-cli.d.ts +24 -0
- package/dist/llm/providers/cursor-cli.d.ts.map +1 -0
- package/dist/llm/providers/cursor-cli.js +106 -0
- package/dist/llm/providers/cursor-cli.js.map +1 -0
- package/dist/llm/providers/gemini-api.d.ts +20 -0
- package/dist/llm/providers/gemini-api.d.ts.map +1 -0
- package/dist/llm/providers/gemini-api.js +121 -0
- package/dist/llm/providers/gemini-api.js.map +1 -0
- package/dist/llm/providers/gemini-cli.d.ts +20 -0
- package/dist/llm/providers/gemini-cli.d.ts.map +1 -0
- package/dist/llm/providers/gemini-cli.js +109 -0
- package/dist/llm/providers/gemini-cli.js.map +1 -0
- package/dist/llm/providers/interactive.d.ts +42 -0
- package/dist/llm/providers/interactive.d.ts.map +1 -0
- package/dist/llm/providers/interactive.js +200 -0
- package/dist/llm/providers/interactive.js.map +1 -0
- package/dist/llm/providers/openai-api.d.ts +21 -0
- package/dist/llm/providers/openai-api.d.ts.map +1 -0
- package/dist/llm/providers/openai-api.js +107 -0
- package/dist/llm/providers/openai-api.js.map +1 -0
- package/dist/llm/types.d.ts +128 -0
- package/dist/llm/types.d.ts.map +1 -0
- package/dist/llm/types.js +8 -0
- package/dist/llm/types.js.map +1 -0
- package/dist/parser/index.d.ts +3 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +19 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/path-security.d.ts +40 -0
- package/dist/parser/path-security.d.ts.map +1 -0
- package/dist/parser/path-security.js +183 -0
- package/dist/parser/path-security.js.map +1 -0
- package/dist/parser/rule-parser.d.ts +50 -0
- package/dist/parser/rule-parser.d.ts.map +1 -0
- package/dist/parser/rule-parser.js +203 -0
- package/dist/parser/rule-parser.js.map +1 -0
- package/dist/schemas/config.d.ts +202 -0
- package/dist/schemas/config.d.ts.map +1 -0
- package/dist/schemas/config.js +96 -0
- package/dist/schemas/config.js.map +1 -0
- package/dist/schemas/index.d.ts +3 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +19 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/rule.d.ts +67 -0
- package/dist/schemas/rule.d.ts.map +1 -0
- package/dist/schemas/rule.js +44 -0
- package/dist/schemas/rule.js.map +1 -0
- package/package.json +69 -0
- package/templates/architecture.md +35 -0
- package/templates/bootstrap-prompt.md +242 -0
- package/templates/config.yaml +25 -0
- package/templates/project.md +44 -0
- 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":"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"}
|
|
@@ -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"}
|