create-universal-ai-context 2.5.0 → 2.6.0-final
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 -21
- package/README.md +331 -294
- package/bin/create-ai-context.js +1507 -775
- package/lib/adapters/aider.js +131 -131
- package/lib/adapters/antigravity.js +205 -205
- package/lib/adapters/claude.js +397 -397
- package/lib/adapters/cline.js +125 -125
- package/lib/adapters/continue.js +138 -138
- package/lib/adapters/copilot.js +131 -131
- package/lib/adapters/index.js +78 -78
- package/lib/adapters/windsurf.js +138 -138
- package/lib/ai-context-generator.js +234 -234
- package/lib/ai-orchestrator.js +432 -432
- package/lib/call-tracer.js +444 -444
- package/lib/content-preservation.js +243 -243
- package/lib/cross-tool-sync/file-watcher.js +274 -274
- package/lib/cross-tool-sync/index.js +41 -40
- package/lib/cross-tool-sync/sync-manager.js +540 -512
- package/lib/cross-tool-sync/sync-service.js +297 -297
- package/lib/detector.js +726 -726
- package/lib/doc-discovery.js +741 -741
- package/lib/drift-checker.js +920 -920
- package/lib/environment-detector.js +239 -239
- package/lib/index.js +399 -399
- package/lib/install-hooks.js +82 -82
- package/lib/installer.js +419 -419
- package/lib/migrate.js +328 -328
- package/lib/placeholder.js +632 -632
- package/lib/prompts.js +341 -341
- package/lib/smart-merge.js +540 -540
- package/lib/spinner.js +60 -60
- package/lib/static-analyzer.js +729 -729
- package/lib/template-coordination.js +148 -148
- package/lib/template-populator.js +843 -843
- package/lib/template-renderer.js +392 -392
- package/lib/utils/fs-wrapper.js +79 -79
- package/lib/utils/path-utils.js +60 -60
- package/lib/validate.js +155 -155
- package/package.json +1 -1
- package/templates/AI_CONTEXT.md.template +245 -245
- package/templates/base/README.md +260 -257
- package/templates/base/RPI_WORKFLOW_PLAN.md +325 -320
- package/templates/base/agents/api-developer.md +76 -76
- package/templates/base/agents/context-engineer.md +525 -525
- package/templates/base/agents/core-architect.md +76 -76
- package/templates/base/agents/database-ops.md +76 -76
- package/templates/base/agents/deployment-ops.md +76 -76
- package/templates/base/agents/integration-hub.md +76 -76
- package/templates/base/analytics/README.md +114 -114
- package/templates/base/automation/config.json +58 -58
- package/templates/base/automation/generators/code-mapper.js +308 -308
- package/templates/base/automation/generators/index-builder.js +321 -321
- package/templates/base/automation/hooks/post-commit.sh +83 -83
- package/templates/base/automation/hooks/pre-commit.sh +103 -103
- package/templates/base/ci-templates/README.md +108 -108
- package/templates/base/ci-templates/github-actions/context-check.yml +144 -144
- package/templates/base/ci-templates/github-actions/validate-docs.yml +105 -105
- package/templates/base/commands/analytics.md +238 -238
- package/templates/base/commands/auto-sync.md +172 -172
- package/templates/base/commands/collab.md +194 -194
- package/templates/base/commands/context-optimize.md +226 -0
- package/templates/base/commands/help.md +485 -450
- package/templates/base/commands/rpi-implement.md +164 -115
- package/templates/base/commands/rpi-plan.md +147 -93
- package/templates/base/commands/rpi-research.md +145 -88
- package/templates/base/commands/session-resume.md +144 -144
- package/templates/base/commands/session-save.md +112 -112
- package/templates/base/commands/validate-all.md +77 -77
- package/templates/base/commands/verify-docs-current.md +86 -86
- package/templates/base/config/base.json +57 -57
- package/templates/base/config/environments/development.json +13 -13
- package/templates/base/config/environments/production.json +17 -17
- package/templates/base/config/environments/staging.json +13 -13
- package/templates/base/config/local.json.example +21 -21
- package/templates/base/context/.meta/generated-at.json +18 -18
- package/templates/base/context/ARCHITECTURE_SNAPSHOT.md +156 -156
- package/templates/base/context/CODE_TO_WORKFLOW_MAP.md +94 -94
- package/templates/base/context/FILE_OWNERSHIP.md +57 -57
- package/templates/base/context/INTEGRATION_POINTS.md +92 -92
- package/templates/base/context/KNOWN_GOTCHAS.md +195 -195
- package/templates/base/context/TESTING_MAP.md +95 -95
- package/templates/base/context/WORKFLOW_INDEX.md +129 -129
- package/templates/base/context/workflows/WORKFLOW_TEMPLATE.md +294 -294
- package/templates/base/indexes/agents/CAPABILITY_MATRIX.md +255 -255
- package/templates/base/indexes/agents/CATEGORY_INDEX.md +44 -44
- package/templates/base/indexes/code/CATEGORY_INDEX.md +38 -38
- package/templates/base/indexes/routing/CATEGORY_INDEX.md +39 -39
- package/templates/base/indexes/search/CATEGORY_INDEX.md +39 -39
- package/templates/base/indexes/workflows/CATEGORY_INDEX.md +38 -38
- package/templates/base/knowledge/README.md +98 -98
- package/templates/base/knowledge/sessions/README.md +88 -88
- package/templates/base/knowledge/sessions/TEMPLATE.md +150 -150
- package/templates/base/knowledge/shared/decisions/0001-adopt-context-engineering.md +144 -144
- package/templates/base/knowledge/shared/decisions/README.md +49 -49
- package/templates/base/knowledge/shared/decisions/TEMPLATE.md +123 -123
- package/templates/base/knowledge/shared/patterns/README.md +62 -62
- package/templates/base/knowledge/shared/patterns/TEMPLATE.md +120 -120
- package/templates/base/plans/PLAN_TEMPLATE.md +316 -250
- package/templates/base/research/RESEARCH_TEMPLATE.md +245 -153
- package/templates/base/schemas/agent.schema.json +141 -141
- package/templates/base/schemas/anchors.schema.json +54 -54
- package/templates/base/schemas/automation.schema.json +93 -93
- package/templates/base/schemas/command.schema.json +134 -134
- package/templates/base/schemas/hashes.schema.json +40 -40
- package/templates/base/schemas/manifest.schema.json +117 -117
- package/templates/base/schemas/plan.schema.json +136 -136
- package/templates/base/schemas/research.schema.json +115 -115
- package/templates/base/schemas/roles.schema.json +34 -34
- package/templates/base/schemas/session.schema.json +77 -77
- package/templates/base/schemas/settings.schema.json +244 -244
- package/templates/base/schemas/staleness.schema.json +53 -53
- package/templates/base/schemas/team-config.schema.json +42 -42
- package/templates/base/schemas/workflow.schema.json +126 -126
- package/templates/base/session/checkpoints/.gitkeep +2 -2
- package/templates/base/session/current/state.json +20 -20
- package/templates/base/session/history/.gitkeep +2 -2
- package/templates/base/settings.json +3 -3
- package/templates/base/standards/COMPATIBILITY.md +219 -219
- package/templates/base/standards/EXTENSION_GUIDELINES.md +280 -280
- package/templates/base/standards/QUALITY_CHECKLIST.md +211 -211
- package/templates/base/standards/README.md +66 -66
- package/templates/base/sync/anchors.json +6 -6
- package/templates/base/sync/hashes.json +6 -6
- package/templates/base/sync/staleness.json +10 -10
- package/templates/base/team/README.md +168 -168
- package/templates/base/team/config.json +79 -79
- package/templates/base/team/roles.json +145 -145
- package/templates/base/tools/bin/claude-context.js +151 -151
- package/templates/base/tools/lib/anchor-resolver.js +276 -276
- package/templates/base/tools/lib/config-loader.js +363 -363
- package/templates/base/tools/lib/detector.js +350 -350
- package/templates/base/tools/lib/diagnose.js +206 -206
- package/templates/base/tools/lib/drift-detector.js +373 -373
- package/templates/base/tools/lib/errors.js +199 -199
- package/templates/base/tools/lib/index.js +36 -36
- package/templates/base/tools/lib/init.js +192 -192
- package/templates/base/tools/lib/logger.js +230 -230
- package/templates/base/tools/lib/placeholder.js +201 -201
- package/templates/base/tools/lib/session-manager.js +354 -354
- package/templates/base/tools/lib/validate.js +521 -521
- package/templates/base/tools/package.json +49 -49
- package/templates/handlebars/aider-config.hbs +146 -80
- package/templates/handlebars/antigravity.hbs +377 -377
- package/templates/handlebars/claude.hbs +183 -183
- package/templates/handlebars/cline.hbs +62 -62
- package/templates/handlebars/continue-config.hbs +116 -116
- package/templates/handlebars/copilot.hbs +130 -130
- package/templates/handlebars/partials/gotcha-list.hbs +11 -11
- package/templates/handlebars/partials/header.hbs +3 -3
- package/templates/handlebars/partials/workflow-summary.hbs +16 -16
- package/templates/handlebars/windsurf-rules.hbs +69 -69
- package/templates/hooks/post-commit.hbs +28 -29
- package/templates/hooks/pre-commit.hbs +46 -46
|
@@ -1,234 +1,234 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* AI Context Generator
|
|
3
|
-
*
|
|
4
|
-
* Orchestrates context generation for multiple AI tools.
|
|
5
|
-
* Uses adapters to generate tool-specific output files.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const { getAdapters, getAllAdapters, getAdapterNames } = require('./adapters');
|
|
10
|
-
const { initialize: initTemplateRenderer, buildContext } = require('./template-renderer');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Default AI tools to generate for
|
|
14
|
-
*/
|
|
15
|
-
const DEFAULT_AI_TOOLS = ['claude', 'copilot', 'cline', 'antigravity'];
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Initialize the generator
|
|
19
|
-
*/
|
|
20
|
-
function initialize() {
|
|
21
|
-
initTemplateRenderer();
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Generate context files for selected AI tools
|
|
26
|
-
* @param {object} analysis - Analysis results from static analyzer
|
|
27
|
-
* @param {object} config - Configuration from CLI
|
|
28
|
-
* @param {string} projectRoot - Project root directory
|
|
29
|
-
* @param {object} options - Generation options
|
|
30
|
-
* @returns {object} Generation results
|
|
31
|
-
*/
|
|
32
|
-
async function generateAll(analysis, config, projectRoot, options = {}) {
|
|
33
|
-
const {
|
|
34
|
-
aiTools = config.aiTools || DEFAULT_AI_TOOLS,
|
|
35
|
-
verbose = false,
|
|
36
|
-
dryRun = false
|
|
37
|
-
} = options;
|
|
38
|
-
|
|
39
|
-
const results = {
|
|
40
|
-
success: true,
|
|
41
|
-
generated: [],
|
|
42
|
-
skipped: [],
|
|
43
|
-
errors: [],
|
|
44
|
-
summary: {
|
|
45
|
-
total: 0,
|
|
46
|
-
successful: 0,
|
|
47
|
-
failed: 0,
|
|
48
|
-
files: 0
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
// Initialize template renderer
|
|
53
|
-
initialize();
|
|
54
|
-
|
|
55
|
-
// Get adapters for selected tools
|
|
56
|
-
const adapters = getAdapters(aiTools);
|
|
57
|
-
|
|
58
|
-
if (adapters.length === 0) {
|
|
59
|
-
results.success = false;
|
|
60
|
-
results.errors.push({
|
|
61
|
-
message: `No valid adapters found for: ${aiTools.join(', ')}`,
|
|
62
|
-
validAdapters: getAdapterNames()
|
|
63
|
-
});
|
|
64
|
-
return results;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Generate for each adapter
|
|
68
|
-
for (const adapter of adapters) {
|
|
69
|
-
results.summary.total++;
|
|
70
|
-
|
|
71
|
-
if (verbose) {
|
|
72
|
-
console.log(`Generating ${adapter.displayName} context...`);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
if (dryRun) {
|
|
76
|
-
results.skipped.push({
|
|
77
|
-
adapter: adapter.name,
|
|
78
|
-
reason: 'dry-run mode',
|
|
79
|
-
outputPath: adapter.outputPath
|
|
80
|
-
});
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
try {
|
|
85
|
-
const result = await adapter.generate(analysis, config, projectRoot);
|
|
86
|
-
|
|
87
|
-
if (result.success) {
|
|
88
|
-
results.summary.successful++;
|
|
89
|
-
results.summary.files += result.files.length;
|
|
90
|
-
results.generated.push({
|
|
91
|
-
adapter: adapter.name,
|
|
92
|
-
displayName: adapter.displayName,
|
|
93
|
-
files: result.files,
|
|
94
|
-
outputType: adapter.outputType
|
|
95
|
-
});
|
|
96
|
-
} else {
|
|
97
|
-
results.summary.failed++;
|
|
98
|
-
results.errors.push({
|
|
99
|
-
adapter: adapter.name,
|
|
100
|
-
errors: result.errors
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
} catch (error) {
|
|
104
|
-
results.summary.failed++;
|
|
105
|
-
results.errors.push({
|
|
106
|
-
adapter: adapter.name,
|
|
107
|
-
message: error.message,
|
|
108
|
-
stack: error.stack
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Update overall success
|
|
114
|
-
results.success = results.summary.failed === 0;
|
|
115
|
-
|
|
116
|
-
return results;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* Generate context for a single AI tool
|
|
121
|
-
* @param {string} toolName - AI tool name (claude, copilot, cline, antigravity)
|
|
122
|
-
* @param {object} analysis - Analysis results from static analyzer
|
|
123
|
-
* @param {object} config - Configuration from CLI
|
|
124
|
-
* @param {string} projectRoot - Project root directory
|
|
125
|
-
* @returns {object} Generation result
|
|
126
|
-
*/
|
|
127
|
-
async function generateSingle(toolName, analysis, config, projectRoot) {
|
|
128
|
-
initialize();
|
|
129
|
-
|
|
130
|
-
const adapters = getAdapters([toolName]);
|
|
131
|
-
|
|
132
|
-
if (adapters.length === 0) {
|
|
133
|
-
return {
|
|
134
|
-
success: false,
|
|
135
|
-
error: `Unknown AI tool: ${toolName}`,
|
|
136
|
-
validTools: getAdapterNames()
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
const adapter = adapters[0];
|
|
141
|
-
return adapter.generate(analysis, config, projectRoot);
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Validate generated context files
|
|
146
|
-
* @param {string} projectRoot - Project root directory
|
|
147
|
-
* @param {string[]} aiTools - AI tools to validate
|
|
148
|
-
* @returns {object} Validation results
|
|
149
|
-
*/
|
|
150
|
-
function validateAll(projectRoot, aiTools = DEFAULT_AI_TOOLS) {
|
|
151
|
-
const adapters = getAdapters(aiTools);
|
|
152
|
-
const results = {
|
|
153
|
-
valid: true,
|
|
154
|
-
validations: []
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
for (const adapter of adapters) {
|
|
158
|
-
const validation = adapter.validate(projectRoot);
|
|
159
|
-
results.validations.push({
|
|
160
|
-
adapter: adapter.name,
|
|
161
|
-
displayName: adapter.displayName,
|
|
162
|
-
...validation
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
if (!validation.valid) {
|
|
166
|
-
results.valid = false;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
return results;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Check which AI tool outputs exist
|
|
175
|
-
* @param {string} projectRoot - Project root directory
|
|
176
|
-
* @returns {object} Existence check results
|
|
177
|
-
*/
|
|
178
|
-
function checkExisting(projectRoot) {
|
|
179
|
-
const adapters = getAllAdapters();
|
|
180
|
-
const existing = {};
|
|
181
|
-
|
|
182
|
-
for (const adapter of adapters) {
|
|
183
|
-
existing[adapter.name] = {
|
|
184
|
-
exists: adapter.exists(projectRoot),
|
|
185
|
-
path: adapter.outputPath
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
return existing;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/**
|
|
193
|
-
* Get context information for display
|
|
194
|
-
* @param {object} analysis - Analysis results
|
|
195
|
-
* @param {object} config - Configuration
|
|
196
|
-
* @returns {object} Context info for display
|
|
197
|
-
*/
|
|
198
|
-
function getContextInfo(analysis, config) {
|
|
199
|
-
const context = buildContext(analysis, config);
|
|
200
|
-
|
|
201
|
-
return {
|
|
202
|
-
projectName: context.project.name,
|
|
203
|
-
techStack: context.project.tech_stack,
|
|
204
|
-
workflowCount: context.workflows.length,
|
|
205
|
-
entryPointCount: context.key_files.entry_points.length,
|
|
206
|
-
gotchaCount: context.gotchas.length,
|
|
207
|
-
constraintCount: context.critical_constraints.length
|
|
208
|
-
};
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Get supported AI tools
|
|
213
|
-
* @returns {object[]} Array of tool info objects
|
|
214
|
-
*/
|
|
215
|
-
function getSupportedTools() {
|
|
216
|
-
return getAllAdapters().map(adapter => ({
|
|
217
|
-
name: adapter.name,
|
|
218
|
-
displayName: adapter.displayName,
|
|
219
|
-
description: adapter.description,
|
|
220
|
-
outputType: adapter.outputType,
|
|
221
|
-
outputPath: adapter.outputPath
|
|
222
|
-
}));
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
module.exports = {
|
|
226
|
-
generateAll,
|
|
227
|
-
generateSingle,
|
|
228
|
-
validateAll,
|
|
229
|
-
checkExisting,
|
|
230
|
-
getContextInfo,
|
|
231
|
-
getSupportedTools,
|
|
232
|
-
initialize,
|
|
233
|
-
DEFAULT_AI_TOOLS
|
|
234
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* AI Context Generator
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates context generation for multiple AI tools.
|
|
5
|
+
* Uses adapters to generate tool-specific output files.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const { getAdapters, getAllAdapters, getAdapterNames } = require('./adapters');
|
|
10
|
+
const { initialize: initTemplateRenderer, buildContext } = require('./template-renderer');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Default AI tools to generate for
|
|
14
|
+
*/
|
|
15
|
+
const DEFAULT_AI_TOOLS = ['claude', 'copilot', 'cline', 'antigravity'];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Initialize the generator
|
|
19
|
+
*/
|
|
20
|
+
function initialize() {
|
|
21
|
+
initTemplateRenderer();
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Generate context files for selected AI tools
|
|
26
|
+
* @param {object} analysis - Analysis results from static analyzer
|
|
27
|
+
* @param {object} config - Configuration from CLI
|
|
28
|
+
* @param {string} projectRoot - Project root directory
|
|
29
|
+
* @param {object} options - Generation options
|
|
30
|
+
* @returns {object} Generation results
|
|
31
|
+
*/
|
|
32
|
+
async function generateAll(analysis, config, projectRoot, options = {}) {
|
|
33
|
+
const {
|
|
34
|
+
aiTools = config.aiTools || DEFAULT_AI_TOOLS,
|
|
35
|
+
verbose = false,
|
|
36
|
+
dryRun = false
|
|
37
|
+
} = options;
|
|
38
|
+
|
|
39
|
+
const results = {
|
|
40
|
+
success: true,
|
|
41
|
+
generated: [],
|
|
42
|
+
skipped: [],
|
|
43
|
+
errors: [],
|
|
44
|
+
summary: {
|
|
45
|
+
total: 0,
|
|
46
|
+
successful: 0,
|
|
47
|
+
failed: 0,
|
|
48
|
+
files: 0
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
// Initialize template renderer
|
|
53
|
+
initialize();
|
|
54
|
+
|
|
55
|
+
// Get adapters for selected tools
|
|
56
|
+
const adapters = getAdapters(aiTools);
|
|
57
|
+
|
|
58
|
+
if (adapters.length === 0) {
|
|
59
|
+
results.success = false;
|
|
60
|
+
results.errors.push({
|
|
61
|
+
message: `No valid adapters found for: ${aiTools.join(', ')}`,
|
|
62
|
+
validAdapters: getAdapterNames()
|
|
63
|
+
});
|
|
64
|
+
return results;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Generate for each adapter
|
|
68
|
+
for (const adapter of adapters) {
|
|
69
|
+
results.summary.total++;
|
|
70
|
+
|
|
71
|
+
if (verbose) {
|
|
72
|
+
console.log(`Generating ${adapter.displayName} context...`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
if (dryRun) {
|
|
76
|
+
results.skipped.push({
|
|
77
|
+
adapter: adapter.name,
|
|
78
|
+
reason: 'dry-run mode',
|
|
79
|
+
outputPath: adapter.outputPath
|
|
80
|
+
});
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const result = await adapter.generate(analysis, config, projectRoot);
|
|
86
|
+
|
|
87
|
+
if (result.success) {
|
|
88
|
+
results.summary.successful++;
|
|
89
|
+
results.summary.files += result.files.length;
|
|
90
|
+
results.generated.push({
|
|
91
|
+
adapter: adapter.name,
|
|
92
|
+
displayName: adapter.displayName,
|
|
93
|
+
files: result.files,
|
|
94
|
+
outputType: adapter.outputType
|
|
95
|
+
});
|
|
96
|
+
} else {
|
|
97
|
+
results.summary.failed++;
|
|
98
|
+
results.errors.push({
|
|
99
|
+
adapter: adapter.name,
|
|
100
|
+
errors: result.errors
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
} catch (error) {
|
|
104
|
+
results.summary.failed++;
|
|
105
|
+
results.errors.push({
|
|
106
|
+
adapter: adapter.name,
|
|
107
|
+
message: error.message,
|
|
108
|
+
stack: error.stack
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Update overall success
|
|
114
|
+
results.success = results.summary.failed === 0;
|
|
115
|
+
|
|
116
|
+
return results;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Generate context for a single AI tool
|
|
121
|
+
* @param {string} toolName - AI tool name (claude, copilot, cline, antigravity)
|
|
122
|
+
* @param {object} analysis - Analysis results from static analyzer
|
|
123
|
+
* @param {object} config - Configuration from CLI
|
|
124
|
+
* @param {string} projectRoot - Project root directory
|
|
125
|
+
* @returns {object} Generation result
|
|
126
|
+
*/
|
|
127
|
+
async function generateSingle(toolName, analysis, config, projectRoot) {
|
|
128
|
+
initialize();
|
|
129
|
+
|
|
130
|
+
const adapters = getAdapters([toolName]);
|
|
131
|
+
|
|
132
|
+
if (adapters.length === 0) {
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
error: `Unknown AI tool: ${toolName}`,
|
|
136
|
+
validTools: getAdapterNames()
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const adapter = adapters[0];
|
|
141
|
+
return adapter.generate(analysis, config, projectRoot);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Validate generated context files
|
|
146
|
+
* @param {string} projectRoot - Project root directory
|
|
147
|
+
* @param {string[]} aiTools - AI tools to validate
|
|
148
|
+
* @returns {object} Validation results
|
|
149
|
+
*/
|
|
150
|
+
function validateAll(projectRoot, aiTools = DEFAULT_AI_TOOLS) {
|
|
151
|
+
const adapters = getAdapters(aiTools);
|
|
152
|
+
const results = {
|
|
153
|
+
valid: true,
|
|
154
|
+
validations: []
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
for (const adapter of adapters) {
|
|
158
|
+
const validation = adapter.validate(projectRoot);
|
|
159
|
+
results.validations.push({
|
|
160
|
+
adapter: adapter.name,
|
|
161
|
+
displayName: adapter.displayName,
|
|
162
|
+
...validation
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
if (!validation.valid) {
|
|
166
|
+
results.valid = false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return results;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Check which AI tool outputs exist
|
|
175
|
+
* @param {string} projectRoot - Project root directory
|
|
176
|
+
* @returns {object} Existence check results
|
|
177
|
+
*/
|
|
178
|
+
function checkExisting(projectRoot) {
|
|
179
|
+
const adapters = getAllAdapters();
|
|
180
|
+
const existing = {};
|
|
181
|
+
|
|
182
|
+
for (const adapter of adapters) {
|
|
183
|
+
existing[adapter.name] = {
|
|
184
|
+
exists: adapter.exists(projectRoot),
|
|
185
|
+
path: adapter.outputPath
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return existing;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Get context information for display
|
|
194
|
+
* @param {object} analysis - Analysis results
|
|
195
|
+
* @param {object} config - Configuration
|
|
196
|
+
* @returns {object} Context info for display
|
|
197
|
+
*/
|
|
198
|
+
function getContextInfo(analysis, config) {
|
|
199
|
+
const context = buildContext(analysis, config);
|
|
200
|
+
|
|
201
|
+
return {
|
|
202
|
+
projectName: context.project.name,
|
|
203
|
+
techStack: context.project.tech_stack,
|
|
204
|
+
workflowCount: context.workflows.length,
|
|
205
|
+
entryPointCount: context.key_files.entry_points.length,
|
|
206
|
+
gotchaCount: context.gotchas.length,
|
|
207
|
+
constraintCount: context.critical_constraints.length
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Get supported AI tools
|
|
213
|
+
* @returns {object[]} Array of tool info objects
|
|
214
|
+
*/
|
|
215
|
+
function getSupportedTools() {
|
|
216
|
+
return getAllAdapters().map(adapter => ({
|
|
217
|
+
name: adapter.name,
|
|
218
|
+
displayName: adapter.displayName,
|
|
219
|
+
description: adapter.description,
|
|
220
|
+
outputType: adapter.outputType,
|
|
221
|
+
outputPath: adapter.outputPath
|
|
222
|
+
}));
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
module.exports = {
|
|
226
|
+
generateAll,
|
|
227
|
+
generateSingle,
|
|
228
|
+
validateAll,
|
|
229
|
+
checkExisting,
|
|
230
|
+
getContextInfo,
|
|
231
|
+
getSupportedTools,
|
|
232
|
+
initialize,
|
|
233
|
+
DEFAULT_AI_TOOLS
|
|
234
|
+
};
|