@shardworks/nexus-core 0.1.99 → 0.1.101

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 (166) hide show
  1. package/README.md +95 -166
  2. package/dist/guild-config.d.ts +14 -52
  3. package/dist/guild-config.d.ts.map +1 -1
  4. package/dist/guild-config.js +7 -10
  5. package/dist/guild-config.js.map +1 -1
  6. package/dist/guild.d.ts +83 -0
  7. package/dist/guild.d.ts.map +1 -0
  8. package/dist/guild.js +45 -0
  9. package/dist/guild.js.map +1 -0
  10. package/dist/id.d.ts +14 -0
  11. package/dist/id.d.ts.map +1 -0
  12. package/dist/id.js +19 -0
  13. package/dist/id.js.map +1 -0
  14. package/dist/index.d.ts +6 -30
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +7 -32
  17. package/dist/index.js.map +1 -1
  18. package/dist/nexus-home.d.ts +0 -4
  19. package/dist/nexus-home.d.ts.map +1 -1
  20. package/dist/nexus-home.js +1 -9
  21. package/dist/nexus-home.js.map +1 -1
  22. package/dist/plugin.d.ts +115 -0
  23. package/dist/plugin.d.ts.map +1 -0
  24. package/dist/plugin.js +39 -0
  25. package/dist/plugin.js.map +1 -0
  26. package/dist/resolve-package.d.ts +58 -0
  27. package/dist/resolve-package.d.ts.map +1 -0
  28. package/dist/resolve-package.js +123 -0
  29. package/dist/resolve-package.js.map +1 -0
  30. package/package.json +5 -14
  31. package/dist/book.d.ts +0 -110
  32. package/dist/book.d.ts.map +0 -1
  33. package/dist/book.js +0 -16
  34. package/dist/book.js.map +0 -1
  35. package/dist/legacy/1/anima.d.ts +0 -79
  36. package/dist/legacy/1/anima.d.ts.map +0 -1
  37. package/dist/legacy/1/anima.js +0 -285
  38. package/dist/legacy/1/anima.js.map +0 -1
  39. package/dist/legacy/1/audit.d.ts +0 -23
  40. package/dist/legacy/1/audit.d.ts.map +0 -1
  41. package/dist/legacy/1/audit.js +0 -61
  42. package/dist/legacy/1/audit.js.map +0 -1
  43. package/dist/legacy/1/bundle.d.ts +0 -111
  44. package/dist/legacy/1/bundle.d.ts.map +0 -1
  45. package/dist/legacy/1/bundle.js +0 -452
  46. package/dist/legacy/1/bundle.js.map +0 -1
  47. package/dist/legacy/1/clock-daemon.d.ts +0 -2
  48. package/dist/legacy/1/clock-daemon.d.ts.map +0 -1
  49. package/dist/legacy/1/clock-daemon.js +0 -72
  50. package/dist/legacy/1/clock-daemon.js.map +0 -1
  51. package/dist/legacy/1/clockworks.d.ts +0 -98
  52. package/dist/legacy/1/clockworks.d.ts.map +0 -1
  53. package/dist/legacy/1/clockworks.js +0 -359
  54. package/dist/legacy/1/clockworks.js.map +0 -1
  55. package/dist/legacy/1/conversation.d.ts +0 -165
  56. package/dist/legacy/1/conversation.d.ts.map +0 -1
  57. package/dist/legacy/1/conversation.js +0 -457
  58. package/dist/legacy/1/conversation.js.map +0 -1
  59. package/dist/legacy/1/engine.d.ts +0 -90
  60. package/dist/legacy/1/engine.d.ts.map +0 -1
  61. package/dist/legacy/1/engine.js +0 -89
  62. package/dist/legacy/1/engine.js.map +0 -1
  63. package/dist/legacy/1/events.d.ts +0 -88
  64. package/dist/legacy/1/events.d.ts.map +0 -1
  65. package/dist/legacy/1/events.js +0 -239
  66. package/dist/legacy/1/events.js.map +0 -1
  67. package/dist/legacy/1/guild-config.d.ts +0 -74
  68. package/dist/legacy/1/guild-config.d.ts.map +0 -1
  69. package/dist/legacy/1/guild-config.js +0 -51
  70. package/dist/legacy/1/guild-config.js.map +0 -1
  71. package/dist/legacy/1/id.d.ts +0 -8
  72. package/dist/legacy/1/id.d.ts.map +0 -1
  73. package/dist/legacy/1/id.js +0 -27
  74. package/dist/legacy/1/id.js.map +0 -1
  75. package/dist/legacy/1/index.d.ts +0 -28
  76. package/dist/legacy/1/index.d.ts.map +0 -1
  77. package/dist/legacy/1/index.js +0 -32
  78. package/dist/legacy/1/index.js.map +0 -1
  79. package/dist/legacy/1/init-guild.d.ts +0 -24
  80. package/dist/legacy/1/init-guild.d.ts.map +0 -1
  81. package/dist/legacy/1/init-guild.js +0 -230
  82. package/dist/legacy/1/init-guild.js.map +0 -1
  83. package/dist/legacy/1/install-tool.d.ts +0 -73
  84. package/dist/legacy/1/install-tool.d.ts.map +0 -1
  85. package/dist/legacy/1/install-tool.js +0 -436
  86. package/dist/legacy/1/install-tool.js.map +0 -1
  87. package/dist/legacy/1/instantiate.d.ts +0 -33
  88. package/dist/legacy/1/instantiate.d.ts.map +0 -1
  89. package/dist/legacy/1/instantiate.js +0 -137
  90. package/dist/legacy/1/instantiate.js.map +0 -1
  91. package/dist/legacy/1/manifest.d.ts +0 -132
  92. package/dist/legacy/1/manifest.d.ts.map +0 -1
  93. package/dist/legacy/1/manifest.js +0 -321
  94. package/dist/legacy/1/manifest.js.map +0 -1
  95. package/dist/legacy/1/migrate.d.ts +0 -84
  96. package/dist/legacy/1/migrate.d.ts.map +0 -1
  97. package/dist/legacy/1/migrate.js +0 -228
  98. package/dist/legacy/1/migrate.js.map +0 -1
  99. package/dist/legacy/1/nexus-home.d.ts +0 -11
  100. package/dist/legacy/1/nexus-home.d.ts.map +0 -1
  101. package/dist/legacy/1/nexus-home.js +0 -16
  102. package/dist/legacy/1/nexus-home.js.map +0 -1
  103. package/dist/legacy/1/plugin-descriptor.d.ts +0 -3
  104. package/dist/legacy/1/plugin-descriptor.d.ts.map +0 -1
  105. package/dist/legacy/1/plugin-descriptor.js +0 -2
  106. package/dist/legacy/1/plugin-descriptor.js.map +0 -1
  107. package/dist/legacy/1/preconditions.d.ts +0 -100
  108. package/dist/legacy/1/preconditions.d.ts.map +0 -1
  109. package/dist/legacy/1/preconditions.js +0 -189
  110. package/dist/legacy/1/preconditions.js.map +0 -1
  111. package/dist/legacy/1/rehydrate.d.ts +0 -22
  112. package/dist/legacy/1/rehydrate.d.ts.map +0 -1
  113. package/dist/legacy/1/rehydrate.js +0 -109
  114. package/dist/legacy/1/rehydrate.js.map +0 -1
  115. package/dist/legacy/1/remove-tool.d.ts +0 -19
  116. package/dist/legacy/1/remove-tool.d.ts.map +0 -1
  117. package/dist/legacy/1/remove-tool.js +0 -105
  118. package/dist/legacy/1/remove-tool.js.map +0 -1
  119. package/dist/legacy/1/session.d.ts +0 -343
  120. package/dist/legacy/1/session.d.ts.map +0 -1
  121. package/dist/legacy/1/session.js +0 -499
  122. package/dist/legacy/1/session.js.map +0 -1
  123. package/dist/legacy/1/tool-registry.d.ts +0 -12
  124. package/dist/legacy/1/tool-registry.d.ts.map +0 -1
  125. package/dist/legacy/1/tool-registry.js +0 -28
  126. package/dist/legacy/1/tool-registry.js.map +0 -1
  127. package/dist/legacy/1/tool.d.ts +0 -10
  128. package/dist/legacy/1/tool.d.ts.map +0 -1
  129. package/dist/legacy/1/tool.js +0 -2
  130. package/dist/legacy/1/tool.js.map +0 -1
  131. package/dist/legacy/1/upgrade.d.ts +0 -129
  132. package/dist/legacy/1/upgrade.d.ts.map +0 -1
  133. package/dist/legacy/1/upgrade.js +0 -355
  134. package/dist/legacy/1/upgrade.js.map +0 -1
  135. package/dist/legacy/1/workshop.d.ts +0 -95
  136. package/dist/legacy/1/workshop.d.ts.map +0 -1
  137. package/dist/legacy/1/workshop.js +0 -229
  138. package/dist/legacy/1/workshop.js.map +0 -1
  139. package/dist/legacy/1/worktree.d.ts +0 -67
  140. package/dist/legacy/1/worktree.d.ts.map +0 -1
  141. package/dist/legacy/1/worktree.js +0 -117
  142. package/dist/legacy/1/worktree.js.map +0 -1
  143. package/dist/legacy/1/writ.d.ts +0 -130
  144. package/dist/legacy/1/writ.d.ts.map +0 -1
  145. package/dist/legacy/1/writ.js +0 -599
  146. package/dist/legacy/1/writ.js.map +0 -1
  147. package/dist/rig-context.d.ts +0 -47
  148. package/dist/rig-context.d.ts.map +0 -1
  149. package/dist/rig-context.js +0 -11
  150. package/dist/rig-context.js.map +0 -1
  151. package/dist/rig-descriptor.d.ts +0 -39
  152. package/dist/rig-descriptor.d.ts.map +0 -1
  153. package/dist/rig-descriptor.js +0 -12
  154. package/dist/rig-descriptor.js.map +0 -1
  155. package/dist/rig.d.ts +0 -70
  156. package/dist/rig.d.ts.map +0 -1
  157. package/dist/rig.js +0 -14
  158. package/dist/rig.js.map +0 -1
  159. package/dist/tool.d.ts +0 -136
  160. package/dist/tool.d.ts.map +0 -1
  161. package/dist/tool.js +0 -135
  162. package/dist/tool.js.map +0 -1
  163. package/migrations/001-schema.sql +0 -177
  164. package/migrations/002-writs.sql +0 -44
  165. package/migrations/003-conversations.sql +0 -43
  166. package/migrations/004-remove-commissions.sql +0 -24
