cmp-standards 3.5.1 → 3.7.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 (107) hide show
  1. package/README.md +399 -633
  2. package/dist/analytics/CrossProjectAnalytics.js +65 -65
  3. package/dist/cli/index.js +255 -12
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/dashboard/tokens.js +173 -173
  6. package/dist/db/cloud.d.ts +1 -0
  7. package/dist/db/cloud.d.ts.map +1 -1
  8. package/dist/db/migrations.js +256 -256
  9. package/dist/db/turso-client.js +2 -2
  10. package/dist/db/upstash-client.d.ts +9 -0
  11. package/dist/db/upstash-client.d.ts.map +1 -1
  12. package/dist/db/upstash-client.js +11 -0
  13. package/dist/db/upstash-client.js.map +1 -1
  14. package/dist/eslint/rules/no-async-useeffect.js +6 -6
  15. package/dist/experts/ExpertVotePersistence.js +9 -9
  16. package/dist/hooks/cloud-post-tool-use.d.ts.map +1 -1
  17. package/dist/hooks/cloud-post-tool-use.js +72 -10
  18. package/dist/hooks/cloud-post-tool-use.js.map +1 -1
  19. package/dist/hooks/cloud-pre-tool-use.d.ts +12 -9
  20. package/dist/hooks/cloud-pre-tool-use.d.ts.map +1 -1
  21. package/dist/hooks/cloud-pre-tool-use.js +227 -99
  22. package/dist/hooks/cloud-pre-tool-use.js.map +1 -1
  23. package/dist/hooks/cloud-session-start.js +5 -5
  24. package/dist/hooks/resilient-hook-runner.d.ts +78 -0
  25. package/dist/hooks/resilient-hook-runner.d.ts.map +1 -0
  26. package/dist/hooks/resilient-hook-runner.js +201 -0
  27. package/dist/hooks/resilient-hook-runner.js.map +1 -0
  28. package/dist/hooks/session-end.js +14 -14
  29. package/dist/patterns/registry.js +90 -90
  30. package/dist/schema/codewiki-types.d.ts +10 -10
  31. package/dist/schema/docs-types.d.ts +8 -8
  32. package/dist/schema/ecosystem-types.d.ts +12 -12
  33. package/dist/services/BootstrapService.d.ts +123 -0
  34. package/dist/services/BootstrapService.d.ts.map +1 -0
  35. package/dist/services/BootstrapService.js +309 -0
  36. package/dist/services/BootstrapService.js.map +1 -0
  37. package/dist/services/CodeWikiIndexer.js +3 -3
  38. package/dist/services/ContextGenerator.js +7 -7
  39. package/dist/services/FeedbackCollector.js +11 -11
  40. package/dist/services/GitIntegration.js +9 -9
  41. package/dist/services/HookVerifier.js +70 -70
  42. package/dist/services/KnowledgeGapDetector.d.ts +122 -0
  43. package/dist/services/KnowledgeGapDetector.d.ts.map +1 -0
  44. package/dist/services/KnowledgeGapDetector.js +530 -0
  45. package/dist/services/KnowledgeGapDetector.js.map +1 -0
  46. package/dist/services/ProjectScaffold.d.ts.map +1 -1
  47. package/dist/services/ProjectScaffold.js +79 -78
  48. package/dist/services/ProjectScaffold.js.map +1 -1
  49. package/dist/services/index.d.ts +4 -0
  50. package/dist/services/index.d.ts.map +1 -1
  51. package/dist/services/index.js +6 -0
  52. package/dist/services/index.js.map +1 -1
  53. package/dist/services/knowledge-graph.d.ts +121 -0
  54. package/dist/services/knowledge-graph.d.ts.map +1 -0
  55. package/dist/services/knowledge-graph.js +446 -0
  56. package/dist/services/knowledge-graph.js.map +1 -0
  57. package/dist/services/memory-router.d.ts +25 -0
  58. package/dist/services/memory-router.d.ts.map +1 -1
  59. package/dist/services/memory-router.js +236 -98
  60. package/dist/services/memory-router.js.map +1 -1
  61. package/dist/services/pattern-learning.d.ts +79 -0
  62. package/dist/services/pattern-learning.d.ts.map +1 -0
  63. package/dist/services/pattern-learning.js +312 -0
  64. package/dist/services/pattern-learning.js.map +1 -0
  65. package/dist/services/pattern-tracker.js +95 -95
  66. package/dist/services/semantic-search.js +2 -2
  67. package/package.json +124 -116
  68. package/standards/README.md +94 -50
  69. package/standards/experts/expert-routing.md +215 -215
  70. package/standards/general/code-quality.md +86 -86
  71. package/standards/general/ecosystem.md +243 -0
  72. package/standards/general/learning-loop.md +192 -0
  73. package/standards/general/memory-usage.md +205 -205
  74. package/standards/general/project-onboarding.md +339 -0
  75. package/standards/general/sync-workflow.md +235 -235
  76. package/standards/general/workflow.md +82 -82
  77. package/standards/hooks/mandatory-tracking.md +446 -446
  78. package/standards/infrastructure/cloud-database.md +287 -287
  79. package/standards/mcp/server-design.md +243 -243
  80. package/standards/mcp/tool-patterns.md +354 -354
  81. package/standards/skills/skill-structure.md +286 -286
  82. package/standards/skills/workflow-design.md +323 -323
  83. package/standards/tools/tool-design.md +297 -297
  84. package/templates/agents/architecture-expert.md +61 -61
  85. package/templates/agents/database-expert.md +62 -62
  86. package/templates/agents/documentation-expert.md +57 -57
  87. package/templates/agents/ecosystem-expert.md +104 -0
  88. package/templates/agents/memory-expert.md +88 -88
  89. package/templates/agents/performance-expert.md +61 -61
  90. package/templates/agents/security-expert.md +59 -59
  91. package/templates/agents/ux-expert.md +63 -63
  92. package/templates/agents/worker.md +75 -75
  93. package/templates/ai-skills/SKILL_TEMPLATE.md +55 -55
  94. package/templates/claude-settings.json +72 -72
  95. package/templates/commands/experts.md +138 -138
  96. package/templates/hooks/README.md +158 -158
  97. package/templates/hooks/project.config.json.template +77 -77
  98. package/templates/hooks/settings.local.json.template +57 -57
  99. package/templates/hooks.config.json +21 -0
  100. package/templates/memory-config.json +56 -56
  101. package/templates/memory-config.schema.json +212 -212
  102. package/templates/settings.json +58 -58
  103. package/templates/skills/continue.md +205 -205
  104. package/templates/workflows/business-improvement.md +264 -264
  105. package/templates/workflows/expert-review.md +153 -153
  106. package/templates/workflows/internal-app.md +245 -245
  107. package/templates/workflows/sync-docs.md +187 -187
