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.
Files changed (136) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/bin/create-ai-context.js +337 -0
  4. package/lib/adapters/antigravity.js +160 -0
  5. package/lib/adapters/claude.js +122 -0
  6. package/lib/adapters/cline.js +111 -0
  7. package/lib/adapters/copilot.js +117 -0
  8. package/lib/adapters/index.js +69 -0
  9. package/lib/ai-context-generator.js +234 -0
  10. package/lib/ai-orchestrator.js +431 -0
  11. package/lib/call-tracer.js +444 -0
  12. package/lib/detector.js +726 -0
  13. package/lib/environment-detector.js +239 -0
  14. package/lib/index.js +310 -0
  15. package/lib/installer.js +418 -0
  16. package/lib/migrate.js +319 -0
  17. package/lib/placeholder.js +541 -0
  18. package/lib/prompts.js +287 -0
  19. package/lib/spinner.js +60 -0
  20. package/lib/static-analyzer.js +729 -0
  21. package/lib/template-populator.js +843 -0
  22. package/lib/template-renderer.js +382 -0
  23. package/lib/validate.js +155 -0
  24. package/package.json +70 -0
  25. package/templates/AI_CONTEXT.md.template +245 -0
  26. package/templates/base/README.md +257 -0
  27. package/templates/base/RPI_WORKFLOW_PLAN.md +320 -0
  28. package/templates/base/agents/api-developer.md +76 -0
  29. package/templates/base/agents/context-engineer.md +525 -0
  30. package/templates/base/agents/core-architect.md +76 -0
  31. package/templates/base/agents/database-ops.md +76 -0
  32. package/templates/base/agents/deployment-ops.md +76 -0
  33. package/templates/base/agents/integration-hub.md +76 -0
  34. package/templates/base/analytics/README.md +114 -0
  35. package/templates/base/automation/config.json +58 -0
  36. package/templates/base/automation/generators/code-mapper.js +308 -0
  37. package/templates/base/automation/generators/index-builder.js +321 -0
  38. package/templates/base/automation/hooks/post-commit.sh +83 -0
  39. package/templates/base/automation/hooks/pre-commit.sh +103 -0
  40. package/templates/base/ci-templates/README.md +108 -0
  41. package/templates/base/ci-templates/github-actions/context-check.yml +144 -0
  42. package/templates/base/ci-templates/github-actions/validate-docs.yml +105 -0
  43. package/templates/base/commands/analytics.md +238 -0
  44. package/templates/base/commands/auto-sync.md +172 -0
  45. package/templates/base/commands/collab.md +194 -0
  46. package/templates/base/commands/help.md +450 -0
  47. package/templates/base/commands/rpi-implement.md +115 -0
  48. package/templates/base/commands/rpi-plan.md +93 -0
  49. package/templates/base/commands/rpi-research.md +88 -0
  50. package/templates/base/commands/session-resume.md +144 -0
  51. package/templates/base/commands/session-save.md +112 -0
  52. package/templates/base/commands/validate-all.md +77 -0
  53. package/templates/base/commands/verify-docs-current.md +86 -0
  54. package/templates/base/config/base.json +57 -0
  55. package/templates/base/config/environments/development.json +13 -0
  56. package/templates/base/config/environments/production.json +17 -0
  57. package/templates/base/config/environments/staging.json +13 -0
  58. package/templates/base/config/local.json.example +21 -0
  59. package/templates/base/context/.meta/generated-at.json +18 -0
  60. package/templates/base/context/ARCHITECTURE_SNAPSHOT.md +156 -0
  61. package/templates/base/context/CODE_TO_WORKFLOW_MAP.md +94 -0
  62. package/templates/base/context/FILE_OWNERSHIP.md +57 -0
  63. package/templates/base/context/INTEGRATION_POINTS.md +92 -0
  64. package/templates/base/context/KNOWN_GOTCHAS.md +195 -0
  65. package/templates/base/context/TESTING_MAP.md +95 -0
  66. package/templates/base/context/WORKFLOW_INDEX.md +129 -0
  67. package/templates/base/context/workflows/WORKFLOW_TEMPLATE.md +294 -0
  68. package/templates/base/indexes/agents/CAPABILITY_MATRIX.md +255 -0
  69. package/templates/base/indexes/agents/CATEGORY_INDEX.md +44 -0
  70. package/templates/base/indexes/code/CATEGORY_INDEX.md +38 -0
  71. package/templates/base/indexes/routing/CATEGORY_INDEX.md +39 -0
  72. package/templates/base/indexes/search/CATEGORY_INDEX.md +39 -0
  73. package/templates/base/indexes/workflows/CATEGORY_INDEX.md +38 -0
  74. package/templates/base/knowledge/README.md +98 -0
  75. package/templates/base/knowledge/sessions/README.md +88 -0
  76. package/templates/base/knowledge/sessions/TEMPLATE.md +150 -0
  77. package/templates/base/knowledge/shared/decisions/0001-adopt-context-engineering.md +144 -0
  78. package/templates/base/knowledge/shared/decisions/README.md +49 -0
  79. package/templates/base/knowledge/shared/decisions/TEMPLATE.md +123 -0
  80. package/templates/base/knowledge/shared/patterns/README.md +62 -0
  81. package/templates/base/knowledge/shared/patterns/TEMPLATE.md +120 -0
  82. package/templates/base/plans/PLAN_TEMPLATE.md +250 -0
  83. package/templates/base/plans/active/.gitkeep +0 -0
  84. package/templates/base/plans/completed/.gitkeep +0 -0
  85. package/templates/base/research/RESEARCH_TEMPLATE.md +153 -0
  86. package/templates/base/research/active/.gitkeep +0 -0
  87. package/templates/base/research/completed/.gitkeep +0 -0
  88. package/templates/base/schemas/agent.schema.json +141 -0
  89. package/templates/base/schemas/anchors.schema.json +54 -0
  90. package/templates/base/schemas/automation.schema.json +93 -0
  91. package/templates/base/schemas/command.schema.json +134 -0
  92. package/templates/base/schemas/hashes.schema.json +40 -0
  93. package/templates/base/schemas/manifest.schema.json +117 -0
  94. package/templates/base/schemas/plan.schema.json +136 -0
  95. package/templates/base/schemas/research.schema.json +115 -0
  96. package/templates/base/schemas/roles.schema.json +34 -0
  97. package/templates/base/schemas/session.schema.json +77 -0
  98. package/templates/base/schemas/settings.schema.json +244 -0
  99. package/templates/base/schemas/staleness.schema.json +53 -0
  100. package/templates/base/schemas/team-config.schema.json +42 -0
  101. package/templates/base/schemas/workflow.schema.json +126 -0
  102. package/templates/base/session/checkpoints/.gitkeep +2 -0
  103. package/templates/base/session/current/state.json +20 -0
  104. package/templates/base/session/history/.gitkeep +2 -0
  105. package/templates/base/settings.json +3 -0
  106. package/templates/base/standards/COMPATIBILITY.md +219 -0
  107. package/templates/base/standards/EXTENSION_GUIDELINES.md +280 -0
  108. package/templates/base/standards/QUALITY_CHECKLIST.md +211 -0
  109. package/templates/base/standards/README.md +66 -0
  110. package/templates/base/sync/anchors.json +6 -0
  111. package/templates/base/sync/hashes.json +6 -0
  112. package/templates/base/sync/staleness.json +10 -0
  113. package/templates/base/team/README.md +168 -0
  114. package/templates/base/team/config.json +79 -0
  115. package/templates/base/team/roles.json +145 -0
  116. package/templates/base/tools/bin/claude-context.js +151 -0
  117. package/templates/base/tools/lib/anchor-resolver.js +276 -0
  118. package/templates/base/tools/lib/config-loader.js +363 -0
  119. package/templates/base/tools/lib/detector.js +350 -0
  120. package/templates/base/tools/lib/diagnose.js +206 -0
  121. package/templates/base/tools/lib/drift-detector.js +373 -0
  122. package/templates/base/tools/lib/errors.js +199 -0
  123. package/templates/base/tools/lib/index.js +36 -0
  124. package/templates/base/tools/lib/init.js +192 -0
  125. package/templates/base/tools/lib/logger.js +230 -0
  126. package/templates/base/tools/lib/placeholder.js +201 -0
  127. package/templates/base/tools/lib/session-manager.js +354 -0
  128. package/templates/base/tools/lib/validate.js +521 -0
  129. package/templates/base/tools/package.json +49 -0
  130. package/templates/handlebars/antigravity.hbs +337 -0
  131. package/templates/handlebars/claude.hbs +184 -0
  132. package/templates/handlebars/cline.hbs +63 -0
  133. package/templates/handlebars/copilot.hbs +131 -0
  134. package/templates/handlebars/partials/gotcha-list.hbs +11 -0
  135. package/templates/handlebars/partials/header.hbs +3 -0
  136. 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
+ };