@veedubin/neuralgentics 0.12.6 → 0.13.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.
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Update logic for the neuralgentics two-init installer.
3
+ *
4
+ * Three update modes:
5
+ * - updateAll() — find all .neuralgentics-state.json files under
6
+ * ~/.config/opencode/ AND under all project
7
+ * directories the user has initialized
8
+ * - updateProject() — only update {CWD}/.opencode/
9
+ * - updateHomedir() — only update the homedir config
10
+ *
11
+ * For each update:
12
+ * 1. Read .neuralgentics-state.json for installed version + file manifest
13
+ * 2. Download latest tarball (reuse download.ts)
14
+ * 3. For each file in new tarball:
15
+ * - Compute SHA-256
16
+ * - Compare against state file manifest
17
+ * - If changed: call backupFile() then write new file
18
+ * - If same: skip
19
+ * - If new: create
20
+ * 4. Update state file with new version + manifest
21
+ * 5. Print summary
22
+ * 6. Print final prompt to user
23
+ */
24
+ import { createHash } from "node:crypto";
25
+ import { promises as fs, existsSync } from "node:fs";
26
+ import * as path from "node:path";
27
+ import * as os from "node:os";
28
+ import { downloadTarball, extractTarball, resolveVersion, verifySha256, } from "./download.js";
29
+ import { getHomedirConfigPath, getProjectConfigPath } from "./paths.js";
30
+ import { backupFile } from "./backup.js";
31
+ /** Name of the state file inside a config directory. */
32
+ const STATE_FILENAME = ".neuralgentics-state.json";
33
+ /** Read chunk size for SHA256 computation (64 KiB). */
34
+ const CHUNK_SIZE = 64 * 1024;
35
+ /**
36
+ * Compute the SHA-256 hash of a file.
37
+ */
38
+ async function computeFileSha256(filePath) {
39
+ const hash = createHash("sha256");
40
+ const handle = await fs.open(filePath, "r");
41
+ try {
42
+ const buffer = Buffer.alloc(CHUNK_SIZE);
43
+ // eslint-disable-next-line no-constant-condition
44
+ while (true) {
45
+ const { bytesRead } = await handle.read(buffer, 0, CHUNK_SIZE, null);
46
+ if (bytesRead === 0)
47
+ break;
48
+ hash.update(buffer.subarray(0, bytesRead));
49
+ }
50
+ }
51
+ finally {
52
+ await handle.close();
53
+ }
54
+ return hash.digest("hex");
55
+ }
56
+ /**
57
+ * Read a state file from a config directory.
58
+ */
59
+ async function readStateFile(configDir) {
60
+ const statePath = path.join(configDir, STATE_FILENAME);
61
+ if (!existsSync(statePath))
62
+ return null;
63
+ try {
64
+ const text = await fs.readFile(statePath, "utf-8");
65
+ return JSON.parse(text);
66
+ }
67
+ catch {
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Write a state file to a config directory.
73
+ */
74
+ async function writeStateFile(configDir, state) {
75
+ const statePath = path.join(configDir, STATE_FILENAME);
76
+ await fs.mkdir(path.dirname(statePath), { recursive: true });
77
+ await fs.writeFile(statePath, JSON.stringify(state, null, 2) + "\n", "utf-8");
78
+ }
79
+ /**
80
+ * Walk a directory tree and return all file paths.
81
+ */
82
+ async function iterFiles(root) {
83
+ const result = [];
84
+ async function walk(dir) {
85
+ const entries = await fs.readdir(dir, { withFileTypes: true });
86
+ for (const entry of entries) {
87
+ const full = path.join(dir, entry.name);
88
+ if (entry.isDirectory()) {
89
+ await walk(full);
90
+ }
91
+ else if (entry.isFile()) {
92
+ result.push(full);
93
+ }
94
+ }
95
+ }
96
+ await walk(root);
97
+ result.sort();
98
+ return result;
99
+ }
100
+ /**
101
+ * Update a single config directory from the tarball.
102
+ *
103
+ * @param configDir — the config directory to update
104
+ * @param extractDir — the extracted tarball directory (source of new files)
105
+ * @param newVersion — the new version string
106
+ * @param opts — update options
107
+ */
108
+ async function updateConfigDir(configDir, extractDir, newVersion, opts) {
109
+ const state = await readStateFile(configDir);
110
+ const installType = state?.installType ?? "unknown";
111
+ const fromVersion = state?.installed_version ?? null;
112
+ if (opts.dryRun) {
113
+ process.stdout.write(`[DRY-RUN] Would update ${configDir} from ${fromVersion ?? "none"} to ${newVersion}\n`);
114
+ return {
115
+ configDir,
116
+ installType,
117
+ updated: 0,
118
+ skipped: 0,
119
+ created: 0,
120
+ backups: [],
121
+ fromVersion,
122
+ toVersion: newVersion,
123
+ };
124
+ }
125
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
126
+ const newFiles = await iterFiles(extractDir);
127
+ const newManifest = {};
128
+ let updated = 0;
129
+ let skipped = 0;
130
+ let created = 0;
131
+ const backups = [];
132
+ for (const src of newFiles) {
133
+ const rel = path.relative(extractDir, src).split(path.sep).join("/");
134
+ const dest = path.join(configDir, rel);
135
+ const newSha = await computeFileSha256(src);
136
+ const oldRecord = state?.files[rel];
137
+ // Compute destination directory and ensure it exists
138
+ await fs.mkdir(path.dirname(dest), { recursive: true });
139
+ if (oldRecord && oldRecord.sha256 === newSha && !opts.force) {
140
+ // Same content — skip
141
+ skipped++;
142
+ newManifest[rel] = oldRecord;
143
+ continue;
144
+ }
145
+ if (existsSync(dest) && !opts.force) {
146
+ // File exists and differs — back up first
147
+ const backup = await backupFile(configDir, dest, timestamp);
148
+ if (backup !== null)
149
+ backups.push(backup);
150
+ updated++;
151
+ }
152
+ else if (!existsSync(dest)) {
153
+ created++;
154
+ }
155
+ else {
156
+ // force mode — back up the existing file
157
+ const backup = await backupFile(configDir, dest, timestamp);
158
+ if (backup !== null)
159
+ backups.push(backup);
160
+ updated++;
161
+ }
162
+ await fs.copyFile(src, dest);
163
+ newManifest[rel] = {
164
+ sha256: await computeFileSha256(dest),
165
+ user_modified: false,
166
+ installed_from: newVersion,
167
+ last_known_shipped_sha256: newSha,
168
+ merged: rel.endsWith("opencode.json") ? true : null,
169
+ };
170
+ }
171
+ // Write updated state file
172
+ const now = new Date().toISOString().replace(/\.\d+Z$/, "Z");
173
+ const newState = {
174
+ version: 1,
175
+ installed_version: newVersion,
176
+ installed_at: state?.installed_at ?? now,
177
+ updated_at: now,
178
+ cli_version: state?.cli_version ?? "0.1.0",
179
+ source: "github",
180
+ repo: opts.repo,
181
+ target: configDir,
182
+ files: newManifest,
183
+ last_backup: backups.length > 0 ? path.join(configDir, "opencode-bak") : null,
184
+ installType: installType === "unknown" ? "project" : installType,
185
+ };
186
+ await writeStateFile(configDir, newState);
187
+ return {
188
+ configDir,
189
+ installType,
190
+ updated,
191
+ skipped,
192
+ created,
193
+ backups,
194
+ fromVersion,
195
+ toVersion: newVersion,
196
+ };
197
+ }
198
+ /**
199
+ * Download and extract the latest tarball.
200
+ */
201
+ async function downloadAndExtract(version, repo) {
202
+ const resolvedVersion = await resolveVersion(version, repo);
203
+ const { tarballPath, checksumsPath } = await downloadTarball(resolvedVersion, repo);
204
+ await verifySha256(tarballPath, checksumsPath);
205
+ const extractDir = await fs.mkdtemp(path.join(os.tmpdir(), `neuralgentics-update-${resolvedVersion}-`));
206
+ await extractTarball(tarballPath, extractDir);
207
+ return { extractDir, version: resolvedVersion };
208
+ }
209
+ /**
210
+ * Find all config directories with state files.
211
+ *
212
+ * Searches:
213
+ * 1. The homedir config directory
214
+ * 2. All project directories under the user's home that have
215
+ * .neuralgentics-state.json files
216
+ */
217
+ async function findAllStateDirs() {
218
+ const dirs = new Set();
219
+ const homedirConfig = getHomedirConfigPath();
220
+ if (existsSync(path.join(homedirConfig, STATE_FILENAME))) {
221
+ dirs.add(homedirConfig);
222
+ }
223
+ // Search for project-level state files under the home directory.
224
+ // This is a shallow search — we look for .opencode/.neuralgentics-state.json
225
+ // in immediate subdirectories of the home dir and common project locations.
226
+ const home = os.homedir();
227
+ const searchRoots = [
228
+ home,
229
+ path.join(home, "Projects"),
230
+ path.join(home, "projects"),
231
+ path.join(home, "Code"),
232
+ path.join(home, "code"),
233
+ path.join(home, "src"),
234
+ path.join(home, "workspace"),
235
+ ];
236
+ for (const root of searchRoots) {
237
+ if (!existsSync(root))
238
+ continue;
239
+ try {
240
+ const entries = await fs.readdir(root, { withFileTypes: true });
241
+ for (const entry of entries) {
242
+ if (!entry.isDirectory())
243
+ continue;
244
+ const projectConfig = path.join(root, entry.name, ".opencode");
245
+ const stateFile = path.join(projectConfig, STATE_FILENAME);
246
+ if (existsSync(stateFile)) {
247
+ dirs.add(projectConfig);
248
+ }
249
+ }
250
+ }
251
+ catch {
252
+ // Permission denied or other error — skip this root.
253
+ }
254
+ }
255
+ return Array.from(dirs).sort();
256
+ }
257
+ /**
258
+ * Update ALL installs under the user's home (projects + homedir).
259
+ */
260
+ export async function updateAll(opts) {
261
+ const { extractDir, version } = await downloadAndExtract(opts.version, opts.repo);
262
+ const configDirs = await findAllStateDirs();
263
+ const results = [];
264
+ for (const dir of configDirs) {
265
+ try {
266
+ const result = await updateConfigDir(dir, extractDir, version, opts);
267
+ results.push(result);
268
+ }
269
+ catch (err) {
270
+ process.stderr.write(`[ERROR] Failed to update ${dir}: ${err instanceof Error ? err.message : String(err)}\n`);
271
+ }
272
+ }
273
+ printUpdateSummary(results);
274
+ return results;
275
+ }
276
+ /**
277
+ * Update just THIS project (CWD).
278
+ */
279
+ export async function updateProject(opts) {
280
+ const { extractDir, version } = await downloadAndExtract(opts.version, opts.repo);
281
+ const configDir = getProjectConfigPath();
282
+ const result = await updateConfigDir(configDir, extractDir, version, opts);
283
+ printUpdateSummary([result]);
284
+ return [result];
285
+ }
286
+ /**
287
+ * Update just the home dir.
288
+ */
289
+ export async function updateHomedir(opts) {
290
+ const { extractDir, version } = await downloadAndExtract(opts.version, opts.repo);
291
+ const configDir = getHomedirConfigPath();
292
+ const result = await updateConfigDir(configDir, extractDir, version, opts);
293
+ printUpdateSummary([result]);
294
+ return [result];
295
+ }
296
+ /**
297
+ * Print a summary of update results.
298
+ */
299
+ function printUpdateSummary(results) {
300
+ for (const r of results) {
301
+ process.stdout.write(`\nUpdated ${r.configDir}\n` +
302
+ ` ${r.updated} files updated, ${r.skipped} skipped, ${r.created} created\n` +
303
+ ` Version: ${r.fromVersion ?? "none"} → ${r.toVersion}\n`);
304
+ if (r.backups.length > 0) {
305
+ process.stdout.write(` Backups at ${path.dirname(r.backups[0].backupPath)}/\n`);
306
+ }
307
+ }
308
+ // Final prompt
309
+ const anyBackups = results.some((r) => r.backups.length > 0);
310
+ if (anyBackups) {
311
+ const firstBackupDir = results
312
+ .find((r) => r.backups.length > 0)
313
+ ?.backups[0]?.backupPath;
314
+ if (firstBackupDir) {
315
+ process.stdout.write(`\nPersonalize the updated files if needed — your old versions are backed up at ${path.dirname(firstBackupDir)}/\n`);
316
+ }
317
+ }
318
+ }
319
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/neuralgentics/update.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veedubin/neuralgentics",
3
- "version": "0.12.6",
3
+ "version": "0.13.0",
4
4
  "description": "Neuralgentics OpenCode plugin — agent personas, skills, routing enforcement, and MCP tools.",
5
5
  "type": "module",
6
6
  "main": "./dist/server.js",