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/windsurf.js
CHANGED
|
@@ -1,138 +1,138 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Windsurf IDE Adapter
|
|
3
|
-
*
|
|
4
|
-
* Generates .windsurf/rules.md file for Windsurf IDE Cascade AI
|
|
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: 'windsurf',
|
|
17
|
-
displayName: 'Windsurf IDE',
|
|
18
|
-
description: 'Project rules for Windsurf IDE Cascade AI',
|
|
19
|
-
outputType: 'single-file',
|
|
20
|
-
outputPath: '.windsurf/rules.md'
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Get output path for Windsurf 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, '.windsurf', 'rules.md');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Check if Windsurf output already exists
|
|
34
|
-
* @param {string} projectRoot - Project root directory
|
|
35
|
-
* @returns {boolean}
|
|
36
|
-
*/
|
|
37
|
-
function exists(projectRoot) {
|
|
38
|
-
const rulesPath = getOutputPath(projectRoot);
|
|
39
|
-
const windsurfDir = path.join(projectRoot, '.windsurf');
|
|
40
|
-
return fs.existsSync(rulesPath) || fs.existsSync(windsurfDir);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Generate Windsurf rules 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 rulesPath = getOutputPath(projectRoot);
|
|
60
|
-
|
|
61
|
-
// Check if file exists and is custom (not managed by us)
|
|
62
|
-
if (fs.existsSync(rulesPath) && !config.force) {
|
|
63
|
-
if (!isManagedFile(rulesPath)) {
|
|
64
|
-
result.errors.push({
|
|
65
|
-
message: '.windsurf/rules.md 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, 'windsurf');
|
|
75
|
-
|
|
76
|
-
// Render template
|
|
77
|
-
const content = renderTemplateByName('windsurf-rules', context);
|
|
78
|
-
|
|
79
|
-
// Create .windsurf directory if it doesn't exist
|
|
80
|
-
const windsurfDir = path.dirname(rulesPath);
|
|
81
|
-
if (!fs.existsSync(windsurfDir)) {
|
|
82
|
-
fs.mkdirSync(windsurfDir, { recursive: true });
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Write output file
|
|
86
|
-
fs.writeFileSync(rulesPath, content, 'utf-8');
|
|
87
|
-
|
|
88
|
-
result.success = true;
|
|
89
|
-
result.files.push({
|
|
90
|
-
path: rulesPath,
|
|
91
|
-
relativePath: '.windsurf/rules.md',
|
|
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 Windsurf output
|
|
106
|
-
* @param {string} projectRoot - Project root directory
|
|
107
|
-
* @returns {object} Validation result
|
|
108
|
-
*/
|
|
109
|
-
function validate(projectRoot) {
|
|
110
|
-
const issues = [];
|
|
111
|
-
const rulesPath = getOutputPath(projectRoot);
|
|
112
|
-
|
|
113
|
-
if (!fs.existsSync(rulesPath)) {
|
|
114
|
-
issues.push({ file: '.windsurf/rules.md', error: 'not found' });
|
|
115
|
-
} else {
|
|
116
|
-
const content = fs.readFileSync(rulesPath, 'utf-8');
|
|
117
|
-
const placeholderMatch = content.match(/\{\{[A-Z_]+\}\}/g);
|
|
118
|
-
if (placeholderMatch && placeholderMatch.length > 0) {
|
|
119
|
-
issues.push({
|
|
120
|
-
file: '.windsurf/rules.md',
|
|
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
|
+
* Windsurf IDE Adapter
|
|
3
|
+
*
|
|
4
|
+
* Generates .windsurf/rules.md file for Windsurf IDE Cascade AI
|
|
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: 'windsurf',
|
|
17
|
+
displayName: 'Windsurf IDE',
|
|
18
|
+
description: 'Project rules for Windsurf IDE Cascade AI',
|
|
19
|
+
outputType: 'single-file',
|
|
20
|
+
outputPath: '.windsurf/rules.md'
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Get output path for Windsurf 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, '.windsurf', 'rules.md');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Check if Windsurf output already exists
|
|
34
|
+
* @param {string} projectRoot - Project root directory
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
function exists(projectRoot) {
|
|
38
|
+
const rulesPath = getOutputPath(projectRoot);
|
|
39
|
+
const windsurfDir = path.join(projectRoot, '.windsurf');
|
|
40
|
+
return fs.existsSync(rulesPath) || fs.existsSync(windsurfDir);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Generate Windsurf rules 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 rulesPath = getOutputPath(projectRoot);
|
|
60
|
+
|
|
61
|
+
// Check if file exists and is custom (not managed by us)
|
|
62
|
+
if (fs.existsSync(rulesPath) && !config.force) {
|
|
63
|
+
if (!isManagedFile(rulesPath)) {
|
|
64
|
+
result.errors.push({
|
|
65
|
+
message: '.windsurf/rules.md 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, 'windsurf');
|
|
75
|
+
|
|
76
|
+
// Render template
|
|
77
|
+
const content = renderTemplateByName('windsurf-rules', context);
|
|
78
|
+
|
|
79
|
+
// Create .windsurf directory if it doesn't exist
|
|
80
|
+
const windsurfDir = path.dirname(rulesPath);
|
|
81
|
+
if (!fs.existsSync(windsurfDir)) {
|
|
82
|
+
fs.mkdirSync(windsurfDir, { recursive: true });
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Write output file
|
|
86
|
+
fs.writeFileSync(rulesPath, content, 'utf-8');
|
|
87
|
+
|
|
88
|
+
result.success = true;
|
|
89
|
+
result.files.push({
|
|
90
|
+
path: rulesPath,
|
|
91
|
+
relativePath: '.windsurf/rules.md',
|
|
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 Windsurf output
|
|
106
|
+
* @param {string} projectRoot - Project root directory
|
|
107
|
+
* @returns {object} Validation result
|
|
108
|
+
*/
|
|
109
|
+
function validate(projectRoot) {
|
|
110
|
+
const issues = [];
|
|
111
|
+
const rulesPath = getOutputPath(projectRoot);
|
|
112
|
+
|
|
113
|
+
if (!fs.existsSync(rulesPath)) {
|
|
114
|
+
issues.push({ file: '.windsurf/rules.md', error: 'not found' });
|
|
115
|
+
} else {
|
|
116
|
+
const content = fs.readFileSync(rulesPath, 'utf-8');
|
|
117
|
+
const placeholderMatch = content.match(/\{\{[A-Z_]+\}\}/g);
|
|
118
|
+
if (placeholderMatch && placeholderMatch.length > 0) {
|
|
119
|
+
issues.push({
|
|
120
|
+
file: '.windsurf/rules.md',
|
|
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
|
+
};
|