@@ -151,14 +151,14 @@ export declare const PublicProjectSummarySchema: z.ZodObject<{
151
151
  totalSymbols: number;
152
152
  tests: number;
153
153
  };
154
- projectId: string;
155
- frameworks: string[];
156
154
  features: {
157
155
  id: string;
158
156
  category: string;
159
157
  name: string;
160
158
  description?: string | undefined;
161
159
  }[];
160
+ projectId: string;
161
+ frameworks: string[];
162
162
  generatedAt: string;
163
163
  topLanguages: Record<string, number>;
164
164
  description?: string | undefined;
@@ -174,14 +174,14 @@ export declare const PublicProjectSummarySchema: z.ZodObject<{
174
174
  totalSymbols: number;
175
175
  tests: number;
176
176
  };
177
- projectId: string;
178
- frameworks: string[];
179
177
  features: {
180
178
  id: string;
181
179
  category: string;
182
180
  name: string;
183
181
  description?: string | undefined;
184
182
  }[];
183
+ projectId: string;
184
+ frameworks: string[];
185
185
  generatedAt: string;
186
186
  topLanguages: Record<string, number>;
187
187
  description?: string | undefined;
@@ -248,14 +248,14 @@ export declare const FeaturedProjectsResponseSchema: z.ZodObject<{
248
248
  totalSymbols: number;
249
249
  tests: number;
250
250
  };
251
- projectId: string;
252
- frameworks: string[];
253
251
  features: {
254
252
  id: string;
255
253
  category: string;
256
254
  name: string;
257
255
  description?: string | undefined;
258
256
  }[];
257
+ projectId: string;
258
+ frameworks: string[];
259
259
  generatedAt: string;
260
260
  topLanguages: Record<string, number>;
261
261
  description?: string | undefined;
@@ -271,14 +271,14 @@ export declare const FeaturedProjectsResponseSchema: z.ZodObject<{
271
271
  totalSymbols: number;
272
272
  tests: number;
273
273
  };
