agent-switchboard 0.1.2 → 0.1.3
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 +73 -3
- package/dist/agents/claude-code.js +2 -6
- package/dist/agents/claude-code.js.map +1 -1
- package/dist/agents/claude-desktop.js +2 -16
- package/dist/agents/claude-desktop.js.map +1 -1
- package/dist/agents/codex.js +2 -5
- package/dist/agents/codex.js.map +1 -1
- package/dist/agents/gemini.js +2 -6
- package/dist/agents/gemini.js.map +1 -1
- package/dist/agents/opencode.js +2 -8
- package/dist/agents/opencode.js.map +1 -1
- package/dist/commands/distribution.d.ts +12 -0
- package/dist/commands/distribution.js +96 -0
- package/dist/commands/distribution.js.map +1 -0
- package/dist/commands/importer.d.ts +6 -0
- package/dist/commands/importer.js +66 -0
- package/dist/commands/importer.js.map +1 -0
- package/dist/commands/inventory.d.ts +16 -0
- package/dist/commands/inventory.js +78 -0
- package/dist/commands/inventory.js.map +1 -0
- package/dist/commands/library.d.ts +9 -0
- package/dist/commands/library.js +49 -0
- package/dist/commands/library.js.map +1 -0
- package/dist/commands/template.d.ts +1 -0
- package/dist/commands/template.js +9 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/config/paths.d.ts +24 -0
- package/dist/config/paths.js +64 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/index.js +421 -23
- package/dist/index.js.map +1 -1
- package/dist/library/distribute.d.ts +23 -0
- package/dist/library/distribute.js +66 -0
- package/dist/library/distribute.js.map +1 -0
- package/dist/library/fs.d.ts +14 -0
- package/dist/library/fs.js +55 -0
- package/dist/library/fs.js.map +1 -0
- package/dist/library/parser.d.ts +7 -0
- package/dist/library/parser.js +11 -0
- package/dist/library/parser.js.map +1 -0
- package/dist/library/schema.d.ts +18 -0
- package/dist/library/schema.js +14 -0
- package/dist/library/schema.js.map +1 -0
- package/dist/library/state.d.ts +43 -0
- package/dist/library/state.js +64 -0
- package/dist/library/state.js.map +1 -0
- package/dist/rules/distribution.js +6 -30
- package/dist/rules/distribution.js.map +1 -1
- package/dist/subagents/distribution.d.ts +12 -0
- package/dist/subagents/distribution.js +71 -0
- package/dist/subagents/distribution.js.map +1 -0
- package/dist/subagents/importer.d.ts +6 -0
- package/dist/subagents/importer.js +42 -0
- package/dist/subagents/importer.js.map +1 -0
- package/dist/subagents/inventory.d.ts +17 -0
- package/dist/subagents/inventory.js +111 -0
- package/dist/subagents/inventory.js.map +1 -0
- package/dist/subagents/library.d.ts +9 -0
- package/dist/subagents/library.js +49 -0
- package/dist/subagents/library.js.map +1 -0
- package/dist/subagents/template.d.ts +1 -0
- package/dist/subagents/template.js +9 -0
- package/dist/subagents/template.js.map +1 -0
- package/dist/ui/command-ui.d.ts +3 -0
- package/dist/ui/command-ui.js +23 -0
- package/dist/ui/command-ui.js.map +1 -0
- package/dist/ui/library-selector.d.ts +14 -0
- package/dist/ui/library-selector.js +136 -0
- package/dist/ui/library-selector.js.map +1 -0
- package/dist/ui/subagent-ui.d.ts +3 -0
- package/dist/ui/subagent-ui.js +29 -0
- package/dist/ui/subagent-ui.js.map +1 -0
- package/dist/util/cli.d.ts +6 -0
- package/dist/util/cli.js +24 -0
- package/dist/util/cli.js.map +1 -0
- package/dist/util/extras.d.ts +4 -0
- package/dist/util/extras.js +25 -0
- package/dist/util/extras.js.map +1 -0
- package/dist/util/frontmatter.d.ts +1 -0
- package/dist/util/frontmatter.js +7 -0
- package/dist/util/frontmatter.js.map +1 -0
- package/dist/util/markdown.d.ts +24 -0
- package/dist/util/markdown.js +70 -0
- package/dist/util/markdown.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Manage MCP servers in one place and apply them to local agents (Codex, Claude Code/Desktop, Gemini) and opencode.
|
|
4
4
|
|
|
5
|
+
You can run with either `agent-switchboard` or the shorter alias `asb`.
|
|
6
|
+
|
|
5
7
|
## Installation
|
|
6
8
|
|
|
7
9
|
Global install:
|
|
@@ -58,7 +60,7 @@ Toggle `rules.includeDelimiters` to `true` if you want each snippet surrounded b
|
|
|
58
60
|
|
|
59
61
|
Run `agent-switchboard mcp` again after updating the list.
|
|
60
62
|
|
|
61
|
-
## Rule Library
|
|
63
|
+
## Rule Library
|
|
62
64
|
|
|
63
65
|
Rule snippets live in `~/.agent-switchboard/rules/` (respects `ASB_HOME`). Each snippet is a Markdown file and can include YAML frontmatter with `title`, `description`, `tags`, and `requires` fields. Example:
|
|
64
66
|
|
|
@@ -87,7 +89,7 @@ Once confirmed, Agent Switchboard composes the merged Markdown, stores the activ
|
|
|
87
89
|
- `~/.gemini/AGENTS.md`
|
|
88
90
|
- `~/.config/opencode/AGENTS.md` (or `%APPDATA%/opencode/AGENTS.md` on Windows)
|
|
89
91
|
|
|
90
|
-
Unsupportive agents such as Claude Desktop and Cursor are reported and left untouched.
|
|
92
|
+
Unsupportive agents such as Claude Desktop and Cursor are reported and left untouched. If you rerun the selector without changing the order, the tool refreshes the destination files to overwrite any manual edits.
|
|
91
93
|
|
|
92
94
|
### Auditing Rules
|
|
93
95
|
|
|
@@ -95,9 +97,77 @@ See the full inventory, activation state, and per-agent sync timestamps:
|
|
|
95
97
|
|
|
96
98
|
```bash
|
|
97
99
|
agent-switchboard rule list
|
|
98
|
-
agent-switchboard rule list --json
|
|
99
100
|
```
|
|
100
101
|
|
|
102
|
+
## Command Library
|
|
103
|
+
|
|
104
|
+
- Location: `~/.agent-switchboard/commands/<slug>.md` (respects `ASB_HOME`).
|
|
105
|
+
- Frontmatter: only global `description` (optional). Any platform-native options must live under `extras.<platform>` and are written through verbatim. No parsing, no key renaming, no documentation of platform keys here.
|
|
106
|
+
|
|
107
|
+
### Import
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Import an existing platform file or directory into the library
|
|
111
|
+
# Use -r/--recursive to traverse subdirectories when <path> is a directory
|
|
112
|
+
agent-switchboard command load <platform> [path] [-r]
|
|
113
|
+
# <platform>: claude-code | codex | gemini | opencode
|
|
114
|
+
# If [path] is omitted, defaults by platform:
|
|
115
|
+
# claude-code → ~/.claude/commands
|
|
116
|
+
# codex → ~/.codex/prompts
|
|
117
|
+
# gemini → ~/.gemini/commands
|
|
118
|
+
# opencode → ~/.config/opencode/command (Windows: %APPDATA%/opencode/command)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Select and Distribute
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
agent-switchboard command
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
On confirm, adapters write each selected command to the corresponding platform output in your user home (platform defaults), using the file format that platform expects. The frontmatter consists of the global `description` (if present) plus `extras.<platform>` written as-is.
|
|
128
|
+
|
|
129
|
+
Files are only rewritten when content changes.
|
|
130
|
+
|
|
131
|
+
### Inventory
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
# Inventory
|
|
135
|
+
agent-switchboard command list
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Subagent Library
|
|
139
|
+
|
|
140
|
+
- Location: `~/.agent-switchboard/subagents/<slug>.md` (respects `ASB_HOME`).
|
|
141
|
+
- Frontmatter: only global `description` (optional). Any platform-native options must live under `extras.<platform>` and are written through verbatim. We do not parse, validate, or showcase platform key names in this README. Platforms that do not support subagent files are skipped.
|
|
142
|
+
|
|
143
|
+
### Import
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
agent-switchboard subagent load <platform> [path] [-r]
|
|
147
|
+
# <platform>: claude-code | opencode
|
|
148
|
+
# If [path] is omitted, defaults by platform:
|
|
149
|
+
# claude-code → ~/.claude/agents
|
|
150
|
+
# opencode → ~/.config/opencode/agent (Windows: %APPDATA%/opencode/agent)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Select and Distribute
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
agent-switchboard subagent
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
On confirm, adapters write each selected subagent to the corresponding platform output in your user home (platform defaults), using the file format that platform expects. The frontmatter consists of the global `description` (if present) plus `extras.<platform>` written as-is. Platforms that do not accept subagent files are skipped with a hint.
|
|
160
|
+
|
|
161
|
+
### Inventory
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
agent-switchboard subagent list
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Environment
|
|
168
|
+
|
|
169
|
+
- `ASB_HOME`: overrides `~/.agent-switchboard` for library/state files.
|
|
170
|
+
|
|
101
171
|
## License
|
|
102
172
|
|
|
103
173
|
MIT
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Claude Code agent adapter
|
|
3
3
|
* Manages MCP server configuration for Claude Code CLI
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
6
|
-
import path from 'node:path';
|
|
5
|
+
import { getClaudeJsonPath } from '../config/paths.js';
|
|
7
6
|
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js';
|
|
8
7
|
/**
|
|
9
8
|
* Claude Code agent adapter
|
|
@@ -12,10 +11,7 @@ import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js'
|
|
|
12
11
|
export class ClaudeCodeAgent {
|
|
13
12
|
id = 'claude-code';
|
|
14
13
|
configPath() {
|
|
15
|
-
|
|
16
|
-
? process.env.ASB_AGENTS_HOME
|
|
17
|
-
: os.homedir();
|
|
18
|
-
return path.join(base, '.claude.json');
|
|
14
|
+
return getClaudeJsonPath();
|
|
19
15
|
}
|
|
20
16
|
applyConfig(config) {
|
|
21
17
|
const path = this.configPath();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../src/agents/claude-code.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIvD,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,MAAM,OAAO,eAAe;IACjB,EAAE,GAAG,aAAsB,CAAC;IAErC,UAAU;QACR,OAAO,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Claude Desktop agent adapter
|
|
3
3
|
* Manages MCP server configuration for Claude Desktop app
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
6
|
-
import path from 'node:path';
|
|
5
|
+
import { getClaudeDesktopConfigPath } from '../config/paths.js';
|
|
7
6
|
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js';
|
|
8
7
|
/**
|
|
9
8
|
* Claude Desktop config file structure
|
|
@@ -19,20 +18,7 @@ import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js'
|
|
|
19
18
|
export class ClaudeDesktopAgent {
|
|
20
19
|
id = 'claude-desktop';
|
|
21
20
|
configPath() {
|
|
22
|
-
|
|
23
|
-
const home = process.env.ASB_AGENTS_HOME && process.env.ASB_AGENTS_HOME.trim().length > 0
|
|
24
|
-
? process.env.ASB_AGENTS_HOME
|
|
25
|
-
: os.homedir();
|
|
26
|
-
switch (platform) {
|
|
27
|
-
case 'darwin': // macOS
|
|
28
|
-
return path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json');
|
|
29
|
-
case 'win32': // Windows
|
|
30
|
-
return path.join(home, 'AppData', 'Roaming', 'Claude', 'claude_desktop_config.json');
|
|
31
|
-
case 'linux': // Linux
|
|
32
|
-
return path.join(home, '.config', 'Claude', 'claude_desktop_config.json');
|
|
33
|
-
default:
|
|
34
|
-
throw new Error(`Unsupported platform: ${platform}`);
|
|
35
|
-
}
|
|
21
|
+
return getClaudeDesktopConfigPath();
|
|
36
22
|
}
|
|
37
23
|
applyConfig(config) {
|
|
38
24
|
const path = this.configPath();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/agents/claude-desktop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"claude-desktop.js","sourceRoot":"","sources":["../../src/agents/claude-desktop.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;;;;GAMG;AACH,MAAM,OAAO,kBAAkB;IACpB,EAAE,GAAG,gBAAyB,CAAC;IAExC,UAAU;QACR,OAAO,0BAA0B,EAAE,CAAC;IACtC,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
package/dist/agents/codex.js
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
* Handles TOML-based configuration with canonical section output
|
|
4
4
|
*/
|
|
5
5
|
import fs from 'node:fs';
|
|
6
|
-
import os from 'node:os';
|
|
7
6
|
import path from 'node:path';
|
|
8
7
|
import { parse as parseToml, stringify as tomlStringify } from '@iarna/toml';
|
|
8
|
+
import { getCodexConfigPath } from '../config/paths.js';
|
|
9
9
|
/**
|
|
10
10
|
* Codex CLI agent adapter
|
|
11
11
|
* Config: ~/.codex/config.toml (TOML format)
|
|
@@ -13,10 +13,7 @@ import { parse as parseToml, stringify as tomlStringify } from '@iarna/toml';
|
|
|
13
13
|
export class CodexAgent {
|
|
14
14
|
id = 'codex';
|
|
15
15
|
configPath() {
|
|
16
|
-
|
|
17
|
-
? process.env.ASB_AGENTS_HOME
|
|
18
|
-
: os.homedir();
|
|
19
|
-
return path.join(base, '.codex', 'config.toml');
|
|
16
|
+
return getCodexConfigPath();
|
|
20
17
|
}
|
|
21
18
|
applyConfig(config) {
|
|
22
19
|
const content = this._loadConfig();
|
package/dist/agents/codex.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/agents/codex.ts"],"names":[],"mappings":"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"}
|
package/dist/agents/gemini.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Gemini CLI agent adapter
|
|
3
3
|
* Manages MCP server configuration for Gemini CLI
|
|
4
4
|
*/
|
|
5
|
-
import
|
|
6
|
-
import path from 'node:path';
|
|
5
|
+
import { getGeminiSettingsPath } from '../config/paths.js';
|
|
7
6
|
import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js';
|
|
8
7
|
/**
|
|
9
8
|
* Gemini CLI config file structure
|
|
@@ -16,10 +15,7 @@ import { loadJsonFile, mergeMcpIntoAgent, saveJsonFile, } from './json-utils.js'
|
|
|
16
15
|
export class GeminiAgent {
|
|
17
16
|
id = 'gemini';
|
|
18
17
|
configPath() {
|
|
19
|
-
|
|
20
|
-
? process.env.ASB_AGENTS_HOME
|
|
21
|
-
: os.homedir();
|
|
22
|
-
return path.join(base, '.gemini', 'settings.json');
|
|
18
|
+
return getGeminiSettingsPath();
|
|
23
19
|
}
|
|
24
20
|
applyConfig(config) {
|
|
25
21
|
const path = this.configPath();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agents/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/agents/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,OAAO,EAEL,YAAY,EACZ,iBAAiB,EACjB,YAAY,GACb,MAAM,iBAAiB,CAAC;AAEzB;;GAEG;AACH,8BAA8B;AAE9B;;;GAGG;AACH,MAAM,OAAO,WAAW;IACb,EAAE,GAAG,QAAiB,CAAC;IAEhC,UAAU;QACR,OAAO,qBAAqB,EAAE,CAAC;IACjC,CAAC;IAED,WAAW,CAAC,MAAkE;QAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,YAAY,CAAkB,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,EAAE,MAAM,CAAC,UAAoC,CAAC,CAAC;QAC3F,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
package/dist/agents/opencode.js
CHANGED
|
@@ -3,18 +3,12 @@
|
|
|
3
3
|
* Synchronizes MCP servers into ~/.config/opencode/opencode.json
|
|
4
4
|
*/
|
|
5
5
|
import fs from 'node:fs';
|
|
6
|
-
import os from 'node:os';
|
|
7
6
|
import path from 'node:path';
|
|
7
|
+
import { getOpencodePath } from '../config/paths.js';
|
|
8
8
|
export class OpencodeAgent {
|
|
9
9
|
id = 'opencode';
|
|
10
10
|
configPath() {
|
|
11
|
-
|
|
12
|
-
? process.env.ASB_AGENTS_HOME
|
|
13
|
-
: os.homedir();
|
|
14
|
-
if (process.platform === 'win32') {
|
|
15
|
-
return path.join(home, 'AppData', 'Roaming', 'opencode', 'opencode.json');
|
|
16
|
-
}
|
|
17
|
-
return path.join(home, '.config', 'opencode', 'opencode.json');
|
|
11
|
+
return getOpencodePath('opencode.json');
|
|
18
12
|
}
|
|
19
13
|
applyConfig(config) {
|
|
20
14
|
const filePath = this.configPath();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../src/agents/opencode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type DistributeOutcome } from '../library/distribute.js';
|
|
2
|
+
export type CommandPlatform = 'claude-code' | 'codex' | 'gemini' | 'opencode';
|
|
3
|
+
export interface CommandDistributionResult {
|
|
4
|
+
platform: CommandPlatform;
|
|
5
|
+
filePath: string;
|
|
6
|
+
status: 'written' | 'skipped' | 'error';
|
|
7
|
+
reason?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
export type CommandDistributionOutcome = DistributeOutcome<CommandPlatform>;
|
|
11
|
+
export declare function resolveCommandFilePath(platform: CommandPlatform, id: string): string;
|
|
12
|
+
export declare function distributeCommands(): CommandDistributionOutcome;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { stringify as toToml } from '@iarna/toml';
|
|
3
|
+
import { getClaudeDir, getCodexDir, getGeminiDir, getOpencodePath } from '../config/paths.js';
|
|
4
|
+
import { distributeLibrary, } from '../library/distribute.js';
|
|
5
|
+
import { loadLibraryStateSection } from '../library/state.js';
|
|
6
|
+
import { wrapFrontmatter } from '../util/frontmatter.js';
|
|
7
|
+
import { loadCommandLibrary } from './library.js';
|
|
8
|
+
export function resolveCommandFilePath(platform, id) {
|
|
9
|
+
switch (platform) {
|
|
10
|
+
case 'claude-code':
|
|
11
|
+
return path.join(getClaudeDir(), 'commands', `${id}.md`);
|
|
12
|
+
case 'codex':
|
|
13
|
+
return path.join(getCodexDir(), 'prompts', `${id}.md`);
|
|
14
|
+
case 'gemini':
|
|
15
|
+
return path.join(getGeminiDir(), 'commands', `${id}.toml`);
|
|
16
|
+
case 'opencode':
|
|
17
|
+
return getOpencodePath('command', `${id}.md`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function buildFrontmatterForClaude(entry) {
|
|
21
|
+
const base = {};
|
|
22
|
+
if (entry.metadata.description)
|
|
23
|
+
base.description = entry.metadata.description;
|
|
24
|
+
const extras = entry.metadata.extras;
|
|
25
|
+
const cc = extras?.['claude-code'] ?? undefined;
|
|
26
|
+
if (cc && typeof cc === 'object') {
|
|
27
|
+
for (const [k, v] of Object.entries(cc))
|
|
28
|
+
base[k] = v;
|
|
29
|
+
}
|
|
30
|
+
return base;
|
|
31
|
+
}
|
|
32
|
+
function buildFrontmatterForOpencode(entry) {
|
|
33
|
+
const extras = entry.metadata.extras;
|
|
34
|
+
const opencode = extras?.opencode ?? undefined;
|
|
35
|
+
const base = {};
|
|
36
|
+
if (entry.metadata.description)
|
|
37
|
+
base.description = entry.metadata.description;
|
|
38
|
+
if (opencode && typeof opencode === 'object') {
|
|
39
|
+
for (const [k, v] of Object.entries(opencode))
|
|
40
|
+
base[k] = v;
|
|
41
|
+
}
|
|
42
|
+
return base;
|
|
43
|
+
}
|
|
44
|
+
function renderForPlatform(platform, entry) {
|
|
45
|
+
switch (platform) {
|
|
46
|
+
case 'claude-code': {
|
|
47
|
+
const fm = buildFrontmatterForClaude(entry);
|
|
48
|
+
return wrapFrontmatter(fm, entry.content);
|
|
49
|
+
}
|
|
50
|
+
case 'codex': {
|
|
51
|
+
const desc = entry.metadata.description?.trim();
|
|
52
|
+
const header = desc && desc.length > 0 ? `<!-- ${desc} -->\n\n` : '';
|
|
53
|
+
return `${header}${entry.content.trimStart()}`;
|
|
54
|
+
}
|
|
55
|
+
case 'gemini': {
|
|
56
|
+
const extras = entry.metadata.extras;
|
|
57
|
+
const g = extras?.gemini ?? undefined;
|
|
58
|
+
const obj = {
|
|
59
|
+
prompt: entry.content.trimStart(),
|
|
60
|
+
};
|
|
61
|
+
if (entry.metadata.description)
|
|
62
|
+
obj.description = entry.metadata.description;
|
|
63
|
+
if (g && typeof g === 'object') {
|
|
64
|
+
for (const [k, v] of Object.entries(g))
|
|
65
|
+
obj[k] = v;
|
|
66
|
+
}
|
|
67
|
+
// biome-ignore lint/suspicious/noExplicitAny: TOML stringify expects JSON-like values; cast is safe here
|
|
68
|
+
return toToml(obj);
|
|
69
|
+
}
|
|
70
|
+
case 'opencode': {
|
|
71
|
+
const fm = buildFrontmatterForOpencode(entry);
|
|
72
|
+
return wrapFrontmatter(fm, entry.content);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export function distributeCommands() {
|
|
77
|
+
const entries = loadCommandLibrary();
|
|
78
|
+
const state = loadLibraryStateSection('commands');
|
|
79
|
+
const activeIds = state.active;
|
|
80
|
+
const byId = new Map(entries.map((e) => [e.id, e]));
|
|
81
|
+
const selected = [];
|
|
82
|
+
for (const id of activeIds) {
|
|
83
|
+
const e = byId.get(id);
|
|
84
|
+
if (e)
|
|
85
|
+
selected.push(e);
|
|
86
|
+
}
|
|
87
|
+
const platforms = ['claude-code', 'codex', 'gemini', 'opencode'];
|
|
88
|
+
return distributeLibrary({
|
|
89
|
+
section: 'commands',
|
|
90
|
+
selected,
|
|
91
|
+
platforms,
|
|
92
|
+
resolveFilePath: (p, e) => resolveCommandFilePath(p, e.id),
|
|
93
|
+
render: (p, e) => renderForPlatform(p, e),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=distribution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"distribution.js","sourceRoot":"","sources":["../../src/commands/distribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { wrapFrontmatter } from '../util/frontmatter.js';
|
|
4
|
+
import { FRONTMATTER_PATTERN, slugify, stripYamlFrontmatter } from '../util/markdown.js';
|
|
5
|
+
function parseTomlString(content, key) {
|
|
6
|
+
// Naive TOML key = "value" or key = """multiline"""
|
|
7
|
+
const triple = new RegExp(`^\\s*${key}\\s*=\\s*"""([\\s\\S]*?)"""`, 'm');
|
|
8
|
+
const single = new RegExp(`^\\s*${key}\\s*=\\s*"([\\s\\S]*?)"`, 'm');
|
|
9
|
+
const m3 = content.match(triple);
|
|
10
|
+
if (m3)
|
|
11
|
+
return m3[1] ?? '';
|
|
12
|
+
const m1 = content.match(single);
|
|
13
|
+
if (m1)
|
|
14
|
+
return m1[1] ?? '';
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
// Using shared stripYamlFrontmatter from util/markdown
|
|
18
|
+
export function importCommandFromFile(platform, filePath) {
|
|
19
|
+
if (!fs.existsSync(filePath)) {
|
|
20
|
+
throw new Error(`Source file not found: ${filePath}`);
|
|
21
|
+
}
|
|
22
|
+
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
23
|
+
const baseSlug = slugify(path.basename(filePath, path.extname(filePath)));
|
|
24
|
+
switch (platform) {
|
|
25
|
+
case 'claude-code':
|
|
26
|
+
case 'opencode': {
|
|
27
|
+
// Strip any existing frontmatter and wrap into library schema (description + extras.<platform>)
|
|
28
|
+
const extracted = stripYamlFrontmatter(raw);
|
|
29
|
+
let body = extracted.body;
|
|
30
|
+
let meta = extracted.meta ?? {};
|
|
31
|
+
if (!meta || typeof meta !== 'object')
|
|
32
|
+
meta = {};
|
|
33
|
+
// Attempt to strip accidental second frontmatter at body start
|
|
34
|
+
const second = body.match(FRONTMATTER_PATTERN);
|
|
35
|
+
if (second && second.index === 0) {
|
|
36
|
+
const stripped = stripYamlFrontmatter(body);
|
|
37
|
+
meta = { ...meta, ...(stripped.meta ?? {}) };
|
|
38
|
+
body = stripped.body;
|
|
39
|
+
}
|
|
40
|
+
const metaRecord = meta;
|
|
41
|
+
const description = typeof metaRecord.description === 'string' ? metaRecord.description : '';
|
|
42
|
+
const rest = Object.fromEntries(Object.entries(metaRecord).filter(([k]) => k !== 'description'));
|
|
43
|
+
const fm = { description, extras: { [platform]: rest } };
|
|
44
|
+
const bodyNoFrontmatter = body.replace(/^\s*---\s*[\s\S]*?\r?\n---\s*\r?\n?/, '');
|
|
45
|
+
return { slug: baseSlug, content: wrapFrontmatter(fm, bodyNoFrontmatter) };
|
|
46
|
+
}
|
|
47
|
+
case 'codex': {
|
|
48
|
+
// Pure Markdown body; keep content and add minimal frontmatter
|
|
49
|
+
const fm = { description: '', extras: { codex: {} } };
|
|
50
|
+
return { slug: baseSlug, content: wrapFrontmatter(fm, raw) };
|
|
51
|
+
}
|
|
52
|
+
case 'gemini': {
|
|
53
|
+
// Minimal parse: extract prompt and description; do not infer/rename other keys
|
|
54
|
+
const prompt = parseTomlString(raw, 'prompt') ?? '';
|
|
55
|
+
const description = parseTomlString(raw, 'description') ?? '';
|
|
56
|
+
const fm = { description, extras: { gemini: {} } };
|
|
57
|
+
return { slug: baseSlug, content: wrapFrontmatter(fm, prompt) };
|
|
58
|
+
}
|
|
59
|
+
default: {
|
|
60
|
+
// biome-ignore lint/suspicious/noExplicitAny: exhaustive check fallback
|
|
61
|
+
const never = platform;
|
|
62
|
+
throw new Error(`Unsupported platform: ${never}`);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=importer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"importer.js","sourceRoot":"","sources":["../../src/commands/importer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type SectionState } from '../library/state.js';
|
|
2
|
+
export interface CommandInventoryRow {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string | null;
|
|
5
|
+
description: string | null;
|
|
6
|
+
model: string | null;
|
|
7
|
+
extrasKeys: string[];
|
|
8
|
+
active: boolean;
|
|
9
|
+
order: number | null;
|
|
10
|
+
filePath: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface CommandInventory {
|
|
13
|
+
entries: CommandInventoryRow[];
|
|
14
|
+
state: SectionState;
|
|
15
|
+
}
|
|
16
|
+
export declare function buildCommandInventory(): CommandInventory;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { loadLibraryStateSection } from '../library/state.js';
|
|
2
|
+
import { loadCommandLibrary } from './library.js';
|
|
3
|
+
function sortInactive(entries) {
|
|
4
|
+
return [...entries].sort((a, b) => {
|
|
5
|
+
const aMeta = a.metadata;
|
|
6
|
+
const bMeta = b.metadata;
|
|
7
|
+
const aTitle = aMeta.title;
|
|
8
|
+
const bTitle = bMeta.title;
|
|
9
|
+
const aLabel = (typeof aTitle === 'string' && aTitle.trim().length > 0 ? aTitle : a.id).toLowerCase();
|
|
10
|
+
const bLabel = (typeof bTitle === 'string' && bTitle.trim().length > 0 ? bTitle : b.id).toLowerCase();
|
|
11
|
+
return aLabel.localeCompare(bLabel);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function buildCommandInventory() {
|
|
15
|
+
const entries = loadCommandLibrary();
|
|
16
|
+
const state = loadLibraryStateSection('commands');
|
|
17
|
+
const byId = new Map(entries.map((e) => [e.id, e]));
|
|
18
|
+
const rows = [];
|
|
19
|
+
const seen = new Set();
|
|
20
|
+
state.active.forEach((id) => {
|
|
21
|
+
const e = byId.get(id);
|
|
22
|
+
if (!e) {
|
|
23
|
+
rows.push({
|
|
24
|
+
id,
|
|
25
|
+
title: null,
|
|
26
|
+
description: null,
|
|
27
|
+
model: null,
|
|
28
|
+
extrasKeys: [],
|
|
29
|
+
active: true,
|
|
30
|
+
order: null,
|
|
31
|
+
filePath: null,
|
|
32
|
+
});
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
seen.add(id);
|
|
36
|
+
rows.push({
|
|
37
|
+
id,
|
|
38
|
+
title: (() => {
|
|
39
|
+
const t = e.metadata.title;
|
|
40
|
+
return typeof t === 'string' ? t : null;
|
|
41
|
+
})(),
|
|
42
|
+
description: e.metadata.description ?? null,
|
|
43
|
+
model: (() => {
|
|
44
|
+
const extras = e.metadata.extras;
|
|
45
|
+
const cc = extras?.['claude-code'] ?? undefined;
|
|
46
|
+
const m = cc?.model;
|
|
47
|
+
return typeof m === 'string' && m.trim().length > 0 ? m : null;
|
|
48
|
+
})(),
|
|
49
|
+
extrasKeys: e.metadata.extras ? Object.keys(e.metadata.extras) : [],
|
|
50
|
+
active: true,
|
|
51
|
+
order: null,
|
|
52
|
+
filePath: e.filePath,
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
const inactive = sortInactive(entries.filter((e) => !seen.has(e.id)));
|
|
56
|
+
inactive.forEach((e) => {
|
|
57
|
+
rows.push({
|
|
58
|
+
id: e.id,
|
|
59
|
+
title: (() => {
|
|
60
|
+
const t = e.metadata.title;
|
|
61
|
+
return typeof t === 'string' ? t : null;
|
|
62
|
+
})(),
|
|
63
|
+
description: e.metadata.description ?? null,
|
|
64
|
+
model: (() => {
|
|
65
|
+
const extras = e.metadata.extras;
|
|
66
|
+
const cc = extras?.['claude-code'] ?? undefined;
|
|
67
|
+
const m = cc?.model;
|
|
68
|
+
return typeof m === 'string' && m.trim().length > 0 ? m : null;
|
|
69
|
+
})(),
|
|
70
|
+
extrasKeys: e.metadata.extras ? Object.keys(e.metadata.extras) : [],
|
|
71
|
+
active: false,
|
|
72
|
+
order: null,
|
|
73
|
+
filePath: e.filePath,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
return { entries: rows, state };
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/commands/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { LibraryFrontmatter } from '../library/schema.js';
|
|
2
|
+
export interface CommandEntry {
|
|
3
|
+
id: string;
|
|
4
|
+
filePath: string;
|
|
5
|
+
metadata: LibraryFrontmatter;
|
|
6
|
+
content: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function ensureCommandsDirectory(): string;
|
|
9
|
+
export declare function loadCommandLibrary(): CommandEntry[];
|