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
package/lib/adapters/cline.js
CHANGED
|
@@ -1,125 +1,125 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cline Adapter
|
|
3
|
-
*
|
|
4
|
-
* Generates .clinerules file for Cline VS Code extension.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const fs = require('fs');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const { renderTemplateByName, buildContext } = require('../template-renderer');
|
|
10
|
-
const { isManagedFile } = require('../template-coordination');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Adapter metadata
|
|
14
|
-
*/
|
|
15
|
-
const adapter = {
|
|
16
|
-
name: 'cline',
|
|
17
|
-
displayName: 'Cline',
|
|
18
|
-
description: 'Rules file for Cline VS Code extension',
|
|
19
|
-
outputType: 'single-file',
|
|
20
|
-
outputPath: '.clinerules'
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Get output path for Cline rules file
|
|
25
|
-
* @param {string} projectRoot - Project root directory
|
|
26
|
-
* @returns {string} Output file path
|
|
27
|
-
*/
|
|
28
|
-
function getOutputPath(projectRoot) {
|
|
29
|
-
return path.join(projectRoot, '.clinerules');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Check if Cline output already exists
|
|
34
|
-
* @param {string} projectRoot - Project root directory
|
|
35
|
-
* @returns {boolean}
|
|
36
|
-
*/
|
|
37
|
-
function exists(projectRoot) {
|
|
38
|
-
return fs.existsSync(getOutputPath(projectRoot));
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Generate Cline rules file
|
|
43
|
-
* @param {object} analysis - Analysis results from static analyzer
|
|
44
|
-
* @param {object} config - Configuration from CLI
|
|
45
|
-
* @param {string} projectRoot - Project root directory
|
|
46
|
-
* @returns {object} Generation result
|
|
47
|
-
*/
|
|
48
|
-
async function generate(analysis, config, projectRoot) {
|
|
49
|
-
const result = {
|
|
50
|
-
success: false,
|
|
51
|
-
adapter: adapter.name,
|
|
52
|
-
files: [],
|
|
53
|
-
errors: []
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
try {
|
|
57
|
-
const outputPath = getOutputPath(projectRoot);
|
|
58
|
-
|
|
59
|
-
// Check if file exists and is custom (not managed by us)
|
|
60
|
-
if (fs.existsSync(outputPath) && !config.force) {
|
|
61
|
-
if (!isManagedFile(outputPath)) {
|
|
62
|
-
result.errors.push({
|
|
63
|
-
message: '.clinerules exists and appears to be custom. Use --force to overwrite.',
|
|
64
|
-
code: 'EXISTS_CUSTOM',
|
|
65
|
-
severity: 'error'
|
|
66
|
-
});
|
|
67
|
-
return result;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Build context from analysis
|
|
72
|
-
const context = buildContext(analysis, config, 'cline');
|
|
73
|
-
|
|
74
|
-
// Render template
|
|
75
|
-
const content = renderTemplateByName('cline', context);
|
|
76
|
-
|
|
77
|
-
// Write output file
|
|
78
|
-
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
79
|
-
|
|
80
|
-
result.success = true;
|
|
81
|
-
result.files.push({
|
|
82
|
-
path: outputPath,
|
|
83
|
-
relativePath: '.clinerules',
|
|
84
|
-
size: content.length
|
|
85
|
-
});
|
|
86
|
-
} catch (error) {
|
|
87
|
-
result.errors.push({
|
|
88
|
-
message: error.message,
|
|
89
|
-
stack: error.stack
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return result;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/**
|
|
97
|
-
* Validate Cline output
|
|
98
|
-
* @param {string} projectRoot - Project root directory
|
|
99
|
-
* @returns {object} Validation result
|
|
100
|
-
*/
|
|
101
|
-
function validate(projectRoot) {
|
|
102
|
-
const outputPath = getOutputPath(projectRoot);
|
|
103
|
-
|
|
104
|
-
if (!fs.existsSync(outputPath)) {
|
|
105
|
-
return {
|
|
106
|
-
valid: false,
|
|
107
|
-
error: '.clinerules not found'
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const content = fs.readFileSync(outputPath, 'utf-8');
|
|
112
|
-
|
|
113
|
-
return {
|
|
114
|
-
valid: true,
|
|
115
|
-
size: content.length
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
module.exports = {
|
|
120
|
-
...adapter,
|
|
121
|
-
getOutputPath,
|
|
122
|
-
exists,
|
|
123
|
-
generate,
|
|
124
|
-
validate
|
|
125
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Cline Adapter
|
|
3
|
+
*
|
|
4
|
+
* Generates .clinerules file for Cline VS Code extension.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const { renderTemplateByName, buildContext } = require('../template-renderer');
|
|
10
|
+
const { isManagedFile } = require('../template-coordination');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Adapter metadata
|
|
14
|
+
*/
|
|
15
|
+
const adapter = {
|
|
16
|
+
name: 'cline',
|
|
17
|
+
displayName: 'Cline',
|
|
18
|
+
description: 'Rules file for Cline VS Code extension',
|
|
19
|
+
outputType: 'single-file',
|
|
20
|
+
outputPath: '.clinerules'
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get output path for Cline rules file
|
|
25
|
+
* @param {string} projectRoot - Project root directory
|
|
26
|
+
* @returns {string} Output file path
|
|
27
|
+
*/
|
|
28
|
+
function getOutputPath(projectRoot) {
|
|
29
|
+
return path.join(projectRoot, '.clinerules');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Check if Cline output already exists
|
|
34
|
+
* @param {string} projectRoot - Project root directory
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
function exists(projectRoot) {
|
|
38
|
+
return fs.existsSync(getOutputPath(projectRoot));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Generate Cline rules file
|
|
43
|
+
* @param {object} analysis - Analysis results from static analyzer
|
|
44
|
+
* @param {object} config - Configuration from CLI
|
|
45
|
+
* @param {string} projectRoot - Project root directory
|
|
46
|
+
* @returns {object} Generation result
|
|
47
|
+
*/
|
|
48
|
+
async function generate(analysis, config, projectRoot) {
|
|
49
|
+
const result = {
|
|
50
|
+
success: false,
|
|
51
|
+
adapter: adapter.name,
|
|
52
|
+
files: [],
|
|
53
|
+
errors: []
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
const outputPath = getOutputPath(projectRoot);
|
|
58
|
+
|
|
59
|
+
// Check if file exists and is custom (not managed by us)
|
|
60
|
+
if (fs.existsSync(outputPath) && !config.force) {
|
|
61
|
+
if (!isManagedFile(outputPath)) {
|
|
62
|
+
result.errors.push({
|
|
63
|
+
message: '.clinerules exists and appears to be custom. Use --force to overwrite.',
|
|
64
|
+
code: 'EXISTS_CUSTOM',
|
|
65
|
+
severity: 'error'
|
|
66
|
+
});
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Build context from analysis
|
|
72
|
+
const context = buildContext(analysis, config, 'cline');
|
|
73
|
+
|
|
74
|
+
// Render template
|
|
75
|
+
const content = renderTemplateByName('cline', context);
|
|
76
|
+
|
|
77
|
+
// Write output file
|
|
78
|
+
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
79
|
+
|
|
80
|
+
result.success = true;
|
|
81
|
+
result.files.push({
|
|
82
|
+
path: outputPath,
|
|
83
|
+
relativePath: '.clinerules',
|
|
84
|
+
size: content.length
|
|
85
|
+
});
|
|
86
|
+
} catch (error) {
|
|
87
|
+
result.errors.push({
|
|
88
|
+
message: error.message,
|
|
89
|
+
stack: error.stack
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Validate Cline output
|
|
98
|
+
* @param {string} projectRoot - Project root directory
|
|
99
|
+
* @returns {object} Validation result
|
|
100
|
+
*/
|
|
101
|
+
function validate(projectRoot) {
|
|
102
|
+
const outputPath = getOutputPath(projectRoot);
|
|
103
|
+
|
|
104
|
+
if (!fs.existsSync(outputPath)) {
|
|
105
|
+
return {
|
|
106
|
+
valid: false,
|
|
107
|
+
error: '.clinerules not found'
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const content = fs.readFileSync(outputPath, 'utf-8');
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
valid: true,
|
|
115
|
+
size: content.length
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
module.exports = {
|
|
120
|
+
...adapter,
|
|
121
|
+
getOutputPath,
|
|
122
|
+
exists,
|
|
123
|
+
generate,
|
|
124
|
+
validate
|
|
125
|
+
};
|
package/lib/adapters/continue.js
CHANGED
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Continue Adapter
|
|
3
|
-
*
|
|
4
|
-
* Generates .continue/config.json file for Continue extension
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const fs = require('fs');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const { renderTemplateByName, buildContext } = require('../template-renderer');
|
|
10
|
-
const { isManagedFile } = require('../template-coordination');
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Adapter metadata
|
|
14
|
-
*/
|
|
15
|
-
const adapter = {
|
|
16
|
-
name: 'continue',
|
|
17
|
-
displayName: 'Continue',
|
|
18
|
-
description: 'Configuration file for Continue VS Code/JetBrains extension',
|
|
19
|
-
outputType: 'single-file',
|
|
20
|
-
outputPath: '.continue/config.json'
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Get output path for Continue config file
|
|
25
|
-
* @param {string} projectRoot - Project root directory
|
|
26
|
-
* @returns {string} Output file path
|
|
27
|
-
*/
|
|
28
|
-
function getOutputPath(projectRoot) {
|
|
29
|
-
return path.join(projectRoot, '.continue', 'config.json');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Check if Continue output already exists
|
|
34
|
-
* @param {string} projectRoot - Project root directory
|
|
35
|
-
* @returns {boolean}
|
|
36
|
-
*/
|
|
37
|
-
function exists(projectRoot) {
|
|
38
|
-
const configPath = getOutputPath(projectRoot);
|
|
39
|
-
const continueDir = path.join(projectRoot, '.continue');
|
|
40
|
-
return fs.existsSync(configPath) || fs.existsSync(continueDir);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Generate Continue config file
|
|
45
|
-
* @param {object} analysis - Analysis results from static analyzer
|
|
46
|
-
* @param {object} config - Configuration from CLI
|
|
47
|
-
* @param {string} projectRoot - Project root directory
|
|
48
|
-
* @returns {object} Generation result
|
|
49
|
-
*/
|
|
50
|
-
async function generate(analysis, config, projectRoot) {
|
|
51
|
-
const result = {
|
|
52
|
-
success: false,
|
|
53
|
-
adapter: adapter.name,
|
|
54
|
-
files: [],
|
|
55
|
-
errors: []
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
try {
|
|
59
|
-
const configPath = getOutputPath(projectRoot);
|
|
60
|
-
|
|
61
|
-
// Check if file exists and is custom (not managed by us)
|
|
62
|
-
if (fs.existsSync(configPath) && !config.force) {
|
|
63
|
-
if (!isManagedFile(configPath)) {
|
|
64
|
-
result.errors.push({
|
|
65
|
-
message: '.continue/config.json exists and appears to be custom. Use --force to overwrite.',
|
|
66
|
-
code: 'EXISTS_CUSTOM',
|
|
67
|
-
severity: 'error'
|
|
68
|
-
});
|
|
69
|
-
return result;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Build context from analysis
|
|
74
|
-
const context = buildContext(analysis, config, 'continue');
|
|
75
|
-
|
|
76
|
-
// Render template
|
|
77
|
-
const content = renderTemplateByName('continue-config', context);
|
|
78
|
-
|
|
79
|
-
// Create .continue directory if it doesn't exist
|
|
80
|
-
const continueDir = path.dirname(configPath);
|
|
81
|
-
if (!fs.existsSync(continueDir)) {
|
|
82
|
-
fs.mkdirSync(continueDir, { recursive: true });
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Write output file
|
|
86
|
-
fs.writeFileSync(configPath, content, 'utf-8');
|
|
87
|
-
|
|
88
|
-
result.success = true;
|
|
89
|
-
result.files.push({
|
|
90
|
-
path: configPath,
|
|
91
|
-
relativePath: '.continue/config.json',
|
|
92
|
-
size: content.length
|
|
93
|
-
});
|
|
94
|
-
} catch (error) {
|
|
95
|
-
result.errors.push({
|
|
96
|
-
message: error.message,
|
|
97
|
-
stack: error.stack
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return result;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Validate Continue output
|
|
106
|
-
* @param {string} projectRoot - Project root directory
|
|
107
|
-
* @returns {object} Validation result
|
|
108
|
-
*/
|
|
109
|
-
function validate(projectRoot) {
|
|
110
|
-
const issues = [];
|
|
111
|
-
const configPath = getOutputPath(projectRoot);
|
|
112
|
-
|
|
113
|
-
if (!fs.existsSync(configPath)) {
|
|
114
|
-
issues.push({ file: '.continue/config.json', error: 'not found' });
|
|
115
|
-
} else {
|
|
116
|
-
const content = fs.readFileSync(configPath, 'utf-8');
|
|
117
|
-
const placeholderMatch = content.match(/\{\{[A-Z_]+\}\}/g);
|
|
118
|
-
if (placeholderMatch && placeholderMatch.length > 0) {
|
|
119
|
-
issues.push({
|
|
120
|
-
file: '.continue/config.json',
|
|
121
|
-
error: `Found ${placeholderMatch.length} unreplaced placeholders`
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return {
|
|
127
|
-
valid: issues.filter(i => i.severity !== 'warning').length === 0,
|
|
128
|
-
issues
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
module.exports = {
|
|
133
|
-
...adapter,
|
|
134
|
-
getOutputPath,
|
|
135
|
-
exists,
|
|
136
|
-
generate,
|
|
137
|
-
validate
|
|
138
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Continue Adapter
|
|
3
|
+
*
|
|
4
|
+
* Generates .continue/config.json file for Continue extension
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const { renderTemplateByName, buildContext } = require('../template-renderer');
|
|
10
|
+
const { isManagedFile } = require('../template-coordination');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Adapter metadata
|
|
14
|
+
*/
|
|
15
|
+
const adapter = {
|
|
16
|
+
name: 'continue',
|
|
17
|
+
displayName: 'Continue',
|
|
18
|
+
description: 'Configuration file for Continue VS Code/JetBrains extension',
|
|
19
|
+
outputType: 'single-file',
|
|
20
|
+
outputPath: '.continue/config.json'
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get output path for Continue config file
|
|
25
|
+
* @param {string} projectRoot - Project root directory
|
|
26
|
+
* @returns {string} Output file path
|
|
27
|
+
*/
|
|
28
|
+
function getOutputPath(projectRoot) {
|
|
29
|
+
return path.join(projectRoot, '.continue', 'config.json');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Check if Continue output already exists
|
|
34
|
+
* @param {string} projectRoot - Project root directory
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
function exists(projectRoot) {
|
|
38
|
+
const configPath = getOutputPath(projectRoot);
|
|
39
|
+
const continueDir = path.join(projectRoot, '.continue');
|
|
40
|
+
return fs.existsSync(configPath) || fs.existsSync(continueDir);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Generate Continue config file
|
|
45
|
+
* @param {object} analysis - Analysis results from static analyzer
|
|
46
|
+
* @param {object} config - Configuration from CLI
|
|
47
|
+
* @param {string} projectRoot - Project root directory
|
|
48
|
+
* @returns {object} Generation result
|
|
49
|
+
*/
|
|
50
|
+
async function generate(analysis, config, projectRoot) {
|
|
51
|
+
const result = {
|
|
52
|
+
success: false,
|
|
53
|
+
adapter: adapter.name,
|
|
54
|
+
files: [],
|
|
55
|
+
errors: []
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
const configPath = getOutputPath(projectRoot);
|
|
60
|
+
|
|
61
|
+
// Check if file exists and is custom (not managed by us)
|
|
62
|
+
if (fs.existsSync(configPath) && !config.force) {
|
|
63
|
+
if (!isManagedFile(configPath)) {
|
|
64
|
+
result.errors.push({
|
|
65
|
+
message: '.continue/config.json exists and appears to be custom. Use --force to overwrite.',
|
|
66
|
+
code: 'EXISTS_CUSTOM',
|
|
67
|
+
severity: 'error'
|
|
68
|
+
});
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Build context from analysis
|
|
74
|
+
const context = buildContext(analysis, config, 'continue');
|
|
75
|
+
|
|
76
|
+
// Render template
|
|
77
|
+
const content = renderTemplateByName('continue-config', context);
|
|
78
|
+
|
|
79
|
+
// Create .continue directory if it doesn't exist
|
|
80
|
+
const continueDir = path.dirname(configPath);
|
|
81
|
+
if (!fs.existsSync(continueDir)) {
|
|
82
|
+
fs.mkdirSync(continueDir, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Write output file
|
|
86
|
+
fs.writeFileSync(configPath, content, 'utf-8');
|
|
87
|
+
|
|
88
|
+
result.success = true;
|
|
89
|
+
result.files.push({
|
|
90
|
+
path: configPath,
|
|
91
|
+
relativePath: '.continue/config.json',
|
|
92
|
+
size: content.length
|
|
93
|
+
});
|
|
94
|
+
} catch (error) {
|
|
95
|
+
result.errors.push({
|
|
96
|
+
message: error.message,
|
|
97
|
+
stack: error.stack
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return result;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Validate Continue output
|
|
106
|
+
* @param {string} projectRoot - Project root directory
|
|
107
|
+
* @returns {object} Validation result
|
|
108
|
+
*/
|
|
109
|
+
function validate(projectRoot) {
|
|
110
|
+
const issues = [];
|
|
111
|
+
const configPath = getOutputPath(projectRoot);
|
|
112
|
+
|
|
113
|
+
if (!fs.existsSync(configPath)) {
|
|
114
|
+
issues.push({ file: '.continue/config.json', error: 'not found' });
|
|
115
|
+
} else {
|
|
116
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
117
|
+
const placeholderMatch = content.match(/\{\{[A-Z_]+\}\}/g);
|
|
118
|
+
if (placeholderMatch && placeholderMatch.length > 0) {
|
|
119
|
+
issues.push({
|
|
120
|
+
file: '.continue/config.json',
|
|
121
|
+
error: `Found ${placeholderMatch.length} unreplaced placeholders`
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
valid: issues.filter(i => i.severity !== 'warning').length === 0,
|
|
128
|
+
issues
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
module.exports = {
|
|
133
|
+
...adapter,
|
|
134
|
+
getOutputPath,
|
|
135
|
+
exists,
|
|
136
|
+
generate,
|
|
137
|
+
validate
|
|
138
|
+
};
|