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.
Files changed (97) hide show
  1. package/README.md +37 -11
  2. package/dist/commands/distribution.js +2 -2
  3. package/dist/commands/distribution.js.map +1 -1
  4. package/dist/commands/library.d.ts +1 -1
  5. package/dist/commands/library.js +5 -6
  6. package/dist/commands/library.js.map +1 -1
  7. package/dist/config/application-config.d.ts +37 -0
  8. package/dist/config/application-config.js +83 -0
  9. package/dist/config/application-config.js.map +1 -0
  10. package/dist/config/layered-config.js +43 -2
  11. package/dist/config/layered-config.js.map +1 -1
  12. package/dist/config/paths.d.ts +13 -2
  13. package/dist/config/paths.js +21 -3
  14. package/dist/config/paths.js.map +1 -1
  15. package/dist/config/schemas.d.ts +408 -43
  16. package/dist/config/schemas.js +32 -22
  17. package/dist/config/schemas.js.map +1 -1
  18. package/dist/config/switchboard-config.d.ts +3 -6
  19. package/dist/config/switchboard-config.js +3 -6
  20. package/dist/config/switchboard-config.js.map +1 -1
  21. package/dist/hooks/distribution.d.ts +27 -0
  22. package/dist/hooks/distribution.js +235 -0
  23. package/dist/hooks/distribution.js.map +1 -0
  24. package/dist/hooks/library.d.ts +40 -0
  25. package/dist/hooks/library.js +143 -0
  26. package/dist/hooks/library.js.map +1 -0
  27. package/dist/hooks/schema.d.ts +542 -0
  28. package/dist/hooks/schema.js +49 -0
  29. package/dist/hooks/schema.js.map +1 -0
  30. package/dist/index.js +708 -168
  31. package/dist/index.js.map +1 -1
  32. package/dist/library/fs.d.ts +1 -3
  33. package/dist/library/fs.js +24 -7
  34. package/dist/library/fs.js.map +1 -1
  35. package/dist/library/schema.d.ts +1 -1
  36. package/dist/library/schema.js +1 -1
  37. package/dist/library/sources.d.ts +75 -0
  38. package/dist/library/sources.js +285 -0
  39. package/dist/library/sources.js.map +1 -0
  40. package/dist/library/state.d.ts +4 -5
  41. package/dist/library/state.js +15 -31
  42. package/dist/library/state.js.map +1 -1
  43. package/dist/marketplace/plugin-loader.d.ts +30 -0
  44. package/dist/marketplace/plugin-loader.js +178 -0
  45. package/dist/marketplace/plugin-loader.js.map +1 -0
  46. package/dist/marketplace/reader.d.ts +36 -0
  47. package/dist/marketplace/reader.js +90 -0
  48. package/dist/marketplace/reader.js.map +1 -0
  49. package/dist/marketplace/schemas.d.ts +467 -0
  50. package/dist/marketplace/schemas.js +57 -0
  51. package/dist/marketplace/schemas.js.map +1 -0
  52. package/dist/marketplace/source-loader.d.ts +32 -0
  53. package/dist/marketplace/source-loader.js +45 -0
  54. package/dist/marketplace/source-loader.js.map +1 -0
  55. package/dist/rules/agents.d.ts +4 -4
  56. package/dist/rules/agents.js +10 -4
  57. package/dist/rules/agents.js.map +1 -1
  58. package/dist/rules/composer.d.ts +2 -2
  59. package/dist/rules/composer.js +5 -5
  60. package/dist/rules/composer.js.map +1 -1
  61. package/dist/rules/distribution.js +48 -112
  62. package/dist/rules/distribution.js.map +1 -1
  63. package/dist/rules/library.d.ts +1 -1
  64. package/dist/rules/library.js +4 -5
  65. package/dist/rules/library.js.map +1 -1
  66. package/dist/skills/distribution.js +6 -6
  67. package/dist/skills/distribution.js.map +1 -1
  68. package/dist/skills/library.d.ts +1 -2
  69. package/dist/skills/library.js +6 -7
  70. package/dist/skills/library.js.map +1 -1
  71. package/dist/subagents/distribution.d.ts +1 -1
  72. package/dist/subagents/distribution.js +319 -20
  73. package/dist/subagents/distribution.js.map +1 -1
  74. package/dist/subagents/importer.d.ts +1 -1
  75. package/dist/subagents/importer.js +61 -1
  76. package/dist/subagents/importer.js.map +1 -1
  77. package/dist/subagents/inventory.js +3 -3
  78. package/dist/subagents/inventory.js.map +1 -1
  79. package/dist/subagents/library.d.ts +2 -2
  80. package/dist/subagents/library.js +14 -20
  81. package/dist/subagents/library.js.map +1 -1
  82. package/dist/ui/hook-ui.d.ts +8 -0
  83. package/dist/ui/hook-ui.js +17 -0
  84. package/dist/ui/hook-ui.js.map +1 -0
  85. package/dist/ui/library-selector.d.ts +1 -1
  86. package/dist/ui/subagent-ui.js +3 -3
  87. package/dist/ui/subagent-ui.js.map +1 -1
  88. package/dist/util/cli.d.ts +20 -0
  89. package/dist/util/cli.js +107 -14
  90. package/dist/util/cli.js.map +1 -1
  91. package/package.json +3 -2
  92. package/dist/config/agent-config.d.ts +0 -35
  93. package/dist/config/agent-config.js +0 -88
  94. package/dist/config/agent-config.js.map +0 -1
  95. package/dist/library/subscriptions.d.ts +0 -42
  96. package/dist/library/subscriptions.js +0 -116
  97. package/dist/library/subscriptions.js.map +0 -1
