metacoding 1.1.1 → 1.1.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.
- package/CHANGELOG.md +12 -2
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +4 -18
- package/lib/cli.js.map +1 -1
- package/lib/commands/update.d.ts +12 -1
- package/lib/commands/update.d.ts.map +1 -1
- package/lib/commands/update.js +395 -7
- package/lib/commands/update.js.map +1 -1
- package/lib/services/backup.d.ts +11 -0
- package/lib/services/backup.d.ts.map +1 -0
- package/lib/services/backup.js +127 -0
- package/lib/services/backup.js.map +1 -0
- package/lib/services/conflict-resolution.d.ts +16 -0
- package/lib/services/conflict-resolution.d.ts.map +1 -0
- package/lib/services/conflict-resolution.js +166 -0
- package/lib/services/conflict-resolution.js.map +1 -0
- package/lib/types/index.d.ts +19 -4
- package/lib/types/index.d.ts.map +1 -1
- package/package.json +4 -1
- package/templates/general/copilot-instructions.md +5 -2
- package/templates/general/docs-update.instructions.md +32 -0
- package/lib/commands/validate.d.ts +0 -5
- package/lib/commands/validate.d.ts.map +0 -1
- package/lib/commands/validate.js +0 -20
- package/lib/commands/validate.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,11 +5,21 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
-
## [
|
|
8
|
+
## [1.1.2] - 2024-12-19
|
|
9
9
|
|
|
10
10
|
### Added
|
|
11
11
|
|
|
12
|
-
-
|
|
12
|
+
- **Update Command**: Complete `metacoding update` command implementation with validation and conflict resolution
|
|
13
|
+
- **Validation Mode**: Added `--dry-run` flag for comprehensive setup validation without making changes
|
|
14
|
+
- **Strict Validation**: Added `--strict` flag for enhanced validation rules and detailed reporting
|
|
15
|
+
- Automatic template detection from existing project files and configuration
|
|
16
|
+
- Safe backup system with timestamped full directory backup for complete rollback protection
|
|
17
|
+
- Simple conflict resolution: user chooses to keep their version (saved as `user.filename`) or replace with template
|
|
18
|
+
- No interactive diff - clean, user-controlled choices only
|
|
19
|
+
- Force mode for automated updates without conflict prompts
|
|
20
|
+
- Complete integration with existing template system and VS Code settings
|
|
21
|
+
- Comprehensive error handling, progress feedback, and validation reporting
|
|
22
|
+
- **Removed**: Separate `validate` command - all validation integrated into `update --dry-run`
|
|
13
23
|
|
|
14
24
|
## [1.1.1] - 2025-06-22
|
|
15
25
|
|
package/lib/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAUA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA6E1C"}
|
package/lib/cli.js
CHANGED
|
@@ -7,7 +7,6 @@ exports.main = main;
|
|
|
7
7
|
const commander_1 = require("commander");
|
|
8
8
|
const chalk_1 = __importDefault(require("chalk"));
|
|
9
9
|
const init_1 = require("./commands/init");
|
|
10
|
-
const validate_1 = require("./commands/validate");
|
|
11
10
|
const update_1 = require("./commands/update");
|
|
12
11
|
const packageJson = require('../package.json');
|
|
13
12
|
const version = packageJson.version;
|
|
@@ -21,7 +20,7 @@ async function main() {
|
|
|
21
20
|
${chalk_1.default.cyan('Examples:')}
|
|
22
21
|
${chalk_1.default.dim('$')} metacoding init # Initialize metacoding in current directory
|
|
23
22
|
${chalk_1.default.dim('$')} metacoding init --template react # Initialize with React template
|
|
24
|
-
${chalk_1.default.dim('$')} metacoding
|
|
23
|
+
${chalk_1.default.dim('$')} metacoding update --dry-run # Validate current metacoding setup
|
|
25
24
|
${chalk_1.default.dim('$')} metacoding update # Update to latest metacoding version
|
|
26
25
|
|
|
27
26
|
${chalk_1.default.cyan('Learn more:')}
|
|
@@ -45,26 +44,13 @@ ${chalk_1.default.cyan('Learn more:')}
|
|
|
45
44
|
process.exit(1);
|
|
46
45
|
}
|
|
47
46
|
});
|
|
48
|
-
program
|
|
49
|
-
.command('validate')
|
|
50
|
-
.description('Validate current metacoding setup')
|
|
51
|
-
.option('--fix', 'automatically fix issues where possible')
|
|
52
|
-
.option('--strict', 'use strict validation rules')
|
|
53
|
-
.action(async (options) => {
|
|
54
|
-
try {
|
|
55
|
-
const validateCommand = new validate_1.ValidateCommand();
|
|
56
|
-
await validateCommand.execute(options);
|
|
57
|
-
}
|
|
58
|
-
catch (error) {
|
|
59
|
-
console.error(chalk_1.default.red('Error during validation:'), error instanceof Error ? error.message : error);
|
|
60
|
-
process.exit(1);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
47
|
program
|
|
64
48
|
.command('update')
|
|
65
|
-
.description('Update existing metacoding setup to latest version')
|
|
49
|
+
.description('Update existing metacoding setup to latest version or validate current setup')
|
|
66
50
|
.option('--template <type>', 'update to specific template type')
|
|
67
51
|
.option('--backup', 'create backup of existing files before updating')
|
|
52
|
+
.option('--dry-run', 'validate setup without making changes')
|
|
53
|
+
.option('--strict', 'use strict validation rules (with --dry-run)')
|
|
68
54
|
.action(async (options) => {
|
|
69
55
|
try {
|
|
70
56
|
const updateCommand = new update_1.UpdateCommand();
|
package/lib/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";;;;;AAUA,oBA6EC;AAvFD,yCAAoC;AACpC,kDAA0B;AAC1B,0CAA8C;AAC9C,8CAAkD;AAClD,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAC/C,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;AAK7B,KAAK,UAAU,IAAI;IACxB,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CACV,OAAO,EACP;EACJ,eAAK,CAAC,IAAI,CAAC,WAAW,CAAC;IACrB,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACd,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACd,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC;IACd,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC;;EAEhB,eAAK,CAAC,IAAI,CAAC,aAAa,CAAC;;;KAGtB,CACA,CAAC;IAGJ,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CACL,uBAAuB,EACvB,iDAAiD,EACjD,SAAS,CACV;SACA,MAAM,CAAC,aAAa,EAAE,+CAA+C,CAAC;SACtE,MAAM,CAAC,eAAe,EAAE,qCAAqC,CAAC;SAC9D,MAAM,CAAC,YAAY,EAAE,0CAA0C,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,kBAAW,EAAE,CAAC;YACtC,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,EACzC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAGL,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,8EAA8E,CAC/E;SACA,MAAM,CAAC,mBAAmB,EAAE,kCAAkC,CAAC;SAC/D,MAAM,CAAC,UAAU,EAAE,iDAAiD,CAAC;SACrE,MAAM,CAAC,WAAW,EAAE,uCAAuC,CAAC;SAC5D,MAAM,CAAC,UAAU,EAAE,8CAA8C,CAAC;SAClE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAI,sBAAa,EAAE,CAAC;YAC1C,MAAM,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,eAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EACjC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAGL,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;IAGD,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACzC,CAAC"}
|
package/lib/commands/update.d.ts
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import { UpdateOptions } from '../types';
|
|
2
2
|
export declare class UpdateCommand {
|
|
3
|
-
|
|
3
|
+
private templateManager;
|
|
4
|
+
private backupService;
|
|
5
|
+
private conflictService;
|
|
6
|
+
private vscodeService;
|
|
7
|
+
private projectDetector;
|
|
8
|
+
constructor();
|
|
9
|
+
execute(options: UpdateOptions): Promise<void>;
|
|
10
|
+
private detectCurrentTemplate;
|
|
11
|
+
private getProjectConfig;
|
|
12
|
+
private getExistingMetacodingFiles;
|
|
13
|
+
private validateSetup;
|
|
14
|
+
private displayUpdateSummary;
|
|
4
15
|
}
|
|
5
16
|
//# sourceMappingURL=update.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAUzC,qBAAa,aAAa;IACxB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;;IAUnC,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAgItC,qBAAqB;YAsBrB,gBAAgB;YAgBhB,0BAA0B;YA6B1B,aAAa;IAgR3B,OAAO,CAAC,oBAAoB;CAoB7B"}
|
package/lib/commands/update.js
CHANGED
|
@@ -1,19 +1,407 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.UpdateCommand = void 0;
|
|
7
40
|
const chalk_1 = __importDefault(require("chalk"));
|
|
41
|
+
const ora_1 = __importDefault(require("ora"));
|
|
42
|
+
const fs = __importStar(require("fs-extra"));
|
|
43
|
+
const path = __importStar(require("path"));
|
|
44
|
+
const template_manager_1 = require("../services/template-manager");
|
|
45
|
+
const backup_1 = require("../services/backup");
|
|
46
|
+
const conflict_resolution_1 = require("../services/conflict-resolution");
|
|
47
|
+
const vscode_1 = require("../services/vscode");
|
|
48
|
+
const project_detector_1 = require("../services/project-detector");
|
|
8
49
|
class UpdateCommand {
|
|
9
|
-
|
|
50
|
+
constructor() {
|
|
51
|
+
this.templateManager = new template_manager_1.TemplateManager();
|
|
52
|
+
this.backupService = new backup_1.BackupService();
|
|
53
|
+
this.conflictService = new conflict_resolution_1.ConflictResolutionService();
|
|
54
|
+
this.vscodeService = new vscode_1.VSCodeService();
|
|
55
|
+
this.projectDetector = new project_detector_1.ProjectDetector();
|
|
56
|
+
}
|
|
57
|
+
async execute(options) {
|
|
58
|
+
if (options.dryRun) {
|
|
59
|
+
return this.validateSetup(options);
|
|
60
|
+
}
|
|
10
61
|
console.log(chalk_1.default.cyan('🔄 Updating metacoding setup...\n'));
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
62
|
+
try {
|
|
63
|
+
const spinner = (0, ora_1.default)('Detecting current template...').start();
|
|
64
|
+
const currentTemplate = await this.detectCurrentTemplate(options.template);
|
|
65
|
+
spinner.succeed(`Current template: ${currentTemplate}`);
|
|
66
|
+
if (options.backup !== false) {
|
|
67
|
+
const backupSpinner = (0, ora_1.default)('Creating backup...').start();
|
|
68
|
+
const backupResult = await this.backupService.createBackup();
|
|
69
|
+
backupSpinner.succeed(`Backup created at: ${backupResult.backupPath}`);
|
|
70
|
+
}
|
|
71
|
+
const templateSpinner = (0, ora_1.default)('Loading template files...').start();
|
|
72
|
+
const projectConfig = await this.getProjectConfig(currentTemplate);
|
|
73
|
+
const template = await this.templateManager.getTemplate(currentTemplate, projectConfig);
|
|
74
|
+
const templateFiles = await this.templateManager.processTemplate(template, projectConfig);
|
|
75
|
+
templateSpinner.succeed(`Loaded ${templateFiles.length} template files`);
|
|
76
|
+
const existingFiles = await this.getExistingMetacodingFiles();
|
|
77
|
+
const conflictSpinner = (0, ora_1.default)('Checking for conflicts...').start();
|
|
78
|
+
const conflicts = await this.conflictService.detectConflicts(templateFiles.map((f) => ({ path: f.path, content: f.content })), existingFiles);
|
|
79
|
+
if (conflicts.length > 0) {
|
|
80
|
+
conflictSpinner.warn(`Found ${conflicts.length} conflicts`);
|
|
81
|
+
if (!options.force) {
|
|
82
|
+
const resolutions = await this.conflictService.getConflictResolution(conflicts);
|
|
83
|
+
const { preservedFiles } = await this.conflictService.applyResolutions(conflicts, resolutions);
|
|
84
|
+
if (preservedFiles.length > 0) {
|
|
85
|
+
console.log(chalk_1.default.yellow(`💾 Preserved ${preservedFiles.length} user files with user. prefix`));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
for (const conflict of conflicts) {
|
|
90
|
+
await fs.writeFile(conflict.filePath, conflict.templateContent);
|
|
91
|
+
}
|
|
92
|
+
console.log(chalk_1.default.yellow(`⚠️ Force mode: Replaced ${conflicts.length} conflicted files`));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
conflictSpinner.succeed('No conflicts detected');
|
|
97
|
+
}
|
|
98
|
+
const updateSpinner = (0, ora_1.default)('Updating template files...').start();
|
|
99
|
+
let filesUpdated = 0;
|
|
100
|
+
for (const file of templateFiles) {
|
|
101
|
+
const isConflicted = conflicts.some((c) => c.filePath === file.path);
|
|
102
|
+
if (!isConflicted) {
|
|
103
|
+
await fs.ensureDir(path.dirname(file.path));
|
|
104
|
+
await fs.writeFile(file.path, file.content);
|
|
105
|
+
filesUpdated++;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
updateSpinner.succeed(`Updated ${filesUpdated} files`);
|
|
109
|
+
const vscodeSpinner = (0, ora_1.default)('Updating VS Code settings...').start();
|
|
110
|
+
await this.vscodeService.updateSettings(template.vscodeSettings || {});
|
|
111
|
+
vscodeSpinner.succeed('VS Code settings updated');
|
|
112
|
+
await this.backupService.cleanupOldBackups();
|
|
113
|
+
console.log(chalk_1.default.green.bold('\n✅ metacoding update complete!\n'));
|
|
114
|
+
this.displayUpdateSummary({
|
|
115
|
+
template: currentTemplate,
|
|
116
|
+
filesUpdated,
|
|
117
|
+
conflictsResolved: conflicts.length,
|
|
118
|
+
backupCreated: options.backup !== false,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
123
|
+
console.error(chalk_1.default.red('\n❌ Update failed:'), errorMessage);
|
|
124
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async detectCurrentTemplate(specifiedTemplate) {
|
|
133
|
+
if (specifiedTemplate) {
|
|
134
|
+
return specifiedTemplate;
|
|
135
|
+
}
|
|
136
|
+
if (!(await fs.pathExists('.github'))) {
|
|
137
|
+
throw new Error('No metacoding setup found. Run "metacoding init" first.');
|
|
138
|
+
}
|
|
139
|
+
const projectInfo = await this.projectDetector.detectProject();
|
|
140
|
+
return projectInfo.projectType || 'general';
|
|
141
|
+
}
|
|
142
|
+
async getProjectConfig(templateType) {
|
|
143
|
+
const projectInfo = await this.projectDetector.detectProject();
|
|
144
|
+
return {
|
|
145
|
+
name: projectInfo.name || path.basename(process.cwd()),
|
|
146
|
+
description: projectInfo.description || 'A guided development project',
|
|
147
|
+
techStack: projectInfo.techStack || [],
|
|
148
|
+
projectType: templateType,
|
|
149
|
+
testFramework: projectInfo.testFramework,
|
|
150
|
+
buildTool: projectInfo.buildTool,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
async getExistingMetacodingFiles() {
|
|
154
|
+
const files = [];
|
|
155
|
+
const githubDir = '.github';
|
|
156
|
+
if (!(await fs.pathExists(githubDir))) {
|
|
157
|
+
return files;
|
|
158
|
+
}
|
|
159
|
+
const mainFile = path.join(githubDir, 'copilot-instructions.md');
|
|
160
|
+
if (await fs.pathExists(mainFile)) {
|
|
161
|
+
files.push(mainFile);
|
|
162
|
+
}
|
|
163
|
+
const instructionsDir = path.join(githubDir, 'instructions');
|
|
164
|
+
if (await fs.pathExists(instructionsDir)) {
|
|
165
|
+
const instructionFiles = await fs.readdir(instructionsDir);
|
|
166
|
+
for (const file of instructionFiles) {
|
|
167
|
+
files.push(path.join(instructionsDir, file));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return files;
|
|
171
|
+
}
|
|
172
|
+
async validateSetup(options) {
|
|
173
|
+
console.log(chalk_1.default.cyan('🔍 Validating metacoding setup...\n'));
|
|
174
|
+
const validationResults = [];
|
|
175
|
+
let hasErrors = false;
|
|
176
|
+
let hasWarnings = false;
|
|
177
|
+
try {
|
|
178
|
+
const fileSpinner = (0, ora_1.default)('Checking file structure...').start();
|
|
179
|
+
const requiredFiles = [
|
|
180
|
+
'.github/copilot-instructions.md',
|
|
181
|
+
'.github/instructions/code-review.instructions.md',
|
|
182
|
+
'.github/instructions/docs-update.instructions.md',
|
|
183
|
+
'.github/instructions/release.instructions.md',
|
|
184
|
+
'.github/instructions/test-runner.instructions.md',
|
|
185
|
+
];
|
|
186
|
+
let missingFiles = 0;
|
|
187
|
+
for (const file of requiredFiles) {
|
|
188
|
+
if (!(await fs.pathExists(file))) {
|
|
189
|
+
validationResults.push({
|
|
190
|
+
check: `File ${file}`,
|
|
191
|
+
status: 'fail',
|
|
192
|
+
message: 'Missing required file',
|
|
193
|
+
});
|
|
194
|
+
missingFiles++;
|
|
195
|
+
hasErrors = true;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (missingFiles === 0) {
|
|
199
|
+
fileSpinner.succeed('File structure complete');
|
|
200
|
+
validationResults.push({
|
|
201
|
+
check: 'File structure',
|
|
202
|
+
status: 'pass',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
fileSpinner.fail(`Missing ${missingFiles} required files`);
|
|
207
|
+
}
|
|
208
|
+
const vscodeSpinner = (0, ora_1.default)('Checking VS Code configuration...').start();
|
|
209
|
+
try {
|
|
210
|
+
const vscodeSettingsPath = '.vscode/settings.json';
|
|
211
|
+
if (await fs.pathExists(vscodeSettingsPath)) {
|
|
212
|
+
const settings = await fs.readJson(vscodeSettingsPath);
|
|
213
|
+
const requiredSettings = ['github.copilot.chat.promptFiles'];
|
|
214
|
+
let missingSettings = 0;
|
|
215
|
+
for (const setting of requiredSettings) {
|
|
216
|
+
if (!settings[setting]) {
|
|
217
|
+
validationResults.push({
|
|
218
|
+
check: `VS Code setting '${setting}'`,
|
|
219
|
+
status: options.strict ? 'fail' : 'warn',
|
|
220
|
+
message: 'Not configured',
|
|
221
|
+
});
|
|
222
|
+
missingSettings++;
|
|
223
|
+
if (options.strict) {
|
|
224
|
+
hasErrors = true;
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
hasWarnings = true;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
if (missingSettings === 0) {
|
|
232
|
+
vscodeSpinner.succeed('VS Code configuration valid');
|
|
233
|
+
validationResults.push({
|
|
234
|
+
check: 'VS Code configuration',
|
|
235
|
+
status: 'pass',
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
else if (options.strict) {
|
|
239
|
+
vscodeSpinner.fail(`Missing ${missingSettings} required settings`);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
vscodeSpinner.warn(`Missing ${missingSettings} recommended settings`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
vscodeSpinner.warn('VS Code settings file not found');
|
|
247
|
+
validationResults.push({
|
|
248
|
+
check: 'VS Code settings file',
|
|
249
|
+
status: 'warn',
|
|
250
|
+
message: 'File not found',
|
|
251
|
+
});
|
|
252
|
+
hasWarnings = true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
vscodeSpinner.fail('Error reading VS Code settings');
|
|
257
|
+
validationResults.push({
|
|
258
|
+
check: 'VS Code configuration',
|
|
259
|
+
status: 'fail',
|
|
260
|
+
message: 'Error reading settings file',
|
|
261
|
+
});
|
|
262
|
+
hasErrors = true;
|
|
263
|
+
}
|
|
264
|
+
const gitSpinner = (0, ora_1.default)('Checking Git repository...').start();
|
|
265
|
+
if (await fs.pathExists('.git')) {
|
|
266
|
+
gitSpinner.succeed('Git repository configured');
|
|
267
|
+
validationResults.push({
|
|
268
|
+
check: 'Git repository',
|
|
269
|
+
status: 'pass',
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
const message = 'No Git repository found';
|
|
274
|
+
if (options.strict) {
|
|
275
|
+
gitSpinner.fail(message);
|
|
276
|
+
validationResults.push({
|
|
277
|
+
check: 'Git repository',
|
|
278
|
+
status: 'fail',
|
|
279
|
+
message,
|
|
280
|
+
});
|
|
281
|
+
hasErrors = true;
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
gitSpinner.warn(message);
|
|
285
|
+
validationResults.push({
|
|
286
|
+
check: 'Git repository',
|
|
287
|
+
status: 'warn',
|
|
288
|
+
message,
|
|
289
|
+
});
|
|
290
|
+
hasWarnings = true;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
const templateSpinner = (0, ora_1.default)('Checking template integrity...').start();
|
|
294
|
+
try {
|
|
295
|
+
await this.detectCurrentTemplate(options.template);
|
|
296
|
+
if (await fs.pathExists('.github/copilot-instructions.md')) {
|
|
297
|
+
const content = await fs.readFile('.github/copilot-instructions.md', 'utf-8');
|
|
298
|
+
const hasPlaceholders = content.includes('{{') && content.includes('}}');
|
|
299
|
+
if (hasPlaceholders) {
|
|
300
|
+
templateSpinner.fail('Template variables not substituted');
|
|
301
|
+
validationResults.push({
|
|
302
|
+
check: 'Template integrity',
|
|
303
|
+
status: 'fail',
|
|
304
|
+
message: 'Unprocessed template variables found',
|
|
305
|
+
});
|
|
306
|
+
hasErrors = true;
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
templateSpinner.succeed('Template integrity verified');
|
|
310
|
+
validationResults.push({
|
|
311
|
+
check: 'Template integrity',
|
|
312
|
+
status: 'pass',
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
templateSpinner.warn('Cannot verify template integrity - main file missing');
|
|
318
|
+
validationResults.push({
|
|
319
|
+
check: 'Template integrity',
|
|
320
|
+
status: 'warn',
|
|
321
|
+
message: 'Main instruction file missing',
|
|
322
|
+
});
|
|
323
|
+
hasWarnings = true;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
templateSpinner.fail('Error checking template integrity');
|
|
328
|
+
validationResults.push({
|
|
329
|
+
check: 'Template integrity',
|
|
330
|
+
status: 'fail',
|
|
331
|
+
message: 'Error during template validation',
|
|
332
|
+
});
|
|
333
|
+
hasErrors = true;
|
|
334
|
+
}
|
|
335
|
+
console.log('');
|
|
336
|
+
for (const result of validationResults) {
|
|
337
|
+
const icon = result.status === 'pass'
|
|
338
|
+
? '✅'
|
|
339
|
+
: result.status === 'warn'
|
|
340
|
+
? '⚠️'
|
|
341
|
+
: '❌';
|
|
342
|
+
const message = result.message ? ` - ${result.message}` : '';
|
|
343
|
+
console.log(`${icon} ${result.check}${message}`);
|
|
344
|
+
}
|
|
345
|
+
console.log('');
|
|
346
|
+
const totalChecks = validationResults.length;
|
|
347
|
+
const passedChecks = validationResults.filter((r) => r.status === 'pass').length;
|
|
348
|
+
if (hasErrors) {
|
|
349
|
+
console.log(chalk_1.default.red.bold('❌ Validation failed with errors\n'));
|
|
350
|
+
console.log(chalk_1.default.cyan('Suggestions:'));
|
|
351
|
+
console.log("- Run 'metacoding update' to restore missing files");
|
|
352
|
+
console.log('- Check VS Code settings configuration');
|
|
353
|
+
console.log("- Ensure you're in a Git repository");
|
|
354
|
+
console.log(chalk_1.default.dim(`\nSummary: ${passedChecks}/${totalChecks} checks passed`));
|
|
355
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
356
|
+
process.exit(1);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
throw new Error('Validation failed');
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
else if (hasWarnings && options.strict) {
|
|
363
|
+
console.log(chalk_1.default.yellow.bold('⚠️ Validation completed with warnings\n'));
|
|
364
|
+
console.log(chalk_1.default.cyan('Suggestions:'));
|
|
365
|
+
console.log('- Configure recommended VS Code settings');
|
|
366
|
+
console.log('- Consider initializing a Git repository');
|
|
367
|
+
console.log(chalk_1.default.dim(`\nSummary: ${passedChecks}/${totalChecks} checks passed`));
|
|
368
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
369
|
+
process.exit(2);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
throw new Error('Validation completed with warnings');
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
console.log(chalk_1.default.green.bold('🎉 metacoding setup is valid and ready to use!\n'));
|
|
377
|
+
console.log(chalk_1.default.dim(`Summary: ${passedChecks}/${totalChecks} checks passed`));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
if (error instanceof Error && error.message.includes('Validation')) {
|
|
382
|
+
throw error;
|
|
383
|
+
}
|
|
384
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
385
|
+
console.error(chalk_1.default.red('\n❌ Validation failed:'), errorMessage);
|
|
386
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
387
|
+
process.exit(1);
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
throw error;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
displayUpdateSummary(summary) {
|
|
395
|
+
console.log(chalk_1.default.cyan('Update Summary:'));
|
|
396
|
+
console.log(` Template: ${summary.template}`);
|
|
397
|
+
console.log(` Files updated: ${summary.filesUpdated}`);
|
|
398
|
+
if (summary.conflictsResolved > 0) {
|
|
399
|
+
console.log(` Conflicts resolved: ${summary.conflictsResolved}`);
|
|
400
|
+
}
|
|
401
|
+
if (summary.backupCreated) {
|
|
402
|
+
console.log(` Backup: Created in .backup/ directory`);
|
|
403
|
+
}
|
|
404
|
+
console.log('\n' + chalk_1.default.dim('Your metacoding setup is now up to date!'));
|
|
17
405
|
}
|
|
18
406
|
}
|
|
19
407
|
exports.UpdateCommand = UpdateCommand;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAM1B,MAAa,aAAa;IACxB,KAAK,CAAC,OAAO,CAAC,QAAuB;QACnC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAG7D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACrD,CAAC;CACF;AAZD,sCAYC"}
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BackupResult } from '../types';
|
|
2
|
+
export declare class BackupService {
|
|
3
|
+
private readonly backupBaseDir;
|
|
4
|
+
createBackup(): Promise<BackupResult>;
|
|
5
|
+
private generateTimestamp;
|
|
6
|
+
private listAllFiles;
|
|
7
|
+
getFileHash(filePath: string): Promise<string | null>;
|
|
8
|
+
hasFileChanged(filePath: string, originalContent: string): Promise<boolean>;
|
|
9
|
+
cleanupOldBackups(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=backup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/services/backup.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKxC,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAKrC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC;IA6B3C,OAAO,CAAC,iBAAiB;YAYX,YAAY;IA2BpB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAYrD,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC;IAqBb,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAmBzC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
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.BackupService = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const fs = __importStar(require("fs-extra"));
|
|
39
|
+
const crypto = __importStar(require("crypto"));
|
|
40
|
+
class BackupService {
|
|
41
|
+
constructor() {
|
|
42
|
+
this.backupBaseDir = '.backup';
|
|
43
|
+
}
|
|
44
|
+
async createBackup() {
|
|
45
|
+
const timestamp = this.generateTimestamp();
|
|
46
|
+
const backupPath = path.join(this.backupBaseDir, timestamp);
|
|
47
|
+
const githubDir = '.github';
|
|
48
|
+
await fs.ensureDir(backupPath);
|
|
49
|
+
const filesBackedUp = [];
|
|
50
|
+
if (await fs.pathExists(githubDir)) {
|
|
51
|
+
await fs.copy(githubDir, path.join(backupPath, githubDir));
|
|
52
|
+
const allFiles = await this.listAllFiles(githubDir);
|
|
53
|
+
filesBackedUp.push(...allFiles);
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
backupPath,
|
|
57
|
+
timestamp,
|
|
58
|
+
filesBackedUp,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
generateTimestamp() {
|
|
62
|
+
const now = new Date();
|
|
63
|
+
return now
|
|
64
|
+
.toISOString()
|
|
65
|
+
.replace(/[-:]/g, '')
|
|
66
|
+
.replace(/\..+/, '')
|
|
67
|
+
.replace('T', '_');
|
|
68
|
+
}
|
|
69
|
+
async listAllFiles(dirPath) {
|
|
70
|
+
const files = [];
|
|
71
|
+
if (!(await fs.pathExists(dirPath))) {
|
|
72
|
+
return files;
|
|
73
|
+
}
|
|
74
|
+
const items = await fs.readdir(dirPath);
|
|
75
|
+
for (const item of items) {
|
|
76
|
+
const itemPath = path.join(dirPath, item);
|
|
77
|
+
const stat = await fs.stat(itemPath);
|
|
78
|
+
if (stat.isDirectory()) {
|
|
79
|
+
const subFiles = await this.listAllFiles(itemPath);
|
|
80
|
+
files.push(...subFiles);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
files.push(itemPath);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return files;
|
|
87
|
+
}
|
|
88
|
+
async getFileHash(filePath) {
|
|
89
|
+
if (!(await fs.pathExists(filePath))) {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
93
|
+
return crypto.createHash('md5').update(content).digest('hex');
|
|
94
|
+
}
|
|
95
|
+
async hasFileChanged(filePath, originalContent) {
|
|
96
|
+
if (!(await fs.pathExists(filePath))) {
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
const currentContent = await fs.readFile(filePath, 'utf8');
|
|
100
|
+
const currentHash = crypto
|
|
101
|
+
.createHash('md5')
|
|
102
|
+
.update(currentContent)
|
|
103
|
+
.digest('hex');
|
|
104
|
+
const originalHash = crypto
|
|
105
|
+
.createHash('md5')
|
|
106
|
+
.update(originalContent)
|
|
107
|
+
.digest('hex');
|
|
108
|
+
return currentHash !== originalHash;
|
|
109
|
+
}
|
|
110
|
+
async cleanupOldBackups() {
|
|
111
|
+
if (!(await fs.pathExists(this.backupBaseDir))) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const backupDirs = await fs.readdir(this.backupBaseDir);
|
|
115
|
+
const sortedDirs = backupDirs
|
|
116
|
+
.filter((dir) => /^\d{8}_\d{6}$/.test(dir))
|
|
117
|
+
.sort()
|
|
118
|
+
.reverse();
|
|
119
|
+
const dirsToDelete = sortedDirs.slice(5);
|
|
120
|
+
for (const dir of dirsToDelete) {
|
|
121
|
+
const dirPath = path.join(this.backupBaseDir, dir);
|
|
122
|
+
await fs.remove(dirPath);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.BackupService = BackupService;
|
|
127
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/services/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { UpdateConflict, ConflictResolution } from '../types';
|
|
2
|
+
export declare class ConflictResolutionService {
|
|
3
|
+
private backupService;
|
|
4
|
+
constructor();
|
|
5
|
+
detectConflicts(templateFiles: Array<{
|
|
6
|
+
path: string;
|
|
7
|
+
content: string;
|
|
8
|
+
}>, existingFiles: string[]): Promise<UpdateConflict[]>;
|
|
9
|
+
getConflictResolution(conflicts: UpdateConflict[]): Promise<ConflictResolution[]>;
|
|
10
|
+
private getUserFileName;
|
|
11
|
+
applyResolutions(conflicts: UpdateConflict[], resolutions: ConflictResolution[]): Promise<{
|
|
12
|
+
preservedFiles: string[];
|
|
13
|
+
updatedFiles: string[];
|
|
14
|
+
}>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=conflict-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolution.d.ts","sourceRoot":"","sources":["../../src/services/conflict-resolution.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAM9D,qBAAa,yBAAyB;IACpC,OAAO,CAAC,aAAa,CAAgB;;IAS/B,eAAe,CACnB,aAAa,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EACvD,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,cAAc,EAAE,CAAC;IA8BtB,qBAAqB,CACzB,SAAS,EAAE,cAAc,EAAE,GAC1B,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAiFhC,OAAO,CAAC,eAAe;IASjB,gBAAgB,CACpB,SAAS,EAAE,cAAc,EAAE,EAC3B,WAAW,EAAE,kBAAkB,EAAE,GAChC,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAuCjE"}
|
|
@@ -0,0 +1,166 @@
|
|
|
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.ConflictResolutionService = void 0;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const fs = __importStar(require("fs-extra"));
|
|
42
|
+
const inquirer_1 = __importDefault(require("inquirer"));
|
|
43
|
+
const backup_1 = require("./backup");
|
|
44
|
+
class ConflictResolutionService {
|
|
45
|
+
constructor() {
|
|
46
|
+
this.backupService = new backup_1.BackupService();
|
|
47
|
+
}
|
|
48
|
+
async detectConflicts(templateFiles, existingFiles) {
|
|
49
|
+
const conflicts = [];
|
|
50
|
+
for (const templateFile of templateFiles) {
|
|
51
|
+
const filePath = templateFile.path;
|
|
52
|
+
if (existingFiles.includes(filePath)) {
|
|
53
|
+
const hasChanges = await this.backupService.hasFileChanged(filePath, templateFile.content);
|
|
54
|
+
if (hasChanges) {
|
|
55
|
+
const userContent = await fs.readFile(filePath, 'utf8');
|
|
56
|
+
conflicts.push({
|
|
57
|
+
filePath,
|
|
58
|
+
templateContent: templateFile.content,
|
|
59
|
+
userContent,
|
|
60
|
+
hasChanges: true,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return conflicts;
|
|
66
|
+
}
|
|
67
|
+
async getConflictResolution(conflicts) {
|
|
68
|
+
if (conflicts.length === 0) {
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
const resolutions = [];
|
|
72
|
+
console.log(`\n🔍 Found ${conflicts.length} conflicts that need resolution:\n`);
|
|
73
|
+
for (const conflict of conflicts) {
|
|
74
|
+
console.log(`Conflict in: ${conflict.filePath}`);
|
|
75
|
+
}
|
|
76
|
+
const { globalChoice } = await inquirer_1.default.prompt([
|
|
77
|
+
{
|
|
78
|
+
type: 'list',
|
|
79
|
+
name: 'globalChoice',
|
|
80
|
+
message: 'How would you like to handle conflicts?',
|
|
81
|
+
choices: [
|
|
82
|
+
{ name: 'Keep my versions (save as user.filename)', value: 'keep' },
|
|
83
|
+
{ name: 'Replace with template versions', value: 'replace' },
|
|
84
|
+
{ name: 'Review each conflict individually', value: 'individual' },
|
|
85
|
+
{ name: 'Cancel update', value: 'cancel' },
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
]);
|
|
89
|
+
if (globalChoice === 'cancel') {
|
|
90
|
+
throw new Error('Update cancelled by user');
|
|
91
|
+
}
|
|
92
|
+
if (globalChoice === 'individual') {
|
|
93
|
+
for (const conflict of conflicts) {
|
|
94
|
+
const { choice } = await inquirer_1.default.prompt([
|
|
95
|
+
{
|
|
96
|
+
type: 'list',
|
|
97
|
+
name: 'choice',
|
|
98
|
+
message: `Conflict in ${conflict.filePath}:`,
|
|
99
|
+
choices: [
|
|
100
|
+
{
|
|
101
|
+
name: 'Keep my version (save as user.filename)',
|
|
102
|
+
value: 'keep',
|
|
103
|
+
},
|
|
104
|
+
{ name: 'Replace with template version', value: 'replace' },
|
|
105
|
+
{ name: 'Skip this file', value: 'skip' },
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
]);
|
|
109
|
+
resolutions.push({
|
|
110
|
+
action: choice,
|
|
111
|
+
userFileName: choice === 'keep'
|
|
112
|
+
? this.getUserFileName(conflict.filePath)
|
|
113
|
+
: undefined,
|
|
114
|
+
applyToAll: false,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
for (const conflict of conflicts) {
|
|
120
|
+
resolutions.push({
|
|
121
|
+
action: globalChoice,
|
|
122
|
+
userFileName: globalChoice === 'keep'
|
|
123
|
+
? this.getUserFileName(conflict.filePath)
|
|
124
|
+
: undefined,
|
|
125
|
+
applyToAll: true,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return resolutions;
|
|
130
|
+
}
|
|
131
|
+
getUserFileName(originalPath) {
|
|
132
|
+
const dir = path.dirname(originalPath);
|
|
133
|
+
const filename = path.basename(originalPath);
|
|
134
|
+
return path.join(dir, `user.${filename}`);
|
|
135
|
+
}
|
|
136
|
+
async applyResolutions(conflicts, resolutions) {
|
|
137
|
+
const preservedFiles = [];
|
|
138
|
+
const updatedFiles = [];
|
|
139
|
+
for (let i = 0; i < conflicts.length; i++) {
|
|
140
|
+
const conflict = conflicts[i];
|
|
141
|
+
const resolution = resolutions[i];
|
|
142
|
+
if (!conflict || !resolution) {
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
switch (resolution.action) {
|
|
146
|
+
case 'keep':
|
|
147
|
+
if (resolution.userFileName) {
|
|
148
|
+
await fs.move(conflict.filePath, resolution.userFileName);
|
|
149
|
+
preservedFiles.push(resolution.userFileName);
|
|
150
|
+
await fs.writeFile(conflict.filePath, conflict.templateContent);
|
|
151
|
+
updatedFiles.push(conflict.filePath);
|
|
152
|
+
}
|
|
153
|
+
break;
|
|
154
|
+
case 'replace':
|
|
155
|
+
await fs.writeFile(conflict.filePath, conflict.templateContent);
|
|
156
|
+
updatedFiles.push(conflict.filePath);
|
|
157
|
+
break;
|
|
158
|
+
case 'skip':
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return { preservedFiles, updatedFiles };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
exports.ConflictResolutionService = ConflictResolutionService;
|
|
166
|
+
//# sourceMappingURL=conflict-resolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolution.js","sourceRoot":"","sources":["../../src/services/conflict-resolution.ts"],"names":[],"mappings":"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"}
|
package/lib/types/index.d.ts
CHANGED
|
@@ -4,13 +4,12 @@ export interface InitOptions {
|
|
|
4
4
|
skipVscode?: boolean;
|
|
5
5
|
skipGit?: boolean;
|
|
6
6
|
}
|
|
7
|
-
export interface ValidateOptions {
|
|
8
|
-
fix?: boolean;
|
|
9
|
-
strict?: boolean;
|
|
10
|
-
}
|
|
11
7
|
export interface UpdateOptions {
|
|
12
8
|
template?: string;
|
|
13
9
|
backup?: boolean;
|
|
10
|
+
force?: boolean;
|
|
11
|
+
dryRun?: boolean;
|
|
12
|
+
strict?: boolean;
|
|
14
13
|
}
|
|
15
14
|
export interface ProjectConfig {
|
|
16
15
|
name: string;
|
|
@@ -63,4 +62,20 @@ export interface FileSystemResult {
|
|
|
63
62
|
updated?: string[];
|
|
64
63
|
skipped?: string[];
|
|
65
64
|
}
|
|
65
|
+
export interface ConflictResolution {
|
|
66
|
+
action: 'keep' | 'replace' | 'skip';
|
|
67
|
+
userFileName?: string | undefined;
|
|
68
|
+
applyToAll?: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface UpdateConflict {
|
|
71
|
+
filePath: string;
|
|
72
|
+
templateContent: string;
|
|
73
|
+
userContent: string;
|
|
74
|
+
hasChanges: boolean;
|
|
75
|
+
}
|
|
76
|
+
export interface BackupResult {
|
|
77
|
+
backupPath: string;
|
|
78
|
+
timestamp: string;
|
|
79
|
+
filesBackedUp: string[];
|
|
80
|
+
}
|
|
66
81
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/types/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "metacoding",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Guided Development Workflow for GitHub Copilot - Transform your coding experience with AI-guided standards, structured workflows, and quality practices",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -96,6 +96,9 @@
|
|
|
96
96
|
"jest": {
|
|
97
97
|
"preset": "ts-jest",
|
|
98
98
|
"testEnvironment": "node",
|
|
99
|
+
"setupFilesAfterEnv": [
|
|
100
|
+
"<rootDir>/test/setup.ts"
|
|
101
|
+
],
|
|
99
102
|
"transform": {
|
|
100
103
|
"^.+\\.ts$": [
|
|
101
104
|
"ts-jest",
|
|
@@ -212,8 +212,11 @@ When providing code suggestions, prioritize:
|
|
|
212
212
|
### Step 2: Task Management
|
|
213
213
|
|
|
214
214
|
- **Document before executing:** Add corresponding task(s) to `/_meta/project-task-list.md` BEFORE any implementation work
|
|
215
|
-
- **
|
|
216
|
-
- **
|
|
215
|
+
- **Use standardized task naming:** Follow the `[AREA]-TASK-[NUMBER]` format for all tasks
|
|
216
|
+
- **Area Prefixes:** Use appropriate prefixes (CORE, API, UI, DB, AUTH, UTIL, CONFIG, DOC, CLI, TMPL, etc.)
|
|
217
|
+
- **Examples:** `CLI-TASK-001: Implement validate command`, `DOC-TASK-002: Update API documentation`
|
|
218
|
+
- **Set task status:** Mark tasks as "In Progress" with clear descriptions and status indicators
|
|
219
|
+
- **Break down complex tasks:** Split large tasks into smaller, manageable subtasks with sequential numbering
|
|
217
220
|
- **Estimate effort:** Provide realistic time/complexity estimates
|
|
218
221
|
- **Task documentation requirement:** Every task must be documented in the task list before work begins
|
|
219
222
|
|
|
@@ -86,6 +86,38 @@ This project enforces a strict distinction between different types of documentat
|
|
|
86
86
|
- **Use descriptive section names:** Use functional names like "Core Features", "Infrastructure", "Testing" instead of "Completed Tasks"
|
|
87
87
|
- **Avoid temporal references:** Don't use "Recent", "Latest", "Upcoming" in section headers - they become outdated quickly
|
|
88
88
|
|
|
89
|
+
### Task ID Naming Convention
|
|
90
|
+
|
|
91
|
+
Follow the standardized task naming format for all project management documentation:
|
|
92
|
+
|
|
93
|
+
#### Required Task Format
|
|
94
|
+
|
|
95
|
+
```markdown
|
|
96
|
+
- [ ] **[AREA]-TASK-001: Task title** - ❌ **NOT STARTED**
|
|
97
|
+
- Detailed task description and requirements
|
|
98
|
+
- Implementation steps and acceptance criteria
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
#### Task ID Conventions
|
|
102
|
+
|
|
103
|
+
- **Format:** `[AREA]-TASK-[NUMBER]`
|
|
104
|
+
- **Area Prefixes:** Adapt to your project (CORE, API, UI, DB, AUTH, UTIL, CONFIG, DOC, CLI, TMPL, etc.)
|
|
105
|
+
- **Task Type:** Always use "TASK" for consistency
|
|
106
|
+
- **Sequential Numbering:** 001, 002, 003, etc. within each area
|
|
107
|
+
- **Examples:**
|
|
108
|
+
- `CLI-TASK-001: Implement validate command`
|
|
109
|
+
- `API-TASK-002: Add authentication middleware`
|
|
110
|
+
- `DOC-TASK-003: Update README installation guide`
|
|
111
|
+
- `TMPL-TASK-004: Create Python project template`
|
|
112
|
+
|
|
113
|
+
#### Task Organization Requirements
|
|
114
|
+
|
|
115
|
+
- **Functional Grouping:** Group tasks by system area/component
|
|
116
|
+
- **Clear Descriptions:** Provide specific, actionable task descriptions
|
|
117
|
+
- **Status Tracking:** Use standard status indicators (❌ NOT STARTED, 🚧 IN PROGRESS, ✅ COMPLETED)
|
|
118
|
+
- **Acceptance Criteria:** Include clear completion criteria in task details
|
|
119
|
+
- **Dependencies:** Note task dependencies and prerequisites when relevant
|
|
120
|
+
|
|
89
121
|
## README.md Standards (System Documentation)
|
|
90
122
|
|
|
91
123
|
**⚠️ README.md is system documentation - NO status indicators or temporal language allowed**
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAK3C,qBAAa,eAAe;IACpB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAWxD"}
|
package/lib/commands/validate.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.ValidateCommand = void 0;
|
|
7
|
-
const chalk_1 = __importDefault(require("chalk"));
|
|
8
|
-
class ValidateCommand {
|
|
9
|
-
async execute(_options) {
|
|
10
|
-
console.log(chalk_1.default.cyan('🔍 Validating metacoding setup...\n'));
|
|
11
|
-
console.log(chalk_1.default.yellow('⚠️ Validation command is not yet implemented.'));
|
|
12
|
-
console.log(chalk_1.default.dim('This feature will check:'));
|
|
13
|
-
console.log(chalk_1.default.dim('- Required files exist'));
|
|
14
|
-
console.log(chalk_1.default.dim('- VS Code settings are configured'));
|
|
15
|
-
console.log(chalk_1.default.dim('- Instruction files are valid'));
|
|
16
|
-
console.log(chalk_1.default.dim('- Template consistency'));
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
exports.ValidateCommand = ValidateCommand;
|
|
20
|
-
//# sourceMappingURL=validate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAM1B,MAAa,eAAe;IAC1B,KAAK,CAAC,OAAO,CAAC,QAAyB;QACrC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAG/D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,gDAAgD,CAAC,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACnD,CAAC;CACF;AAZD,0CAYC"}
|