create-universal-ai-context 2.0.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 +171 -0
- package/bin/create-ai-context.js +337 -0
- package/lib/adapters/antigravity.js +160 -0
- package/lib/adapters/claude.js +122 -0
- package/lib/adapters/cline.js +111 -0
- package/lib/adapters/copilot.js +117 -0
- package/lib/adapters/index.js +69 -0
- package/lib/ai-context-generator.js +234 -0
- package/lib/ai-orchestrator.js +431 -0
- package/lib/call-tracer.js +444 -0
- package/lib/detector.js +726 -0
- package/lib/environment-detector.js +239 -0
- package/lib/index.js +310 -0
- package/lib/installer.js +418 -0
- package/lib/migrate.js +319 -0
- package/lib/placeholder.js +541 -0
- package/lib/prompts.js +287 -0
- package/lib/spinner.js +60 -0
- package/lib/static-analyzer.js +729 -0
- package/lib/template-populator.js +843 -0
- package/lib/template-renderer.js +382 -0
- package/lib/validate.js +155 -0
- package/package.json +70 -0
- package/templates/AI_CONTEXT.md.template +245 -0
- package/templates/base/README.md +257 -0
- package/templates/base/RPI_WORKFLOW_PLAN.md +320 -0
- package/templates/base/agents/api-developer.md +76 -0
- package/templates/base/agents/context-engineer.md +525 -0
- package/templates/base/agents/core-architect.md +76 -0
- package/templates/base/agents/database-ops.md +76 -0
- package/templates/base/agents/deployment-ops.md +76 -0
- package/templates/base/agents/integration-hub.md +76 -0
- package/templates/base/analytics/README.md +114 -0
- package/templates/base/automation/config.json +58 -0
- package/templates/base/automation/generators/code-mapper.js +308 -0
- package/templates/base/automation/generators/index-builder.js +321 -0
- package/templates/base/automation/hooks/post-commit.sh +83 -0
- package/templates/base/automation/hooks/pre-commit.sh +103 -0
- package/templates/base/ci-templates/README.md +108 -0
- package/templates/base/ci-templates/github-actions/context-check.yml +144 -0
- package/templates/base/ci-templates/github-actions/validate-docs.yml +105 -0
- package/templates/base/commands/analytics.md +238 -0
- package/templates/base/commands/auto-sync.md +172 -0
- package/templates/base/commands/collab.md +194 -0
- package/templates/base/commands/help.md +450 -0
- package/templates/base/commands/rpi-implement.md +115 -0
- package/templates/base/commands/rpi-plan.md +93 -0
- package/templates/base/commands/rpi-research.md +88 -0
- package/templates/base/commands/session-resume.md +144 -0
- package/templates/base/commands/session-save.md +112 -0
- package/templates/base/commands/validate-all.md +77 -0
- package/templates/base/commands/verify-docs-current.md +86 -0
- package/templates/base/config/base.json +57 -0
- package/templates/base/config/environments/development.json +13 -0
- package/templates/base/config/environments/production.json +17 -0
- package/templates/base/config/environments/staging.json +13 -0
- package/templates/base/config/local.json.example +21 -0
- package/templates/base/context/.meta/generated-at.json +18 -0
- package/templates/base/context/ARCHITECTURE_SNAPSHOT.md +156 -0
- package/templates/base/context/CODE_TO_WORKFLOW_MAP.md +94 -0
- package/templates/base/context/FILE_OWNERSHIP.md +57 -0
- package/templates/base/context/INTEGRATION_POINTS.md +92 -0
- package/templates/base/context/KNOWN_GOTCHAS.md +195 -0
- package/templates/base/context/TESTING_MAP.md +95 -0
- package/templates/base/context/WORKFLOW_INDEX.md +129 -0
- package/templates/base/context/workflows/WORKFLOW_TEMPLATE.md +294 -0
- package/templates/base/indexes/agents/CAPABILITY_MATRIX.md +255 -0
- package/templates/base/indexes/agents/CATEGORY_INDEX.md +44 -0
- package/templates/base/indexes/code/CATEGORY_INDEX.md +38 -0
- package/templates/base/indexes/routing/CATEGORY_INDEX.md +39 -0
- package/templates/base/indexes/search/CATEGORY_INDEX.md +39 -0
- package/templates/base/indexes/workflows/CATEGORY_INDEX.md +38 -0
- package/templates/base/knowledge/README.md +98 -0
- package/templates/base/knowledge/sessions/README.md +88 -0
- package/templates/base/knowledge/sessions/TEMPLATE.md +150 -0
- package/templates/base/knowledge/shared/decisions/0001-adopt-context-engineering.md +144 -0
- package/templates/base/knowledge/shared/decisions/README.md +49 -0
- package/templates/base/knowledge/shared/decisions/TEMPLATE.md +123 -0
- package/templates/base/knowledge/shared/patterns/README.md +62 -0
- package/templates/base/knowledge/shared/patterns/TEMPLATE.md +120 -0
- package/templates/base/plans/PLAN_TEMPLATE.md +250 -0
- package/templates/base/plans/active/.gitkeep +0 -0
- package/templates/base/plans/completed/.gitkeep +0 -0
- package/templates/base/research/RESEARCH_TEMPLATE.md +153 -0
- package/templates/base/research/active/.gitkeep +0 -0
- package/templates/base/research/completed/.gitkeep +0 -0
- package/templates/base/schemas/agent.schema.json +141 -0
- package/templates/base/schemas/anchors.schema.json +54 -0
- package/templates/base/schemas/automation.schema.json +93 -0
- package/templates/base/schemas/command.schema.json +134 -0
- package/templates/base/schemas/hashes.schema.json +40 -0
- package/templates/base/schemas/manifest.schema.json +117 -0
- package/templates/base/schemas/plan.schema.json +136 -0
- package/templates/base/schemas/research.schema.json +115 -0
- package/templates/base/schemas/roles.schema.json +34 -0
- package/templates/base/schemas/session.schema.json +77 -0
- package/templates/base/schemas/settings.schema.json +244 -0
- package/templates/base/schemas/staleness.schema.json +53 -0
- package/templates/base/schemas/team-config.schema.json +42 -0
- package/templates/base/schemas/workflow.schema.json +126 -0
- package/templates/base/session/checkpoints/.gitkeep +2 -0
- package/templates/base/session/current/state.json +20 -0
- package/templates/base/session/history/.gitkeep +2 -0
- package/templates/base/settings.json +3 -0
- package/templates/base/standards/COMPATIBILITY.md +219 -0
- package/templates/base/standards/EXTENSION_GUIDELINES.md +280 -0
- package/templates/base/standards/QUALITY_CHECKLIST.md +211 -0
- package/templates/base/standards/README.md +66 -0
- package/templates/base/sync/anchors.json +6 -0
- package/templates/base/sync/hashes.json +6 -0
- package/templates/base/sync/staleness.json +10 -0
- package/templates/base/team/README.md +168 -0
- package/templates/base/team/config.json +79 -0
- package/templates/base/team/roles.json +145 -0
- package/templates/base/tools/bin/claude-context.js +151 -0
- package/templates/base/tools/lib/anchor-resolver.js +276 -0
- package/templates/base/tools/lib/config-loader.js +363 -0
- package/templates/base/tools/lib/detector.js +350 -0
- package/templates/base/tools/lib/diagnose.js +206 -0
- package/templates/base/tools/lib/drift-detector.js +373 -0
- package/templates/base/tools/lib/errors.js +199 -0
- package/templates/base/tools/lib/index.js +36 -0
- package/templates/base/tools/lib/init.js +192 -0
- package/templates/base/tools/lib/logger.js +230 -0
- package/templates/base/tools/lib/placeholder.js +201 -0
- package/templates/base/tools/lib/session-manager.js +354 -0
- package/templates/base/tools/lib/validate.js +521 -0
- package/templates/base/tools/package.json +49 -0
- package/templates/handlebars/antigravity.hbs +337 -0
- package/templates/handlebars/claude.hbs +184 -0
- package/templates/handlebars/cline.hbs +63 -0
- package/templates/handlebars/copilot.hbs +131 -0
- package/templates/handlebars/partials/gotcha-list.hbs +11 -0
- package/templates/handlebars/partials/header.hbs +3 -0
- package/templates/handlebars/partials/workflow-summary.hbs +16 -0
package/lib/migrate.js
ADDED
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Context Engineering - Migration Script
|
|
3
|
+
*
|
|
4
|
+
* Migrates v1.x installations (.claude/, CLAUDE.md) to v2.0 format
|
|
5
|
+
* (.ai-context/, AI_CONTEXT.md).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { glob } = require('glob');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Old and new directory/file names
|
|
14
|
+
*/
|
|
15
|
+
const MIGRATIONS = {
|
|
16
|
+
directory: {
|
|
17
|
+
old: '.claude',
|
|
18
|
+
new: '.ai-context'
|
|
19
|
+
},
|
|
20
|
+
entryFile: {
|
|
21
|
+
old: 'CLAUDE.md',
|
|
22
|
+
new: 'AI_CONTEXT.md'
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Patterns to update in file contents
|
|
28
|
+
*/
|
|
29
|
+
const CONTENT_REPLACEMENTS = [
|
|
30
|
+
{ pattern: /\.claude\//g, replacement: '.ai-context/' },
|
|
31
|
+
{ pattern: /\.claude\\/g, replacement: '.ai-context\\' },
|
|
32
|
+
{ pattern: /CLAUDE\.md/g, replacement: 'AI_CONTEXT.md' },
|
|
33
|
+
{ pattern: /create-claude-context/g, replacement: 'create-ai-context' },
|
|
34
|
+
{ pattern: /claude-context/g, replacement: 'ai-context' }
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Check if a project has v1.x installation
|
|
39
|
+
* @param {string} projectRoot - Project root directory
|
|
40
|
+
* @returns {object} Detection result
|
|
41
|
+
*/
|
|
42
|
+
function detectV1Installation(projectRoot) {
|
|
43
|
+
const result = {
|
|
44
|
+
hasV1: false,
|
|
45
|
+
hasV2: false,
|
|
46
|
+
oldDir: null,
|
|
47
|
+
oldFile: null,
|
|
48
|
+
newDir: null,
|
|
49
|
+
newFile: null
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const oldDirPath = path.join(projectRoot, MIGRATIONS.directory.old);
|
|
53
|
+
const oldFilePath = path.join(projectRoot, MIGRATIONS.entryFile.old);
|
|
54
|
+
const newDirPath = path.join(projectRoot, MIGRATIONS.directory.new);
|
|
55
|
+
const newFilePath = path.join(projectRoot, MIGRATIONS.entryFile.new);
|
|
56
|
+
|
|
57
|
+
if (fs.existsSync(oldDirPath)) {
|
|
58
|
+
result.hasV1 = true;
|
|
59
|
+
result.oldDir = oldDirPath;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (fs.existsSync(oldFilePath)) {
|
|
63
|
+
result.hasV1 = true;
|
|
64
|
+
result.oldFile = oldFilePath;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (fs.existsSync(newDirPath)) {
|
|
68
|
+
result.hasV2 = true;
|
|
69
|
+
result.newDir = newDirPath;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (fs.existsSync(newFilePath)) {
|
|
73
|
+
result.hasV2 = true;
|
|
74
|
+
result.newFile = newFilePath;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Migrate a v1.x installation to v2.0
|
|
82
|
+
* @param {string} projectRoot - Project root directory
|
|
83
|
+
* @param {object} options - Migration options
|
|
84
|
+
* @returns {object} Migration result
|
|
85
|
+
*/
|
|
86
|
+
async function migrateV1ToV2(projectRoot, options = {}) {
|
|
87
|
+
const {
|
|
88
|
+
dryRun = false,
|
|
89
|
+
force = false,
|
|
90
|
+
updateReferences = true,
|
|
91
|
+
backup = false
|
|
92
|
+
} = options;
|
|
93
|
+
|
|
94
|
+
const result = {
|
|
95
|
+
success: false,
|
|
96
|
+
changes: [],
|
|
97
|
+
warnings: [],
|
|
98
|
+
errors: []
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// Detect current state
|
|
102
|
+
const detection = detectV1Installation(projectRoot);
|
|
103
|
+
|
|
104
|
+
if (!detection.hasV1) {
|
|
105
|
+
result.warnings.push('No v1.x installation found (.claude/ or CLAUDE.md)');
|
|
106
|
+
result.success = true;
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (detection.hasV2 && !force) {
|
|
111
|
+
result.errors.push('v2.0 installation already exists. Use --force to overwrite.');
|
|
112
|
+
return result;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// 1. Rename .claude/ → .ai-context/
|
|
116
|
+
if (detection.oldDir) {
|
|
117
|
+
const newDirPath = path.join(projectRoot, MIGRATIONS.directory.new);
|
|
118
|
+
|
|
119
|
+
if (dryRun) {
|
|
120
|
+
result.changes.push({
|
|
121
|
+
type: 'rename',
|
|
122
|
+
action: 'would rename',
|
|
123
|
+
from: MIGRATIONS.directory.old + '/',
|
|
124
|
+
to: MIGRATIONS.directory.new + '/'
|
|
125
|
+
});
|
|
126
|
+
} else {
|
|
127
|
+
try {
|
|
128
|
+
// Backup if requested
|
|
129
|
+
if (backup && fs.existsSync(newDirPath)) {
|
|
130
|
+
const backupPath = newDirPath + '.backup-' + Date.now();
|
|
131
|
+
fs.renameSync(newDirPath, backupPath);
|
|
132
|
+
result.changes.push({
|
|
133
|
+
type: 'backup',
|
|
134
|
+
action: 'backed up',
|
|
135
|
+
from: MIGRATIONS.directory.new + '/',
|
|
136
|
+
to: path.basename(backupPath) + '/'
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Remove existing v2 dir if force
|
|
141
|
+
if (force && fs.existsSync(newDirPath)) {
|
|
142
|
+
fs.rmSync(newDirPath, { recursive: true });
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
fs.renameSync(detection.oldDir, newDirPath);
|
|
146
|
+
result.changes.push({
|
|
147
|
+
type: 'rename',
|
|
148
|
+
action: 'renamed',
|
|
149
|
+
from: MIGRATIONS.directory.old + '/',
|
|
150
|
+
to: MIGRATIONS.directory.new + '/'
|
|
151
|
+
});
|
|
152
|
+
} catch (error) {
|
|
153
|
+
result.errors.push(`Failed to rename directory: ${error.message}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// 2. Rename CLAUDE.md → AI_CONTEXT.md
|
|
159
|
+
if (detection.oldFile) {
|
|
160
|
+
const newFilePath = path.join(projectRoot, MIGRATIONS.entryFile.new);
|
|
161
|
+
|
|
162
|
+
if (dryRun) {
|
|
163
|
+
result.changes.push({
|
|
164
|
+
type: 'rename',
|
|
165
|
+
action: 'would rename',
|
|
166
|
+
from: MIGRATIONS.entryFile.old,
|
|
167
|
+
to: MIGRATIONS.entryFile.new
|
|
168
|
+
});
|
|
169
|
+
} else {
|
|
170
|
+
try {
|
|
171
|
+
// Backup if requested
|
|
172
|
+
if (backup && fs.existsSync(newFilePath)) {
|
|
173
|
+
const backupPath = newFilePath + '.backup-' + Date.now();
|
|
174
|
+
fs.renameSync(newFilePath, backupPath);
|
|
175
|
+
result.changes.push({
|
|
176
|
+
type: 'backup',
|
|
177
|
+
action: 'backed up',
|
|
178
|
+
from: MIGRATIONS.entryFile.new,
|
|
179
|
+
to: path.basename(backupPath)
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Remove existing v2 file if force
|
|
184
|
+
if (force && fs.existsSync(newFilePath)) {
|
|
185
|
+
fs.unlinkSync(newFilePath);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
fs.renameSync(detection.oldFile, newFilePath);
|
|
189
|
+
result.changes.push({
|
|
190
|
+
type: 'rename',
|
|
191
|
+
action: 'renamed',
|
|
192
|
+
from: MIGRATIONS.entryFile.old,
|
|
193
|
+
to: MIGRATIONS.entryFile.new
|
|
194
|
+
});
|
|
195
|
+
} catch (error) {
|
|
196
|
+
result.errors.push(`Failed to rename entry file: ${error.message}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// 3. Update internal references in files
|
|
202
|
+
if (updateReferences && !dryRun) {
|
|
203
|
+
const contextDir = path.join(projectRoot, MIGRATIONS.directory.new);
|
|
204
|
+
const entryFile = path.join(projectRoot, MIGRATIONS.entryFile.new);
|
|
205
|
+
|
|
206
|
+
const filesToUpdate = [];
|
|
207
|
+
|
|
208
|
+
// Add entry file
|
|
209
|
+
if (fs.existsSync(entryFile)) {
|
|
210
|
+
filesToUpdate.push(entryFile);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Add all markdown and json files in context directory
|
|
214
|
+
if (fs.existsSync(contextDir)) {
|
|
215
|
+
try {
|
|
216
|
+
const files = await glob('**/*.{md,json}', {
|
|
217
|
+
cwd: contextDir,
|
|
218
|
+
absolute: true,
|
|
219
|
+
nodir: true
|
|
220
|
+
});
|
|
221
|
+
filesToUpdate.push(...files);
|
|
222
|
+
} catch (error) {
|
|
223
|
+
result.warnings.push(`Could not scan context directory: ${error.message}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Update .gitignore
|
|
228
|
+
const gitignorePath = path.join(projectRoot, '.gitignore');
|
|
229
|
+
if (fs.existsSync(gitignorePath)) {
|
|
230
|
+
filesToUpdate.push(gitignorePath);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Process each file
|
|
234
|
+
for (const filePath of filesToUpdate) {
|
|
235
|
+
try {
|
|
236
|
+
let content = fs.readFileSync(filePath, 'utf-8');
|
|
237
|
+
const originalContent = content;
|
|
238
|
+
|
|
239
|
+
for (const { pattern, replacement } of CONTENT_REPLACEMENTS) {
|
|
240
|
+
content = content.replace(pattern, replacement);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (content !== originalContent) {
|
|
244
|
+
fs.writeFileSync(filePath, content, 'utf-8');
|
|
245
|
+
result.changes.push({
|
|
246
|
+
type: 'update',
|
|
247
|
+
action: 'updated references in',
|
|
248
|
+
file: path.relative(projectRoot, filePath)
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
} catch (error) {
|
|
252
|
+
result.warnings.push(`Could not update ${path.relative(projectRoot, filePath)}: ${error.message}`);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} else if (updateReferences && dryRun) {
|
|
256
|
+
result.changes.push({
|
|
257
|
+
type: 'update',
|
|
258
|
+
action: 'would update references in',
|
|
259
|
+
file: 'all markdown and json files'
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// Set success if no errors
|
|
264
|
+
result.success = result.errors.length === 0;
|
|
265
|
+
|
|
266
|
+
return result;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Get migration status summary
|
|
271
|
+
* @param {string} projectRoot - Project root directory
|
|
272
|
+
* @returns {object} Status summary
|
|
273
|
+
*/
|
|
274
|
+
function getMigrationStatus(projectRoot) {
|
|
275
|
+
const detection = detectV1Installation(projectRoot);
|
|
276
|
+
|
|
277
|
+
if (!detection.hasV1 && !detection.hasV2) {
|
|
278
|
+
return {
|
|
279
|
+
status: 'none',
|
|
280
|
+
message: 'No AI context installation found',
|
|
281
|
+
needsMigration: false
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (detection.hasV1 && !detection.hasV2) {
|
|
286
|
+
return {
|
|
287
|
+
status: 'v1',
|
|
288
|
+
message: 'v1.x installation found, migration available',
|
|
289
|
+
needsMigration: true,
|
|
290
|
+
details: detection
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
if (!detection.hasV1 && detection.hasV2) {
|
|
295
|
+
return {
|
|
296
|
+
status: 'v2',
|
|
297
|
+
message: 'v2.0 installation found, no migration needed',
|
|
298
|
+
needsMigration: false,
|
|
299
|
+
details: detection
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (detection.hasV1 && detection.hasV2) {
|
|
304
|
+
return {
|
|
305
|
+
status: 'mixed',
|
|
306
|
+
message: 'Both v1.x and v2.0 installations found',
|
|
307
|
+
needsMigration: true,
|
|
308
|
+
details: detection
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
module.exports = {
|
|
314
|
+
migrateV1ToV2,
|
|
315
|
+
detectV1Installation,
|
|
316
|
+
getMigrationStatus,
|
|
317
|
+
MIGRATIONS,
|
|
318
|
+
CONTENT_REPLACEMENTS
|
|
319
|
+
};
|