bytarch-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.genie-cli/config.json +7 -0
- package/.genie-cli/plan.json +10 -0
- package/bin/bytarch-cli.js +3 -0
- package/dist/commands/apply.d.ts +9 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +118 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/config.d.ts +14 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +189 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/edit.d.ts +8 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +152 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +89 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/plan.d.ts +10 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +173 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/review.d.ts +13 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +240 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/status.d.ts +9 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +122 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/fs/patcher.d.ts +19 -0
- package/dist/fs/patcher.d.ts.map +1 -0
- package/dist/fs/patcher.js +210 -0
- package/dist/fs/patcher.js.map +1 -0
- package/dist/fs/safe-readwrite.d.ts +20 -0
- package/dist/fs/safe-readwrite.d.ts.map +1 -0
- package/dist/fs/safe-readwrite.js +146 -0
- package/dist/fs/safe-readwrite.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/provider/bytarch.d.ts +26 -0
- package/dist/provider/bytarch.d.ts.map +1 -0
- package/dist/provider/bytarch.js +54 -0
- package/dist/provider/bytarch.js.map +1 -0
- package/dist/provider/evaluation.d.ts +5 -0
- package/dist/provider/evaluation.d.ts.map +1 -0
- package/dist/provider/evaluation.js +40 -0
- package/dist/provider/evaluation.js.map +1 -0
- package/dist/provider/prompts.d.ts +4 -0
- package/dist/provider/prompts.d.ts.map +1 -0
- package/dist/provider/prompts.js +61 -0
- package/dist/provider/prompts.js.map +1 -0
- package/dist/ui/prompts.d.ts +43 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +122 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/workspace/config.d.ts +19 -0
- package/dist/workspace/config.d.ts.map +1 -0
- package/dist/workspace/config.js +102 -0
- package/dist/workspace/config.js.map +1 -0
- package/dist/workspace/edits.d.ts +24 -0
- package/dist/workspace/edits.d.ts.map +1 -0
- package/dist/workspace/edits.js +119 -0
- package/dist/workspace/edits.js.map +1 -0
- package/dist/workspace/plan.d.ts +29 -0
- package/dist/workspace/plan.d.ts.map +1 -0
- package/dist/workspace/plan.js +101 -0
- package/dist/workspace/plan.js.map +1 -0
- package/package.json +52 -0
- package/src/commands/apply.ts +91 -0
- package/src/commands/config.ts +194 -0
- package/src/commands/edit.ts +133 -0
- package/src/commands/init.ts +62 -0
- package/src/commands/plan.ts +163 -0
- package/src/commands/review.ts +242 -0
- package/src/commands/status.ts +101 -0
- package/src/fs/patcher.ts +188 -0
- package/src/fs/safe-readwrite.ts +141 -0
- package/src/index.ts +123 -0
- package/src/provider/bytarch.ts +75 -0
- package/src/provider/evaluation.ts +39 -0
- package/src/provider/prompts.ts +59 -0
- package/src/ui/prompts.ts +163 -0
- package/src/workspace/config.ts +86 -0
- package/src/workspace/edits.ts +106 -0
- package/src/workspace/plan.ts +92 -0
- package/tsconfig.json +36 -0
|
@@ -0,0 +1,102 @@
|
|
|
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.ConfigManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class ConfigManager {
|
|
40
|
+
workspacePath;
|
|
41
|
+
configPath;
|
|
42
|
+
constructor(workspacePath) {
|
|
43
|
+
this.workspacePath = workspacePath;
|
|
44
|
+
this.configPath = path.join(workspacePath, 'config.json');
|
|
45
|
+
}
|
|
46
|
+
async loadConfig() {
|
|
47
|
+
try {
|
|
48
|
+
if (await fs.pathExists(this.configPath)) {
|
|
49
|
+
const config = await fs.readJson(this.configPath);
|
|
50
|
+
return this.mergeWithEnv(config);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.warn('Failed to load config, creating default:', error);
|
|
55
|
+
}
|
|
56
|
+
return this.createDefaultConfig();
|
|
57
|
+
}
|
|
58
|
+
async saveConfig(config) {
|
|
59
|
+
await fs.writeJson(this.configPath, config, { spaces: 2 });
|
|
60
|
+
}
|
|
61
|
+
async updateConfig(updates) {
|
|
62
|
+
const config = await this.loadConfig();
|
|
63
|
+
const newConfig = { ...config, ...updates };
|
|
64
|
+
await this.saveConfig(newConfig);
|
|
65
|
+
return newConfig;
|
|
66
|
+
}
|
|
67
|
+
getApiKey(config) {
|
|
68
|
+
const envApiKey = process.env.BYTARCH_API_KEY;
|
|
69
|
+
if (envApiKey) {
|
|
70
|
+
return envApiKey;
|
|
71
|
+
}
|
|
72
|
+
if (config.apiKey) {
|
|
73
|
+
return config.apiKey;
|
|
74
|
+
}
|
|
75
|
+
throw new Error('BYTARCH API key not found. Set BYTARCH_API_KEY environment variable or configure in .genie-cli/config.json');
|
|
76
|
+
}
|
|
77
|
+
mergeWithEnv(config) {
|
|
78
|
+
const defaultConfig = this.createDefaultConfig();
|
|
79
|
+
const mergedConfig = { ...defaultConfig, ...config };
|
|
80
|
+
if (process.env.BYTARCH_API_KEY) {
|
|
81
|
+
mergedConfig.apiKey = process.env.BYTARCH_API_KEY;
|
|
82
|
+
}
|
|
83
|
+
if (process.env.BYTARCH_ENDPOINT) {
|
|
84
|
+
mergedConfig.endpoint = process.env.BYTARCH_ENDPOINT;
|
|
85
|
+
}
|
|
86
|
+
if (process.env.BYTARCH_MODEL) {
|
|
87
|
+
mergedConfig.model = process.env.BYTARCH_MODEL;
|
|
88
|
+
}
|
|
89
|
+
return mergedConfig;
|
|
90
|
+
}
|
|
91
|
+
createDefaultConfig() {
|
|
92
|
+
return {
|
|
93
|
+
provider: 'bytarch',
|
|
94
|
+
endpoint: 'https://api.bytarch.dpdns.org/openai/v1/chat/completions',
|
|
95
|
+
model: 'gpt-5-nano',
|
|
96
|
+
apiKey: '',
|
|
97
|
+
dryRun: true
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.ConfigManager = ConfigManager;
|
|
102
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/workspace/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,2CAA6B;AAU7B,MAAa,aAAa;IAChB,aAAa,CAAS;IACtB,UAAU,CAAS;IAE3B,YAAY,aAAqB;QAC/B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACzC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClD,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,0CAA0C,EAAE,KAAK,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAwB;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;QAC5C,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAC9C,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,4GAA4G,CAAC,CAAC;IAChI,CAAC;IAEO,YAAY,CAAC,MAAuB;QAC1C,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;QAErD,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;YAChC,YAAY,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QACpD,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACjC,YAAY,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;QACvD,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YAC9B,YAAY,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QACjD,CAAC;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,mBAAmB;QACzB,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,0DAA0D;YACpE,KAAK,EAAE,YAAY;YACnB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;CACF;AA1ED,sCA0EC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface FileEdit {
|
|
2
|
+
id: string;
|
|
3
|
+
path: string;
|
|
4
|
+
description: string;
|
|
5
|
+
rationale: string;
|
|
6
|
+
patch: string;
|
|
7
|
+
status: 'pending' | 'accepted' | 'rejected' | 'applied';
|
|
8
|
+
createdAt: string;
|
|
9
|
+
updatedAt: string;
|
|
10
|
+
}
|
|
11
|
+
export declare class EditManager {
|
|
12
|
+
private workspacePath;
|
|
13
|
+
private editsPath;
|
|
14
|
+
constructor(workspacePath: string);
|
|
15
|
+
ensureEditsDir(): Promise<void>;
|
|
16
|
+
saveEdit(edit: FileEdit): Promise<void>;
|
|
17
|
+
loadEdit(editId: string): Promise<FileEdit | null>;
|
|
18
|
+
listEdits(): Promise<FileEdit[]>;
|
|
19
|
+
updateEditStatus(editId: string, status: FileEdit['status']): Promise<FileEdit | null>;
|
|
20
|
+
deleteEdit(editId: string): Promise<void>;
|
|
21
|
+
getPendingEdits(): Promise<FileEdit[]>;
|
|
22
|
+
generateEditId(): string;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=edits.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edits.d.ts","sourceRoot":"","sources":["../../src/workspace/edits.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,SAAS,CAAS;gBAEd,aAAa,EAAE,MAAM;IAK3B,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAelD,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA2BhC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAUtF,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAK5C,cAAc,IAAI,MAAM;CAGzB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
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.EditManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class EditManager {
|
|
40
|
+
workspacePath;
|
|
41
|
+
editsPath;
|
|
42
|
+
constructor(workspacePath) {
|
|
43
|
+
this.workspacePath = workspacePath;
|
|
44
|
+
this.editsPath = path.join(workspacePath, 'edits');
|
|
45
|
+
}
|
|
46
|
+
async ensureEditsDir() {
|
|
47
|
+
await fs.ensureDir(this.editsPath);
|
|
48
|
+
}
|
|
49
|
+
async saveEdit(edit) {
|
|
50
|
+
await this.ensureEditsDir();
|
|
51
|
+
edit.updatedAt = new Date().toISOString();
|
|
52
|
+
const editPath = path.join(this.editsPath, `${edit.id}.json`);
|
|
53
|
+
await fs.writeJson(editPath, edit, { spaces: 2 });
|
|
54
|
+
}
|
|
55
|
+
async loadEdit(editId) {
|
|
56
|
+
await this.ensureEditsDir();
|
|
57
|
+
const editPath = path.join(this.editsPath, `${editId}.json`);
|
|
58
|
+
try {
|
|
59
|
+
if (await fs.pathExists(editPath)) {
|
|
60
|
+
return await fs.readJson(editPath);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.warn(`Failed to load edit ${editId}:`, error);
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
async listEdits() {
|
|
69
|
+
await this.ensureEditsDir();
|
|
70
|
+
try {
|
|
71
|
+
const files = await fs.readdir(this.editsPath);
|
|
72
|
+
const jsonFiles = files.filter(file => file.endsWith('.json'));
|
|
73
|
+
const edits = [];
|
|
74
|
+
for (const file of jsonFiles) {
|
|
75
|
+
const editPath = path.join(this.editsPath, file);
|
|
76
|
+
try {
|
|
77
|
+
const edit = await fs.readJson(editPath);
|
|
78
|
+
edits.push(edit);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.warn(`Failed to load edit file ${file}:`, error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return edits.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.warn('Failed to list edits:', error);
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async updateEditStatus(editId, status) {
|
|
92
|
+
const edit = await this.loadEdit(editId);
|
|
93
|
+
if (!edit)
|
|
94
|
+
return null;
|
|
95
|
+
edit.status = status;
|
|
96
|
+
edit.updatedAt = new Date().toISOString();
|
|
97
|
+
await this.saveEdit(edit);
|
|
98
|
+
return edit;
|
|
99
|
+
}
|
|
100
|
+
async deleteEdit(editId) {
|
|
101
|
+
await this.ensureEditsDir();
|
|
102
|
+
const editPath = path.join(this.editsPath, `${editId}.json`);
|
|
103
|
+
try {
|
|
104
|
+
await fs.remove(editPath);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.warn(`Failed to delete edit ${editId}:`, error);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async getPendingEdits() {
|
|
111
|
+
const edits = await this.listEdits();
|
|
112
|
+
return edits.filter(edit => edit.status === 'pending' || edit.status === 'accepted');
|
|
113
|
+
}
|
|
114
|
+
generateEditId() {
|
|
115
|
+
return `edit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
exports.EditManager = EditManager;
|
|
119
|
+
//# sourceMappingURL=edits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"edits.js","sourceRoot":"","sources":["../../src/workspace/edits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface PlanItem {
|
|
2
|
+
id: string;
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
status: 'pending' | 'in_progress' | 'completed';
|
|
6
|
+
rationale?: string;
|
|
7
|
+
files?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface Plan {
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
description: string;
|
|
13
|
+
items: PlanItem[];
|
|
14
|
+
rationale: string;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
updatedAt: string;
|
|
17
|
+
}
|
|
18
|
+
export declare class PlanManager {
|
|
19
|
+
private workspacePath;
|
|
20
|
+
private planPath;
|
|
21
|
+
constructor(workspacePath: string);
|
|
22
|
+
loadPlan(): Promise<Plan>;
|
|
23
|
+
savePlan(plan: Plan): Promise<void>;
|
|
24
|
+
updatePlanItem(itemId: string, updates: Partial<PlanItem>): Promise<Plan>;
|
|
25
|
+
addPlanItem(item: PlanItem): Promise<Plan>;
|
|
26
|
+
removePlanItem(itemId: string): Promise<Plan>;
|
|
27
|
+
private createDefaultPlan;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/workspace/plan.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,GAAG,aAAa,GAAG,WAAW,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAS;gBAEb,aAAa,EAAE,MAAM;IAK3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAazB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAKnC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzE,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAO1C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,OAAO,CAAC,iBAAiB;CAW1B"}
|
|
@@ -0,0 +1,101 @@
|
|
|
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.PlanManager = void 0;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
class PlanManager {
|
|
40
|
+
workspacePath;
|
|
41
|
+
planPath;
|
|
42
|
+
constructor(workspacePath) {
|
|
43
|
+
this.workspacePath = workspacePath;
|
|
44
|
+
this.planPath = path.join(workspacePath, 'plan.json');
|
|
45
|
+
}
|
|
46
|
+
async loadPlan() {
|
|
47
|
+
try {
|
|
48
|
+
if (await fs.pathExists(this.planPath)) {
|
|
49
|
+
const data = await fs.readJson(this.planPath);
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
console.warn('Failed to load plan, creating default:', error);
|
|
55
|
+
}
|
|
56
|
+
return this.createDefaultPlan();
|
|
57
|
+
}
|
|
58
|
+
async savePlan(plan) {
|
|
59
|
+
plan.updatedAt = new Date().toISOString();
|
|
60
|
+
await fs.writeJson(this.planPath, plan, { spaces: 2 });
|
|
61
|
+
}
|
|
62
|
+
async updatePlanItem(itemId, updates) {
|
|
63
|
+
const plan = await this.loadPlan();
|
|
64
|
+
const updateItem = (items) => {
|
|
65
|
+
return items.map(item => {
|
|
66
|
+
if (item.id === itemId) {
|
|
67
|
+
return { ...item, ...updates };
|
|
68
|
+
}
|
|
69
|
+
return item;
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
plan.items = updateItem(plan.items);
|
|
73
|
+
await this.savePlan(plan);
|
|
74
|
+
return plan;
|
|
75
|
+
}
|
|
76
|
+
async addPlanItem(item) {
|
|
77
|
+
const plan = await this.loadPlan();
|
|
78
|
+
plan.items.push(item);
|
|
79
|
+
await this.savePlan(plan);
|
|
80
|
+
return plan;
|
|
81
|
+
}
|
|
82
|
+
async removePlanItem(itemId) {
|
|
83
|
+
const plan = await this.loadPlan();
|
|
84
|
+
plan.items = plan.items.filter(item => item.id !== itemId);
|
|
85
|
+
await this.savePlan(plan);
|
|
86
|
+
return plan;
|
|
87
|
+
}
|
|
88
|
+
createDefaultPlan() {
|
|
89
|
+
return {
|
|
90
|
+
id: 'default',
|
|
91
|
+
title: 'Project Plan',
|
|
92
|
+
description: 'Generated project plan',
|
|
93
|
+
items: [],
|
|
94
|
+
rationale: '',
|
|
95
|
+
createdAt: new Date().toISOString(),
|
|
96
|
+
updatedAt: new Date().toISOString()
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.PlanManager = PlanManager;
|
|
101
|
+
//# sourceMappingURL=plan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/workspace/plan.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bytarch-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "AI-powered CLI for project planning and code editing using BYTARCH OpenAI-compatible API",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"bytarch-cli": "./bin/bytarch-cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"start": "node bin/bytarch-cli.js",
|
|
12
|
+
"dev": "ts-node src/index.ts",
|
|
13
|
+
"test": "jest",
|
|
14
|
+
"lint": "eslint src/**/*.ts",
|
|
15
|
+
"format": "prettier --write src/**/*.ts"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [
|
|
18
|
+
"cli",
|
|
19
|
+
"ai",
|
|
20
|
+
"code",
|
|
21
|
+
"planning",
|
|
22
|
+
"bytarch",
|
|
23
|
+
"openai"
|
|
24
|
+
],
|
|
25
|
+
"author": "",
|
|
26
|
+
"license": "MIT",
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"ai": "^6.0.50",
|
|
29
|
+
"commander": "^12.0.0",
|
|
30
|
+
"inquirer": "^9.2.0",
|
|
31
|
+
"chalk": "^5.3.0",
|
|
32
|
+
"fs-extra": "^11.2.0",
|
|
33
|
+
"diff": "^5.1.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^20.11.0",
|
|
37
|
+
"@types/inquirer": "^9.0.0",
|
|
38
|
+
"@types/fs-extra": "^11.0.0",
|
|
39
|
+
"@types/diff": "^5.0.0",
|
|
40
|
+
"typescript": "^5.3.0",
|
|
41
|
+
"ts-node": "^10.9.0",
|
|
42
|
+
"jest": "^29.7.0",
|
|
43
|
+
"@types/jest": "^29.5.0",
|
|
44
|
+
"eslint": "^8.56.0",
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "^6.19.0",
|
|
46
|
+
"@typescript-eslint/parser": "^6.19.0",
|
|
47
|
+
"prettier": "^3.2.0"
|
|
48
|
+
},
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">=18.0.0"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import { ConfigManager } from '../workspace/config';
|
|
3
|
+
import { EditManager } from '../workspace/edits';
|
|
4
|
+
import { Patcher } from '../fs/patcher';
|
|
5
|
+
import { UI } from '../ui/prompts';
|
|
6
|
+
|
|
7
|
+
export class ApplyCommand {
|
|
8
|
+
static async execute(options: { force?: boolean; dryRun?: boolean; ids?: string }): Promise<void> {
|
|
9
|
+
const projectRoot = process.cwd();
|
|
10
|
+
const workspacePath = path.join(projectRoot, '.genie-cli');
|
|
11
|
+
|
|
12
|
+
const configManager = new ConfigManager(workspacePath);
|
|
13
|
+
const editManager = new EditManager(workspacePath);
|
|
14
|
+
const patcher = new Patcher(projectRoot);
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
const config = await configManager.loadConfig();
|
|
18
|
+
|
|
19
|
+
if (!options.force && !options.dryRun && config.dryRun) {
|
|
20
|
+
UI.info('Dry-run mode is enabled by default. Use --force to actually apply changes.');
|
|
21
|
+
options.dryRun = true;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let editsToApply = await editManager.getPendingEdits();
|
|
25
|
+
|
|
26
|
+
if (options.ids) {
|
|
27
|
+
const targetIds = options.ids.split(',').map(id => id.trim());
|
|
28
|
+
editsToApply = editsToApply.filter(edit => targetIds.includes(edit.id));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
editsToApply = editsToApply.filter(edit => edit.status === 'accepted');
|
|
32
|
+
|
|
33
|
+
if (editsToApply.length === 0) {
|
|
34
|
+
UI.warning('No accepted edits to apply.');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
UI.header(`🔧 Applying ${editsToApply.length} edit(s)${options.dryRun ? ' (DRY RUN)' : ''}`);
|
|
39
|
+
|
|
40
|
+
for (let i = 0; i < editsToApply.length; i++) {
|
|
41
|
+
const edit = editsToApply[i];
|
|
42
|
+
UI.progress(i + 1, editsToApply.length, `Processing ${edit.path}`);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
if (options.dryRun) {
|
|
46
|
+
const preview = await patcher.previewPatch(edit);
|
|
47
|
+
console.log(preview);
|
|
48
|
+
} else {
|
|
49
|
+
if (options.force || await this.confirmEdit(edit)) {
|
|
50
|
+
const result = await patcher.applyPatch(edit);
|
|
51
|
+
|
|
52
|
+
if (result.success) {
|
|
53
|
+
await editManager.updateEditStatus(edit.id, 'applied');
|
|
54
|
+
UI.success(`Applied ${edit.path} (${result.appliedChanges} changes)`);
|
|
55
|
+
} else {
|
|
56
|
+
UI.error(`Failed to apply ${edit.path}: ${result.error}`);
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
UI.info(`Skipped ${edit.path}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} catch (error) {
|
|
63
|
+
UI.error(`Error processing ${edit.path}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (options.dryRun) {
|
|
68
|
+
UI.info('Dry run completed. No changes were made.');
|
|
69
|
+
} else {
|
|
70
|
+
UI.success('Apply process completed.');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
} catch (error) {
|
|
74
|
+
throw new Error(`Failed to apply edits: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
private static async confirmEdit(edit: any): Promise<boolean> {
|
|
79
|
+
console.log(`\\nEdit: ${edit.path}`);
|
|
80
|
+
console.log(`Description: ${edit.description}`);
|
|
81
|
+
|
|
82
|
+
if (edit.rationale) {
|
|
83
|
+
console.log(`Rationale: ${edit.rationale}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return await UI.confirm({
|
|
87
|
+
message: `Apply this edit to ${edit.path}?`,
|
|
88
|
+
default: true
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|