mycontext-cli 4.2.0 → 4.2.2

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 (92) hide show
  1. package/README.md +128 -133
  2. package/dist/README.md +128 -133
  3. package/dist/cli.js +76 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +18 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +53 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/init.d.ts.map +1 -1
  10. package/dist/commands/init.js +99 -2
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/core/brain/BrainClient.d.ts +2 -0
  13. package/dist/core/brain/BrainClient.d.ts.map +1 -1
  14. package/dist/core/brain/BrainClient.js +19 -0
  15. package/dist/core/brain/BrainClient.js.map +1 -1
  16. package/dist/doctor/DoctorEngine.d.ts +5 -0
  17. package/dist/doctor/DoctorEngine.d.ts.map +1 -0
  18. package/dist/doctor/DoctorEngine.js +491 -0
  19. package/dist/doctor/DoctorEngine.js.map +1 -0
  20. package/dist/doctor/api.d.ts +4 -0
  21. package/dist/doctor/api.d.ts.map +1 -0
  22. package/dist/doctor/api.js +19 -0
  23. package/dist/doctor/api.js.map +1 -0
  24. package/dist/doctor/rules/dead-code-rules.d.ts +3 -0
  25. package/dist/doctor/rules/dead-code-rules.d.ts.map +1 -0
  26. package/dist/doctor/rules/dead-code-rules.js +269 -0
  27. package/dist/doctor/rules/dead-code-rules.js.map +1 -0
  28. package/dist/doctor/rules/index.d.ts +11 -0
  29. package/dist/doctor/rules/index.d.ts.map +1 -0
  30. package/dist/doctor/rules/index.js +21 -0
  31. package/dist/doctor/rules/index.js.map +1 -0
  32. package/dist/doctor/rules/nextjs-rules.d.ts +3 -0
  33. package/dist/doctor/rules/nextjs-rules.d.ts.map +1 -0
  34. package/dist/doctor/rules/nextjs-rules.js +357 -0
  35. package/dist/doctor/rules/nextjs-rules.js.map +1 -0
  36. package/dist/doctor/rules/node-rules.d.ts +3 -0
  37. package/dist/doctor/rules/node-rules.d.ts.map +1 -0
  38. package/dist/doctor/rules/node-rules.js +290 -0
  39. package/dist/doctor/rules/node-rules.js.map +1 -0
  40. package/dist/doctor/rules/turbo-rules.d.ts +3 -0
  41. package/dist/doctor/rules/turbo-rules.d.ts.map +1 -0
  42. package/dist/doctor/rules/turbo-rules.js +215 -0
  43. package/dist/doctor/rules/turbo-rules.js.map +1 -0
  44. package/dist/doctor/types.d.ts +87 -0
  45. package/dist/doctor/types.d.ts.map +1 -0
  46. package/dist/doctor/types.js +6 -0
  47. package/dist/doctor/types.js.map +1 -0
  48. package/dist/package.json +4 -4
  49. package/dist/services/ContextSyncer.d.ts +40 -0
  50. package/dist/services/ContextSyncer.d.ts.map +1 -0
  51. package/dist/services/ContextSyncer.js +219 -0
  52. package/dist/services/ContextSyncer.js.map +1 -0
  53. package/dist/services/ProjectScanner.d.ts +74 -0
  54. package/dist/services/ProjectScanner.d.ts.map +1 -0
  55. package/dist/services/ProjectScanner.js +343 -0
  56. package/dist/services/ProjectScanner.js.map +1 -0
  57. package/dist/services/ScaffoldAgent.d.ts +35 -0
  58. package/dist/services/ScaffoldAgent.d.ts.map +1 -0
  59. package/dist/services/ScaffoldAgent.js +228 -0
  60. package/dist/services/ScaffoldAgent.js.map +1 -0
  61. package/dist/tui/PlanningMode.d.ts +42 -0
  62. package/dist/tui/PlanningMode.d.ts.map +1 -0
  63. package/dist/tui/PlanningMode.js +401 -0
  64. package/dist/tui/PlanningMode.js.map +1 -0
  65. package/dist/tui/TUIClient.d.ts +20 -0
  66. package/dist/tui/TUIClient.d.ts.map +1 -0
  67. package/dist/tui/TUIClient.js +50 -0
  68. package/dist/tui/TUIClient.js.map +1 -0
  69. package/dist/types/mega-context.d.ts +118 -0
  70. package/dist/types/mega-context.d.ts.map +1 -0
  71. package/dist/types/mega-context.js +3 -0
  72. package/dist/types/mega-context.js.map +1 -0
  73. package/dist/types/tui.d.ts +29 -0
  74. package/dist/types/tui.d.ts.map +1 -0
  75. package/dist/types/tui.js +8 -0
  76. package/dist/types/tui.js.map +1 -0
  77. package/dist/types/unified-context.d.ts +102 -0
  78. package/dist/types/unified-context.d.ts.map +1 -0
  79. package/dist/types/unified-context.js +50 -0
  80. package/dist/types/unified-context.js.map +1 -0
  81. package/dist/utils/FileGenerator.d.ts +5 -0
  82. package/dist/utils/FileGenerator.d.ts.map +1 -1
  83. package/dist/utils/FileGenerator.js +48 -0
  84. package/dist/utils/FileGenerator.js.map +1 -1
  85. package/dist/utils/deepMerge.d.ts +14 -0
  86. package/dist/utils/deepMerge.d.ts.map +1 -0
  87. package/dist/utils/deepMerge.js +87 -0
  88. package/dist/utils/deepMerge.js.map +1 -0
  89. package/dist/utils/fileSystem.d.ts.map +1 -1
  90. package/dist/utils/fileSystem.js +32 -4
  91. package/dist/utils/fileSystem.js.map +1 -1
  92. package/package.json +24 -22
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-rules.js","sourceRoot":"","sources":["../../../src/doctor/rules/node-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { DoctorRule } from "../types";
2
+ export declare const turboRules: DoctorRule[];
3
+ //# sourceMappingURL=turbo-rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turbo-rules.d.ts","sourceRoot":"","sources":["../../../src/doctor/rules/turbo-rules.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAC;AAsMpE,eAAO,MAAM,UAAU,EAAE,UAAU,EAOlC,CAAC"}
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.turboRules = void 0;
37
+ /**
38
+ * Turborepo Rules — Best practice checks for Turborepo monorepos
39
+ */
40
+ const path = __importStar(require("path"));
41
+ function diag(rule, filePath, message, opts = {}) {
42
+ return {
43
+ ruleId: rule.id,
44
+ filePath,
45
+ line: opts.line,
46
+ severity: rule.severity,
47
+ message,
48
+ help: opts.help || rule.help,
49
+ autoFixable: opts.autoFixable ?? false,
50
+ };
51
+ }
52
+ // ─── Rules ────────────────────────────────────────────────────────
53
+ const hasTurboJson = {
54
+ id: "turbo/has-turbo-json",
55
+ name: "Has turbo.json",
56
+ category: "turbo",
57
+ severity: "error",
58
+ description: "Turborepo projects must have a turbo.json configuration",
59
+ help: "Create turbo.json with pipeline configuration at the project root",
60
+ appliesTo: ["turbo"],
61
+ async check(ctx) {
62
+ const results = [];
63
+ if (!(await ctx.fileExists("turbo.json"))) {
64
+ results.push(diag(this, "turbo.json", "Missing turbo.json configuration"));
65
+ }
66
+ return results;
67
+ },
68
+ };
69
+ const workspaceDeps = {
70
+ id: "turbo/workspace-deps",
71
+ name: "Workspace Protocol",
72
+ category: "turbo",
73
+ severity: "warning",
74
+ description: "Workspace packages should use workspace:* protocol for internal deps",
75
+ help: "Use \"workspace:*\" for local package dependencies instead of version numbers",
76
+ appliesTo: ["turbo"],
77
+ async check(ctx) {
78
+ const results = [];
79
+ if (!ctx.project.workspaces)
80
+ return results;
81
+ // Get all workspace package names
82
+ const wsNames = new Set(ctx.project.workspaces.map(ws => ws.name));
83
+ for (const ws of ctx.project.workspaces) {
84
+ const pkgPath = path.join(ws.path, "package.json");
85
+ const pkg = await ctx.readJson(pkgPath);
86
+ if (!pkg)
87
+ continue;
88
+ const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };
89
+ for (const [dep, version] of Object.entries(allDeps)) {
90
+ if (wsNames.has(dep) && typeof version === "string" && !version.startsWith("workspace:")) {
91
+ results.push(diag(this, pkgPath, `${dep} should use "workspace:*" instead of "${version}"`, { autoFixable: true }));
92
+ }
93
+ }
94
+ }
95
+ return results;
96
+ },
97
+ };
98
+ const sharedTsConfig = {
99
+ id: "turbo/shared-tsconfig",
100
+ name: "Shared TypeScript Config",
101
+ category: "turbo",
102
+ severity: "warning",
103
+ description: "Workspace packages should extend a shared tsconfig",
104
+ help: "Create a shared tsconfig.base.json at root and have workspaces extend it",
105
+ appliesTo: ["turbo"],
106
+ async check(ctx) {
107
+ const results = [];
108
+ const hasBase = await ctx.fileExists("tsconfig.json") ||
109
+ await ctx.fileExists("tsconfig.base.json");
110
+ if (!hasBase)
111
+ return results;
112
+ if (!ctx.project.workspaces)
113
+ return results;
114
+ for (const ws of ctx.project.workspaces) {
115
+ const tsPath = path.join(ws.path, "tsconfig.json");
116
+ const content = await ctx.readFile(tsPath);
117
+ if (!content)
118
+ continue;
119
+ if (!content.includes('"extends"')) {
120
+ results.push(diag(this, tsPath, `${ws.name} tsconfig doesn't extend a shared base config`));
121
+ }
122
+ }
123
+ return results;
124
+ },
125
+ };
126
+ const noRootAppDeps = {
127
+ id: "turbo/no-root-app-deps",
128
+ name: "No Root App Dependencies",
129
+ category: "turbo",
130
+ severity: "warning",
131
+ description: "Root package.json should only have devDependencies, not app-level deps",
132
+ help: "Move application dependencies to workspace packages, keep only tooling in root",
133
+ appliesTo: ["turbo"],
134
+ async check(ctx) {
135
+ const results = [];
136
+ const pkg = await ctx.readJson("package.json");
137
+ if (!pkg?.dependencies)
138
+ return results;
139
+ // Common root-level deps that are fine
140
+ const allowedRootDeps = new Set(["turbo", "typescript"]);
141
+ const appDeps = Object.keys(pkg.dependencies).filter(d => !allowedRootDeps.has(d));
142
+ if (appDeps.length > 0) {
143
+ results.push(diag(this, "package.json", `Root has ${appDeps.length} application dependencies: ${appDeps.slice(0, 5).join(", ")}${appDeps.length > 5 ? "..." : ""}`, { help: "Move these to workspace packages; root should only have devDependencies" }));
144
+ }
145
+ return results;
146
+ },
147
+ };
148
+ const pipelineCoverage = {
149
+ id: "turbo/pipeline-coverage",
150
+ name: "Pipeline Coverage",
151
+ category: "turbo",
152
+ severity: "warning",
153
+ description: "All workspace scripts should be covered in turbo.json pipeline",
154
+ help: "Add missing tasks to turbo.json to benefit from caching",
155
+ appliesTo: ["turbo"],
156
+ async check(ctx) {
157
+ const results = [];
158
+ const turboConfig = await ctx.readJson("turbo.json");
159
+ if (!turboConfig)
160
+ return results;
161
+ // Turbo v2 uses "tasks", v1 uses "pipeline"
162
+ const pipeline = turboConfig.tasks || turboConfig.pipeline || {};
163
+ const pipelineKeys = new Set(Object.keys(pipeline));
164
+ if (!ctx.project.workspaces)
165
+ return results;
166
+ // Collect all unique script names across workspaces
167
+ const allScripts = new Set();
168
+ for (const ws of ctx.project.workspaces) {
169
+ const pkg = await ctx.readJson(path.join(ws.path, "package.json"));
170
+ if (pkg?.scripts) {
171
+ Object.keys(pkg.scripts).forEach(s => allScripts.add(s));
172
+ }
173
+ }
174
+ // Common scripts that should be in pipeline
175
+ const importantScripts = ["build", "test", "lint", "dev"];
176
+ for (const script of importantScripts) {
177
+ if (allScripts.has(script) && !pipelineKeys.has(script)) {
178
+ results.push(diag(this, "turbo.json", `Script "${script}" exists in workspaces but not in turbo pipeline`));
179
+ }
180
+ }
181
+ return results;
182
+ },
183
+ };
184
+ const workspaceNaming = {
185
+ id: "turbo/workspace-naming",
186
+ name: "Consistent Workspace Naming",
187
+ category: "turbo",
188
+ severity: "warning",
189
+ description: "Workspace packages should use consistent naming (e.g. @scope/name)",
190
+ help: "Use @org/package-name format for workspace packages",
191
+ appliesTo: ["turbo"],
192
+ async check(ctx) {
193
+ const results = [];
194
+ if (!ctx.project.workspaces || ctx.project.workspaces.length < 2)
195
+ return results;
196
+ const scoped = ctx.project.workspaces.filter(ws => ws.name.startsWith("@"));
197
+ const unscoped = ctx.project.workspaces.filter(ws => !ws.name.startsWith("@"));
198
+ // If some are scoped and some aren't, warn about inconsistency
199
+ if (scoped.length > 0 && unscoped.length > 0) {
200
+ for (const ws of unscoped) {
201
+ results.push(diag(this, path.join(ws.path, "package.json"), `${ws.name} is not scoped — other packages use @scope/name format`));
202
+ }
203
+ }
204
+ return results;
205
+ },
206
+ };
207
+ exports.turboRules = [
208
+ hasTurboJson,
209
+ workspaceDeps,
210
+ sharedTsConfig,
211
+ noRootAppDeps,
212
+ pipelineCoverage,
213
+ workspaceNaming,
214
+ ];
215
+ //# sourceMappingURL=turbo-rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turbo-rules.js","sourceRoot":"","sources":["../../../src/doctor/rules/turbo-rules.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Doctor Types — Shared interfaces for the mycontext doctor system
3
+ */
4
+ export type ProjectType = "nextjs" | "turbo" | "node";
5
+ export interface ProjectInfo {
6
+ type: ProjectType;
7
+ name: string;
8
+ root: string;
9
+ version?: string;
10
+ packageManager: "npm" | "pnpm" | "yarn" | "bun" | "unknown";
11
+ isMonorepo: boolean;
12
+ workspaces?: WorkspaceInfo[];
13
+ typescript: boolean;
14
+ nextVersion?: string;
15
+ reactVersion?: string;
16
+ turboVersion?: string;
17
+ }
18
+ export interface WorkspaceInfo {
19
+ name: string;
20
+ path: string;
21
+ absolutePath: string;
22
+ type: ProjectType;
23
+ hasPackageJson: boolean;
24
+ }
25
+ export type DoctorCategory = "nextjs" | "turbo" | "node" | "dead";
26
+ export interface Diagnostic {
27
+ ruleId: string;
28
+ filePath: string;
29
+ line?: number;
30
+ column?: number;
31
+ severity: "error" | "warning";
32
+ message: string;
33
+ help: string;
34
+ autoFixable: boolean;
35
+ }
36
+ export interface RuleContext {
37
+ root: string;
38
+ project: ProjectInfo;
39
+ isWorkspace: boolean;
40
+ readFile(relativePath: string): Promise<string | null>;
41
+ fileExists(relativePath: string): Promise<boolean>;
42
+ findFiles(pattern: RegExp, maxDepth?: number): Promise<string[]>;
43
+ readJson(relativePath: string): Promise<any | null>;
44
+ }
45
+ export interface DoctorRule {
46
+ id: string;
47
+ name: string;
48
+ category: DoctorCategory;
49
+ severity: "error" | "warning";
50
+ description: string;
51
+ help: string;
52
+ appliesTo: ProjectType[];
53
+ check(ctx: RuleContext): Promise<Diagnostic[]>;
54
+ fix?(ctx: RuleContext, diag: Diagnostic): Promise<boolean>;
55
+ }
56
+ export interface DoctorResult {
57
+ score: number;
58
+ grade: string;
59
+ diagnostics: Diagnostic[];
60
+ project: ProjectInfo;
61
+ ruleResults: RuleResult[];
62
+ fixedCount?: number;
63
+ duration: number;
64
+ }
65
+ export interface RuleResult {
66
+ ruleId: string;
67
+ ruleName: string;
68
+ category: DoctorCategory;
69
+ passed: boolean;
70
+ diagnostics: Diagnostic[];
71
+ }
72
+ export interface DoctorOptions {
73
+ fix?: boolean;
74
+ verbose?: boolean;
75
+ score?: boolean;
76
+ project?: string;
77
+ category?: DoctorCategory;
78
+ dryRun?: boolean;
79
+ json?: boolean;
80
+ }
81
+ export interface DiagnoseOptions {
82
+ lint?: boolean;
83
+ deadCode?: boolean;
84
+ category?: DoctorCategory;
85
+ project?: string;
86
+ }
87
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Doctor Types — Shared interfaces for the mycontext doctor system
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/doctor/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mycontext-cli",
3
- "version": "4.2.0",
3
+ "version": "4.2.2",
4
4
  "description": "CLI tool for spec-driven development - Generate comprehensive context, visual screens, and scaffolding for AI-powered coding",
