agent-switchboard 0.1.26 → 0.1.28
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 +37 -11
- package/dist/commands/distribution.js +2 -2
- package/dist/commands/distribution.js.map +1 -1
- package/dist/commands/library.d.ts +1 -1
- package/dist/commands/library.js +5 -6
- package/dist/commands/library.js.map +1 -1
- package/dist/config/application-config.d.ts +37 -0
- package/dist/config/application-config.js +83 -0
- package/dist/config/application-config.js.map +1 -0
- package/dist/config/layered-config.js +43 -2
- package/dist/config/layered-config.js.map +1 -1
- package/dist/config/paths.d.ts +13 -2
- package/dist/config/paths.js +21 -3
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schemas.d.ts +408 -43
- package/dist/config/schemas.js +32 -22
- package/dist/config/schemas.js.map +1 -1
- package/dist/config/switchboard-config.d.ts +3 -6
- package/dist/config/switchboard-config.js +3 -6
- package/dist/config/switchboard-config.js.map +1 -1
- package/dist/hooks/distribution.d.ts +27 -0
- package/dist/hooks/distribution.js +235 -0
- package/dist/hooks/distribution.js.map +1 -0
- package/dist/hooks/library.d.ts +40 -0
- package/dist/hooks/library.js +143 -0
- package/dist/hooks/library.js.map +1 -0
- package/dist/hooks/schema.d.ts +542 -0
- package/dist/hooks/schema.js +49 -0
- package/dist/hooks/schema.js.map +1 -0
- package/dist/index.js +708 -168
- package/dist/index.js.map +1 -1
- package/dist/library/fs.d.ts +1 -3
- package/dist/library/fs.js +24 -7
- package/dist/library/fs.js.map +1 -1
- package/dist/library/schema.d.ts +1 -1
- package/dist/library/schema.js +1 -1
- package/dist/library/sources.d.ts +75 -0
- package/dist/library/sources.js +285 -0
- package/dist/library/sources.js.map +1 -0
- package/dist/library/state.d.ts +4 -5
- package/dist/library/state.js +15 -31
- package/dist/library/state.js.map +1 -1
- package/dist/marketplace/plugin-loader.d.ts +30 -0
- package/dist/marketplace/plugin-loader.js +178 -0
- package/dist/marketplace/plugin-loader.js.map +1 -0
- package/dist/marketplace/reader.d.ts +36 -0
- package/dist/marketplace/reader.js +90 -0
- package/dist/marketplace/reader.js.map +1 -0
- package/dist/marketplace/schemas.d.ts +467 -0
- package/dist/marketplace/schemas.js +57 -0
- package/dist/marketplace/schemas.js.map +1 -0
- package/dist/marketplace/source-loader.d.ts +32 -0
- package/dist/marketplace/source-loader.js +45 -0
- package/dist/marketplace/source-loader.js.map +1 -0
- package/dist/rules/agents.d.ts +4 -4
- package/dist/rules/agents.js +10 -4
- package/dist/rules/agents.js.map +1 -1
- package/dist/rules/composer.d.ts +2 -2
- package/dist/rules/composer.js +5 -5
- package/dist/rules/composer.js.map +1 -1
- package/dist/rules/distribution.js +48 -112
- package/dist/rules/distribution.js.map +1 -1
- package/dist/rules/library.d.ts +1 -1
- package/dist/rules/library.js +4 -5
- package/dist/rules/library.js.map +1 -1
- package/dist/skills/distribution.js +6 -6
- package/dist/skills/distribution.js.map +1 -1
- package/dist/skills/library.d.ts +1 -2
- package/dist/skills/library.js +6 -7
- package/dist/skills/library.js.map +1 -1
- package/dist/subagents/distribution.d.ts +1 -1
- package/dist/subagents/distribution.js +319 -20
- package/dist/subagents/distribution.js.map +1 -1
- package/dist/subagents/importer.d.ts +1 -1
- package/dist/subagents/importer.js +61 -1
- package/dist/subagents/importer.js.map +1 -1
- package/dist/subagents/inventory.js +3 -3
- package/dist/subagents/inventory.js.map +1 -1
- package/dist/subagents/library.d.ts +2 -2
- package/dist/subagents/library.js +14 -20
- package/dist/subagents/library.js.map +1 -1
- package/dist/ui/hook-ui.d.ts +8 -0
- package/dist/ui/hook-ui.js +17 -0
- package/dist/ui/hook-ui.js.map +1 -0
- package/dist/ui/library-selector.d.ts +1 -1
- package/dist/ui/subagent-ui.js +3 -3
- package/dist/ui/subagent-ui.js.map +1 -1
- package/dist/util/cli.d.ts +20 -0
- package/dist/util/cli.js +107 -14
- package/dist/util/cli.js.map +1 -1
- package/package.json +3 -2
- package/dist/config/agent-config.d.ts +0 -35
- package/dist/config/agent-config.js +0 -88
- package/dist/config/agent-config.js.map +0 -1
- package/dist/library/subscriptions.d.ts +0 -42
- package/dist/library/subscriptions.js +0 -116
- package/dist/library/subscriptions.js.map +0 -1
package/dist/config/schemas.js
CHANGED
|
@@ -23,7 +23,7 @@ export const mcpConfigSchema = z.object({
|
|
|
23
23
|
mcpServers: z.record(z.string(), mcpServerSchema).default({}),
|
|
24
24
|
});
|
|
25
25
|
/**
|
|
26
|
-
* Base schema for selection sections (commands,
|
|
26
|
+
* Base schema for selection sections (commands, agents, etc.) without defaults
|
|
27
27
|
*/
|
|
28
28
|
const selectionSectionBaseSchema = z
|
|
29
29
|
.object({
|
|
@@ -36,7 +36,7 @@ export const selectionSectionSchema = selectionSectionBaseSchema
|
|
|
36
36
|
})
|
|
37
37
|
.passthrough();
|
|
38
38
|
/**
|
|
39
|
-
* Incremental selection schema for per-
|
|
39
|
+
* Incremental selection schema for per-application overrides
|
|
40
40
|
* - active: completely override the global list
|
|
41
41
|
* - add: append to the global list
|
|
42
42
|
* - remove: remove from the global list
|
|
@@ -52,36 +52,38 @@ const incrementalRulesSchema = incrementalSelectionSchema.extend({
|
|
|
52
52
|
includeDelimiters: z.boolean().optional(),
|
|
53
53
|
});
|
|
54
54
|
/**
|
|
55
|
-
* Per-
|
|
56
|
-
* Allows overriding mcp, commands,
|
|
55
|
+
* Per-application configuration override schema
|
|
56
|
+
* Allows overriding mcp, commands, agents, skills, rules for a specific application
|
|
57
57
|
*/
|
|
58
|
-
export const
|
|
58
|
+
export const applicationConfigOverrideSchema = z
|
|
59
59
|
.object({
|
|
60
60
|
mcp: incrementalSelectionSchema.optional(),
|
|
61
61
|
commands: incrementalSelectionSchema.optional(),
|
|
62
|
-
|
|
62
|
+
agents: incrementalSelectionSchema.optional(),
|
|
63
63
|
skills: incrementalSelectionSchema.optional(),
|
|
64
|
+
hooks: incrementalSelectionSchema.optional(),
|
|
64
65
|
rules: incrementalRulesSchema.optional(),
|
|
65
66
|
})
|
|
66
67
|
.passthrough();
|
|
67
68
|
/**
|
|
68
|
-
*
|
|
69
|
+
* Applications section schema with active list and per-application overrides.
|
|
70
|
+
* Lists which AI agent applications (claude-code, cursor, codex, etc.) to sync to.
|
|
69
71
|
* Format in TOML:
|
|
70
|
-
* [
|
|
72
|
+
* [applications]
|
|
71
73
|
* active = ["claude-code", "codex"]
|
|
72
74
|
*
|
|
73
|
-
* [
|
|
75
|
+
* [applications.codex.skills]
|
|
74
76
|
* remove = ["skill-codex"]
|
|
75
77
|
*
|
|
76
|
-
* Note: Using passthrough() instead of catchall() to allow per-
|
|
77
|
-
* The per-
|
|
78
|
+
* Note: Using passthrough() instead of catchall() to allow per-application overrides.
|
|
79
|
+
* The per-application overrides are validated at runtime in application-config.ts.
|
|
78
80
|
*/
|
|
79
|
-
const
|
|
81
|
+
const applicationsSectionBaseSchema = z
|
|
80
82
|
.object({
|
|
81
83
|
active: z.array(z.string().trim().min(1)).optional(),
|
|
82
84
|
})
|
|
83
85
|
.passthrough();
|
|
84
|
-
const
|
|
86
|
+
const applicationsSectionSchema = z
|
|
85
87
|
.object({
|
|
86
88
|
active: z.array(z.string().trim().min(1)).default([]),
|
|
87
89
|
})
|
|
@@ -97,7 +99,7 @@ export const rulesSectionSchema = rulesSectionBaseSchema
|
|
|
97
99
|
.passthrough();
|
|
98
100
|
/**
|
|
99
101
|
* Distribution configuration schema
|
|
100
|
-
* Controls how skills/commands/
|
|
102
|
+
* Controls how skills/commands/agents are distributed to application targets.
|
|
101
103
|
* - use_agents_dir: When true, skills are distributed to 2 targets (claude-code + agents).
|
|
102
104
|
* When false (default), skills use the legacy 4-target mode for backward compatibility.
|
|
103
105
|
*/
|
|
@@ -126,16 +128,22 @@ export const uiSectionSchema = uiSectionBaseSchema
|
|
|
126
128
|
.passthrough();
|
|
127
129
|
/**
|
|
128
130
|
* Library configuration schema
|
|
129
|
-
* -
|
|
131
|
+
* - sources: Record of namespace -> local path or remote git source
|
|
130
132
|
*/
|
|
133
|
+
export const remoteSourceSchema = z.object({
|
|
134
|
+
url: z.string().min(1),
|
|
135
|
+
ref: z.string().optional(),
|
|
136
|
+
subdir: z.string().optional(),
|
|
137
|
+
});
|
|
138
|
+
export const sourceValueSchema = z.union([z.string().trim().min(1), remoteSourceSchema]);
|
|
131
139
|
const librarySectionBaseSchema = z
|
|
132
140
|
.object({
|
|
133
|
-
|
|
141
|
+
sources: z.record(z.string().trim().min(1), sourceValueSchema).optional(),
|
|
134
142
|
})
|
|
135
143
|
.passthrough();
|
|
136
144
|
export const librarySectionSchema = librarySectionBaseSchema
|
|
137
145
|
.extend({
|
|
138
|
-
|
|
146
|
+
sources: z.record(z.string().trim().min(1), sourceValueSchema).default({}),
|
|
139
147
|
})
|
|
140
148
|
.passthrough();
|
|
141
149
|
/**
|
|
@@ -143,15 +151,16 @@ export const librarySectionSchema = librarySectionBaseSchema
|
|
|
143
151
|
*/
|
|
144
152
|
export const switchboardConfigSchema = z
|
|
145
153
|
.object({
|
|
146
|
-
|
|
154
|
+
applications: applicationsSectionSchema.default({ active: [] }),
|
|
147
155
|
mcp: selectionSectionSchema.default({ active: [] }),
|
|
148
156
|
commands: selectionSectionSchema.default({ active: [] }),
|
|
149
|
-
|
|
157
|
+
agents: selectionSectionSchema.default({ active: [] }),
|
|
150
158
|
skills: selectionSectionSchema.default({ active: [] }),
|
|
159
|
+
hooks: selectionSectionSchema.default({ active: [] }),
|
|
151
160
|
rules: rulesSectionSchema.default({ active: [], includeDelimiters: false }),
|
|
152
161
|
distribution: distributionSectionSchema.default({ use_agents_dir: false }),
|
|
153
162
|
ui: uiSectionSchema.default({ pageSize: 20 }),
|
|
154
|
-
library: librarySectionSchema.default({
|
|
163
|
+
library: librarySectionSchema.default({ sources: {} }),
|
|
155
164
|
})
|
|
156
165
|
.passthrough();
|
|
157
166
|
/**
|
|
@@ -159,11 +168,12 @@ export const switchboardConfigSchema = z
|
|
|
159
168
|
*/
|
|
160
169
|
export const switchboardConfigLayerSchema = z
|
|
161
170
|
.object({
|
|
162
|
-
|
|
171
|
+
applications: applicationsSectionBaseSchema.optional(),
|
|
163
172
|
mcp: selectionSectionBaseSchema.optional(),
|
|
164
173
|
commands: selectionSectionBaseSchema.optional(),
|
|
165
|
-
|
|
174
|
+
agents: selectionSectionBaseSchema.optional(),
|
|
166
175
|
skills: selectionSectionBaseSchema.optional(),
|
|
176
|
+
hooks: selectionSectionBaseSchema.optional(),
|
|
167
177
|
rules: rulesSectionBaseSchema.optional(),
|
|
168
178
|
distribution: distributionSectionBaseSchema.optional(),
|
|
169
179
|
ui: uiSectionBaseSchema.optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAChC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;CAClD,CAAC;KACD,WAAW,EAAE,CAAC,CAAC,uBAAuB;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC9D,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,0BAA0B,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,sBAAsB,GAAG,0BAA0B;KAC7D,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACtD,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC;KACxC,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACpD,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACjD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrD,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,sBAAsB,GAAG,0BAA0B,CAAC,MAAM,CAAC;IAC/D,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/config/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent Switchboard configuration loader and saver (TOML format)
|
|
3
|
-
* Manages
|
|
3
|
+
* Manages target applications and library state
|
|
4
4
|
*/
|
|
5
5
|
import type { ConfigLayers, LoadConfigLayersOptions } from './layered-config.js';
|
|
6
6
|
import { type SwitchboardConfig } from './schemas.js';
|
|
@@ -11,11 +11,8 @@ export interface SwitchboardConfigLoadResult {
|
|
|
11
11
|
layers: ConfigLayers;
|
|
12
12
|
}
|
|
13
13
|
/**
|
|
14
|
-
* Loads the Agent Switchboard configuration from ~/.agent-switchboard/config.toml
|
|
15
|
-
* Returns default empty
|
|
16
|
-
*
|
|
17
|
-
* @returns {SwitchboardConfig} Parsed and validated configuration
|
|
18
|
-
* @throws {Error} If file exists but contains invalid TOML or fails schema validation
|
|
14
|
+
* Loads the Agent Switchboard configuration from ~/.agent-switchboard/config.toml.
|
|
15
|
+
* Returns default empty applications list if file doesn't exist.
|
|
19
16
|
*/
|
|
20
17
|
export declare function loadSwitchboardConfig(options?: SwitchboardConfigLoadOptions): SwitchboardConfig;
|
|
21
18
|
export declare function loadSwitchboardConfigWithLayers(options?: SwitchboardConfigLoadOptions): SwitchboardConfigLoadResult;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Agent Switchboard configuration loader and saver (TOML format)
|
|
3
|
-
* Manages
|
|
3
|
+
* Manages target applications and library state
|
|
4
4
|
*/
|
|
5
5
|
import fs from 'node:fs';
|
|
6
6
|
import { stringify } from '@iarna/toml';
|
|
@@ -8,11 +8,8 @@ import { loadMergedSwitchboardConfig } from './layered-config.js';
|
|
|
8
8
|
import { getConfigDir, getSwitchboardConfigPath } from './paths.js';
|
|
9
9
|
import { switchboardConfigSchema } from './schemas.js';
|
|
10
10
|
/**
|
|
11
|
-
* Loads the Agent Switchboard configuration from ~/.agent-switchboard/config.toml
|
|
12
|
-
* Returns default empty
|
|
13
|
-
*
|
|
14
|
-
* @returns {SwitchboardConfig} Parsed and validated configuration
|
|
15
|
-
* @throws {Error} If file exists but contains invalid TOML or fails schema validation
|
|
11
|
+
* Loads the Agent Switchboard configuration from ~/.agent-switchboard/config.toml.
|
|
12
|
+
* Returns default empty applications list if file doesn't exist.
|
|
16
13
|
*/
|
|
17
14
|
export function loadSwitchboardConfig(options) {
|
|
18
15
|
return loadMergedSwitchboardConfig(options).config;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"switchboard-config.js","sourceRoot":"","sources":["../../src/config/switchboard-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAA0B,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAS/E
|
|
1
|
+
{"version":3,"file":"switchboard-config.js","sourceRoot":"","sources":["../../src/config/switchboard-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAA0B,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAS/E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAsC;IAC1E,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,OAAsC;IAEtC,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAyB;IAC7D,MAAM,UAAU,GAAG,wBAAwB,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,YAAY,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAExD,0BAA0B;QAC1B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;QACvD,qFAAqF;QACrF,MAAM,OAAO,GAAG,SAAS,CAAC,QAAe,CAAC,CAAC;QAE3C,gBAAgB;QAChB,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8CAA8C,UAAU,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChG,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook distribution: copies bundle files and merges hook configurations
|
|
3
|
+
* into Claude Code's settings.json.
|
|
4
|
+
*
|
|
5
|
+
* Two-phase distribution for each active hook:
|
|
6
|
+
* 1. **Bundle copy** (bundle hooks only): copy script files to
|
|
7
|
+
* `~/.claude/hooks/asb/<hook-id>/` using the existing bundle distributor.
|
|
8
|
+
* 2. **Config merge**: deep-merge all active hooks' event maps into
|
|
9
|
+
* `~/.claude/settings.json` under the `hooks` key. For bundle hooks,
|
|
10
|
+
* `${HOOK_DIR}` placeholders are resolved to the distributed path.
|
|
11
|
+
*
|
|
12
|
+
* Only Claude Code is supported as a distribution target.
|
|
13
|
+
*/
|
|
14
|
+
import type { ConfigScope } from '../config/scope.js';
|
|
15
|
+
import type { DistributionResult } from '../library/distribute.js';
|
|
16
|
+
import type { BundleDistributionResult } from '../library/distribute-bundle.js';
|
|
17
|
+
export type HookPlatform = 'claude-code';
|
|
18
|
+
export interface HookDistributionOutcome {
|
|
19
|
+
results: Array<DistributionResult<HookPlatform> | BundleDistributionResult<HookPlatform>>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Distribute hooks to Claude Code:
|
|
23
|
+
* 1. Copy bundle files for bundle-type hooks
|
|
24
|
+
* 2. Merge all active hook configs into settings.json
|
|
25
|
+
* 3. Clean up orphan bundle directories
|
|
26
|
+
*/
|
|
27
|
+
export declare function distributeHooks(scope?: ConfigScope): HookDistributionOutcome;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook distribution: copies bundle files and merges hook configurations
|
|
3
|
+
* into Claude Code's settings.json.
|
|
4
|
+
*
|
|
5
|
+
* Two-phase distribution for each active hook:
|
|
6
|
+
* 1. **Bundle copy** (bundle hooks only): copy script files to
|
|
7
|
+
* `~/.claude/hooks/asb/<hook-id>/` using the existing bundle distributor.
|
|
8
|
+
* 2. **Config merge**: deep-merge all active hooks' event maps into
|
|
9
|
+
* `~/.claude/settings.json` under the `hooks` key. For bundle hooks,
|
|
10
|
+
* `${HOOK_DIR}` placeholders are resolved to the distributed path.
|
|
11
|
+
*
|
|
12
|
+
* Only Claude Code is supported as a distribution target.
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import { getClaudeDir, getProjectClaudeDir } from '../config/paths.js';
|
|
17
|
+
import { distributeBundle } from '../library/distribute-bundle.js';
|
|
18
|
+
import { ensureParentDir } from '../library/fs.js';
|
|
19
|
+
import { loadLibraryStateSectionForApplication } from '../library/state.js';
|
|
20
|
+
import { listHookBundleFiles, loadHookLibrary } from './library.js';
|
|
21
|
+
import { HOOK_DIR_PLACEHOLDER } from './schema.js';
|
|
22
|
+
const ASB_MANAGED_KEY = '_asb_managed_hooks';
|
|
23
|
+
const ASB_HOOKS_SUBDIR = 'asb';
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Path helpers
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
function resolveSettingsPath(scope) {
|
|
28
|
+
const projectRoot = scope?.project?.trim();
|
|
29
|
+
if (projectRoot && projectRoot.length > 0) {
|
|
30
|
+
return path.join(getProjectClaudeDir(projectRoot), 'settings.local.json');
|
|
31
|
+
}
|
|
32
|
+
return path.join(getClaudeDir(), 'settings.json');
|
|
33
|
+
}
|
|
34
|
+
function resolveHooksBundleParentDir(scope) {
|
|
35
|
+
const projectRoot = scope?.project?.trim();
|
|
36
|
+
if (projectRoot && projectRoot.length > 0) {
|
|
37
|
+
return path.join(getProjectClaudeDir(projectRoot), 'hooks', ASB_HOOKS_SUBDIR);
|
|
38
|
+
}
|
|
39
|
+
return path.join(getClaudeDir(), 'hooks', ASB_HOOKS_SUBDIR);
|
|
40
|
+
}
|
|
41
|
+
function resolveHookBundleTargetDir(_platform, entry, scope) {
|
|
42
|
+
return path.join(resolveHooksBundleParentDir(scope), entry.id);
|
|
43
|
+
}
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
// Settings.json I/O
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
function readSettingsJson(filePath) {
|
|
48
|
+
try {
|
|
49
|
+
if (fs.existsSync(filePath)) {
|
|
50
|
+
return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// Corrupted or unreadable; start fresh for hooks section
|
|
55
|
+
}
|
|
56
|
+
return {};
|
|
57
|
+
}
|
|
58
|
+
function writeSettingsJson(filePath, data) {
|
|
59
|
+
ensureParentDir(filePath);
|
|
60
|
+
fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`, 'utf-8');
|
|
61
|
+
}
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// ${HOOK_DIR} rewriting
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
/**
|
|
66
|
+
* Deep-clone matcher groups, replacing `${HOOK_DIR}` in command strings
|
|
67
|
+
* with the absolute path to the distributed bundle directory.
|
|
68
|
+
*/
|
|
69
|
+
function rewriteHookDir(groups, distributedDir) {
|
|
70
|
+
return groups.map((group) => ({
|
|
71
|
+
...group,
|
|
72
|
+
hooks: group.hooks.map((handler) => {
|
|
73
|
+
if (typeof handler.command !== 'string')
|
|
74
|
+
return handler;
|
|
75
|
+
return {
|
|
76
|
+
...handler,
|
|
77
|
+
command: handler.command.replaceAll(HOOK_DIR_PLACEHOLDER, distributedDir),
|
|
78
|
+
};
|
|
79
|
+
}),
|
|
80
|
+
}));
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Config merge
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
/**
|
|
86
|
+
* Merge active hook entries into the settings.json `hooks` key.
|
|
87
|
+
* Tags each injected matcher group with `_asb_source` for future cleanup.
|
|
88
|
+
*/
|
|
89
|
+
function mergeHooksIntoSettings(settings, selected, scope) {
|
|
90
|
+
const existingHooks = (settings.hooks ?? {});
|
|
91
|
+
// Remove previously ASB-managed matcher groups
|
|
92
|
+
const cleanedHooks = {};
|
|
93
|
+
for (const [event, groups] of Object.entries(existingHooks)) {
|
|
94
|
+
const kept = groups.filter((g) => g._asb_source === undefined);
|
|
95
|
+
if (kept.length > 0)
|
|
96
|
+
cleanedHooks[event] = kept;
|
|
97
|
+
}
|
|
98
|
+
// Merge active entries
|
|
99
|
+
for (const entry of selected) {
|
|
100
|
+
for (const [event, groups] of Object.entries(entry.hooks)) {
|
|
101
|
+
if (!cleanedHooks[event])
|
|
102
|
+
cleanedHooks[event] = [];
|
|
103
|
+
// Resolve ${HOOK_DIR} for bundle hooks
|
|
104
|
+
const resolvedGroups = entry.isBundle
|
|
105
|
+
? rewriteHookDir(groups, resolveHookBundleTargetDir('claude-code', entry, scope))
|
|
106
|
+
: groups;
|
|
107
|
+
for (const group of resolvedGroups) {
|
|
108
|
+
cleanedHooks[event].push({ ...group, _asb_source: true });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
settings.hooks = cleanedHooks;
|
|
113
|
+
settings[ASB_MANAGED_KEY] = selected.map((e) => e.id);
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// Orphan cleanup for bundles
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
function rmDirRecursive(dirPath) {
|
|
119
|
+
if (!fs.existsSync(dirPath))
|
|
120
|
+
return;
|
|
121
|
+
const entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
122
|
+
for (const entry of entries) {
|
|
123
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
124
|
+
if (entry.isDirectory()) {
|
|
125
|
+
rmDirRecursive(fullPath);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
fs.unlinkSync(fullPath);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
fs.rmdirSync(dirPath);
|
|
132
|
+
}
|
|
133
|
+
function cleanOrphanBundleDirs(activeIds, scope) {
|
|
134
|
+
const parentDir = resolveHooksBundleParentDir(scope);
|
|
135
|
+
const results = [];
|
|
136
|
+
if (!fs.existsSync(parentDir))
|
|
137
|
+
return results;
|
|
138
|
+
try {
|
|
139
|
+
const entries = fs.readdirSync(parentDir, { withFileTypes: true });
|
|
140
|
+
for (const entry of entries) {
|
|
141
|
+
if (!entry.isDirectory())
|
|
142
|
+
continue;
|
|
143
|
+
if (activeIds.has(entry.name))
|
|
144
|
+
continue;
|
|
145
|
+
const dirPath = path.join(parentDir, entry.name);
|
|
146
|
+
try {
|
|
147
|
+
rmDirRecursive(dirPath);
|
|
148
|
+
results.push({
|
|
149
|
+
platform: 'claude-code',
|
|
150
|
+
targetDir: dirPath,
|
|
151
|
+
status: 'deleted',
|
|
152
|
+
reason: 'orphan',
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
157
|
+
results.push({
|
|
158
|
+
platform: 'claude-code',
|
|
159
|
+
targetDir: dirPath,
|
|
160
|
+
status: 'error',
|
|
161
|
+
error: `Failed to delete orphan: ${msg}`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
// Ignore directory read errors
|
|
168
|
+
}
|
|
169
|
+
return results;
|
|
170
|
+
}
|
|
171
|
+
// ---------------------------------------------------------------------------
|
|
172
|
+
// Main distribution entry point
|
|
173
|
+
// ---------------------------------------------------------------------------
|
|
174
|
+
/**
|
|
175
|
+
* Distribute hooks to Claude Code:
|
|
176
|
+
* 1. Copy bundle files for bundle-type hooks
|
|
177
|
+
* 2. Merge all active hook configs into settings.json
|
|
178
|
+
* 3. Clean up orphan bundle directories
|
|
179
|
+
*/
|
|
180
|
+
export function distributeHooks(scope) {
|
|
181
|
+
const results = [];
|
|
182
|
+
const platform = 'claude-code';
|
|
183
|
+
const allEntries = loadHookLibrary();
|
|
184
|
+
const byId = new Map(allEntries.map((e) => [e.id, e]));
|
|
185
|
+
const state = loadLibraryStateSectionForApplication('hooks', 'claude-code', scope);
|
|
186
|
+
const selected = [];
|
|
187
|
+
for (const id of state.active) {
|
|
188
|
+
const e = byId.get(id);
|
|
189
|
+
if (e)
|
|
190
|
+
selected.push(e);
|
|
191
|
+
}
|
|
192
|
+
// Phase 1: Copy bundle files for bundle-type hooks
|
|
193
|
+
const bundleEntries = selected.filter((e) => e.isBundle);
|
|
194
|
+
if (bundleEntries.length > 0) {
|
|
195
|
+
const bundleOutcome = distributeBundle({
|
|
196
|
+
section: 'hooks',
|
|
197
|
+
selected: bundleEntries,
|
|
198
|
+
platforms: [platform],
|
|
199
|
+
resolveTargetDir: (_p, entry) => resolveHookBundleTargetDir(_p, entry, scope),
|
|
200
|
+
listFiles: listHookBundleFiles,
|
|
201
|
+
getId: (entry) => entry.id,
|
|
202
|
+
scope,
|
|
203
|
+
});
|
|
204
|
+
results.push(...bundleOutcome.results);
|
|
205
|
+
}
|
|
206
|
+
// Clean up orphan bundle directories
|
|
207
|
+
const activeBundleIds = new Set(bundleEntries.map((e) => e.id));
|
|
208
|
+
results.push(...cleanOrphanBundleDirs(activeBundleIds, scope));
|
|
209
|
+
// Phase 2: Merge hook configs into settings.json
|
|
210
|
+
const settingsPath = resolveSettingsPath(scope);
|
|
211
|
+
const settings = readSettingsJson(settingsPath);
|
|
212
|
+
const previouslyManaged = (settings[ASB_MANAGED_KEY] ?? []);
|
|
213
|
+
if (selected.length === 0 && previouslyManaged.length === 0) {
|
|
214
|
+
return { results };
|
|
215
|
+
}
|
|
216
|
+
const before = JSON.stringify(settings);
|
|
217
|
+
mergeHooksIntoSettings(settings, selected, scope);
|
|
218
|
+
const after = JSON.stringify(settings);
|
|
219
|
+
if (before === after) {
|
|
220
|
+
results.push({ platform, filePath: settingsPath, status: 'skipped', reason: 'up-to-date' });
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
try {
|
|
224
|
+
writeSettingsJson(settingsPath, settings);
|
|
225
|
+
const reason = selected.length === 0 ? 'hooks cleared' : `${selected.length} hook(s) merged`;
|
|
226
|
+
results.push({ platform, filePath: settingsPath, status: 'written', reason });
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
230
|
+
results.push({ platform, filePath: settingsPath, status: 'error', error: msg });
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return { results };
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=distribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/hooks/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hook library: loads hook entries from ~/.asb/hooks/ and marketplace sources.
|
|
3
|
+
*
|
|
4
|
+
* Two storage formats are supported:
|
|
5
|
+
* - **Bundle**: a directory containing `hook.json` + script files
|
|
6
|
+
* e.g. `~/.asb/hooks/memorize/hook.json` + `memorize/*.mjs`
|
|
7
|
+
* - **Single file**: a standalone JSON file (no scripts)
|
|
8
|
+
* e.g. `~/.asb/hooks/auto-lint.json`
|
|
9
|
+
*/
|
|
10
|
+
import type { BundleFile } from '../library/distribute-bundle.js';
|
|
11
|
+
import type { HookFile } from './schema.js';
|
|
12
|
+
export interface HookEntry {
|
|
13
|
+
id: string;
|
|
14
|
+
bareId: string;
|
|
15
|
+
namespace?: string;
|
|
16
|
+
source: string;
|
|
17
|
+
filePath: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
hooks: HookFile['hooks'];
|
|
21
|
+
/** True when the hook is a directory bundle with script files */
|
|
22
|
+
isBundle: boolean;
|
|
23
|
+
/** Absolute path to the bundle directory (only set for bundles) */
|
|
24
|
+
dirPath?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function ensureHooksDirectory(): string;
|
|
27
|
+
/**
|
|
28
|
+
* Load hook entries from a single directory.
|
|
29
|
+
* Scans for both bundle directories (containing hook.json) and standalone .json files.
|
|
30
|
+
*/
|
|
31
|
+
export declare function loadHooksFromDirectory(directory: string, namespace?: string): HookEntry[];
|
|
32
|
+
/**
|
|
33
|
+
* List all files in a hook bundle for distribution.
|
|
34
|
+
* Excludes hook.json itself (config is merged into settings.json, not copied).
|
|
35
|
+
*/
|
|
36
|
+
export declare function listHookBundleFiles(entry: HookEntry): BundleFile[];
|
|
37
|
+
/**
|
|
38
|
+
* Load all hooks from the default library, flat sources, and marketplace sources.
|
|
39
|
+
*/
|
|
40
|
+
export declare function loadHookLibrary(): HookEntry[];
|