@@ -1,436 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- import { execFileSync } from 'node:child_process';
4
- import { workshopBarePath } from "./nexus-home.js";
5
- import { readGuildConfig, writeGuildConfig } from "./guild-config.js";
6
- import { checkToolPreconditions } from "./preconditions.js";
7
- /** Descriptor file names in priority order for detection. */
8
- const DESCRIPTOR_FILES = [
9
- 'nexus-tool.json',
10
- 'nexus-engine.json',
11
- 'nexus-curriculum.json',
12
- 'nexus-temperament.json',
13
- ];
14
- /** Map descriptor file -> artifact category in guild.json */
15
- const CATEGORY_MAP = {
16
- 'nexus-tool.json': 'tools',
17
- 'nexus-engine.json': 'engines',
18
- 'nexus-curriculum.json': 'curricula',
19
- 'nexus-temperament.json': 'temperaments',
20
- };
21
- /** Map category -> on-disk parent directory (relative to guild root). */
22
- const DIR_MAP = {
23
- tools: 'tools',
24
- engines: 'engines',
25
- curricula: 'training/curricula',
26
- temperaments: 'training/temperaments',
27
- };
28
- function git(args, cwd) {
29
- execFileSync('git', args, { cwd, stdio: 'pipe' });
30
- }
31
- function npm(args, cwd) {
32
- return execFileSync('npm', args, { cwd, stdio: 'pipe', encoding: 'utf-8' });
33
- }
34
- /** Detect the descriptor file in a directory. Returns the filename or throws. */
35
- function findDescriptor(dir) {
36
- for (const f of DESCRIPTOR_FILES) {
37
- if (fs.existsSync(path.join(dir, f)))
38
- return f;
39
- }
40
- throw new Error(`No descriptor found in ${dir}. Expected one of: ${DESCRIPTOR_FILES.join(', ')}`);
41
- }
42
- /** Read a JSON file. */
43
- function readJson(filePath) {
44
- return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
45
- }
46
- /** Write a JSON file. */
47
- function writeJson(filePath, data) {
48
- fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
49
- }
50
- /** Directories to skip when copying tool sources. */
51
- const SKIP_DIRS = new Set(['node_modules', '.git']);
52
- /** Recursively copy a directory, skipping node_modules and .git. */
53
- function copyDir(src, dest) {
54
- fs.mkdirSync(dest, { recursive: true });
55
- for (const entry of fs.readdirSync(src, { withFileTypes: true })) {
56
- const srcPath = path.join(src, entry.name);
57
- const destPath = path.join(dest, entry.name);
58
- if (entry.isDirectory()) {
59
- if (!SKIP_DIRS.has(entry.name)) {
60
- copyDir(srcPath, destPath);
61
- }
62
- }
63
- else if (entry.isSymbolicLink()) {
64
- const realPath = fs.realpathSync(srcPath);
65
- if (fs.statSync(realPath).isDirectory()) {
66
- if (!SKIP_DIRS.has(entry.name)) {
67
- copyDir(realPath, destPath);
68
- }
69
- }
70
- else {
71
- fs.copyFileSync(realPath, destPath);
72
- }
73
- }
74
- else {
75
- fs.copyFileSync(srcPath, destPath);
76
- }
77
- }
78
- }
79
- /**
80
- * Copy only the metadata files (descriptor + instructions) from a source
81
- * directory into the guild tool directory. This is used for npm-installed
82
- * tools where the runtime code lives in node_modules but the metadata
83
- * needs to be git-tracked in the guild.
84
- */
85
- function copyMetadata(sourceDir, targetDir, descriptorFile, descriptor) {
86
- fs.mkdirSync(targetDir, { recursive: true });
87
- // Always copy the descriptor
88
- fs.copyFileSync(path.join(sourceDir, descriptorFile), path.join(targetDir, descriptorFile));
89
- // Copy instructions if referenced
90
- const instructionsFile = descriptor['instructions'];
91
- if (instructionsFile) {
92
- const instrPath = path.join(sourceDir, instructionsFile);
93
- if (fs.existsSync(instrPath)) {
94
- fs.copyFileSync(instrPath, path.join(targetDir, instructionsFile));
95
- }
96
- }
97
- }
98
- /**
99
- * Classify a source string to determine the installation method.
100
- *
101
- * @param source - The source specifier.
102
- * @param link - Whether the --link flag was set.
103
- */
104
- export function classifySource(source, link = false) {
105
- if (link)
106
- return 'link';
107
- if (source.startsWith('workshop:'))
108
- return 'workshop';
109
- if (source.startsWith('git+'))
110
- return 'git-url';
111
- if (source.endsWith('.tgz') || source.endsWith('.tar.gz'))
112
- return 'tarball';
113
- return 'registry';
114
- }
115
- /**
116
- * Resolve the installed package directory in node_modules after npm install.
117
- */
118
- function resolveInstalledPackage(guildRoot, packageName) {
119
- const pkgDir = path.join(guildRoot, 'node_modules', packageName);
120
- if (!fs.existsSync(pkgDir)) {
121
- throw new Error(`Could not find installed package at ${pkgDir}`);
122
- }
123
- return pkgDir;
124
- }
125
- /**
126
- * Read the package name from a package.json file.
127
- */
128
- function readPackageName(dir) {
129
- const pkgPath = path.join(dir, 'package.json');
130
- if (!fs.existsSync(pkgPath)) {
131
- throw new Error(`No package.json found in ${dir}`);
132
- }
133
- const pkg = readJson(pkgPath);
134
- const name = pkg['name'];
135
- if (!name) {
136
- throw new Error(`No "name" field in ${pkgPath}`);
137
- }
138
- return name;
139
- }
140
- /**
141
- * Parse a registry source specifier to extract the package name.
142
- * e.g. "foo@1.0" -> "foo", "@scope/foo@1.0" -> "@scope/foo"
143
- */
144
- function parsePackageName(source) {
145
- // Scoped packages: @scope/name@version
146
- if (source.startsWith('@') && source.lastIndexOf('@') > 0) {
147
- return source.substring(0, source.lastIndexOf('@'));
148
- }
149
- // Unscoped: name@version
150
- if (source.includes('@')) {
151
- return source.split('@')[0];
152
- }
153
- // Bare name without version
154
- return source;
155
- }
156
- /**
157
- * Determine package name from guild's package.json dependencies.
158
- * Used when we can't derive the name from the source specifier (e.g. tarballs).
159
- */
160
- function findNewDependency(guildRoot) {
161
- const guildhallPkg = readJson(path.join(guildRoot, 'package.json'));
162
- const deps = guildhallPkg['dependencies'] ?? {};
163
- const depNames = Object.keys(deps);
164
- const packageName = depNames[depNames.length - 1];
165
- if (!packageName) {
166
- throw new Error('Could not determine package name after npm install');
167
- }
168
- return packageName;
169
- }
170
- // ── Install paths ───────────────────────────────────────────────────────
171
- /**
172
- * Install via npm --save (registry and git-url sources).
173
- * Package is added to guild's package.json for durability.
174
- */
175
- function installViaNpmSave(guildRoot, source, sourceKind) {
176
- npm(['install', '--save', source], guildRoot);
177
- // Determine the installed package name:
178
- // - Registry specifiers (e.g. "foo@1.0"): parse name from specifier
179
- // - Local paths: read name from source's package.json (reliable for batch installs)
180
- // - Git URLs: detect as new dependency in guild's package.json
181
- const isLocalPath = source.startsWith('/') || source.startsWith('./') || source.startsWith('../');
182
- let packageName;
183
- if (isLocalPath) {
184
- packageName = readPackageName(path.resolve(source));
185
- }
186
- else if (sourceKind === 'registry') {
187
- packageName = parsePackageName(source);
188
- }
189
- else {
190
- packageName = findNewDependency(guildRoot);
191
- }
192
- const packageDir = resolveInstalledPackage(guildRoot, packageName);
193
- const descriptorFile = findDescriptor(packageDir);
194
- const descriptor = readJson(path.join(packageDir, descriptorFile));
195
- const pkg = readJson(path.join(packageDir, 'package.json'));
196
- return { packageName, packageDir, descriptorFile, descriptor, pkg };
197
- }
198
- /**
199
- * Install via npm, detect package name, optionally remove from package.json.
200
- * Used for tarball and workshop sources where we need --no-save semantics
201
- * but need to discover the package name.
202
- */
203
- function installViaNpmDetect(guildRoot, npmSource, save) {
204
- // Always install with --save first to detect the package name
205
- npm(['install', '--save', npmSource], guildRoot);
206
- const packageName = findNewDependency(guildRoot);
207
- const packageDir = resolveInstalledPackage(guildRoot, packageName);
208
- const descriptorFile = findDescriptor(packageDir);
209
- const descriptor = readJson(path.join(packageDir, descriptorFile));
210
- const pkg = readJson(path.join(packageDir, 'package.json'));
211
- // If we don't want to save, remove from package.json but keep in node_modules
212
- if (!save) {
213
- const guildPkg = readJson(path.join(guildRoot, 'package.json'));
214
- const deps = guildPkg['dependencies'];
215
- if (deps && packageName in deps) {
216
- delete deps[packageName];
217
- writeJson(path.join(guildRoot, 'package.json'), guildPkg);
218
- }
219
- }
220
- return { packageName, packageDir, descriptorFile, descriptor, pkg };
221
- }
222
- /**
223
- * Install via symlink (dev mode for local dirs with package.json).
224
- * Creates a symlink in node_modules pointing to the source directory.
225
- */
226
- function installViaLink(guildRoot, source) {
227
- const sourceDir = path.resolve(source);
228
- if (!fs.existsSync(sourceDir) || !fs.statSync(sourceDir).isDirectory()) {
229
- throw new Error(`Source is not a directory: ${sourceDir}`);
230
- }
231
- if (!fs.existsSync(path.join(sourceDir, 'package.json'))) {
232
- throw new Error('The --link option requires a directory with a package.json.');
233
- }
234
- const packageName = readPackageName(sourceDir);
235
- // Ensure node_modules exists
236
- const nodeModulesDir = path.join(guildRoot, 'node_modules');
237
- fs.mkdirSync(nodeModulesDir, { recursive: true });
238
- // Handle scoped packages: @scope/name needs @scope/ directory
239
- const linkTarget = path.join(nodeModulesDir, packageName);
240
- fs.mkdirSync(path.dirname(linkTarget), { recursive: true });
241
- // Remove existing link/directory if present
242
- if (fs.existsSync(linkTarget)) {
243
- fs.rmSync(linkTarget, { recursive: true });
244
- }
245
- fs.symlinkSync(sourceDir, linkTarget, 'dir');
246
- const descriptorFile = findDescriptor(sourceDir);
247
- const descriptor = readJson(path.join(sourceDir, descriptorFile));
248
- const pkg = readJson(path.join(sourceDir, 'package.json'));
249
- return { packageName, packageDir: sourceDir, descriptorFile, descriptor, pkg };
250
- }
251
- // ── Main ────────────────────────────────────────────────────────────────
252
- /**
253
- * Install a tool (implement, engine, curriculum, or temperament) into the guild.
254
- *
255
- * Supports five source types:
256
- * - **Registry** — npm package specifier, fully durable via package.json
257
- * - **Git URL** — `git+https://...`, fully durable via package.json
258
- * - **Workshop** — `workshop:name#ref`, durable within the guild via full source on disk
259
- * - **Tarball** — `.tgz` file, durable via full source on disk
260
- * - **Link** — symlinked local dir (dev mode), NOT durable
261
- *
262
- * For npm-installed tools, runtime code lives in node_modules. Metadata
263
- * (descriptor + instructions) is copied to the tool directory for git tracking.
264
- * The `package` field in guild.json tells the manifest engine to resolve by package name.
265
- */
266
- export function installTool(opts) {
267
- const { home, source, roles, commit = true, link = false, bundle } = opts;
268
- const sourceKind = classifySource(source, link);
269
- let descriptorFile;
270
- let descriptor;
271
- let pkg;
272
- let packageName = null;
273
- let isNpmInstalled = false;
274
- let copyFullSource = false;
275
- let upstream = null;
276
- if (sourceKind === 'link') {
277
- // ── Link mode: symlink local dir ──────────────────────────────────
278
- const result = installViaLink(home, source);
279
- descriptorFile = result.descriptorFile;
280
- descriptor = result.descriptor;
281
- pkg = result.pkg;
282
- packageName = result.packageName;
283
- isNpmInstalled = true;
284
- upstream = null;
285
- }
286
- else if (sourceKind === 'registry' || sourceKind === 'git-url') {
287
- // ── Registry / Git URL: npm install --save ────────────────────────
288
- const result = installViaNpmSave(home, source, sourceKind);
289
- descriptorFile = result.descriptorFile;
290
- descriptor = result.descriptor;
291
- pkg = result.pkg;
292
- packageName = result.packageName;
293
- isNpmInstalled = true;
294
- upstream = sourceKind === 'git-url' ? source : `${result.packageName}@${result.pkg['version']}`;
295
- }
296
- else if (sourceKind === 'workshop') {
297
- // ── Workshop: resolve to git+file:// URL, npm install, full source ─
298
- const parsed = parseWorkshopSource(source);
299
- const barePath = workshopBarePath(home, parsed.workshop);
300
- if (!fs.existsSync(barePath)) {
301
- throw new Error(`Workshop bare repo not found: ${barePath}`);
302
- }
303
- const gitFileUrl = `git+file://${barePath}#${parsed.ref}`;
304
- const result = installViaNpmDetect(home, gitFileUrl, false);
305
- descriptorFile = result.descriptorFile;
306
- descriptor = result.descriptor;
307
- pkg = result.pkg;
308
- packageName = result.packageName;
309
- isNpmInstalled = true;
310
- copyFullSource = true;
311
- upstream = source; // Store the original workshop:name#ref specifier
312
- }
313
- else {
314
- // ── Tarball: npm install --no-save, full source to tool dir ────────
315
- const resolvedSource = path.resolve(source);
316
- const result = installViaNpmDetect(home, resolvedSource, false);
317
- descriptorFile = result.descriptorFile;
318
- descriptor = result.descriptor;
319
- pkg = result.pkg;
320
- packageName = result.packageName;
321
- isNpmInstalled = true;
322
- copyFullSource = true;
323
- upstream = null;
324
- }
325
- const category = CATEGORY_MAP[descriptorFile];
326
- // Resolve name: --name flag > package name > directory basename
327
- const name = opts.name
328
- || (packageName ? packageName.replace(/^@[^/]+\//, '') : null)
329
- || path.basename(path.resolve(source));
330
- if (!name || name === '.' || name === '..') {
331
- throw new Error('Could not determine tool name. Use --name to specify one.');
332
- }
333
- // Determine target directory for metadata/files in the guild.
334
- const parentDir = DIR_MAP[category];
335
- const targetDir = path.join(home, parentDir, name);
336
- if (isNpmInstalled && copyFullSource) {
337
- // Workshop/tarball: copy full source to tool dir for durability
338
- const pkgSourceDir = resolveInstalledPackage(home, packageName);
339
- if (fs.existsSync(targetDir)) {
340
- fs.rmSync(targetDir, { recursive: true });
341
- }
342
- copyDir(pkgSourceDir, targetDir);
343
- }
344
- else if (isNpmInstalled) {
345
- // Registry/git-url/link: copy only metadata to tool dir
346
- const pkgSourceDir = sourceKind === 'link'
347
- ? path.resolve(source)
348
- : resolveInstalledPackage(home, packageName);
349
- if (fs.existsSync(targetDir)) {
350
- fs.rmSync(targetDir, { recursive: true });
351
- }
352
- copyMetadata(pkgSourceDir, targetDir, descriptorFile, descriptor);
353
- }
354
- // Register in guild.json
355
- const config = readGuildConfig(home);
356
- const now = new Date().toISOString();
357
- if (category === 'tools' || category === 'engines') {
358
- const entry = {
359
- upstream,
360
- installedAt: now,
361
- };
362
- if (packageName) {
363
- entry.package = packageName;
364
- }
365
- if (bundle) {
366
- entry.bundle = bundle;
367
- }
368
- config[category][name] = entry;
369
- // For tools, assign to roles or baseTools
370
- if (category === 'tools') {
371
- if (roles && roles.length > 0) {
372
- // Add to specific roles' tool lists
373
- for (const role of roles) {
374
- if (config.roles[role]) {
375
- if (!config.roles[role].tools.includes(name)) {
376
- config.roles[role].tools.push(name);
377
- }
378
- }
379
- // If role doesn't exist, silently skip — the user might create it later
380
- }
381
- }
382
- else {
383
- // Default: add to baseTools (available to all animas)
384
- if (!config.baseTools.includes(name)) {
385
- config.baseTools.push(name);
386
- }
387
- }
388
- }
389
- }
390
- else {
391
- const entry = {
392
- upstream,
393
- installedAt: now,
394
- };
395
- if (bundle) {
396
- entry.bundle = bundle;
397
- }
398
- config[category][name] = entry;
399
- }
400
- writeGuildConfig(home, config);
401
- // Commit (unless suppressed -- e.g. during bootstrap)
402
- if (commit) {
403
- git(['add', '-A'], home);
404
- git(['commit', '-m', `Install ${category.slice(0, -1)} ${name}`], home);
405
- }
406
- // Check preconditions for tools and engines — warn but don't fail
407
- const warnings = [];
408
- if (category === 'tools' || category === 'engines') {
409
- const descriptorFile = category === 'tools' ? 'nexus-tool.json' : 'nexus-engine.json';
410
- const descriptorPath = path.join(targetDir, descriptorFile);
411
- const results = checkToolPreconditions(descriptorPath);
412
- for (const r of results) {
413
- if (!r.passed && r.message) {
414
- warnings.push(r.message);
415
- }
416
- }
417
- }
418
- return { category, name, installedTo: targetDir, sourceKind, warnings };
419
- }
420
- // ── Workshop source parsing ─────────────────────────────────────────────
421
- /**
422
- * Parse a workshop source specifier.
423
- * Format: `workshop:<name>#<ref>`
424
- */
425
- function parseWorkshopSource(source) {
426
- const withoutPrefix = source.substring('workshop:'.length);
427
- const hashIndex = withoutPrefix.indexOf('#');
428
- if (hashIndex === -1) {
429
- throw new Error(`Invalid workshop source "${source}". Expected format: workshop:<name>#<ref>`);
430
- }
431
- return {
432
- workshop: withoutPrefix.substring(0, hashIndex),
433
- ref: withoutPrefix.substring(hashIndex + 1),
434
- };
435
- }
436
- //# sourceMappingURL=install-tool.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-tool.js","sourceRoot":"","sources":["../../../src/legacy/1/install-tool.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- export interface InstantiateOptions {
2
- /** Absolute path to the guild root. */
3
- home: string;
4
- /** Name for the new anima. Must be unique within the guild. */
5
- name: string;
6
- /** Roles the anima will hold (determines implement access via role gating). */
7
- roles: string[];
8
- /** Curriculum to assign (by name, must be registered in guild.json). */
9
- curriculum?: string;
10
- /** Temperament to assign (by name, must be registered in guild.json). */
11
- temperament?: string;
12
- }
13
- export interface InstantiateResult {
14
- animaId: string;
15
- name: string;
16
- roles: string[];
17
- curriculum: string | null;
18
- temperament: string | null;
19
- }
20
- /**
21
- * Instantiate a new anima in the guild.
22
- *
23
- * Creates the anima record, assigns roles in the roster, and snapshots the
24
- * composition (curriculum + temperament content at current versions). All
25
- * operations happen in a single transaction.
26
- *
27
- * Role validation:
28
- * - Every role must be defined in guild.json.roles — throws if undefined.
29
- * - Seat capacity is checked — throws if assigning this anima would exceed
30
- * the role's seat limit.
31
- */
32
- export declare function instantiate(opts: InstantiateOptions): InstantiateResult;
33
- //# sourceMappingURL=instantiate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instantiate.d.ts","sourceRoot":"","sources":["../../../src/legacy/1/instantiate.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6CD;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,CAiIvE"}
@@ -1,137 +0,0 @@
1
- /**
2
- * instantiate — core logic for creating new animas.
3
- *
4
- * Creates an anima record in the Register with its full composition: roles,
5
- * curriculum, and temperament. Reads and snapshots the training content at
6
- * instantiation time so the anima's composition is frozen to specific versions.
7
- *
8
- * Role validation:
9
- * - Each role must be defined in guild.json — hard error if not.
10
- * - Each role's seat capacity is checked — hard error if exceeded.
11
- */
12
- import fs from 'node:fs';
13
- import path from 'node:path';
14
- import Database from 'better-sqlite3';
15
- import { booksPath } from "./nexus-home.js";
16
- import { readGuildConfig } from "./guild-config.js";
17
- import { generateId } from "./id.js";
18
- /**
19
- * Read training content from disk given its guild.json entry.
20
- *
21
- * @param guildRoot - Path to the guild root.
22
- * @param category - 'curricula' or 'temperaments'.
23
- * @param name - The training content name.
24
- * @returns Object with version and the actual content text.
25
- */
26
- function readTrainingContent(guildRoot, category, name) {
27
- const dir = path.join(guildRoot, 'training', category, name);
28
- const descriptorFile = category === 'curricula'
29
- ? 'nexus-curriculum.json'
30
- : 'nexus-temperament.json';
31
- const descriptorPath = path.join(dir, descriptorFile);
32
- if (!fs.existsSync(descriptorPath)) {
33
- throw new Error(`${category.slice(0, -1)} "${name}" not found on disk at ${dir}`);
34
- }
35
- const descriptor = JSON.parse(fs.readFileSync(descriptorPath, 'utf-8'));
36
- const contentFile = descriptor.content;
37
- const contentPath = path.join(dir, contentFile);
38
- if (!fs.existsSync(contentPath)) {
39
- throw new Error(`Content file "${contentFile}" not found for ${category.slice(0, -1)} "${name}" at ${contentPath}`);
40
- }
41
- const version = descriptor.version || 'unknown';
42
- return {
43
- version,
44
- content: fs.readFileSync(contentPath, 'utf-8'),
45
- };
46
- }
47
- /**
48
- * Instantiate a new anima in the guild.
49
- *
50
- * Creates the anima record, assigns roles in the roster, and snapshots the
51
- * composition (curriculum + temperament content at current versions). All
52
- * operations happen in a single transaction.
53
- *
54
- * Role validation:
55
- * - Every role must be defined in guild.json.roles — throws if undefined.
56
- * - Seat capacity is checked — throws if assigning this anima would exceed
57
- * the role's seat limit.
58
- */
59
- export function instantiate(opts) {
60
- const { home, name, roles, curriculum, temperament } = opts;
61
- if (roles.length === 0) {
62
- throw new Error('At least one role is required.');
63
- }
64
- // Validate curriculum and temperament exist in guild.json
65
- const config = readGuildConfig(home);
66
- // Validate all roles exist in guild.json
67
- for (const role of roles) {
68
- if (!config.roles[role]) {
69
- throw new Error(`Role "${role}" is not defined in guild.json. ` +
70
- `Available roles: ${Object.keys(config.roles).join(', ') || '(none)'}`);
71
- }
72
- }
73
- if (curriculum && !config.curricula[curriculum]) {
74
- throw new Error(`Curriculum "${curriculum}" not found in guild.json. Available: ${Object.keys(config.curricula).join(', ') || '(none)'}`);
75
- }
76
- if (temperament && !config.temperaments[temperament]) {
77
- throw new Error(`Temperament "${temperament}" not found in guild.json. Available: ${Object.keys(config.temperaments).join(', ') || '(none)'}`);
78
- }
79
- // Read and snapshot training content
80
- let curriculumSnapshot = null;
81
- if (curriculum) {
82
- const { version, content } = readTrainingContent(home, 'curricula', curriculum);
83
- curriculumSnapshot = { name: curriculum, version, content };
84
- }
85
- let temperamentSnapshot = null;
86
- if (temperament) {
87
- const { version, content } = readTrainingContent(home, 'temperaments', temperament);
88
- temperamentSnapshot = { name: temperament, version, content };
89
- }
90
- const db = new Database(booksPath(home));
91
- db.pragma('foreign_keys = ON');
92
- try {
93
- const result = db.transaction(() => {
94
- // Check name uniqueness
95
- const existing = db.prepare(`SELECT id FROM animas WHERE name = ?`).get(name);
96
- if (existing) {
97
- throw new Error(`Anima "${name}" already exists in the Register.`);
98
- }
99
- // Validate seat capacity for each role
100
- for (const role of roles) {
101
- const roleDef = config.roles[role];
102
- if (roleDef.seats !== null) {
103
- const currentCount = db.prepare(`SELECT COUNT(*) as count FROM roster r JOIN animas a ON r.anima_id = a.id WHERE r.role = ? AND a.status = 'active'`).get(role).count;
104
- if (currentCount >= roleDef.seats) {
105
- throw new Error(`Role "${role}" is full — ${roleDef.seats} seat${roleDef.seats === 1 ? '' : 's'}, ` +
106
- `${currentCount} occupied. Cannot assign another anima.`);
107
- }
108
- }
109
- }
110
- // Create anima
111
- const animaId = generateId('a');
112
- db.prepare(`INSERT INTO animas (id, name, status) VALUES (?, ?, 'active')`).run(animaId, name);
113
- // Assign roles in roster
114
- const insertRole = db.prepare(`INSERT INTO roster (id, anima_id, role) VALUES (?, ?, ?)`);
115
- for (const role of roles) {
116
- insertRole.run(generateId('r'), animaId, role);
117
- }
118
- // Record composition snapshot
119
- db.prepare(`INSERT INTO anima_compositions (id, anima_id, curriculum_name, curriculum_version, curriculum_snapshot, temperament_name, temperament_version, temperament_snapshot)
120
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(generateId('ac'), animaId, curriculumSnapshot?.name ?? '', curriculumSnapshot?.version ?? '', curriculumSnapshot?.content ?? '', temperamentSnapshot?.name ?? '', temperamentSnapshot?.version ?? '', temperamentSnapshot?.content ?? '');
121
- // Audit log
122
- db.prepare(`INSERT INTO audit_log (id, actor, action, target_type, target_id, detail) VALUES (?, ?, ?, ?, ?, ?)`).run(generateId('aud'), 'instantiate', 'anima_instantiated', 'anima', animaId, JSON.stringify({ roles, curriculum: curriculum ?? null, temperament: temperament ?? null }));
123
- return animaId;
124
- })();
125
- return {
126
- animaId: result,
127
- name,
128
- roles,
129
- curriculum: curriculum ?? null,
130
- temperament: temperament ?? null,
131
- };
132
- }
133
- finally {
134
- db.close();
135
- }
136
- }
137
- //# sourceMappingURL=instantiate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"instantiate.js","sourceRoot":"","sources":["../../../src/legacy/1/instantiate.ts"],"names":[],"mappings":"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"}