5
5
  "main": "dist/cli.js",
6
6
  "bin": {
@@ -12,7 +12,7 @@
12
12
  "build:clean": "rm -rf dist && ([ \"$npm_config_loglevel\" = \"silent\" ] || echo '🧹 Cleaned build directory')",
13
13
  "build:compile": "([ \"$npm_config_loglevel\" = \"silent\" ] || echo '🔨 Compiling TypeScript...') && tsc --noEmitOnError false",
14
14
  "build:alias": "([ \"$npm_config_loglevel\" = \"silent\" ] || echo '🔗 Resolving path aliases...') && tsc-alias",
15
- "build:copy": "([ \"$npm_config_loglevel\" = \"silent\" ] || echo '📋 Copying config files...') && cp -r src/config dist/ && cp -r src/templates dist/ && cp package.json dist/ && cp README.md dist/ && ([ \"$npm_config_loglevel\" = \"silent\" ] || echo '✅ Build complete')",
15
+ "build:copy": "([ \"$npm_config_loglevel\" = \"silent\" ] || echo '📋 Copying config files...') && cp -r src/config dist/ && cp -r src/templates dist/ && cp package.json dist/ && cp README.md dist/ && chmod +x dist/cli.js && ([ \"$npm_config_loglevel\" = \"silent\" ] || echo '✅ Build complete')",
16
16
  "dev": "ts-node src/cli.ts",
17
17
  "start": "node dist/cli.js",
18
18
  "watch": "tsc --watch --pretty",
@@ -98,7 +98,7 @@
98
98
  "typescript": "^5.0.0"
99
99
  },