@@ -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, subagents, etc.) without defaults
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-agent overrides
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-agent configuration override schema
56
- * Allows overriding mcp, commands, subagents, skills, rules for a specific agent
55
+ * Per-application configuration override schema
56
+ * Allows overriding mcp, commands, agents, skills, rules for a specific application
57
57
  */
58
- export const agentConfigOverrideSchema = z
58
+ export const applicationConfigOverrideSchema = z
59
59
  .object({
60
60
  mcp: incrementalSelectionSchema.optional(),
61
61
  commands: incrementalSelectionSchema.optional(),
62
- subagents: incrementalSelectionSchema.optional(),
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
- * Agents section schema with active list and per-agent overrides
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
- * [agents]
72
+ * [applications]
71
73
  * active = ["claude-code", "codex"]
72
74
  *
73
- * [agents.codex.skills]
75
+ * [applications.codex.skills]
74
76
  * remove = ["skill-codex"]
75
77
  *
76
- * Note: Using passthrough() instead of catchall() to allow per-agent overrides.
77
- * The per-agent overrides are validated at runtime in agent-config.ts.
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 agentsSectionBaseSchema = z
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 agentsSectionSchema = z
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/subagents are distributed to agent targets.
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
- * - subscriptions: Record of namespace -> path for additional library sources
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
- subscriptions: z.record(z.string().trim().min(1), z.string().trim().min(1)).optional(),
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
- subscriptions: z.record(z.string().trim().min(1), z.string().trim().min(1)).default({}),
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
- agents: agentsSectionSchema.default({ active: [] }),
154
+ applications: applicationsSectionSchema.default({ active: [] }),
147
155
  mcp: selectionSectionSchema.default({ active: [] }),
148
156
  commands: selectionSectionSchema.default({ active: [] }),
149
- subagents: selectionSectionSchema.default({ active: [] }),
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({ subscriptions: {} }),
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
- agents: agentsSectionBaseSchema.optional(),
171
+ applications: applicationsSectionBaseSchema.optional(),
163
172
  mcp: selectionSectionBaseSchema.optional(),
164
173
  commands: selectionSectionBaseSchema.optional(),
165
- subagents: selectionSectionBaseSchema.optional(),
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":"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"}
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 the list of agents to apply MCP configs to
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 agents list if file doesn't exist
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 the list of agents to apply MCP configs to
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 agents list if file doesn't exist
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;;;;;;GAMG;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"}
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[];