agent-switchboard 0.1.27 → 0.1.29
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 +74 -32
- 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 -5
- 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 +7 -2
- package/dist/config/paths.js +12 -3
- package/dist/config/paths.js.map +1 -1
- package/dist/config/schemas.d.ts +103 -22
- package/dist/config/schemas.js +22 -18
- 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 +608 -146
- 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 +3 -0
- package/dist/library/sources.js +8 -2
- package/dist/library/sources.js.map +1 -1
- 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/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 +2 -2
- package/dist/rules/distribution.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 -6
- 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 -19
- 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/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
[](https://github.com/qyhfrank/agent-switchboard/actions/workflows/ci.yml)
|
|
5
5
|
[](LICENSE)
|
|
6
6
|
|
|
7
|
-
Manage MCP servers, rules, commands,
|
|
7
|
+
Manage MCP servers, rules, commands, agents, skills, and hooks from a single source of truth, then sync them to every AI coding agent you use.
|
|
8
8
|
|
|
9
9
|
Alias: `asb`
|
|
10
10
|
|
|
@@ -20,13 +20,13 @@ Libraries Config Layers Distribution
|
|
|
20
20
|
│ mcp.json │ │ User config.toml │ │ Claude Code │
|
|
21
21
|
│ rules/ │ │ Profile <name>.toml │ │ Codex │
|
|
22
22
|
│ commands/ │ ─► │ Project .asb.toml │ ─► │ Cursor │
|
|
23
|
-
│
|
|
24
|
-
│ skills/ │ │ Per-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
│ agents/ │ │ │ │ Gemini │
|
|
24
|
+
│ skills/ │ │ Per-app overrides │ │ OpenCode │
|
|
25
|
+
│ hooks/ │ │ │ │ Claude Desktop │
|
|
26
|
+
└──────────────┘ └─────────────────────┘ └────────────────┘
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Library entries are agent-agnostic Markdown files (or directories for skills, JSON for hooks). Agent Switchboard reads them, applies layered configuration and per-application overrides, then writes the correct format to each agent's config location.
|
|
30
30
|
|
|
31
31
|
## Compatibility
|
|
32
32
|
|
|
@@ -36,8 +36,9 @@ All library entries are agent-agnostic Markdown files (or directories for skills
|
|
|
36
36
|
| Project-level MCP| ✓ | ✓ | ✓ | ✓ | ✓ | |
|
|
37
37
|
| Rules | ✓ | ✓ | ✓ mdc | ✓ | ✓ | |
|
|
38
38
|
| Commands | ✓ | ✓\* | ✓ | ✓ | ✓ | |
|
|
39
|
-
|
|
|
39
|
+
| Agents | ✓ | | ✓ | | ✓ | |
|
|
40
40
|
| Skills | ✓ | ✓ | ✓ | ✓ | ✓ | |
|
|
41
|
+
| Hooks | ✓ | | | | | |
|
|
41
42
|
|
|
42
43
|
\* Codex commands use deprecated `~/.codex/prompts/`; prefer skills instead.
|
|
43
44
|
|
|
@@ -52,7 +53,7 @@ npm i -g agent-switchboard # or: npx agent-switchboard@latest mcp
|
|
|
52
53
|
1. **Pick your agents** -- create `~/.agent-switchboard/config.toml`:
|
|
53
54
|
|
|
54
55
|
```toml
|
|
55
|
-
[
|
|
56
|
+
[applications]
|
|
56
57
|
active = ["claude-code", "codex", "cursor"]
|
|
57
58
|
```
|
|
58
59
|
|
|
@@ -62,7 +63,7 @@ active = ["claude-code", "codex", "cursor"]
|
|
|
62
63
|
asb mcp
|
|
63
64
|
```
|
|
64
65
|
|
|
65
|
-
3. **Sync everything** -- pushes all libraries (rules, commands,
|
|
66
|
+
3. **Sync everything** -- pushes all libraries (rules, commands, agents, skills, hooks) and MCP config to every active application:
|
|
66
67
|
|
|
67
68
|
```bash
|
|
68
69
|
asb sync
|
|
@@ -77,16 +78,17 @@ That's it. Library content lives under `~/.agent-switchboard/` and agent configs
|
|
|
77
78
|
| `asb mcp` | Interactive MCP server selector |
|
|
78
79
|
| `asb rule` | Interactive rule snippet selector with ordering |
|
|
79
80
|
| `asb command` | Interactive command selector |
|
|
80
|
-
| `asb
|
|
81
|
+
| `asb agent` | Interactive agent selector |
|
|
81
82
|
| `asb skill` | Interactive skill selector |
|
|
82
|
-
| `asb
|
|
83
|
+
| `asb hook` | Interactive hook selector (Claude Code only) |
|
|
84
|
+
| `asb sync` | Push all libraries + MCP to applications (no UI) |
|
|
83
85
|
| `asb <lib> load` | Import files from a platform into the library |
|
|
84
86
|
| `asb <lib> list` | Show inventory, activation state, and sync timestamps |
|
|
85
87
|
| `asb source add` | Add an external library source (local path or git URL) |
|
|
86
88
|
| `asb source remove` | Remove a library source |
|
|
87
89
|
| `asb source list` | List configured library sources |
|
|
88
90
|
|
|
89
|
-
`<lib>` = `rule`, `command`, `
|
|
91
|
+
`<lib>` = `rule`, `command`, `agent`, `skill`, or `hook`.
|
|
90
92
|
|
|
91
93
|
**Shared flags**: `-p, --profile <name>`, `--project <path>`, `--json` (on `list` and `source list`).
|
|
92
94
|
|
|
@@ -94,24 +96,24 @@ That's it. Library content lives under `~/.agent-switchboard/` and agent configs
|
|
|
94
96
|
|
|
95
97
|
### `config.toml`
|
|
96
98
|
|
|
97
|
-
The central config file at `~/.agent-switchboard/config.toml` controls which
|
|
99
|
+
The central config file at `~/.agent-switchboard/config.toml` controls which applications and library entries are active:
|
|
98
100
|
|
|
99
101
|
```toml
|
|
100
|
-
[
|
|
102
|
+
[applications]
|
|
101
103
|
active = ["claude-code", "codex", "cursor", "gemini", "opencode"]
|
|
102
104
|
|
|
103
105
|
[rules]
|
|
104
106
|
includeDelimiters = false # wrap each rule snippet in <!-- id:start/end --> markers
|
|
105
107
|
```
|
|
106
108
|
|
|
107
|
-
Supported
|
|
109
|
+
Supported application IDs: `claude-code`, `claude-desktop`, `codex`, `cursor`, `gemini`, `opencode`.
|
|
108
110
|
|
|
109
|
-
### Per-
|
|
111
|
+
### Per-Application Overrides
|
|
110
112
|
|
|
111
|
-
Fine-tune which library entries reach each
|
|
113
|
+
Fine-tune which library entries reach each application using `add` / `remove` / `active`:
|
|
112
114
|
|
|
113
115
|
```toml
|
|
114
|
-
[
|
|
116
|
+
[applications]
|
|
115
117
|
active = ["claude-code", "codex", "opencode"]
|
|
116
118
|
|
|
117
119
|
codex.skills.remove = ["skill-codex"]
|
|
@@ -121,13 +123,13 @@ gemini.commands.add = ["cmd-gemini-only"]
|
|
|
121
123
|
gemini.skills.remove = ["skill-go"]
|
|
122
124
|
```
|
|
123
125
|
|
|
124
|
-
| Syntax
|
|
125
|
-
|
|
126
|
-
| `<
|
|
127
|
-
| `<
|
|
128
|
-
| `<
|
|
126
|
+
| Syntax | Behavior |
|
|
127
|
+
|:--------------------------------|:---------------------------|
|
|
128
|
+
| `<app>.<section>.active = [...]`| Replace the global list |
|
|
129
|
+
| `<app>.<section>.add = [...]` | Append to the global list |
|
|
130
|
+
| `<app>.<section>.remove = [...]`| Remove from the global list|
|
|
129
131
|
|
|
130
|
-
Sections: `mcp`, `rules`, `commands`, `
|
|
132
|
+
Sections: `mcp`, `rules`, `commands`, `agents`, `skills`, `hooks`.
|
|
131
133
|
|
|
132
134
|
### Layered Configuration
|
|
133
135
|
|
|
@@ -142,7 +144,7 @@ Three TOML layers merge in priority order (higher wins):
|
|
|
142
144
|
```bash
|
|
143
145
|
asb command -p team # profile layer
|
|
144
146
|
asb rule --project /path/to/repo # project layer
|
|
145
|
-
asb
|
|
147
|
+
asb agent -p team --project /path/to/repo # both
|
|
146
148
|
```
|
|
147
149
|
|
|
148
150
|
When `--project` is used, outputs target the project directory (e.g. `<project>/AGENTS.md`, `<project>/.claude/commands/`).
|
|
@@ -206,12 +208,12 @@ asb command load gemini [path] -r # import recursively
|
|
|
206
208
|
|
|
207
209
|
Platforms: `claude-code`, `codex`, `cursor`, `gemini`, `opencode`.
|
|
208
210
|
|
|
209
|
-
###
|
|
211
|
+
### Agents
|
|
210
212
|
|
|
211
|
-
Same format as commands, stored in `~/.agent-switchboard/
|
|
213
|
+
Same format as commands, stored in `~/.agent-switchboard/agents/`.
|
|
212
214
|
|
|
213
215
|
```bash
|
|
214
|
-
asb
|
|
216
|
+
asb agent load claude-code # import from ~/.claude/agents/
|
|
215
217
|
```
|
|
216
218
|
|
|
217
219
|
Platforms: `claude-code`, `opencode`, `cursor`.
|
|
@@ -235,6 +237,21 @@ asb skill load codex # import from ~/.agents/skills/
|
|
|
235
237
|
|
|
236
238
|
Entire directories are copied to each agent's skill location. Deactivated skills are cleaned up automatically.
|
|
237
239
|
|
|
240
|
+
### Hooks
|
|
241
|
+
|
|
242
|
+
JSON-based hook definitions distributed to Claude Code's `settings.json`. Two storage formats:
|
|
243
|
+
|
|
244
|
+
- **Single file**: `~/.agent-switchboard/hooks/<id>.json`
|
|
245
|
+
- **Bundle**: `~/.agent-switchboard/hooks/<id>/hook.json` plus script files
|
|
246
|
+
|
|
247
|
+
```bash
|
|
248
|
+
asb hook load claude-code # import from ~/.claude/settings.json
|
|
249
|
+
asb hook load /path/to/hook.json # import a JSON file
|
|
250
|
+
asb hook load /path/to/hook-dir/ # import a bundle directory
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
Bundle scripts are copied to `~/.claude/hooks/asb/<id>/` and the `${HOOK_DIR}` placeholder in commands is resolved to the absolute path at distribution time.
|
|
254
|
+
|
|
238
255
|
## Library Sources
|
|
239
256
|
|
|
240
257
|
Pull library entries from external directories or git repos:
|
|
@@ -246,17 +263,17 @@ asb source list # list configured sources
|
|
|
246
263
|
asb source remove repo # remove
|
|
247
264
|
```
|
|
248
265
|
|
|
249
|
-
|
|
266
|
+
A source can be a flat directory containing `rules/`, `commands/`, `agents/`, `skills/`, or `hooks/` subdirectories, or a `.claude-plugin` marketplace (detected by the presence of `.claude-plugin/marketplace.json`). Entries from external sources appear with a namespace prefix (e.g. `team:my-rule`) in selectors and config.
|
|
250
267
|
|
|
251
268
|
## Sync
|
|
252
269
|
|
|
253
|
-
Push all libraries and MCP config to every active
|
|
270
|
+
Push all libraries and MCP config to every active application in one step:
|
|
254
271
|
|
|
255
272
|
```bash
|
|
256
273
|
asb sync [-p <profile>] [--project <path>]
|
|
257
274
|
```
|
|
258
275
|
|
|
259
|
-
This merges layered config, applies per-
|
|
276
|
+
This merges layered config, applies per-application overrides, and writes target files in place. Files are only rewritten when content changes.
|
|
260
277
|
|
|
261
278
|
## Environment
|
|
262
279
|
|
|
@@ -268,7 +285,7 @@ This merges layered config, applies per-agent overrides, and writes target files
|
|
|
268
285
|
## Development
|
|
269
286
|
|
|
270
287
|
```bash
|
|
271
|
-
pnpm install
|
|
288
|
+
pnpm install # also activates git hooks via postinstall
|
|
272
289
|
pnpm build
|
|
273
290
|
pnpm link --global # global `agent-switchboard` points to local build
|
|
274
291
|
```
|
|
@@ -277,6 +294,31 @@ Code changes take effect after `pnpm build`. To unlink: `pnpm uninstall -g agent
|
|
|
277
294
|
|
|
278
295
|
Other scripts: `pnpm dev` (tsx), `pnpm test`, `pnpm lint`, `pnpm typecheck`.
|
|
279
296
|
|
|
297
|
+
### Git Hooks
|
|
298
|
+
|
|
299
|
+
`pnpm install` automatically sets `core.hooksPath` to `.githooks/`. The pre-commit hook runs `biome check --write --staged` on staged files, ensuring all committed code passes formatting and lint checks.
|
|
300
|
+
|
|
301
|
+
### Releasing
|
|
302
|
+
|
|
303
|
+
Use the release script instead of manually tagging:
|
|
304
|
+
|
|
305
|
+
```bash
|
|
306
|
+
pnpm release # patch bump (default): 0.1.27 → 0.1.28
|
|
307
|
+
pnpm release minor # minor bump: 0.1.27 → 0.2.0
|
|
308
|
+
pnpm release major # major bump: 0.1.27 → 1.0.0
|
|
309
|
+
pnpm release 0.2.0 # explicit version
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
The script performs these steps in order:
|
|
313
|
+
|
|
314
|
+
1. Verify working tree is clean and main is in sync with origin
|
|
315
|
+
2. Run the full validation suite: lint, typecheck, test, build
|
|
316
|
+
3. Bump `version` in `package.json`
|
|
317
|
+
4. Commit and tag (`v<version>`)
|
|
318
|
+
5. Push commit and tag to origin
|
|
319
|
+
|
|
320
|
+
This guarantees the CI Release workflow will pass, since the exact same checks run locally first.
|
|
321
|
+
|
|
280
322
|
## License
|
|
281
323
|
|
|
282
324
|
MIT
|
|
@@ -2,7 +2,7 @@ import path from 'node:path';
|
|
|
2
2
|
import { stringify as toToml } from '@iarna/toml';
|
|
3
3
|
import { getClaudeDir, getCodexDir, getCursorDir, getGeminiDir, getOpencodePath, getProjectClaudeDir, getProjectCursorDir, getProjectGeminiDir, getProjectOpencodePath, } from '../config/paths.js';
|
|
4
4
|
import { distributeLibrary, } from '../library/distribute.js';
|
|
5
|
-
import {
|
|
5
|
+
import { loadLibraryStateSectionForApplication } from '../library/state.js';
|
|
6
6
|
import { wrapFrontmatter } from '../util/frontmatter.js';
|
|
7
7
|
import { loadCommandLibrary } from './library.js';
|
|
8
8
|
/**
|
|
@@ -128,7 +128,7 @@ export function distributeCommands(scope) {
|
|
|
128
128
|
// Filter entries based on per-agent configuration
|
|
129
129
|
const filterSelected = (platform, _allEntries) => {
|
|
130
130
|
const agentId = platformToAgentId(platform);
|
|
131
|
-
const state =
|
|
131
|
+
const state = loadLibraryStateSectionForApplication('commands', agentId, scope);
|
|
132
132
|
const activeIds = state.active;
|
|
133
133
|
const selected = [];
|
|
134
134
|
for (const id of activeIds) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/commands/distribution.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAIL,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/commands/distribution.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAIL,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,qCAAqC,EAAE,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAqB,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIrE;;GAEG;AACH,SAAS,iBAAiB,CAAC,QAAyB;IAClD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAYD,MAAM,UAAU,sBAAsB,CACpC,QAAyB,EACzB,EAAU,EACV,KAAmB;IAEnB,OAAO,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,kBAAkB,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;AAC/F,CAAC;AAED,SAAS,uBAAuB,CAAC,QAAyB,EAAE,KAAmB;IAC7E,MAAM,WAAW,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,sBAAsB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,eAAe,CAAC,SAAS,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,QAAyB,EAAE,EAAU;IAC/D,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;AAC3D,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAmB;IACpD,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC9E,MAAM,MAAM,GAAI,KAAK,CAAC,QAA+B,CAAC,MAEzC,CAAC;IACd,MAAM,EAAE,GAAI,MAAM,EAAE,CAAC,aAAa,CAA6B,IAAI,SAAS,CAAC;IAC7E,IAAI,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,2BAA2B,CAAC,KAAmB;IACtD,MAAM,MAAM,GAAI,KAAK,CAAC,QAA+B,CAAC,MAEzC,CAAC;IACd,MAAM,QAAQ,GAAI,MAAM,EAAE,QAAoC,IAAI,SAAS,CAAC;IAC5E,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW;QAAE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC9E,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAyB,EAAE,KAAmB;IACvE,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;YAC5C,OAAO,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;YAChD,MAAM,MAAM,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACrE,OAAO,CACL,yIAAyI;gBACzI,GAAG,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CACxC,CAAC;QACJ,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAI,KAAK,CAAC,QAA+B,CAAC,MAEzC,CAAC;YACd,MAAM,CAAC,GAAI,MAAM,EAAE,MAAkC,IAAI,SAAS,CAAC;YACnE,MAAM,GAAG,GAA4B;gBACnC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE;aAClC,CAAC;YACF,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW;gBAAE,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC7E,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACrD,CAAC;YACD,yGAAyG;YACzG,OAAO,MAAM,CAAC,GAAU,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,GAAG,2BAA2B,CAAC,KAAK,CAAC,CAAC;YAC9C,OAAO,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAmB;IACpD,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,MAAM,SAAS,GAAsB,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IAE9F,gDAAgD;IAChD,MAAM,OAAO,GAAmC;QAC9C,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,uBAAuB,CAAC,CAAC,EAAE,KAAK,CAAC;QAC1D,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE;YACtB,gEAAgE;YAChE,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;IAEF,kDAAkD;IAClD,MAAM,cAAc,GAAG,CACrB,QAAyB,EACzB,WAA2B,EACX,EAAE;QAClB,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,qCAAqC,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,MAAM,QAAQ,GAAmB,EAAE,CAAC;QACpC,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACvB,IAAI,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,iBAAiB,CAAgC;QAC/D,OAAO,EAAE,UAAU;QACnB,QAAQ,EAAE,OAAO,EAAE,mDAAmD;QACtE,SAAS;QACT,eAAe,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC;QACjE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;QACzC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QAClB,OAAO;QACP,KAAK;QACL,cAAc;KACf,CAAuD,CAAC;IAEzD,8CAA8C;IAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CACxD,CAAC;IACF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CACV,iHAAiH,CAClH,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -10,6 +10,6 @@ export interface CommandEntry {
|
|
|
10
10
|
}
|
|
11
11
|
export declare function ensureCommandsDirectory(): string;
|
|
12
12
|
/**
|
|
13
|
-
* Load all commands from default library and
|
|
13
|
+
* Load all commands from default library, flat sources, and marketplace sources.
|
|
14
14
|
*/
|
|
15
15
|
export declare function loadCommandLibrary(): CommandEntry[];
|
package/dist/commands/library.js
CHANGED
|
@@ -2,7 +2,7 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { getCommandsDir } from '../config/paths.js';
|
|
4
4
|
import { parseLibraryMarkdown } from '../library/parser.js';
|
|
5
|
-
import {
|
|
5
|
+
import { loadEntriesFromSources } from '../marketplace/source-loader.js';
|
|
6
6
|
function isMarkdownFile(fileName) {
|
|
7
7
|
const extension = path.extname(fileName).toLowerCase();
|
|
8
8
|
return extension === '.md' || extension === '.markdown';
|
|
@@ -59,18 +59,18 @@ function loadCommandsFromDirectory(directory, namespace) {
|
|
|
59
59
|
return result;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
* Load all commands from default library and
|
|
62
|
+
* Load all commands from default library, flat sources, and marketplace sources.
|
|
63
63
|
*/
|
|
64
64
|
export function loadCommandLibrary() {
|
|
65
65
|
const result = [];
|
|
66
|
-
// Load from default library (no namespace)
|
|
67
66
|
const defaultDir = ensureCommandsDirectory();
|
|
68
67
|
result.push(...loadCommandsFromDirectory(defaultDir));
|
|
69
|
-
const
|
|
70
|
-
for (const
|
|
68
|
+
const { flatSources, marketplaceEntries } = loadEntriesFromSources();
|
|
69
|
+
for (const { namespace, basePath } of flatSources) {
|
|
71
70
|
const commandsDir = path.join(basePath, 'commands');
|
|
72
71
|
result.push(...loadCommandsFromDirectory(commandsDir, namespace));
|
|
73
72
|
}
|
|
73
|
+
result.push(...marketplaceEntries.commands);
|
|
74
74
|
result.sort((a, b) => a.id.localeCompare(b.id));
|
|
75
75
|
return result;
|
|
76
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/commands/library.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../../src/commands/library.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application-specific configuration resolution.
|
|
3
|
+
* Supports per-application overrides using add/remove incremental syntax.
|
|
4
|
+
*
|
|
5
|
+
* "Applications" are the target AI agent apps (claude-code, cursor, codex, etc.)
|
|
6
|
+
* that ASB distributes library entries to.
|
|
7
|
+
*/
|
|
8
|
+
import type { IncrementalSelection, SwitchboardConfig } from './schemas.js';
|
|
9
|
+
import type { ConfigScope } from './scope.js';
|
|
10
|
+
export type ConfigSection = 'mcp' | 'commands' | 'agents' | 'skills' | 'hooks' | 'rules';
|
|
11
|
+
export interface ResolvedSectionConfig {
|
|
12
|
+
active: string[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Merge incremental selection with base active list
|
|
16
|
+
*
|
|
17
|
+
* Priority: active > add/remove
|
|
18
|
+
* Formula: (base - remove) ∪ add
|
|
19
|
+
*/
|
|
20
|
+
export declare function mergeIncrementalSelection(base: string[], override?: IncrementalSelection): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Get per-application override configuration for a specific section
|
|
23
|
+
*/
|
|
24
|
+
export declare function getApplicationOverride(config: SwitchboardConfig, appId: string, section: ConfigSection): IncrementalSelection | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Resolve effective configuration for a specific application and section.
|
|
27
|
+
* Applies per-application overrides to the global section config.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveApplicationSectionConfig(section: ConfigSection, appId: string, scope?: ConfigScope): ResolvedSectionConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Check if an application has any overrides configured
|
|
32
|
+
*/
|
|
33
|
+
export declare function hasApplicationOverrides(config: SwitchboardConfig, appId: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get list of applications that have overrides configured
|
|
36
|
+
*/
|
|
37
|
+
export declare function getApplicationsWithOverrides(config: SwitchboardConfig): string[];
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application-specific configuration resolution.
|
|
3
|
+
* Supports per-application overrides using add/remove incremental syntax.
|
|
4
|
+
*
|
|
5
|
+
* "Applications" are the target AI agent apps (claude-code, cursor, codex, etc.)
|
|
6
|
+
* that ASB distributes library entries to.
|
|
7
|
+
*/
|
|
8
|
+
import { loadMergedSwitchboardConfig } from './layered-config.js';
|
|
9
|
+
import { scopeToLayerOptions } from './scope.js';
|
|
10
|
+
/**
|
|
11
|
+
* Merge incremental selection with base active list
|
|
12
|
+
*
|
|
13
|
+
* Priority: active > add/remove
|
|
14
|
+
* Formula: (base - remove) ∪ add
|
|
15
|
+
*/
|
|
16
|
+
export function mergeIncrementalSelection(base, override) {
|
|
17
|
+
if (!override)
|
|
18
|
+
return base;
|
|
19
|
+
if (override.active && override.active.length > 0) {
|
|
20
|
+
return override.active;
|
|
21
|
+
}
|
|
22
|
+
let result = [...base];
|
|
23
|
+
if (override.remove && override.remove.length > 0) {
|
|
24
|
+
const removeSet = new Set(override.remove);
|
|
25
|
+
result = result.filter((id) => !removeSet.has(id));
|
|
26
|
+
}
|
|
27
|
+
if (override.add && override.add.length > 0) {
|
|
28
|
+
const existing = new Set(result);
|
|
29
|
+
for (const id of override.add) {
|
|
30
|
+
if (!existing.has(id)) {
|
|
31
|
+
result.push(id);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get per-application override configuration for a specific section
|
|
39
|
+
*/
|
|
40
|
+
export function getApplicationOverride(config, appId, section) {
|
|
41
|
+
const applications = config.applications;
|
|
42
|
+
const appOverrides = applications[appId];
|
|
43
|
+
if (!appOverrides || typeof appOverrides !== 'object') {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const overrideObj = appOverrides;
|
|
47
|
+
return overrideObj[section];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve effective configuration for a specific application and section.
|
|
51
|
+
* Applies per-application overrides to the global section config.
|
|
52
|
+
*/
|
|
53
|
+
export function resolveApplicationSectionConfig(section, appId, scope) {
|
|
54
|
+
const layerOptions = scopeToLayerOptions(scope);
|
|
55
|
+
const { config } = loadMergedSwitchboardConfig(layerOptions);
|
|
56
|
+
const globalActive = [...config[section].active];
|
|
57
|
+
const override = getApplicationOverride(config, appId, section);
|
|
58
|
+
return {
|
|
59
|
+
active: mergeIncrementalSelection(globalActive, override),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Check if an application has any overrides configured
|
|
64
|
+
*/
|
|
65
|
+
export function hasApplicationOverrides(config, appId) {
|
|
66
|
+
const applications = config.applications;
|
|
67
|
+
const appOverrides = applications[appId];
|
|
68
|
+
return appOverrides !== undefined && typeof appOverrides === 'object';
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Get list of applications that have overrides configured
|
|
72
|
+
*/
|
|
73
|
+
export function getApplicationsWithOverrides(config) {
|
|
74
|
+
const applications = config.applications;
|
|
75
|
+
const result = [];
|
|
76
|
+
for (const key of Object.keys(applications)) {
|
|
77
|
+
if (key !== 'active' && typeof applications[key] === 'object') {
|
|
78
|
+
result.push(key);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=application-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-config.js","sourceRoot":"","sources":["../../src/config/application-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,55 @@ import { switchboardConfigLayerSchema, switchboardConfigSchema, } from './schema
|
|
|
6
6
|
function isPlainObject(value) {
|
|
7
7
|
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Migrate legacy config keys to the current schema.
|
|
11
|
+
*
|
|
12
|
+
* - `[agents]` (old target-app list) → `[applications]`
|
|
13
|
+
* - `[subagents]` (old agent library) → `[agents]`
|
|
14
|
+
* - Per-application override `subagents` key → `agents`
|
|
15
|
+
*
|
|
16
|
+
* Detection: the presence of `[subagents]` is an unambiguous signal of old format.
|
|
17
|
+
* Without it, `[agents]` could be either old (target list) or new (library), so we
|
|
18
|
+
* only migrate `[agents]` → `[applications]` when `[subagents]` co-exists.
|
|
19
|
+
*/
|
|
20
|
+
function migrateLegacyConfigKeys(raw) {
|
|
21
|
+
const migrated = { ...raw };
|
|
22
|
+
const hasOldSubagents = 'subagents' in migrated;
|
|
23
|
+
if (hasOldSubagents && 'agents' in migrated && !('applications' in migrated)) {
|
|
24
|
+
migrated.applications = migrated.agents;
|
|
25
|
+
delete migrated.agents;
|
|
26
|
+
const apps = migrated.applications;
|
|
27
|
+
if (apps && typeof apps === 'object') {
|
|
28
|
+
for (const [key, value] of Object.entries(apps)) {
|
|
29
|
+
if (key === 'active')
|
|
30
|
+
continue;
|
|
31
|
+
if (value && typeof value === 'object') {
|
|
32
|
+
const override = { ...value };
|
|
33
|
+
if ('subagents' in override && !('agents' in override)) {
|
|
34
|
+
override.agents = override.subagents;
|
|
35
|
+
delete override.subagents;
|
|
36
|
+
}
|
|
37
|
+
apps[key] = override;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if ('subagents' in migrated && !('agents' in migrated)) {
|
|
43
|
+
migrated.agents = migrated.subagents;
|
|
44
|
+
delete migrated.subagents;
|
|
45
|
+
}
|
|
46
|
+
return migrated;
|
|
47
|
+
}
|
|
9
48
|
function readLayerFile(filePath) {
|
|
10
49
|
if (!fs.existsSync(filePath)) {
|
|
11
50
|
return { path: filePath, exists: false, config: {} };
|
|
12
51
|
}
|
|
13
52
|
try {
|
|
14
53
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
15
|
-
const
|
|
16
|
-
const
|
|
54
|
+
const raw = content.trim().length === 0 ? {} : parse(content);
|
|
55
|
+
const obj = raw && typeof raw === 'object' ? raw : {};
|
|
56
|
+
const migrated = migrateLegacyConfigKeys(obj);
|
|
57
|
+
const validated = switchboardConfigLayerSchema.parse(migrated);
|
|
17
58
|
return { path: filePath, exists: true, config: validated };
|
|
18
59
|
}
|
|
19
60
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layered-config.js","sourceRoot":"","sources":["../../src/config/layered-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAClG,OAAO,EAGL,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAqBtB,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,
|
|
1
|
+
{"version":3,"file":"layered-config.js","sourceRoot":"","sources":["../../src/config/layered-config.ts"],"names":[],"mappings":"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"}
|
package/dist/config/paths.d.ts
CHANGED
|
@@ -43,13 +43,17 @@ export declare function getRulesDir(): string;
|
|
|
43
43
|
*/
|
|
44
44
|
export declare function getCommandsDir(): string;
|
|
45
45
|
/**
|
|
46
|
-
* Returns the absolute path to the
|
|
46
|
+
* Returns the absolute path to the agents library directory (~/.asb/agents/)
|
|
47
47
|
*/
|
|
48
|
-
export declare function
|
|
48
|
+
export declare function getAgentsDir(): string;
|
|
49
49
|
/**
|
|
50
50
|
* Returns the absolute path to the skills library directory
|
|
51
51
|
*/
|
|
52
52
|
export declare function getSkillsDir(): string;
|
|
53
|
+
/**
|
|
54
|
+
* Returns the absolute path to the hooks library directory (~/.asb/hooks/)
|
|
55
|
+
*/
|
|
56
|
+
export declare function getHooksDir(): string;
|
|
53
57
|
/**
|
|
54
58
|
* Returns the directory for remote source clones.
|
|
55
59
|
* Without namespace: returns the base marketplaces dir (~/.asb/marketplaces/).
|
|
@@ -64,6 +68,7 @@ export declare function getAgentsHome(): string;
|
|
|
64
68
|
/** Platform-specific roots for common agent apps */
|
|
65
69
|
export declare function getClaudeDir(): string;
|
|
66
70
|
export declare function getCodexDir(): string;
|
|
71
|
+
export declare function getCodexAgentsDir(): string;
|
|
67
72
|
export declare function getGeminiDir(): string;
|
|
68
73
|
export declare function getCursorDir(): string;
|
|
69
74
|
export declare function getOpencodeRoot(): string;
|
package/dist/config/paths.js
CHANGED
|
@@ -78,10 +78,10 @@ export function getCommandsDir() {
|
|
|
78
78
|
return path.join(getConfigDir(), 'commands');
|
|
79
79
|
}
|
|
80
80
|
/**
|
|
81
|
-
* Returns the absolute path to the
|
|
81
|
+
* Returns the absolute path to the agents library directory (~/.asb/agents/)
|
|
82
82
|
*/
|
|
83
|
-
export function
|
|
84
|
-
return path.join(getConfigDir(), '
|
|
83
|
+
export function getAgentsDir() {
|
|
84
|
+
return path.join(getConfigDir(), 'agents');
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
87
|
* Returns the absolute path to the skills library directory
|
|
@@ -89,6 +89,12 @@ export function getSubagentsDir() {
|
|
|
89
89
|
export function getSkillsDir() {
|
|
90
90
|
return path.join(getConfigDir(), 'skills');
|
|
91
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Returns the absolute path to the hooks library directory (~/.asb/hooks/)
|
|
94
|
+
*/
|
|
95
|
+
export function getHooksDir() {
|
|
96
|
+
return path.join(getConfigDir(), 'hooks');
|
|
97
|
+
}
|
|
92
98
|
/**
|
|
93
99
|
* Returns the directory for remote source clones.
|
|
94
100
|
* Without namespace: returns the base marketplaces dir (~/.asb/marketplaces/).
|
|
@@ -115,6 +121,9 @@ export function getClaudeDir() {
|
|
|
115
121
|
export function getCodexDir() {
|
|
116
122
|
return path.join(getAgentsHome(), '.codex');
|
|
117
123
|
}
|
|
124
|
+
export function getCodexAgentsDir() {
|
|
125
|
+
return path.join(getCodexDir(), 'agents');
|
|
126
|
+
}
|
|
118
127
|
export function getGeminiDir() {
|
|
119
128
|
return path.join(getAgentsHome(), '.gemini');
|
|
120
129
|
}
|