100
100
  "engines": {
101
- "node": ">=18.0.0"
101
+ "node": ">=18"
102
102
  },
103
103
  "files": [
104
104
  "dist/",
@@ -106,4 +106,4 @@
106
106
  "package.json"
107
107
  ],
108
108
  "packageManager": "pnpm@10.11.0+sha512.6540583f41cc5f628eb3d9773ecee802f4f9ef9923cc45b69890fb47991d4b092964694ec3a4f738a420c918a333062c8b925d312f42e4f0c263eb603551f977"
109
- }
109
+ }
@@ -0,0 +1,40 @@
1
+ import { ContextDiffReport, ProjectSnapshot } from "./ProjectScanner";
2
+ export interface SyncResult {
3
+ contextUpdated: boolean;
4
+ readmeUpdated: boolean;
5
+ report: ContextDiffReport | null;
6
+ contextDiff: string;
7
+ readmeDiff: string;
8
+ }
9
+ export declare class ContextSyncer {
10
+ private projectRoot;
11
+ private scanner;
12
+ constructor(projectRoot?: string);
13
+ /**
14
+ * Sync everything: context.json + README
15
+ */
16
+ syncAll(options?: {
17
+ dryRun?: boolean;
18
+ }): Promise<SyncResult>;
19
+ /**
20
+ * Sync context.json: scan → assess → deep merge
21
+ */
22
+ syncContext(snapshot?: ProjectSnapshot, options?: {
23
+ dryRun?: boolean;
24
+ }): Promise<{
25
+ contextUpdated: boolean;
26
+ report: ContextDiffReport | null;
27
+ contextDiff: string;
28
+ }>;
29
+ /**
30
+ * Sync README: read context.json → LLM generate section → write between markers
31
+ */
32
+ syncReadme(options?: {
33
+ dryRun?: boolean;
34
+ }): Promise<{
35
+ readmeUpdated: boolean;
36
+ readmeDiff: string;
37
+ }>;
38
+ private getAICore;
39
+ }
40
+ //# sourceMappingURL=ContextSyncer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContextSyncer.d.ts","sourceRoot":"","sources":["../../src/services/ContextSyncer.ts"],"names":[],"mappings":"AAaA,OAAO,EAAkB,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKtF,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,OAAO,CAAiB;gBAEpB,WAAW,GAAE,MAAsB;IAK/C;;OAEG;IACG,OAAO,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,CAAC;IAiBtE;;OAEG;IACG,WAAW,CACf,QAAQ,CAAC,EAAE,eAAe,EAC1B,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GACjC,OAAO,CAAC;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAgE9F;;OAEG;IACG,UAAU,CAAC,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA4E7G,OAAO,CAAC,SAAS;CAUlB"}
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.ContextSyncer = void 0;
40
+ /**
41
+ * ContextSyncer — Autonomous context.json + README updater
42
+ *
43
+ * The "self-recontextualization" engine:
44
+ * 1. Scan the real project (via ProjectScanner)
45
+ * 2. LLM assesses drift between code and context.json
46
+ * 3. Deep merge suggestions into context.json
47
+ * 4. LLM generates README content from updated context
48
+ * 5. Write both files
49
+ */
50
+ const fs = __importStar(require("fs-extra"));
51
+ const path = __importStar(require("path"));
52
+ const chalk_1 = __importDefault(require("chalk"));
53
+ const ProjectScanner_1 = require("./ProjectScanner");
54
+ const AICore_1 = require("../core/ai/AICore");
55
+ const deepMerge_1 = require("../utils/deepMerge");
56
+ const unified_context_1 = require("../types/unified-context");
57
+ class ContextSyncer {
58
+ constructor(projectRoot = process.cwd()) {
59
+ this.projectRoot = projectRoot;
60
+ this.scanner = new ProjectScanner_1.ProjectScanner(projectRoot);
61
+ }
62
+ /**
63
+ * Sync everything: context.json + README
64
+ */
65
+ async syncAll(options = {}) {
66
+ console.log(chalk_1.default.blue("📂 Scanning project structure...\n"));
67
+ const snapshot = await this.scanner.scan();
68
+ this.scanner.displaySnapshot(snapshot);
69
+ const contextResult = await this.syncContext(snapshot, options);
70
+ const readmeResult = await this.syncReadme(options);
71
+ return {
72
+ contextUpdated: contextResult.contextUpdated,
73
+ readmeUpdated: readmeResult.readmeUpdated,
74
+ report: contextResult.report,
75
+ contextDiff: contextResult.contextDiff,
76
+ readmeDiff: readmeResult.readmeDiff,
77
+ };
78
+ }
79
+ /**
80
+ * Sync context.json: scan → assess → deep merge
81
+ */
82
+ async syncContext(snapshot, options = {}) {
83
+ const contextPath = path.join(this.projectRoot, ".mycontext", "context.json");
84
+ // Load existing context
85
+ let existingContext = {};
86
+ try {
87
+ if (await fs.pathExists(contextPath)) {
88
+ existingContext = await fs.readJson(contextPath);
89
+ }
90
+ }
91
+ catch {
92
+ // Start fresh if corrupted
93
+ }
94
+ // Scan if not provided
95
+ if (!snapshot) {
96
+ snapshot = await this.scanner.scan();
97
+ }
98
+ // Assess via LLM
99
+ console.log(chalk_1.default.blue("\n🧠 Assessing progress against Living Brain...\n"));
100
+ const report = await this.scanner.assessProgress(snapshot, existingContext);
101
+ this.scanner.displayReport(report);
102
+ if (report.overallProgress < 0) {
103
+ return { contextUpdated: false, report, contextDiff: "LLM assessment failed" };
104
+ }
105
+ // Deep merge suggestions
106
+ const hasMerge = Object.keys(report.suggestedContextMerge).length > 0;
107
+ if (!hasMerge) {
108
+ return { contextUpdated: false, report, contextDiff: "No changes suggested" };
109
+ }
110
+ const merged = (0, deepMerge_1.deepMerge)(existingContext, report.suggestedContextMerge);
111
+ // Update scan memory
112
+ if (!merged.brain)
113
+ merged.brain = {};
114
+ if (!merged.brain.memory)
115
+ merged.brain.memory = {};
116
+ merged.brain.memory.lastSync = {
117
+ syncedAt: new Date().toISOString(),
118
+ totalFiles: snapshot.stats.totalFiles,
119
+ totalDirs: snapshot.stats.totalDirs,
120
+ overallProgress: report.overallProgress,
121
+ diffsFound: report.diffs.length,
122
+ };
123
+ const diffSummary = report.diffs
124
+ .map((d) => ` ${d.type === "missing_in_context" ? "+" : d.type === "missing_in_code" ? "-" : "~"} [${d.category}] ${d.description}`)
125
+ .join("\n");
126
+ if (options.dryRun) {
127
+ console.log(chalk_1.default.yellow("\n🔍 DRY RUN — would apply these changes:"));
128
+ console.log(chalk_1.default.gray(diffSummary));
129
+ return { contextUpdated: false, report, contextDiff: diffSummary };
130
+ }
131
+ // Write
132
+ await fs.ensureDir(path.dirname(contextPath));
133
+ await fs.writeJson(contextPath, merged, { spaces: 2 });
134
+ console.log(chalk_1.default.green("✅ context.json updated via deep merge!"));
135
+ return { contextUpdated: true, report, contextDiff: diffSummary };
136
+ }
137
+ /**
138
+ * Sync README: read context.json → LLM generate section → write between markers
139
+ */
140
+ async syncReadme(options = {}) {
141
+ const readmePath = path.join(this.projectRoot, "README.md");
142
+ const contextPath = path.join(this.projectRoot, ".mycontext", "context.json");
143
+ if (!(await fs.pathExists(readmePath))) {
144
+ return { readmeUpdated: false, readmeDiff: "No README.md found" };
145
+ }
146
+ if (!(await fs.pathExists(contextPath))) {
147
+ return { readmeUpdated: false, readmeDiff: "No context.json found" };
148
+ }
149
+ const readme = await fs.readFile(readmePath, "utf-8");
150
+ const context = await fs.readJson(contextPath);
151
+ const summary = (0, unified_context_1.getContextSummary)(context);
152
+ const START_MARKER = "<!-- mycontext:start -->";
153
+ const END_MARKER = "<!-- mycontext:end -->";
154
+ const startIdx = readme.indexOf(START_MARKER);
155
+ const endIdx = readme.indexOf(END_MARKER);
156
+ if (startIdx === -1 || endIdx === -1) {
157
+ console.log(chalk_1.default.yellow("⚠️ No MyContext markers in README. Add these to enable auto-sync:"));
158
+ console.log(chalk_1.default.cyan(` ${START_MARKER}`));
159
+ console.log(chalk_1.default.cyan(` ${END_MARKER}`));
160
+ return { readmeUpdated: false, readmeDiff: "No markers found in README" };
161
+ }
162
+ // Generate content via LLM
163
+ const ai = this.getAICore();
164
+ const prompt = `Generate a concise, well-formatted markdown section for a README based on this project context:
165
+
166
+ Project: ${summary.name}
167
+ Description: ${summary.description}
168
+ ${summary.entities.length > 0 ? `Entities: ${summary.entities.join(", ")}` : ""}
169
+ ${summary.routes.length > 0 ? `Routes: ${summary.routes.join(", ")}` : ""}
170
+ ${summary.roles.length > 0 ? `Roles: ${summary.roles.join(", ")}` : ""}
171
+ ${summary.components.length > 0 ? `Components: ${summary.components.map((c) => c.name).join(", ")}` : ""}
172
+ ${summary.checkpoints.length > 0 ? `Milestones: ${summary.checkpoints.map((c) => `${c.label} (${c.status})`).join(", ")}` : ""}
173
+ ${summary.capabilities.length > 0 ? `Capabilities: ${summary.capabilities.join(", ")}` : ""}
174
+ ${context.project?.techStack ? `Tech Stack: ${context.project.techStack.join(", ")}` : ""}
175
+
176
+ Architecture type: ${context.architecture?.type || context.project?.type || "unknown"}
177
+ ${context.architecture?.packages ? `Packages: ${Object.keys(context.architecture.packages).join(", ")}` : ""}
178
+
179
+ Return ONLY the markdown content (no fences). Include sections:
180
+ - Brief overview
181
+ - Architecture/tech stack
182
+ - Key features/capabilities
183
+ - Project status (based on checkpoints)
184
+
185
+ Keep it concise — max 30 lines. Use emojis sparingly.`;
186
+ try {
187
+ let newContent = await ai.generateText(prompt);
188
+ newContent = newContent.replace(/^```[a-z]*\n?/gm, "").replace(/```$/gm, "").trim();
189
+ const before = readme.substring(0, startIdx + START_MARKER.length);
190
+ const after = readme.substring(endIdx);
191
+ const updated = `${before}\n\n${newContent}\n\n${after}`;
192
+ if (options.dryRun) {
193
+ console.log(chalk_1.default.yellow("\n🔍 DRY RUN — README would be updated with:"));
194
+ console.log(chalk_1.default.gray(newContent.substring(0, 300) + "..."));
195
+ return { readmeUpdated: false, readmeDiff: newContent.substring(0, 200) };
196
+ }
197
+ await fs.writeFile(readmePath, updated, "utf-8");
198
+ console.log(chalk_1.default.green("✅ README.md updated between markers!"));
199
+ return { readmeUpdated: true, readmeDiff: `Updated ${newContent.split("\n").length} lines` };
200
+ }
201
+ catch (error) {
202
+ console.log(chalk_1.default.red(`❌ README sync failed: ${error.message}`));
203
+ return { readmeUpdated: false, readmeDiff: `Error: ${error.message}` };
204
+ }
205
+ }
206
+ getAICore() {
207
+ try {
208
+ return AICore_1.AICore.getInstance();
209
+ }
210
+ catch {
211
+ return AICore_1.AICore.getInstance({
212
+ fallbackEnabled: true,
213
+ workingDirectory: this.projectRoot,
214
+ });
215
+ }
216
+ }
217
+ }
218
+ exports.ContextSyncer = ContextSyncer;
219
+ //# sourceMappingURL=ContextSyncer.js.map