@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.
- package/README.md +95 -166
- package/dist/guild-config.d.ts +14 -52
- package/dist/guild-config.d.ts.map +1 -1
- package/dist/guild-config.js +7 -10
- package/dist/guild-config.js.map +1 -1
- package/dist/guild.d.ts +83 -0
- package/dist/guild.d.ts.map +1 -0
- package/dist/guild.js +45 -0
- package/dist/guild.js.map +1 -0
- package/dist/id.d.ts +14 -0
- package/dist/id.d.ts.map +1 -0
- package/dist/id.js +19 -0
- package/dist/id.js.map +1 -0
- package/dist/index.d.ts +6 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -32
- package/dist/index.js.map +1 -1
- package/dist/nexus-home.d.ts +0 -4
- package/dist/nexus-home.d.ts.map +1 -1
- package/dist/nexus-home.js +1 -9
- package/dist/nexus-home.js.map +1 -1
- package/dist/plugin.d.ts +115 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +39 -0
- package/dist/plugin.js.map +1 -0
- package/dist/resolve-package.d.ts +58 -0
- package/dist/resolve-package.d.ts.map +1 -0
- package/dist/resolve-package.js +123 -0
- package/dist/resolve-package.js.map +1 -0
- package/package.json +5 -14
- package/dist/book.d.ts +0 -110
- package/dist/book.d.ts.map +0 -1
- package/dist/book.js +0 -16
- package/dist/book.js.map +0 -1
- package/dist/legacy/1/anima.d.ts +0 -79
- package/dist/legacy/1/anima.d.ts.map +0 -1
- package/dist/legacy/1/anima.js +0 -285
- package/dist/legacy/1/anima.js.map +0 -1
- package/dist/legacy/1/audit.d.ts +0 -23
- package/dist/legacy/1/audit.d.ts.map +0 -1
- package/dist/legacy/1/audit.js +0 -61
- package/dist/legacy/1/audit.js.map +0 -1
- package/dist/legacy/1/bundle.d.ts +0 -111
- package/dist/legacy/1/bundle.d.ts.map +0 -1
- package/dist/legacy/1/bundle.js +0 -452
- package/dist/legacy/1/bundle.js.map +0 -1
- package/dist/legacy/1/clock-daemon.d.ts +0 -2
- package/dist/legacy/1/clock-daemon.d.ts.map +0 -1
- package/dist/legacy/1/clock-daemon.js +0 -72
- package/dist/legacy/1/clock-daemon.js.map +0 -1
- package/dist/legacy/1/clockworks.d.ts +0 -98
- package/dist/legacy/1/clockworks.d.ts.map +0 -1
- package/dist/legacy/1/clockworks.js +0 -359
- package/dist/legacy/1/clockworks.js.map +0 -1
- package/dist/legacy/1/conversation.d.ts +0 -165
- package/dist/legacy/1/conversation.d.ts.map +0 -1
- package/dist/legacy/1/conversation.js +0 -457
- package/dist/legacy/1/conversation.js.map +0 -1
- package/dist/legacy/1/engine.d.ts +0 -90
- package/dist/legacy/1/engine.d.ts.map +0 -1
- package/dist/legacy/1/engine.js +0 -89
- package/dist/legacy/1/engine.js.map +0 -1
- package/dist/legacy/1/events.d.ts +0 -88
- package/dist/legacy/1/events.d.ts.map +0 -1
- package/dist/legacy/1/events.js +0 -239
- package/dist/legacy/1/events.js.map +0 -1
- package/dist/legacy/1/guild-config.d.ts +0 -74
- package/dist/legacy/1/guild-config.d.ts.map +0 -1
- package/dist/legacy/1/guild-config.js +0 -51
- package/dist/legacy/1/guild-config.js.map +0 -1
- package/dist/legacy/1/id.d.ts +0 -8
- package/dist/legacy/1/id.d.ts.map +0 -1
- package/dist/legacy/1/id.js +0 -27
- package/dist/legacy/1/id.js.map +0 -1
- package/dist/legacy/1/index.d.ts +0 -28
- package/dist/legacy/1/index.d.ts.map +0 -1
- package/dist/legacy/1/index.js +0 -32
- package/dist/legacy/1/index.js.map +0 -1
- package/dist/legacy/1/init-guild.d.ts +0 -24
- package/dist/legacy/1/init-guild.d.ts.map +0 -1
- package/dist/legacy/1/init-guild.js +0 -230
- package/dist/legacy/1/init-guild.js.map +0 -1
- package/dist/legacy/1/install-tool.d.ts +0 -73
- package/dist/legacy/1/install-tool.d.ts.map +0 -1
- package/dist/legacy/1/install-tool.js +0 -436
- package/dist/legacy/1/install-tool.js.map +0 -1
- package/dist/legacy/1/instantiate.d.ts +0 -33
- package/dist/legacy/1/instantiate.d.ts.map +0 -1
- package/dist/legacy/1/instantiate.js +0 -137
- package/dist/legacy/1/instantiate.js.map +0 -1
- package/dist/legacy/1/manifest.d.ts +0 -132
- package/dist/legacy/1/manifest.d.ts.map +0 -1
- package/dist/legacy/1/manifest.js +0 -321
- package/dist/legacy/1/manifest.js.map +0 -1
- package/dist/legacy/1/migrate.d.ts +0 -84
- package/dist/legacy/1/migrate.d.ts.map +0 -1
- package/dist/legacy/1/migrate.js +0 -228
- package/dist/legacy/1/migrate.js.map +0 -1
- package/dist/legacy/1/nexus-home.d.ts +0 -11
- package/dist/legacy/1/nexus-home.d.ts.map +0 -1
- package/dist/legacy/1/nexus-home.js +0 -16
- package/dist/legacy/1/nexus-home.js.map +0 -1
- package/dist/legacy/1/plugin-descriptor.d.ts +0 -3
- package/dist/legacy/1/plugin-descriptor.d.ts.map +0 -1
- package/dist/legacy/1/plugin-descriptor.js +0 -2
- package/dist/legacy/1/plugin-descriptor.js.map +0 -1
- package/dist/legacy/1/preconditions.d.ts +0 -100
- package/dist/legacy/1/preconditions.d.ts.map +0 -1
- package/dist/legacy/1/preconditions.js +0 -189
- package/dist/legacy/1/preconditions.js.map +0 -1
- package/dist/legacy/1/rehydrate.d.ts +0 -22
- package/dist/legacy/1/rehydrate.d.ts.map +0 -1
- package/dist/legacy/1/rehydrate.js +0 -109
- package/dist/legacy/1/rehydrate.js.map +0 -1
- package/dist/legacy/1/remove-tool.d.ts +0 -19
- package/dist/legacy/1/remove-tool.d.ts.map +0 -1
- package/dist/legacy/1/remove-tool.js +0 -105
- package/dist/legacy/1/remove-tool.js.map +0 -1
- package/dist/legacy/1/session.d.ts +0 -343
- package/dist/legacy/1/session.d.ts.map +0 -1
- package/dist/legacy/1/session.js +0 -499
- package/dist/legacy/1/session.js.map +0 -1
- package/dist/legacy/1/tool-registry.d.ts +0 -12
- package/dist/legacy/1/tool-registry.d.ts.map +0 -1
- package/dist/legacy/1/tool-registry.js +0 -28
- package/dist/legacy/1/tool-registry.js.map +0 -1
- package/dist/legacy/1/tool.d.ts +0 -10
- package/dist/legacy/1/tool.d.ts.map +0 -1
- package/dist/legacy/1/tool.js +0 -2
- package/dist/legacy/1/tool.js.map +0 -1
- package/dist/legacy/1/upgrade.d.ts +0 -129
- package/dist/legacy/1/upgrade.d.ts.map +0 -1
- package/dist/legacy/1/upgrade.js +0 -355
- package/dist/legacy/1/upgrade.js.map +0 -1
- package/dist/legacy/1/workshop.d.ts +0 -95
- package/dist/legacy/1/workshop.d.ts.map +0 -1
- package/dist/legacy/1/workshop.js +0 -229
- package/dist/legacy/1/workshop.js.map +0 -1
- package/dist/legacy/1/worktree.d.ts +0 -67
- package/dist/legacy/1/worktree.d.ts.map +0 -1
- package/dist/legacy/1/worktree.js +0 -117
- package/dist/legacy/1/worktree.js.map +0 -1
- package/dist/legacy/1/writ.d.ts +0 -130
- package/dist/legacy/1/writ.d.ts.map +0 -1
- package/dist/legacy/1/writ.js +0 -599
- package/dist/legacy/1/writ.js.map +0 -1
- package/dist/rig-context.d.ts +0 -47
- package/dist/rig-context.d.ts.map +0 -1
- package/dist/rig-context.js +0 -11
- package/dist/rig-context.js.map +0 -1
- package/dist/rig-descriptor.d.ts +0 -39
- package/dist/rig-descriptor.d.ts.map +0 -1
- package/dist/rig-descriptor.js +0 -12
- package/dist/rig-descriptor.js.map +0 -1
- package/dist/rig.d.ts +0 -70
- package/dist/rig.d.ts.map +0 -1
- package/dist/rig.js +0 -14
- package/dist/rig.js.map +0 -1
- package/dist/tool.d.ts +0 -136
- package/dist/tool.d.ts.map +0 -1
- package/dist/tool.js +0 -135
- package/dist/tool.js.map +0 -1
- package/migrations/001-schema.sql +0 -177
- package/migrations/002-writs.sql +0 -44
- package/migrations/003-conversations.sql +0 -43
- 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":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,gBAAgB,GAAG;IACvB,iBAAiB;IACjB,mBAAmB;IACnB,uBAAuB;IACvB,wBAAwB;CAChB,CAAC;AAIX,6DAA6D;AAC7D,MAAM,YAAY,GAA+E;IAC/F,iBAAiB,EAAE,OAAO;IAC1B,mBAAmB,EAAE,SAAS;IAC9B,uBAAuB,EAAE,WAAW;IACpC,wBAAwB,EAAE,cAAc;CACzC,CAAC;AAEF,yEAAyE;AACzE,MAAM,OAAO,GAA2B;IACtC,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,oBAAoB;IAC/B,YAAY,EAAE,uBAAuB;CACtC,CAAC;AAuDF,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW;IACtC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW;IACtC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,iFAAiF;AACjF,SAAS,cAAc,CAAC,GAAW;IACjC,KAAK,MAAM,CAAC,IAAI,gBAAgB,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,0BAA0B,GAAG,sBAAsB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjF,CAAC;AACJ,CAAC;AAED,wBAAwB;AACxB,SAAS,QAAQ,CAAC,QAAgB;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,yBAAyB;AACzB,SAAS,SAAS,CAAC,QAAgB,EAAE,IAA6B;IAChE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACnE,CAAC;AAED,qDAAqD;AACrD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC;AAEpD,oEAAoE;AACpE,SAAS,OAAO,CAAC,GAAW,EAAE,IAAY;IACxC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC/B,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,YAAY,CAAC,SAAiB,EAAE,SAAiB,EAAE,cAAsB,EAAE,UAAmC;IACrH,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,6BAA6B;IAC7B,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5F,kCAAkC;IAClC,MAAM,gBAAgB,GAAG,UAAU,CAAC,cAAc,CAAuB,CAAC;IAC1E,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAgB,KAAK;IAClE,IAAI,IAAI;QAAE,OAAO,MAAM,CAAC;IACxB,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,UAAU,CAAC;IACtD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5E,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,SAAiB,EAAE,WAAmB;IACrE,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;IACjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAuB,CAAC;IAC/C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,MAAc;IACtC,uCAAuC;IACvC,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,yBAAyB;IACzB,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IAC/B,CAAC;IACD,4BAA4B;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,SAAiB;IAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,YAAY,CAAC,cAAc,CAAuC,IAAI,EAAE,CAAC;IACtF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,2EAA2E;AAE3E;;;GAGG;AACH,SAAS,iBAAiB,CACxB,SAAiB,EACjB,MAAc,EACd,UAAsB;IAEtB,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;IAE9C,wCAAwC;IACxC,oEAAoE;IACpE,oFAAoF;IACpF,+DAA+D;IAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAClG,IAAI,WAAmB,CAAC;IACxB,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AACtE,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB,CAC1B,SAAiB,EACjB,SAAiB,EACjB,IAAa;IAEb,8DAA8D;IAC9D,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,uBAAuB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;IAE5D,8EAA8E;IAC9E,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAuC,CAAC;QAC5E,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC;YACzB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CACrB,SAAiB,EACjB,MAAc;IAEd,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IAE/C,6BAA6B;IAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC5D,EAAE,CAAC,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAElD,8DAA8D;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAC1D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5D,4CAA4C;IAC5C,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAE7C,MAAM,cAAc,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAClE,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAE3D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AACjF,CAAC;AAED,2EAA2E;AAE3E;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,IAAwB;IAClD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1E,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEhD,IAAI,cAA8B,CAAC;IACnC,IAAI,UAAmC,CAAC;IACxC,IAAI,GAA4B,CAAC;IACjC,IAAI,WAAW,GAAkB,IAAI,CAAC;IACtC,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,cAAc,GAAG,KAAK,CAAC;IAC3B,IAAI,QAAQ,GAAkB,IAAI,CAAC;IAEnC,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QAC1B,qEAAqE;QACrE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QACvC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,cAAc,GAAG,IAAI,CAAC;QACtB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;SAAM,IAAI,UAAU,KAAK,UAAU,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACjE,qEAAqE;QACrE,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3D,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QACvC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,cAAc,GAAG,IAAI,CAAC;QACtB,QAAQ,GAAG,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAW,EAAE,CAAC;IAC5G,CAAC;SAAM,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QACrC,sEAAsE;QACtE,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,UAAU,GAAG,cAAc,QAAQ,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAE1D,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAC5D,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QACvC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,cAAc,GAAG,IAAI,CAAC;QACtB,cAAc,GAAG,IAAI,CAAC;QACtB,QAAQ,GAAG,MAAM,CAAC,CAAC,iDAAiD;IACtE,CAAC;SAAM,CAAC;QACN,sEAAsE;QACtE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QAChE,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QACvC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC/B,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;QACjB,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,cAAc,GAAG,IAAI,CAAC;QACtB,cAAc,GAAG,IAAI,CAAC;QACtB,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAE9C,gEAAgE;IAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI;WACjB,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;WAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,8DAA8D;IAC9D,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAEnD,IAAI,cAAc,IAAI,cAAc,EAAE,CAAC;QACrC,gEAAgE;QAChE,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,EAAE,WAAY,CAAC,CAAC;QAEjE,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC;SAAM,IAAI,cAAc,EAAE,CAAC;QAC1B,wDAAwD;QACxD,MAAM,YAAY,GAAG,UAAU,KAAK,MAAM;YACxC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;YACtB,CAAC,CAAC,uBAAuB,CAAC,IAAI,EAAE,WAAY,CAAC,CAAC;QAEhD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,YAAY,CAAC,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,KAAK,GAAc;YACvB,QAAQ;YACR,WAAW,EAAE,GAAG;SACjB,CAAC;QACF,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;QAC9B,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAE/B,0CAA0C;QAC1C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,oCAAoC;gBACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;4BAC7C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACtC,CAAC;oBACH,CAAC;oBACD,wEAAwE;gBAC1E,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sDAAsD;gBACtD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAkB;YAC3B,QAAQ;YACR,WAAW,EAAE,GAAG;SACjB,CAAC;QACF,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACjC,CAAC;IAED,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/B,sDAAsD;IACtD,IAAI,MAAM,EAAE,CAAC;QACX,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;QACzB,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,kEAAkE;IAClE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,cAAc,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACtF,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3B,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC1E,CAAC;AAED,2EAA2E;AAE3E;;;GAGG;AACH,SAAS,mBAAmB,CAAC,MAAc;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,4BAA4B,MAAM,2CAA2C,CAC9E,CAAC;IACJ,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC;QAC/C,GAAG,EAAE,aAAa,CAAC,SAAS,CAAC,SAAS,GAAG,CAAC,CAAC;KAC5C,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|