@shardworks/nexus-core 0.1.3 → 0.1.5
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/dist/guild-config.d.ts +3 -1
- package/dist/guild-config.d.ts.map +1 -1
- package/dist/guild-config.js +2 -1
- package/dist/guild-config.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/init-guild.d.ts +2 -1
- package/dist/init-guild.d.ts.map +1 -1
- package/dist/init-guild.js +7 -2
- package/dist/init-guild.js.map +1 -1
- package/dist/install-tool.d.ts +38 -4
- package/dist/install-tool.d.ts.map +1 -1
- package/dist/install-tool.js +250 -27
- package/dist/install-tool.js.map +1 -1
- package/dist/remove-tool.d.ts +3 -0
- package/dist/remove-tool.d.ts.map +1 -1
- package/dist/remove-tool.js +51 -0
- package/dist/remove-tool.js.map +1 -1
- package/package.json +1 -1
package/dist/guild-config.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface TrainingEntry {
|
|
|
22
22
|
}
|
|
23
23
|
/** The guild's central configuration file shape (`guild.json`). */
|
|
24
24
|
export interface GuildConfig {
|
|
25
|
+
/** Guild name — used as the guildhall npm package name. */
|
|
26
|
+
name: string;
|
|
25
27
|
/** Installed Nexus framework version. */
|
|
26
28
|
nexus: string;
|
|
27
29
|
/** Default model for anima sessions. */
|
|
@@ -41,7 +43,7 @@ export interface GuildConfig {
|
|
|
41
43
|
* Create the default guild.json content for a new guild.
|
|
42
44
|
* All registries (implements, engines, curricula, temperaments) start empty.
|
|
43
45
|
*/
|
|
44
|
-
export declare function createInitialGuildConfig(nexusVersion: string, model: string): GuildConfig;
|
|
46
|
+
export declare function createInitialGuildConfig(name: string, nexusVersion: string, model: string): GuildConfig;
|
|
45
47
|
/** Resolve the path to guild.json in the standing worktree. */
|
|
46
48
|
export declare function guildConfigPath(home: string): string;
|
|
47
49
|
/** Read and parse guild.json from the standing worktree. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guild-config.d.ts","sourceRoot":"","sources":["../src/guild-config.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,oFAAoF;IACpF,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1B,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,+GAA+G;IAC/G,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,qGAAqG;IACrG,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"guild-config.d.ts","sourceRoot":"","sources":["../src/guild-config.ts"],"names":[],"mappings":"AAIA,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,oFAAoF;IACpF,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1B,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,+GAA+G;IAC/G,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,qGAAqG;IACrG,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,2EAA2E;IAC3E,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,mEAAmE;AACnE,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnC,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,8CAA8C;IAC9C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAWvG;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAGzD;AAED,iDAAiD;AACjD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAGxE"}
|
package/dist/guild-config.js
CHANGED
|
@@ -5,8 +5,9 @@ import { guildhallWorktreePath } from "./nexus-home.js";
|
|
|
5
5
|
* Create the default guild.json content for a new guild.
|
|
6
6
|
* All registries (implements, engines, curricula, temperaments) start empty.
|
|
7
7
|
*/
|
|
8
|
-
export function createInitialGuildConfig(nexusVersion, model) {
|
|
8
|
+
export function createInitialGuildConfig(name, nexusVersion, model) {
|
|
9
9
|
return {
|
|
10
|
+
name,
|
|
10
11
|
nexus: nexusVersion,
|
|
11
12
|
model,
|
|
12
13
|
workshops: [],
|
package/dist/guild-config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guild-config.js","sourceRoot":"","sources":["../src/guild-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"guild-config.js","sourceRoot":"","sources":["../src/guild-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AA8CxD;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY,EAAE,YAAoB,EAAE,KAAa;IACxF,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,YAAY;QACnB,KAAK;QACL,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,EAAE;QACd,OAAO,EAAE,EAAE;QACX,SAAS,EAAE,EAAE;QACb,YAAY,EAAE,EAAE;KACjB,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;AAC9D,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAgB,CAAC;AACzE,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAmB;IAChE,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACzC,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;AACvE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export declare const VERSION
|
|
1
|
+
export declare const VERSION: string;
|
|
2
2
|
export { type ImplementContext, type ImplementDefinition, implement, } from './implement.ts';
|
|
3
3
|
export { createLedger, INITIAL_SCHEMA } from './ledger.ts';
|
|
4
4
|
export { type GuildConfig, type ToolEntry, type TrainingEntry, createInitialGuildConfig, guildConfigPath, readGuildConfig, writeGuildConfig, } from './guild-config.ts';
|
|
5
5
|
export { resolveNexusHome, guildhallBarePath, guildhallWorktreePath, ledgerPath, worktreesPath, } from './nexus-home.ts';
|
|
6
|
-
export { type InstallToolOptions, type InstallResult, installTool, } from './install-tool.ts';
|
|
6
|
+
export { type InstallToolOptions, type InstallResult, type SourceKind, classifySource, installTool, } from './install-tool.ts';
|
|
7
7
|
export { type RemoveToolOptions, type RemoveResult, removeTool, } from './remove-tool.ts';
|
|
8
8
|
export { type DispatchOptions, type DispatchResult, dispatch, } from './dispatch.ts';
|
|
9
9
|
export { type PublishOptions, type PublishResult, publish, } from './publish.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,EAAE,MAAqB,CAAC;AAE5C,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,cAAc,EACd,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,WAAW,EAChB,eAAe,EACf,YAAY,EACZ,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
// @shardworks/nexus-core — shared infrastructure for the guild system
|
|
2
|
-
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
const _require = createRequire(import.meta.url);
|
|
4
|
+
const _pkg = _require('../package.json');
|
|
5
|
+
export const VERSION = _pkg.version;
|
|
3
6
|
export { implement, } from "./implement.js";
|
|
4
7
|
export { createLedger, INITIAL_SCHEMA } from "./ledger.js";
|
|
5
8
|
export { createInitialGuildConfig, guildConfigPath, readGuildConfig, writeGuildConfig, } from "./guild-config.js";
|
|
6
9
|
export { resolveNexusHome, guildhallBarePath, guildhallWorktreePath, ledgerPath, worktreesPath, } from "./nexus-home.js";
|
|
7
|
-
export { installTool, } from "./install-tool.js";
|
|
10
|
+
export { classifySource, installTool, } from "./install-tool.js";
|
|
8
11
|
export { removeTool, } from "./remove-tool.js";
|
|
9
12
|
export { dispatch, } from "./dispatch.js";
|
|
10
13
|
export { publish, } from "./publish.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAW,IAAI,CAAC,OAAO,CAAC;AAE5C,OAAO,EAGL,SAAS,GACV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAIL,wBAAwB,EACxB,eAAe,EACf,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,cAAc,EACd,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAGL,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAGL,QAAQ,GACT,MAAM,eAAe,CAAC;AACvB,OAAO,EAGL,OAAO,GACR,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAEL,eAAe,EACf,YAAY,EACZ,UAAU,GACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/init-guild.d.ts
CHANGED
|
@@ -13,8 +13,9 @@
|
|
|
13
13
|
* applyMigrations(home) // create ledger via migration engine
|
|
14
14
|
*
|
|
15
15
|
* @param home - Absolute path for the new NEXUS_HOME directory.
|
|
16
|
+
* @param name - Guild name (used in guild.json and as the guildhall npm package name).
|
|
16
17
|
* @param model - Default model identifier for anima sessions.
|
|
17
18
|
* @throws If `home` exists and is not empty.
|
|
18
19
|
*/
|
|
19
|
-
export declare function initGuild(home: string, model: string): void;
|
|
20
|
+
export declare function initGuild(home: string, name: string, model: string): void;
|
|
20
21
|
//# sourceMappingURL=init-guild.d.ts.map
|
package/dist/init-guild.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-guild.d.ts","sourceRoot":"","sources":["../src/init-guild.ts"],"names":[],"mappings":"AAYA
|
|
1
|
+
{"version":3,"file":"init-guild.d.ts","sourceRoot":"","sources":["../src/init-guild.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAsEzE"}
|
package/dist/init-guild.js
CHANGED
|
@@ -23,10 +23,11 @@ function git(args, cwd) {
|
|
|
23
23
|
* applyMigrations(home) // create ledger via migration engine
|
|
24
24
|
*
|
|
25
25
|
* @param home - Absolute path for the new NEXUS_HOME directory.
|
|
26
|
+
* @param name - Guild name (used in guild.json and as the guildhall npm package name).
|
|
26
27
|
* @param model - Default model identifier for anima sessions.
|
|
27
28
|
* @throws If `home` exists and is not empty.
|
|
28
29
|
*/
|
|
29
|
-
export function initGuild(home, model) {
|
|
30
|
+
export function initGuild(home, name, model) {
|
|
30
31
|
// Validate target
|
|
31
32
|
if (fs.existsSync(home)) {
|
|
32
33
|
const entries = fs.readdirSync(home);
|
|
@@ -68,8 +69,12 @@ export function initGuild(home, model) {
|
|
|
68
69
|
// Write codex placeholder
|
|
69
70
|
fs.writeFileSync(path.join(ghWorktree, 'codex/all.md'), '');
|
|
70
71
|
// Write guild.json — empty registries, tools will be installed via bootstrapBaseTools
|
|
71
|
-
const config = createInitialGuildConfig(VERSION, model);
|
|
72
|
+
const config = createInitialGuildConfig(name, VERSION, model);
|
|
72
73
|
fs.writeFileSync(path.join(ghWorktree, 'guild.json'), JSON.stringify(config, null, 2) + '\n');
|
|
74
|
+
// Make the guildhall an npm package so guild tools can be installed as
|
|
75
|
+
// npm dependencies with proper dependency resolution.
|
|
76
|
+
fs.writeFileSync(path.join(ghWorktree, 'package.json'), JSON.stringify({ name: `guild-${name}`, private: true, version: '0.0.0' }, null, 2) + '\n');
|
|
77
|
+
fs.writeFileSync(path.join(ghWorktree, '.gitignore'), 'node_modules/\n');
|
|
73
78
|
// Initial commit
|
|
74
79
|
git(['add', '-A'], ghWorktree);
|
|
75
80
|
git(['commit', '-m', 'Initialize guild'], ghWorktree);
|
package/dist/init-guild.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-guild.js","sourceRoot":"","sources":["../src/init-guild.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,SAAS,GAAG,CAAC,IAAc,EAAE,GAAY;IACvC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AACpD,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"init-guild.js","sourceRoot":"","sources":["../src/init-guild.ts"],"names":[],"mappings":"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"}
|
package/dist/install-tool.d.ts
CHANGED
|
@@ -1,9 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How the source was classified for installation.
|
|
3
|
+
*
|
|
4
|
+
* - `npm-local` — local directory with package.json; npm install (copy) or symlink
|
|
5
|
+
* - `npm-registry` — npm package specifier (e.g. `foo@1.0`, `@scope/tool`)
|
|
6
|
+
* - `npm-tarball` — local .tgz/.tar.gz file
|
|
7
|
+
* - `bare-local` — local directory without package.json; plain file copy
|
|
8
|
+
*/
|
|
9
|
+
export type SourceKind = 'npm-local' | 'npm-registry' | 'npm-tarball' | 'bare-local';
|
|
1
10
|
export interface InstallToolOptions {
|
|
2
11
|
/** Absolute path to the NEXUS_HOME directory. */
|
|
3
12
|
home: string;
|
|
4
|
-
/**
|
|
13
|
+
/**
|
|
14
|
+
* Source — local directory path, npm package specifier, or tarball path.
|
|
15
|
+
*
|
|
16
|
+
* - Local directory with `package.json`: installed via npm (copy) or symlink (`link: true`)
|
|
17
|
+
* - Local directory without `package.json`: copied as bare files (no dep resolution)
|
|
18
|
+
* - `.tgz` / `.tar.gz` file: installed via npm
|
|
19
|
+
* - Anything else: treated as an npm registry specifier
|
|
20
|
+
*/
|
|
5
21
|
source: string;
|
|
6
|
-
/** Override the tool name (defaults to
|
|
22
|
+
/** Override the tool name (defaults to package name or directory basename). */
|
|
7
23
|
name?: string;
|
|
8
24
|
/** Override the version slot. */
|
|
9
25
|
slot?: string;
|
|
@@ -17,18 +33,36 @@ export interface InstallToolOptions {
|
|
|
17
33
|
framework?: boolean;
|
|
18
34
|
/** Whether to create a git commit after installing. Defaults to true. */
|
|
19
35
|
commit?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Symlink a local directory instead of copying (dev mode).
|
|
38
|
+
* Only valid for local directories with `package.json`.
|
|
39
|
+
* Changes to the source are reflected immediately at runtime.
|
|
40
|
+
*/
|
|
41
|
+
link?: boolean;
|
|
20
42
|
}
|
|
21
43
|
export interface InstallResult {
|
|
22
44
|
category: 'implements' | 'engines' | 'curricula' | 'temperaments';
|
|
23
45
|
name: string;
|
|
24
46
|
slot: string;
|
|
25
47
|
installedTo: string;
|
|
48
|
+
sourceKind: SourceKind;
|
|
26
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Classify a source string to determine the installation method.
|
|
52
|
+
*/
|
|
53
|
+
export declare function classifySource(source: string): SourceKind;
|
|
27
54
|
/**
|
|
28
55
|
* Install a tool (implement, engine, curriculum, or temperament) into the guild.
|
|
29
56
|
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
57
|
+
* Supports multiple source types:
|
|
58
|
+
* - Local directory with package.json: installed via npm (or symlinked with `link: true`)
|
|
59
|
+
* - Local directory without package.json: copied as bare files
|
|
60
|
+
* - npm registry specifier: installed via npm
|
|
61
|
+
* - Tarball (.tgz): installed via npm
|
|
62
|
+
*
|
|
63
|
+
* For npm-installed tools, the runtime code lives in the guildhall's node_modules.
|
|
64
|
+
* Metadata (descriptor + instructions) is copied to the guildhall slot for git tracking.
|
|
65
|
+
* The descriptor's `package` field is set so the manifest engine resolves by package name.
|
|
32
66
|
*/
|
|
33
67
|
export declare function installTool(opts: InstallToolOptions): InstallResult;
|
|
34
68
|
//# sourceMappingURL=install-tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-tool.d.ts","sourceRoot":"","sources":["../src/install-tool.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb
|
|
1
|
+
{"version":3,"file":"install-tool.d.ts","sourceRoot":"","sources":["../src/install-tool.ts"],"names":[],"mappings":"AAiCA;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC;AAErF,MAAM,WAAW,kBAAkB;IACjC,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;OAOG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yEAAyE;IACzE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,UAAU,CAAC;CACxB;AAiFD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAwBzD;AA2HD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,aAAa,CAqJnE"}
|
package/dist/install-tool.js
CHANGED
|
@@ -10,14 +10,14 @@ const DESCRIPTOR_FILES = [
|
|
|
10
10
|
'nexus-curriculum.json',
|
|
11
11
|
'nexus-temperament.json',
|
|
12
12
|
];
|
|
13
|
-
/** Map descriptor file
|
|
13
|
+
/** Map descriptor file -> artifact category in guild.json */
|
|
14
14
|
const CATEGORY_MAP = {
|
|
15
15
|
'nexus-implement.json': 'implements',
|
|
16
16
|
'nexus-engine.json': 'engines',
|
|
17
17
|
'nexus-curriculum.json': 'curricula',
|
|
18
18
|
'nexus-temperament.json': 'temperaments',
|
|
19
19
|
};
|
|
20
|
-
/** Map category
|
|
20
|
+
/** Map category -> on-disk parent directory (relative to guildhall worktree). */
|
|
21
21
|
const DIR_MAP = {
|
|
22
22
|
implements: 'implements',
|
|
23
23
|
engines: 'engines',
|
|
@@ -27,6 +27,9 @@ const DIR_MAP = {
|
|
|
27
27
|
function git(args, cwd) {
|
|
28
28
|
execFileSync('git', args, { cwd, stdio: 'pipe' });
|
|
29
29
|
}
|
|
30
|
+
function npm(args, cwd) {
|
|
31
|
+
return execFileSync('npm', args, { cwd, stdio: 'pipe', encoding: 'utf-8' });
|
|
32
|
+
}
|
|
30
33
|
/** Detect the descriptor file in a directory. Returns the filename or throws. */
|
|
31
34
|
function findDescriptor(dir) {
|
|
32
35
|
for (const f of DESCRIPTOR_FILES) {
|
|
@@ -35,10 +38,14 @@ function findDescriptor(dir) {
|
|
|
35
38
|
}
|
|
36
39
|
throw new Error(`No descriptor found in ${dir}. Expected one of: ${DESCRIPTOR_FILES.join(', ')}`);
|
|
37
40
|
}
|
|
38
|
-
/** Read a JSON file
|
|
41
|
+
/** Read a JSON file. */
|
|
39
42
|
function readJson(filePath) {
|
|
40
43
|
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
41
44
|
}
|
|
45
|
+
/** Write a JSON file. */
|
|
46
|
+
function writeJson(filePath, data) {
|
|
47
|
+
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
|
|
48
|
+
}
|
|
42
49
|
/** Directories to skip when copying tool sources. */
|
|
43
50
|
const SKIP_DIRS = new Set(['node_modules', '.git']);
|
|
44
51
|
/** Recursively copy a directory, skipping node_modules and .git. */
|
|
@@ -69,29 +76,214 @@ function copyDir(src, dest) {
|
|
|
69
76
|
}
|
|
70
77
|
}
|
|
71
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Copy only the metadata files (descriptor + instructions) from a source
|
|
81
|
+
* directory into the guildhall slot. This is used for npm-installed tools
|
|
82
|
+
* where the runtime code lives in node_modules but the metadata needs to
|
|
83
|
+
* be git-tracked in the guildhall.
|
|
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
|
+
export function classifySource(source) {
|
|
102
|
+
// Tarball detection
|
|
103
|
+
if (source.endsWith('.tgz') || source.endsWith('.tar.gz')) {
|
|
104
|
+
return 'npm-tarball';
|
|
105
|
+
}
|
|
106
|
+
// Local path detection: starts with /, ./, ../, or is an absolute path on the system
|
|
107
|
+
const isPath = source.startsWith('/') || source.startsWith('./') || source.startsWith('../');
|
|
108
|
+
if (isPath || path.isAbsolute(source)) {
|
|
109
|
+
const resolved = path.resolve(source);
|
|
110
|
+
if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {
|
|
111
|
+
// Check for package.json to distinguish npm-local from bare-local
|
|
112
|
+
if (fs.existsSync(path.join(resolved, 'package.json'))) {
|
|
113
|
+
return 'npm-local';
|
|
114
|
+
}
|
|
115
|
+
return 'bare-local';
|
|
116
|
+
}
|
|
117
|
+
// Path-like but not a directory — could be a nonexistent path (error later)
|
|
118
|
+
// or a relative tarball handled above. Treat as bare-local for error messaging.
|
|
119
|
+
return 'bare-local';
|
|
120
|
+
}
|
|
121
|
+
// Everything else is an npm registry specifier
|
|
122
|
+
return 'npm-registry';
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Resolve the installed package directory in node_modules after npm install.
|
|
126
|
+
* Reads the package name from the source (or node_modules) and returns the path.
|
|
127
|
+
*/
|
|
128
|
+
function resolveInstalledPackage(worktree, packageName) {
|
|
129
|
+
const pkgDir = path.join(worktree, 'node_modules', packageName);
|
|
130
|
+
if (!fs.existsSync(pkgDir)) {
|
|
131
|
+
// Handle scoped packages — npm might nest them
|
|
132
|
+
throw new Error(`Could not find installed package at ${pkgDir}`);
|
|
133
|
+
}
|
|
134
|
+
return pkgDir;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Read the package name from a package.json file.
|
|
138
|
+
*/
|
|
139
|
+
function readPackageName(dir) {
|
|
140
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
141
|
+
if (!fs.existsSync(pkgPath)) {
|
|
142
|
+
throw new Error(`No package.json found in ${dir}`);
|
|
143
|
+
}
|
|
144
|
+
const pkg = readJson(pkgPath);
|
|
145
|
+
const name = pkg['name'];
|
|
146
|
+
if (!name) {
|
|
147
|
+
throw new Error(`No "name" field in ${pkgPath}`);
|
|
148
|
+
}
|
|
149
|
+
return name;
|
|
150
|
+
}
|
|
151
|
+
// ── Install paths ───────────────────────────────────────────────────────
|
|
152
|
+
/**
|
|
153
|
+
* Install via npm (covers local dirs with package.json, registry specifiers, and tarballs).
|
|
154
|
+
* Runs `npm install --save <source>` in the guildhall worktree, then copies
|
|
155
|
+
* metadata (descriptor + instructions) to the guildhall slot for git tracking.
|
|
156
|
+
*/
|
|
157
|
+
function installViaNpm(worktree, source, sourceKind) {
|
|
158
|
+
// For local dirs, resolve to absolute path so npm gets a valid reference
|
|
159
|
+
const npmSource = sourceKind === 'npm-local'
|
|
160
|
+
? path.resolve(source)
|
|
161
|
+
: source;
|
|
162
|
+
npm(['install', '--save', npmSource], worktree);
|
|
163
|
+
// Determine the package name
|
|
164
|
+
let packageName;
|
|
165
|
+
if (sourceKind === 'npm-local') {
|
|
166
|
+
packageName = readPackageName(path.resolve(source));
|
|
167
|
+
}
|
|
168
|
+
else if (sourceKind === 'npm-tarball') {
|
|
169
|
+
// For tarballs, read the name from the installed package
|
|
170
|
+
// npm outputs the package name during install, but parsing the
|
|
171
|
+
// guildhall package.json dependencies is more reliable
|
|
172
|
+
const guildhallPkg = readJson(path.join(worktree, 'package.json'));
|
|
173
|
+
const deps = guildhallPkg['dependencies'] ?? {};
|
|
174
|
+
// The most recently added dependency is our package
|
|
175
|
+
const depNames = Object.keys(deps);
|
|
176
|
+
packageName = depNames[depNames.length - 1];
|
|
177
|
+
if (!packageName) {
|
|
178
|
+
throw new Error('Could not determine package name after npm install');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
// Registry specifier — strip version suffix to get the package name
|
|
183
|
+
// e.g. "foo@1.0" -> "foo", "@scope/foo@1.0" -> "@scope/foo"
|
|
184
|
+
packageName = source.replace(/@[^/]*$/, '');
|
|
185
|
+
// Handle bare names without version
|
|
186
|
+
if (packageName === source && source.includes('@') && !source.startsWith('@')) {
|
|
187
|
+
packageName = source.split('@')[0];
|
|
188
|
+
}
|
|
189
|
+
// Scoped packages: @scope/name@version
|
|
190
|
+
if (source.startsWith('@') && source.lastIndexOf('@') > 0) {
|
|
191
|
+
packageName = source.substring(0, source.lastIndexOf('@'));
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const packageDir = resolveInstalledPackage(worktree, packageName);
|
|
195
|
+
const descriptorFile = findDescriptor(packageDir);
|
|
196
|
+
const descriptor = readJson(path.join(packageDir, descriptorFile));
|
|
197
|
+
const pkg = readJson(path.join(packageDir, 'package.json'));
|
|
198
|
+
return { packageName, packageDir, descriptorFile, descriptor, pkg };
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Install via symlink (dev mode for local dirs with package.json).
|
|
202
|
+
* Creates a symlink in guildhall/node_modules pointing to the source directory.
|
|
203
|
+
*/
|
|
204
|
+
function installViaLink(worktree, source) {
|
|
205
|
+
const sourceDir = path.resolve(source);
|
|
206
|
+
const packageName = readPackageName(sourceDir);
|
|
207
|
+
// Ensure node_modules exists
|
|
208
|
+
const nodeModulesDir = path.join(worktree, 'node_modules');
|
|
209
|
+
fs.mkdirSync(nodeModulesDir, { recursive: true });
|
|
210
|
+
// Handle scoped packages: @scope/name needs @scope/ directory
|
|
211
|
+
const linkTarget = path.join(nodeModulesDir, packageName);
|
|
212
|
+
fs.mkdirSync(path.dirname(linkTarget), { recursive: true });
|
|
213
|
+
// Remove existing link/directory if present
|
|
214
|
+
if (fs.existsSync(linkTarget)) {
|
|
215
|
+
fs.rmSync(linkTarget, { recursive: true });
|
|
216
|
+
}
|
|
217
|
+
fs.symlinkSync(sourceDir, linkTarget, 'dir');
|
|
218
|
+
const descriptorFile = findDescriptor(sourceDir);
|
|
219
|
+
const descriptor = readJson(path.join(sourceDir, descriptorFile));
|
|
220
|
+
const pkg = readJson(path.join(sourceDir, 'package.json'));
|
|
221
|
+
return { packageName, packageDir: sourceDir, descriptorFile, descriptor, pkg };
|
|
222
|
+
}
|
|
223
|
+
// ── Main ────────────────────────────────────────────────────────────────
|
|
72
224
|
/**
|
|
73
225
|
* Install a tool (implement, engine, curriculum, or temperament) into the guild.
|
|
74
226
|
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
227
|
+
* Supports multiple source types:
|
|
228
|
+
* - Local directory with package.json: installed via npm (or symlinked with `link: true`)
|
|
229
|
+
* - Local directory without package.json: copied as bare files
|
|
230
|
+
* - npm registry specifier: installed via npm
|
|
231
|
+
* - Tarball (.tgz): installed via npm
|
|
232
|
+
*
|
|
233
|
+
* For npm-installed tools, the runtime code lives in the guildhall's node_modules.
|
|
234
|
+
* Metadata (descriptor + instructions) is copied to the guildhall slot for git tracking.
|
|
235
|
+
* The descriptor's `package` field is set so the manifest engine resolves by package name.
|
|
77
236
|
*/
|
|
78
237
|
export function installTool(opts) {
|
|
79
|
-
const { home, source, roles, framework = false, commit = true } = opts;
|
|
238
|
+
const { home, source, roles, framework = false, commit = true, link = false } = opts;
|
|
80
239
|
const worktree = guildhallWorktreePath(home);
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
throw new Error(
|
|
240
|
+
const sourceKind = classifySource(source);
|
|
241
|
+
// Validate link option
|
|
242
|
+
if (link && sourceKind !== 'npm-local') {
|
|
243
|
+
throw new Error('The --link option is only valid for local directories with a package.json.');
|
|
244
|
+
}
|
|
245
|
+
let descriptorFile;
|
|
246
|
+
let descriptor;
|
|
247
|
+
let pkg;
|
|
248
|
+
let packageName = null;
|
|
249
|
+
let isNpmInstalled = false;
|
|
250
|
+
if (sourceKind === 'bare-local' || framework) {
|
|
251
|
+
// ── Bare local or framework: copy files directly ──────────────────
|
|
252
|
+
// Framework tools always use copyDir — they resolve by package name
|
|
253
|
+
// at runtime (via the `package` field in their descriptors) and don't
|
|
254
|
+
// need npm installation in the guildhall.
|
|
255
|
+
const sourceDir = path.resolve(source);
|
|
256
|
+
if (!fs.existsSync(sourceDir) || !fs.statSync(sourceDir).isDirectory()) {
|
|
257
|
+
throw new Error(`Source is not a directory: ${sourceDir}`);
|
|
258
|
+
}
|
|
259
|
+
descriptorFile = findDescriptor(sourceDir);
|
|
260
|
+
descriptor = readJson(path.join(sourceDir, descriptorFile));
|
|
261
|
+
const pkgJsonPath = path.join(sourceDir, 'package.json');
|
|
262
|
+
pkg = fs.existsSync(pkgJsonPath) ? readJson(pkgJsonPath) : {};
|
|
263
|
+
}
|
|
264
|
+
else if (link) {
|
|
265
|
+
// ── Link mode: symlink local dir ──────────────────────────────────
|
|
266
|
+
const result = installViaLink(worktree, source);
|
|
267
|
+
descriptorFile = result.descriptorFile;
|
|
268
|
+
descriptor = result.descriptor;
|
|
269
|
+
pkg = result.pkg;
|
|
270
|
+
packageName = result.packageName;
|
|
271
|
+
isNpmInstalled = true;
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
// ── npm install: local dir, registry, or tarball ──────────────────
|
|
275
|
+
const result = installViaNpm(worktree, source, sourceKind);
|
|
276
|
+
descriptorFile = result.descriptorFile;
|
|
277
|
+
descriptor = result.descriptor;
|
|
278
|
+
pkg = result.pkg;
|
|
279
|
+
packageName = result.packageName;
|
|
280
|
+
isNpmInstalled = true;
|
|
85
281
|
}
|
|
86
|
-
// Detect descriptor
|
|
87
|
-
const descriptorFile = findDescriptor(sourceDir);
|
|
88
282
|
const category = CATEGORY_MAP[descriptorFile];
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
// Resolve name: --name flag > directory basename
|
|
94
|
-
const name = opts.name || path.basename(sourceDir);
|
|
283
|
+
// Resolve name: --name flag > package name > directory basename
|
|
284
|
+
const name = opts.name
|
|
285
|
+
|| (packageName ? packageName.replace(/^@[^/]+\//, '') : null)
|
|
286
|
+
|| path.basename(path.resolve(source));
|
|
95
287
|
if (!name || name === '.' || name === '..') {
|
|
96
288
|
throw new Error('Could not determine tool name. Use --name to specify one.');
|
|
97
289
|
}
|
|
@@ -102,7 +294,7 @@ export function installTool(opts) {
|
|
|
102
294
|
if (!slot) {
|
|
103
295
|
throw new Error('No version found in descriptor or package.json. Use --slot to specify a version slot.');
|
|
104
296
|
}
|
|
105
|
-
// Determine target directory.
|
|
297
|
+
// Determine target directory for metadata/files in the guildhall.
|
|
106
298
|
// Framework tools go under nexus/{implements,engines}/.
|
|
107
299
|
// Guild tools go under {implements,engines}/ (or training/ for curricula/temperaments).
|
|
108
300
|
const parentDir = DIR_MAP[category];
|
|
@@ -110,11 +302,42 @@ export function installTool(opts) {
|
|
|
110
302
|
? path.join('nexus', parentDir)
|
|
111
303
|
: parentDir;
|
|
112
304
|
const targetDir = path.join(worktree, prefix, name, slot);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
305
|
+
if (isNpmInstalled) {
|
|
306
|
+
// npm-installed: copy only metadata to the guildhall slot, set package field
|
|
307
|
+
const pkgSourceDir = link
|
|
308
|
+
? path.resolve(source)
|
|
309
|
+
: resolveInstalledPackage(worktree, packageName);
|
|
310
|
+
if (fs.existsSync(targetDir)) {
|
|
311
|
+
fs.rmSync(targetDir, { recursive: true });
|
|
312
|
+
}
|
|
313
|
+
copyMetadata(pkgSourceDir, targetDir, descriptorFile, descriptor);
|
|
314
|
+
// Write package field into the slot's descriptor so the manifest engine
|
|
315
|
+
// resolves by package name at runtime (from guildhall's node_modules).
|
|
316
|
+
const slotDescriptor = readJson(path.join(targetDir, descriptorFile));
|
|
317
|
+
slotDescriptor['package'] = packageName;
|
|
318
|
+
writeJson(path.join(targetDir, descriptorFile), slotDescriptor);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
// Bare local or framework: copy entire source directory
|
|
322
|
+
if (fs.existsSync(targetDir)) {
|
|
323
|
+
fs.rmSync(targetDir, { recursive: true });
|
|
324
|
+
}
|
|
325
|
+
copyDir(path.resolve(source), targetDir);
|
|
326
|
+
// For sources with a package.json, write the package name into the slot
|
|
327
|
+
// descriptor so the manifest engine resolves by package name at runtime.
|
|
328
|
+
// This covers framework tools (which always have package.json) and any
|
|
329
|
+
// bare-local tools that happen to be proper npm packages.
|
|
330
|
+
const sourcePkgPath = path.join(path.resolve(source), 'package.json');
|
|
331
|
+
if (fs.existsSync(sourcePkgPath)) {
|
|
332
|
+
const sourcePkg = readJson(sourcePkgPath);
|
|
333
|
+
const sourcePkgName = sourcePkg['name'];
|
|
334
|
+
if (sourcePkgName) {
|
|
335
|
+
const slotDescriptor = readJson(path.join(targetDir, descriptorFile));
|
|
336
|
+
slotDescriptor['package'] = sourcePkgName;
|
|
337
|
+
writeJson(path.join(targetDir, descriptorFile), slotDescriptor);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
116
340
|
}
|
|
117
|
-
copyDir(sourceDir, targetDir);
|
|
118
341
|
// Register in guild.json
|
|
119
342
|
const config = readGuildConfig(home);
|
|
120
343
|
const now = new Date().toISOString();
|
|
@@ -122,7 +345,7 @@ export function installTool(opts) {
|
|
|
122
345
|
const entry = {
|
|
123
346
|
source: framework ? 'nexus' : 'guild',
|
|
124
347
|
slot,
|
|
125
|
-
upstream: null,
|
|
348
|
+
upstream: isNpmInstalled ? `${packageName}@${slot}` : null,
|
|
126
349
|
installedAt: now,
|
|
127
350
|
};
|
|
128
351
|
if (category === 'implements' && roles && roles.length > 0) {
|
|
@@ -133,17 +356,17 @@ export function installTool(opts) {
|
|
|
133
356
|
else {
|
|
134
357
|
const entry = {
|
|
135
358
|
slot,
|
|
136
|
-
upstream: null,
|
|
359
|
+
upstream: isNpmInstalled ? `${packageName}@${slot}` : null,
|
|
137
360
|
installedAt: now,
|
|
138
361
|
};
|
|
139
362
|
config[category][name] = entry;
|
|
140
363
|
}
|
|
141
364
|
writeGuildConfig(home, config);
|
|
142
|
-
// Commit (unless suppressed
|
|
365
|
+
// Commit (unless suppressed -- e.g. during bootstrap)
|
|
143
366
|
if (commit) {
|
|
144
367
|
git(['add', '-A'], worktree);
|
|
145
368
|
git(['commit', '-m', `Install ${category.slice(0, -1)} ${name}@${slot}`], worktree);
|
|
146
369
|
}
|
|
147
|
-
return { category, name, slot, installedTo: targetDir };
|
|
370
|
+
return { category, name, slot, installedTo: targetDir, sourceKind };
|
|
148
371
|
}
|
|
149
372
|
//# sourceMappingURL=install-tool.js.map
|
package/dist/install-tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-tool.js","sourceRoot":"","sources":["../src/install-tool.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"install-tool.js","sourceRoot":"","sources":["../src/install-tool.ts"],"names":[],"mappings":"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"}
|
package/dist/remove-tool.d.ts
CHANGED
|
@@ -13,6 +13,9 @@ export interface RemoveResult {
|
|
|
13
13
|
/**
|
|
14
14
|
* Remove a tool from the guild — deregister from guild.json and delete from disk.
|
|
15
15
|
*
|
|
16
|
+
* For npm-installed tools, also runs `npm uninstall` to clean up node_modules.
|
|
17
|
+
* For linked tools, removes the symlink from node_modules.
|
|
18
|
+
*
|
|
16
19
|
* Only guild-managed tools can be removed. Framework (nexus) tools are managed
|
|
17
20
|
* by `nexus repair` / `nexus install`.
|
|
18
21
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-tool.d.ts","sourceRoot":"","sources":["../src/remove-tool.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;CACpE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"remove-tool.d.ts","sourceRoot":"","sources":["../src/remove-tool.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;CACpE;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,CAAC;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,YAAY,CA2EhE"}
|
package/dist/remove-tool.js
CHANGED
|
@@ -14,9 +14,36 @@ const REGISTRIES = ['implements', 'engines', 'curricula', 'temperaments'];
|
|
|
14
14
|
function git(args, cwd) {
|
|
15
15
|
execFileSync('git', args, { cwd, stdio: 'pipe' });
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Read a JSON file.
|
|
19
|
+
*/
|
|
20
|
+
function readJson(filePath) {
|
|
21
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Determine the npm package name for a tool from its slot descriptor's `package` field.
|
|
25
|
+
* Returns null if the tool was not npm-installed.
|
|
26
|
+
*/
|
|
27
|
+
function getPackageName(worktree, category, name, slot) {
|
|
28
|
+
const parentDir = DIR_MAP[category];
|
|
29
|
+
const slotDir = path.join(worktree, parentDir, name, slot);
|
|
30
|
+
// Check all possible descriptor files
|
|
31
|
+
const descriptorFiles = ['nexus-implement.json', 'nexus-engine.json', 'nexus-curriculum.json', 'nexus-temperament.json'];
|
|
32
|
+
for (const descriptorFile of descriptorFiles) {
|
|
33
|
+
const descriptorPath = path.join(slotDir, descriptorFile);
|
|
34
|
+
if (fs.existsSync(descriptorPath)) {
|
|
35
|
+
const descriptor = readJson(descriptorPath);
|
|
36
|
+
return descriptor['package'] ?? null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
17
41
|
/**
|
|
18
42
|
* Remove a tool from the guild — deregister from guild.json and delete from disk.
|
|
19
43
|
*
|
|
44
|
+
* For npm-installed tools, also runs `npm uninstall` to clean up node_modules.
|
|
45
|
+
* For linked tools, removes the symlink from node_modules.
|
|
46
|
+
*
|
|
20
47
|
* Only guild-managed tools can be removed. Framework (nexus) tools are managed
|
|
21
48
|
* by `nexus repair` / `nexus install`.
|
|
22
49
|
*/
|
|
@@ -42,6 +69,30 @@ export function removeTool(opts) {
|
|
|
42
69
|
if ('source' in entry && entry.source === 'nexus') {
|
|
43
70
|
throw new Error(`"${name}" is a framework tool (source: nexus). Use "nexus repair" to manage framework tools.`);
|
|
44
71
|
}
|
|
72
|
+
// Clean up npm-installed packages from node_modules
|
|
73
|
+
const packageName = getPackageName(worktree, foundCategory, name, slot);
|
|
74
|
+
if (packageName) {
|
|
75
|
+
const linkPath = path.join(worktree, 'node_modules', packageName);
|
|
76
|
+
if (fs.existsSync(linkPath) && fs.lstatSync(linkPath).isSymbolicLink()) {
|
|
77
|
+
// Linked tool: just remove the symlink
|
|
78
|
+
fs.unlinkSync(linkPath);
|
|
79
|
+
// Clean up empty scoped directory if needed
|
|
80
|
+
const scopeDir = path.dirname(linkPath);
|
|
81
|
+
if (scopeDir !== path.join(worktree, 'node_modules') &&
|
|
82
|
+
fs.existsSync(scopeDir) && fs.readdirSync(scopeDir).length === 0) {
|
|
83
|
+
fs.rmdirSync(scopeDir);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// npm-installed tool: use npm uninstall
|
|
88
|
+
try {
|
|
89
|
+
execFileSync('npm', ['uninstall', packageName], { cwd: worktree, stdio: 'pipe' });
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
// If npm uninstall fails (e.g. package already gone), continue with cleanup
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
45
96
|
// Remove on-disk directory (the specific slot)
|
|
46
97
|
const parentDir = DIR_MAP[foundCategory];
|
|
47
98
|
const toolDir = path.join(worktree, parentDir, name, slot);
|
package/dist/remove-tool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-tool.js","sourceRoot":"","sources":["../src/remove-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,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAEtE,MAAM,OAAO,GAA2B;IACtC,UAAU,EAAE,YAAY;IACxB,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,oBAAoB;IAC/B,YAAY,EAAE,uBAAuB;CACtC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,UAAU,GAAG,CAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,CAAU,CAAC;AAgBnF,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
|
|
1
|
+
{"version":3,"file":"remove-tool.js","sourceRoot":"","sources":["../src/remove-tool.ts"],"names":[],"mappings":"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"}
|