274
- projectId: string;
275
- frameworks: string[];
276
274
  features: {
277
275
  id: string;
278
276
  category: string;
279
277
  name: string;
280
278
  description?: string | undefined;
281
279
  }[];
280
+ projectId: string;
281
+ frameworks: string[];
282
282
  generatedAt: string;
283
283
  topLanguages: Record<string, number>;
284
284
  description?: string | undefined;
@@ -299,14 +299,14 @@ export declare const FeaturedProjectsResponseSchema: z.ZodObject<{
299
299
  totalSymbols: number;
300
300
  tests: number;
301
301
  };
302
- projectId: string;
303
- frameworks: string[];
304
302
  features: {
305
303
  id: string;
306
304
  category: string;
307
305
  name: string;
308
306
  description?: string | undefined;
309
307
  }[];
308
+ projectId: string;
309
+ frameworks: string[];
310
310
  generatedAt: string;
311
311
  topLanguages: Record<string, number>;
312
312
  description?: string | undefined;
@@ -326,14 +326,14 @@ export declare const FeaturedProjectsResponseSchema: z.ZodObject<{
326
326
  totalSymbols: number;
327
327
  tests: number;
328
328
  };
329
- projectId: string;
330
- frameworks: string[];
331
329
  features: {
332
330
  id: string;
333
331
  category: string;
334
332
  name: string;
335
333
  description?: string | undefined;
336
334
  }[];
335
+ projectId: string;
336
+ frameworks: string[];
337
337
  generatedAt: string;
338
338
  topLanguages: Record<string, number>;
339
339
  description?: string | undefined;
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @file BootstrapService - Project Initialization Orchestrator
3
+ * @description Coordinates the full bootstrap process for new CMP projects
4
+ *
5
+ * Bootstrap Phases:
6
+ * 1. SCAFFOLD - Create .claude/ directory structure, agents, commands, hooks
7
+ * 2. INDEX - Run CodeWikiIndexer to index project codebase
8
+ * 3. DOCS - Run DocsGenerator to create project documentation
9
+ * 4. SYNC - Fetch ecosystem patterns via CrossProjectSyncService
10
+ * 5. GAPS - Analyze knowledge gaps via KnowledgeGapDetector
11
+ *
12
+ * Features:
13
+ * - Parallel execution where possible
14
+ * - Progress reporting with callbacks
15
+ * - Resumable (can skip completed phases)
16
+ * - Per-phase error handling (failures don't block other phases)
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const bootstrap = new BootstrapService('/path/to/project')
21
+ * const result = await bootstrap.run({
22
+ * system: 'PANEL',
23
+ * onProgress: (phase, status) => console.log(`${phase}: ${status}`)
24
+ * })
25
+ * ```
26
+ */
27
+ import { type ProjectScanResult } from './ProjectScanner.js';
28
+ import { type ScaffoldResult } from './ProjectScaffold.js';
29
+ import { type IndexResult } from './CodeWikiIndexer.js';
30
+ import { type GenerateResult } from './DocsGenerator.js';
31
+ import { type GapAnalysis } from './KnowledgeGapDetector.js';
32
+ import type { DevSystem } from '../types/index.js';
33
+ export type BootstrapPhase = 'scan' | 'scaffold' | 'index' | 'docs' | 'sync' | 'gaps';
34
+ export interface BootstrapOptions {
35
+ /** System identifier (PANEL, SWARMSCALE, etc.) */
36
+ system: DevSystem;
37
+ /** Project name (defaults to detected from package.json) */
38
+ projectName?: string;
39
+ /** Which phases to run (defaults to all) */
40
+ phases?: BootstrapPhase[];
41
+ /** Force overwrite existing files */
42
+ force?: boolean;
43
+ /** Skip agents installation */
44
+ skipAgents?: boolean;
45
+ /** Skip commands installation */
46
+ skipCommands?: boolean;
47
+ /** Skip hooks installation */
48
+ skipHooks?: boolean;
49
+ /** Index depth for CodeWikiIndexer */
50
+ indexDepth?: 'quick' | 'standard' | 'thorough';
51
+ /** Progress callback */
52
+ onProgress?: (phase: BootstrapPhase, status: string, progress?: number) => void;
53
+ /** Verbose output */
54
+ verbose?: boolean;
55
+ }
56
+ export interface PhaseResult {
57
+ phase: BootstrapPhase;
58
+ success: boolean;
59
+ durationMs: number;
60
+ error?: string;
61
+ data?: unknown;
62
+ }
63
+ export interface BootstrapResult {
64
+ success: boolean;
65
+ projectPath: string;
66
+ system: DevSystem;
67
+ phases: PhaseResult[];
68
+ totalDurationMs: number;
69
+ scan?: ProjectScanResult;
70
+ scaffold?: ScaffoldResult;
71
+ index?: IndexResult;
72
+ docs?: GenerateResult;
73
+ gaps?: GapAnalysis;
74
+ summary: BootstrapSummary;
75
+ }
76
+ export interface BootstrapSummary {
77
+ filesCreated: number;
78
+ filesIndexed: number;
79
+ patternsImported: number;
80
+ knowledgeGaps: number;
81
+ recommendations: string[];
82
+ }
83
+ export declare class BootstrapService {
84
+ private projectPath;
85
+ private scanner;
86
+ private options?;
87
+ private scanResult?;
88
+ constructor(projectPath?: string);
89
+ /**
90
+ * Run the full bootstrap process
91
+ */
92
+ run(options: BootstrapOptions): Promise<BootstrapResult>;
93
+ /**
94
+ * Run a single phase with error handling and timing
95
+ */
96
+ private runPhase;
97
+ /**
98
+ * Report progress to callback and optionally console
99
+ */
100
+ private reportProgress;
101
+ /**
102
+ * Calculate bootstrap summary
103
+ */
104
+ private calculateSummary;
105
+ /**
106
+ * Print final summary
107
+ */
108
+ private printSummary;
109
+ /**
110
+ * Logging helper
111
+ */
112
+ private log;
113
+ }
114
+ /**
115
+ * Create a BootstrapService instance
116
+ */
117
+ export declare function createBootstrapService(projectPath?: string): BootstrapService;
118
+ /**
119
+ * Convenience function to run bootstrap directly
120
+ */
121
+ export declare function bootstrap(projectPath: string, options: BootstrapOptions): Promise<BootstrapResult>;
122
+ export default BootstrapService;
123
+ //# sourceMappingURL=BootstrapService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BootstrapService.d.ts","sourceRoot":"","sources":["../../src/services/BootstrapService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAC5E,OAAO,EAAmB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC3E,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACxE,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEvE,OAAO,EAAwB,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAMlD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;AAErF,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,MAAM,EAAE,SAAS,CAAA;IACjB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,cAAc,EAAE,CAAA;IACzB,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,+BAA+B;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,iCAAiC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,sCAAsC;IACtC,UAAU,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,UAAU,CAAA;IAC9C,wBAAwB;IACxB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/E,qBAAqB;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,cAAc,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,SAAS,CAAA;IACjB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,IAAI,CAAC,EAAE,iBAAiB,CAAA;IACxB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,IAAI,CAAC,EAAE,cAAc,CAAA;IACrB,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,gBAAgB,CAAA;CAC1B;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,EAAE,CAAA;CAC1B;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,OAAO,CAAC,CAAkB;IAClC,OAAO,CAAC,UAAU,CAAC,CAAmB;gBAE1B,WAAW,GAAE,MAAsB;IAK/C;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAuH9D;;OAEG;YACW,QAAQ;IAgCtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAiBtB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,YAAY;IA6CpB;;OAEG;IACH,OAAO,CAAC,GAAG;CAmBZ;AAMD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,gBAAgB,CAE7E;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,eAAe,CAAC,CAG1B;AAED,eAAe,gBAAgB,CAAA"}
@@ -0,0 +1,309 @@
1
+ /**
2
+ * @file BootstrapService - Project Initialization Orchestrator
3
+ * @description Coordinates the full bootstrap process for new CMP projects
4
+ *
5
+ * Bootstrap Phases:
6
+ * 1. SCAFFOLD - Create .claude/ directory structure, agents, commands, hooks
7
+ * 2. INDEX - Run CodeWikiIndexer to index project codebase
8
+ * 3. DOCS - Run DocsGenerator to create project documentation
9
+ * 4. SYNC - Fetch ecosystem patterns via CrossProjectSyncService
10
+ * 5. GAPS - Analyze knowledge gaps via KnowledgeGapDetector
11
+ *
12
+ * Features:
13
+ * - Parallel execution where possible
14
+ * - Progress reporting with callbacks
15
+ * - Resumable (can skip completed phases)
16
+ * - Per-phase error handling (failures don't block other phases)
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const bootstrap = new BootstrapService('/path/to/project')
21
+ * const result = await bootstrap.run({
22
+ * system: 'PANEL',
23
+ * onProgress: (phase, status) => console.log(`${phase}: ${status}`)
24
+ * })
25
+ * ```
26
+ */
27
+ import chalk from 'chalk';
28
+ import { ProjectScanner } from './ProjectScanner.js';
29
+ import { ProjectScaffold } from './ProjectScaffold.js';
30
+ import { CodeWikiIndexer } from './CodeWikiIndexer.js';
31
+ import { DocsGenerator } from './DocsGenerator.js';
32
+ import { CrossProjectSyncService } from './cross-project-sync.js';
33
+ import { KnowledgeGapDetector } from './KnowledgeGapDetector.js';
34
+ // =============================================================================
35
+ // Bootstrap Service
36
+ // =============================================================================
37
+ export class BootstrapService {
38
+ projectPath;
39
+ scanner;
40
+ options;
41
+ scanResult;
42
+ constructor(projectPath = process.cwd()) {
43
+ this.projectPath = projectPath;
44
+ this.scanner = new ProjectScanner(projectPath);
45
+ }
46
+ /**
47
+ * Run the full bootstrap process
48
+ */
49
+ async run(options) {
50
+ this.options = options;
51
+ const startTime = Date.now();
52
+ const phases = [];
53
+ const allPhases = options.phases || ['scan', 'scaffold', 'index', 'docs', 'sync', 'gaps'];
54
+ // Results storage
55
+ let scaffoldResult;
56
+ let indexResult;
57
+ let docsResult;
58
+ let gapAnalysis;
59
+ this.log('header', `Bootstrap: ${options.system}`);
60
+ this.log('info', `Project: ${this.projectPath}`);
61
+ this.log('info', `Phases: ${allPhases.join(' → ')}`);
62
+ console.log();
63
+ // Phase 1: SCAN
64
+ if (allPhases.includes('scan')) {
65
+ const result = await this.runPhase('scan', async () => {
66
+ this.scanResult = await this.scanner.scan();
67
+ return this.scanResult;
68
+ });
69
+ phases.push(result);
70
+ }
71
+ // Phase 2: SCAFFOLD
72
+ if (allPhases.includes('scaffold')) {
73
+ const result = await this.runPhase('scaffold', async () => {
74
+ const scaffold = new ProjectScaffold(this.projectPath);
75
+ scaffoldResult = await scaffold.scaffold({
76
+ system: options.system,
77
+ projectName: options.projectName || this.scanResult?.name,
78
+ force: options.force,
79
+ skipAgents: options.skipAgents,
80
+ skipHooks: options.skipHooks,
81
+ skipCommands: options.skipCommands,
82
+ });
83
+ return scaffoldResult;
84
+ });
85
+ phases.push(result);
86
+ }
87
+ // Phase 3: INDEX (can run in parallel with docs if scaffold done)
88
+ if (allPhases.includes('index')) {
89
+ const result = await this.runPhase('index', async () => {
90
+ const indexer = new CodeWikiIndexer(options.system, this.projectPath);
91
+ indexResult = await indexer.index({
92
+ projectId: options.system,
93
+ rootDir: this.projectPath,
94
+ depth: options.indexDepth || 'standard',
95
+ });
96
+ return indexResult;
97
+ });
98
+ phases.push(result);
99
+ }
100
+ // Phase 4: DOCS (depends on index)
101
+ if (allPhases.includes('docs')) {
102
+ const result = await this.runPhase('docs', async () => {
103
+ const generator = new DocsGenerator({
104
+ system: options.system,
105
+ generateSimpleExplanation: true,
106
+ });
107
+ docsResult = await generator.generate();
108
+ return docsResult;
109
+ });
110
+ phases.push(result);
111
+ }
112
+ // Phase 5: SYNC (ecosystem patterns - can run independently)
113
+ if (allPhases.includes('sync')) {
114
+ const result = await this.runPhase('sync', async () => {
115
+ const syncService = new CrossProjectSyncService();
116
+ const patterns = await syncService.getEcosystemPatterns();
117
+ const shared = await syncService.getSharedMemories();
118
+ return {
119
+ patternsFound: patterns.length,
120
+ sharedMemories: shared.length,
121
+ systems: [...new Set(shared.map(m => m.system))],
122
+ };
123
+ });
124
+ phases.push(result);
125
+ }
126
+ // Phase 6: GAPS (knowledge gap analysis)
127
+ if (allPhases.includes('gaps')) {
128
+ const result = await this.runPhase('gaps', async () => {
129
+ const detector = new KnowledgeGapDetector(options.system, this.projectPath);
130
+ gapAnalysis = await detector.analyze();
131
+ return gapAnalysis;
132
+ });
133
+ phases.push(result);
134
+ }
135
+ // Calculate summary
136
+ const summary = this.calculateSummary(phases, scaffoldResult, indexResult, gapAnalysis);
137
+ // Final output
138
+ const totalDurationMs = Date.now() - startTime;
139
+ const success = phases.every(p => p.success);
140
+ this.printSummary(summary, phases, totalDurationMs);
141
+ return {
142
+ success,
143
+ projectPath: this.projectPath,
144
+ system: options.system,
145
+ phases,
146
+ totalDurationMs,
147
+ scan: this.scanResult,
148
+ scaffold: scaffoldResult,
149
+ index: indexResult,
150
+ docs: docsResult,
151
+ gaps: gapAnalysis,
152
+ summary,
153
+ };
154
+ }
155
+ /**
156
+ * Run a single phase with error handling and timing
157
+ */
158
+ async runPhase(phase, fn) {
159
+ const start = Date.now();
160
+ this.reportProgress(phase, 'starting');
161
+ try {
162
+ const data = await fn();
163
+ const durationMs = Date.now() - start;
164
+ this.reportProgress(phase, `completed (${durationMs}ms)`);
165
+ return {
166
+ phase,
167
+ success: true,
168
+ durationMs,
169
+ data,
170
+ };
171
+ }
172
+ catch (error) {
173
+ const durationMs = Date.now() - start;
174
+ const errorMessage = error instanceof Error ? error.message : String(error);
175
+ this.reportProgress(phase, `failed: ${errorMessage}`);
176
+ return {
177
+ phase,
178
+ success: false,
179
+ durationMs,
180
+ error: errorMessage,
181
+ };
182
+ }
183
+ }
184
+ /**
185
+ * Report progress to callback and optionally console
186
+ */
187
+ reportProgress(phase, status, progress) {
188
+ const phaseLabels = {
189
+ scan: '🔍 Scan',
190
+ scaffold: '🏗️ Scaffold',
191
+ index: '📑 Index',
192
+ docs: '📖 Docs',
193
+ sync: '🔄 Sync',
194
+ gaps: '🔎 Gaps',
195
+ };
196
+ if (this.options?.verbose) {
197
+ console.log(chalk.dim(` ${phaseLabels[phase]}: ${status}`));
198
+ }
199
+ this.options?.onProgress?.(phase, status, progress);
200
+ }
201
+ /**
202
+ * Calculate bootstrap summary
203
+ */
204
+ calculateSummary(phases, scaffold, index, gaps) {
205
+ const recommendations = [];
206
+ // Add recommendations based on results
207
+ if (gaps?.gaps) {
208
+ if (gaps.gaps.length > 5) {
209
+ recommendations.push('Consider running /knowledge to fill knowledge gaps');
210
+ }
211
+ if (gaps.gaps.some(g => g.severity === 'critical')) {
212
+ recommendations.push('Critical knowledge gaps detected - review immediately');
213
+ }
214
+ }
215
+ if (index?.stats?.errorsEncountered && index.stats.errorsEncountered > 0) {
216
+ recommendations.push(`${index.stats.errorsEncountered} files had indexing errors - review logs`);
217
+ }
218
+ const failedPhases = phases.filter(p => !p.success);
219
+ if (failedPhases.length > 0) {
220
+ recommendations.push(`Re-run failed phases: ${failedPhases.map(p => p.phase).join(', ')}`);
221
+ }
222
+ // Always recommend running experts
223
+ recommendations.push('Run /experts on critical files for code review');
224
+ return {
225
+ filesCreated: scaffold?.created?.length ?? 0,
226
+ filesIndexed: index?.stats?.filesIndexed ?? 0,
227
+ patternsImported: 0, // Would need sync result
228
+ knowledgeGaps: gaps?.gaps?.length ?? 0,
229
+ recommendations,
230
+ };
231
+ }
232
+ /**
233
+ * Print final summary
234
+ */
235
+ printSummary(summary, phases, totalDurationMs) {
236
+ console.log();
237
+ console.log(chalk.cyan('─'.repeat(50)));
238
+ console.log(chalk.cyan('📊 Bootstrap Summary'));
239
+ console.log();
240
+ // Phase results
241
+ for (const phase of phases) {
242
+ const icon = phase.success ? chalk.green('✓') : chalk.red('✗');
243
+ const time = chalk.dim(`(${phase.durationMs}ms)`);
244
+ console.log(` ${icon} ${phase.phase} ${time}`);
245
+ if (phase.error) {
246
+ console.log(chalk.red(` └─ ${phase.error}`));
247
+ }
248
+ }
249
+ console.log();
250
+ // Stats
251
+ console.log(chalk.white(' Files created:'), chalk.cyan(summary.filesCreated));
252
+ console.log(chalk.white(' Files indexed:'), chalk.cyan(summary.filesIndexed));
253
+ console.log(chalk.white(' Knowledge gaps:'), summary.knowledgeGaps > 0
254
+ ? chalk.yellow(summary.knowledgeGaps)
255
+ : chalk.green(summary.knowledgeGaps));
256
+ console.log();
257
+ // Recommendations
258
+ if (summary.recommendations.length > 0) {
259
+ console.log(chalk.white(' Recommendations:'));
260
+ for (const rec of summary.recommendations) {
261
+ console.log(chalk.dim(` • ${rec}`));
262
+ }
263
+ }
264
+ console.log();
265
+ console.log(chalk.cyan('─'.repeat(50)));
266
+ console.log(chalk.dim(` Total time: ${(totalDurationMs / 1000).toFixed(2)}s`));
267
+ console.log();
268
+ }
269
+ /**
270
+ * Logging helper
271
+ */
272
+ log(type, message) {
273
+ switch (type) {
274
+ case 'header':
275
+ console.log(chalk.cyan(`\n🚀 ${message}\n`));
276
+ break;
277
+ case 'info':
278
+ console.log(chalk.dim(` ${message}`));
279
+ break;
280
+ case 'success':
281
+ console.log(chalk.green(` ✓ ${message}`));
282
+ break;
283
+ case 'error':
284
+ console.log(chalk.red(` ✗ ${message}`));
285
+ break;
286
+ case 'warn':
287
+ console.log(chalk.yellow(` ⚠ ${message}`));
288
+ break;
289
+ }
290
+ }
291
+ }
292
+ // =============================================================================
293
+ // Factory Function
294
+ // =============================================================================
295
+ /**
296
+ * Create a BootstrapService instance
297
+ */
298
+ export function createBootstrapService(projectPath) {
299
+ return new BootstrapService(projectPath);
300
+ }
301
+ /**
302
+ * Convenience function to run bootstrap directly
303
+ */
304
+ export async function bootstrap(projectPath, options) {
305
+ const service = new BootstrapService(projectPath);
306
+ return service.run(options);
307
+ }
308
+ export default BootstrapService;
309
+ //# sourceMappingURL=BootstrapService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BootstrapService.js","sourceRoot":"","sources":["../../src/services/BootstrapService.ts"],"names":[],"mappings":"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"}
@@ -705,7 +705,7 @@ export class CodeWikiIndexer {
705
705
  // Build insert statements for metadata
706
706
  for (const item of collected.metadata) {
707
707
  statements.push({
708
- sql: `INSERT INTO items (id, type, status, system, content, created_at, updated_at)
708
+ sql: `INSERT INTO items (id, type, status, system, content, created_at, updated_at)
709
709
  VALUES (?, ?, ?, ?, ?, ?, ?)`,
710
710
  args: [item.id, 'file_metadata', 'active', this.system, JSON.stringify(item.content), now, now],
711
711
  });
@@ -713,7 +713,7 @@ export class CodeWikiIndexer {
713
713
  // Build insert statements for structures
714
714
  for (const item of collected.structures) {
715
715
  statements.push({
716
- sql: `INSERT INTO items (id, type, status, system, content, created_at, updated_at)
716
+ sql: `INSERT INTO items (id, type, status, system, content, created_at, updated_at)
717
717
  VALUES (?, ?, ?, ?, ?, ?, ?)`,
718
718
  args: [item.id, 'code_structure', 'active', this.system, JSON.stringify(item.content), now, now],
719
719
  });
@@ -721,7 +721,7 @@ export class CodeWikiIndexer {
721
721
  // Build insert statements for dependencies
722
722
  for (const item of collected.dependencies) {
723
723
  statements.push({
724
- sql: `INSERT INTO items (id, type, status, system, content, created_at, updated_at)
724
+ sql: `INSERT INTO items (id, type, status, system, content, created_at, updated_at)
725
725
  VALUES (?, ?, ?, ?, ?, ?, ?)`,
726
726
  args: [item.id, 'code_dependency', 'active', this.system, JSON.stringify(item.content), now, now],
727
727
  });
@@ -42,13 +42,13 @@ export class ContextGenerator {
42
42
  if (content.includes(splitMarker)) {
43
43
  content = content.split(splitMarker)[0];
44
44
  }
45
- const freshContext = `
46
- ${splitMarker}
47
- ### Active Tasks
48
- ${tasksMd || "- No active tasks."}
49
-
50
- ### Recent Memories
51
- ${memoriesMd || "- No recent memories."}
45
+ const freshContext = `
46
+ ${splitMarker}
47
+ ### Active Tasks
48
+ ${tasksMd || "- No active tasks."}
49
+
50
+ ### Recent Memories
51
+ ${memoriesMd || "- No recent memories."}
52
52
  `;
53
53
  await fs.writeFile(filePath, content + freshContext, "utf-8");
54
54
  return true;
@@ -130,10 +130,10 @@ class FeedbackCollectorService {
130
130
  try {
131
131
  const db = turso.getClient();
132
132
  const result = await db.execute({
133
- sql: `SELECT id, content FROM items
134
- WHERE system = ? AND type = 'memory' AND status = 'active'
135
- ORDER BY COALESCE(json_extract(content, '$.feedbackScore'), 0.5) DESC,
136
- COALESCE(json_extract(content, '$.accessCount'), 0) DESC
133
+ sql: `SELECT id, content FROM items
134
+ WHERE system = ? AND type = 'memory' AND status = 'active'
135
+ ORDER BY COALESCE(json_extract(content, '$.feedbackScore'), 0.5) DESC,
136
+ COALESCE(json_extract(content, '$.accessCount'), 0) DESC
137
137
  LIMIT ?`,
138
138
  args: [system, limit]
139
139
  });
@@ -161,10 +161,10 @@ class FeedbackCollectorService {
161
161
  try {
162
162
  const db = turso.getClient();
163
163
  const result = await db.execute({
164
- sql: `SELECT id, content FROM items
165
- WHERE system = ? AND type = 'memory' AND status = 'active'
166
- AND COALESCE(json_extract(content, '$.feedbackScore'), 0.5) < ?
167
- ORDER BY json_extract(content, '$.feedbackScore') ASC
164
+ sql: `SELECT id, content FROM items
165
+ WHERE system = ? AND type = 'memory' AND status = 'active'
166
+ AND COALESCE(json_extract(content, '$.feedbackScore'), 0.5) < ?
167
+ ORDER BY json_extract(content, '$.feedbackScore') ASC
168
168
  LIMIT ?`,
169
169
  args: [system, threshold, limit]
170
170
  });
@@ -193,9 +193,9 @@ class FeedbackCollectorService {
193
193
  try {
194
194
  const db = turso.getClient();
195
195
  const result = await db.execute({
196
- sql: `UPDATE items SET status = 'archived', updated_at = datetime('now')
197
- WHERE system = ? AND type = 'memory' AND status = 'active'
198
- AND COALESCE(json_extract(content, '$.feedbackScore'), 0.5) < ?
196
+ sql: `UPDATE items SET status = 'archived', updated_at = datetime('now')
197
+ WHERE system = ? AND type = 'memory' AND status = 'active'
198
+ AND COALESCE(json_extract(content, '$.feedbackScore'), 0.5) < ?
199
199
  AND created_at < datetime('now', '-' || ? || ' days')`,
200
200
  args: [system, threshold, minAge]
201
201
  });
@@ -325,15 +325,15 @@ export class GitIntegrationService {
325
325
  const yaml = Object.entries(frontmatter)
326
326
  .map(([k, v]) => `${k}: ${JSON.stringify(v)}`)
327
327
  .join('\n');
328
- return `---
329
- ${yaml}
330
- ---
331
-
332
- # ${content.title}
333
-
334
- ${content.body ?? ''}
335
-
336
- ${content.relatedFiles?.length ? `\n## Related Files\n\n${content.relatedFiles.map(f => `- ${f}`).join('\n')}` : ''}
328
+ return `---
329
+ ${yaml}
330
+ ---
331
+
332
+ # ${content.title}
333
+
334
+ ${content.body ?? ''}
335
+
336
+ ${content.relatedFiles?.length ? `\n## Related Files\n\n${content.relatedFiles.map(f => `- ${f}`).join('\n')}` : ''}
337
337
  `;
338
338
  }
339
339
  parseMemoryFile(content) {