oh-my-codex 0.4.3 → 0.5.0
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 +17 -10
- package/dist/agents/definitions.d.ts.map +1 -1
- package/dist/agents/definitions.js +7 -13
- package/dist/agents/definitions.js.map +1 -1
- package/dist/agents/native-config.d.ts +20 -0
- package/dist/agents/native-config.d.ts.map +1 -0
- package/dist/agents/native-config.js +84 -0
- package/dist/agents/native-config.js.map +1 -0
- package/dist/catalog/__tests__/generator.test.d.ts +2 -0
- package/dist/catalog/__tests__/generator.test.d.ts.map +1 -0
- package/dist/catalog/__tests__/generator.test.js +42 -0
- package/dist/catalog/__tests__/generator.test.js.map +1 -0
- package/dist/catalog/__tests__/schema.test.d.ts +2 -0
- package/dist/catalog/__tests__/schema.test.d.ts.map +1 -0
- package/dist/catalog/__tests__/schema.test.js +33 -0
- package/dist/catalog/__tests__/schema.test.js.map +1 -0
- package/dist/catalog/reader.d.ts +19 -0
- package/dist/catalog/reader.d.ts.map +1 -0
- package/dist/catalog/reader.js +63 -0
- package/dist/catalog/reader.js.map +1 -0
- package/dist/catalog/schema.d.ts +32 -0
- package/dist/catalog/schema.d.ts.map +1 -0
- package/dist/catalog/schema.js +101 -0
- package/dist/catalog/schema.js.map +1 -0
- package/dist/cli/__tests__/index.test.js +109 -1
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/setup-scope.test.d.ts +2 -0
- package/dist/cli/__tests__/setup-scope.test.d.ts.map +1 -0
- package/dist/cli/__tests__/setup-scope.test.js +164 -0
- package/dist/cli/__tests__/setup-scope.test.js.map +1 -0
- package/dist/cli/catalog-contract.d.ts +10 -0
- package/dist/cli/catalog-contract.d.ts.map +1 -0
- package/dist/cli/catalog-contract.js +24 -0
- package/dist/cli/catalog-contract.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +7 -4
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +10 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +124 -99
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup.d.ts +3 -0
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +208 -47
- package/dist/cli/setup.js.map +1 -1
- package/dist/config/__tests__/generator-notify.test.js +28 -0
- package/dist/config/__tests__/generator-notify.test.js.map +1 -1
- package/dist/config/generator.d.ts +1 -0
- package/dist/config/generator.d.ts.map +1 -1
- package/dist/config/generator.js +34 -2
- package/dist/config/generator.js.map +1 -1
- package/dist/hooks/code-simplifier/__tests__/index.test.d.ts +2 -0
- package/dist/hooks/code-simplifier/__tests__/index.test.d.ts.map +1 -0
- package/dist/hooks/code-simplifier/__tests__/index.test.js +135 -0
- package/dist/hooks/code-simplifier/__tests__/index.test.js.map +1 -0
- package/dist/hooks/code-simplifier/index.d.ts +74 -0
- package/dist/hooks/code-simplifier/index.d.ts.map +1 -0
- package/dist/hooks/code-simplifier/index.js +145 -0
- package/dist/hooks/code-simplifier/index.js.map +1 -0
- package/dist/hooks/emulator.d.ts.map +1 -1
- package/dist/hooks/emulator.js +0 -1
- package/dist/hooks/emulator.js.map +1 -1
- package/dist/hooks/keyword-detector.d.ts.map +1 -1
- package/dist/hooks/keyword-detector.js +0 -3
- package/dist/hooks/keyword-detector.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/notifications/__tests__/tmux.test.js +61 -1
- package/dist/notifications/__tests__/tmux.test.js.map +1 -1
- package/dist/notifications/__tests__/verbosity.test.d.ts +2 -0
- package/dist/notifications/__tests__/verbosity.test.d.ts.map +1 -0
- package/dist/notifications/__tests__/verbosity.test.js +202 -0
- package/dist/notifications/__tests__/verbosity.test.js.map +1 -0
- package/dist/notifications/config.d.ts +14 -1
- package/dist/notifications/config.d.ts.map +1 -1
- package/dist/notifications/config.js +52 -0
- package/dist/notifications/config.js.map +1 -1
- package/dist/notifications/formatter.d.ts.map +1 -1
- package/dist/notifications/formatter.js +14 -0
- package/dist/notifications/formatter.js.map +1 -1
- package/dist/notifications/index.d.ts +3 -3
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +14 -4
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/tmux.d.ts +6 -0
- package/dist/notifications/tmux.d.ts.map +1 -1
- package/dist/notifications/tmux.js +31 -1
- package/dist/notifications/tmux.js.map +1 -1
- package/dist/notifications/types.d.ts +13 -0
- package/dist/notifications/types.d.ts.map +1 -1
- package/dist/team/__tests__/model-contract.test.d.ts +2 -0
- package/dist/team/__tests__/model-contract.test.d.ts.map +1 -0
- package/dist/team/__tests__/model-contract.test.js +47 -0
- package/dist/team/__tests__/model-contract.test.js.map +1 -0
- package/dist/team/__tests__/phase-controller.test.d.ts +2 -0
- package/dist/team/__tests__/phase-controller.test.d.ts.map +1 -0
- package/dist/team/__tests__/phase-controller.test.js +36 -0
- package/dist/team/__tests__/phase-controller.test.js.map +1 -0
- package/dist/team/__tests__/runtime.test.js +112 -8
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +71 -1
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/model-contract.d.ts +19 -0
- package/dist/team/model-contract.d.ts.map +1 -0
- package/dist/team/model-contract.js +123 -0
- package/dist/team/model-contract.js.map +1 -0
- package/dist/team/orchestrator.d.ts.map +1 -1
- package/dist/team/orchestrator.js +0 -1
- package/dist/team/orchestrator.js.map +1 -1
- package/dist/team/phase-controller.d.ts +10 -0
- package/dist/team/phase-controller.d.ts.map +1 -0
- package/dist/team/phase-controller.js +128 -0
- package/dist/team/phase-controller.js.map +1 -0
- package/dist/team/runtime.d.ts +3 -3
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +40 -74
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/state.d.ts +15 -0
- package/dist/team/state.d.ts.map +1 -1
- package/dist/team/state.js +35 -0
- package/dist/team/state.js.map +1 -1
- package/dist/team/team-ops.d.ts +3 -1
- package/dist/team/team-ops.d.ts.map +1 -1
- package/dist/team/team-ops.js +2 -0
- package/dist/team/team-ops.js.map +1 -1
- package/dist/team/tmux-session.d.ts +12 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +33 -1
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/utils/paths.d.ts +2 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +4 -0
- package/dist/utils/paths.js.map +1 -1
- package/package.json +2 -2
- package/prompts/code-simplifier.md +91 -0
- package/prompts/product-analyst.md +7 -7
- package/scripts/generate-catalog-docs.js +111 -0
- package/scripts/notify-hook.js +36 -1
- package/skills/build-fix/SKILL.md +3 -3
- package/skills/code-review/SKILL.md +3 -3
- package/skills/help/SKILL.md +4 -4
- package/skills/omx-setup/SKILL.md +24 -15
- package/skills/research/SKILL.md +28 -28
- package/skills/security-review/SKILL.md +3 -3
- package/templates/AGENTS.md +1 -8
- package/templates/catalog-manifest.json +397 -0
- package/prompts/deep-executor.md +0 -19
- package/prompts/scientist.md +0 -89
- package/skills/deepinit/SKILL.md +0 -320
- package/skills/learn-about-omx/SKILL.md +0 -37
- package/skills/learner/SKILL.md +0 -135
- package/skills/pipeline/SKILL.md +0 -407
- package/skills/project-session-manager/SKILL.md +0 -560
- package/skills/psm/SKILL.md +0 -20
- package/skills/release/SKILL.md +0 -83
- package/skills/ultrapilot/SKILL.md +0 -627
- package/skills/writer-memory/SKILL.md +0 -443
package/README.md
CHANGED
|
@@ -102,8 +102,8 @@ OMX installs and wires these layers:
|
|
|
102
102
|
User
|
|
103
103
|
-> Codex CLI
|
|
104
104
|
-> AGENTS.md (orchestration brain)
|
|
105
|
-
-> ~/.codex/prompts/*.md (
|
|
106
|
-
-> ~/.agents/skills/*/SKILL.md (
|
|
105
|
+
-> ~/.codex/prompts/*.md (agent prompt catalog)
|
|
106
|
+
-> ~/.agents/skills/*/SKILL.md (skill catalog)
|
|
107
107
|
-> ~/.codex/config.toml (features, notify, MCP)
|
|
108
108
|
-> .omx/ (runtime state, memory, plans, logs)
|
|
109
109
|
```
|
|
@@ -112,7 +112,7 @@ User
|
|
|
112
112
|
|
|
113
113
|
```bash
|
|
114
114
|
omx # Launch Codex (+ HUD in tmux when available)
|
|
115
|
-
omx setup # Install prompts
|
|
115
|
+
omx setup # Install prompts/skills/config by scope + project AGENTS.md/.omx
|
|
116
116
|
omx doctor # Installation/runtime diagnostics
|
|
117
117
|
omx doctor --team # Team/swarm diagnostics
|
|
118
118
|
omx team ... # Start/status/resume/shutdown tmux team workers
|
|
@@ -146,6 +146,7 @@ See `docs/hooks-extension.md` for the full extension workflow and event model.
|
|
|
146
146
|
--force
|
|
147
147
|
--dry-run
|
|
148
148
|
--verbose
|
|
149
|
+
--scope <user|project-local|project> # setup only
|
|
149
150
|
```
|
|
150
151
|
|
|
151
152
|
`--madmax` maps to Codex `--dangerously-bypass-approvals-and-sandbox`.
|
|
@@ -192,9 +193,14 @@ Important rule: do not shutdown while tasks are still `in_progress` unless abort
|
|
|
192
193
|
|
|
193
194
|
## What `omx setup` writes
|
|
194
195
|
|
|
195
|
-
-
|
|
196
|
-
-
|
|
197
|
-
- `~/.codex/config.toml
|
|
196
|
+
- `.omx/setup-scope.json` (persisted setup scope)
|
|
197
|
+
- Scope-dependent installs:
|
|
198
|
+
- `user`: `~/.codex/prompts/`, `~/.agents/skills/`, `~/.codex/config.toml`, `~/.omx/agents/`
|
|
199
|
+
- `project-local`: `./.codex/prompts/`, `./.agents/skills/`, `./.codex/config.toml`, `./.omx/agents/`
|
|
200
|
+
- `project`: skips prompt/skill/config/native-agent installs
|
|
201
|
+
- Launch behavior: if persisted scope is `project-local`, `omx` launch auto-uses `CODEX_HOME=./.codex` (unless `CODEX_HOME` is already set).
|
|
202
|
+
- Existing `AGENTS.md` is preserved unless `--force` is used (and active-session safety checks still apply).
|
|
203
|
+
- `config.toml` updates (for `user`/`project-local` scopes):
|
|
198
204
|
- `notify = ["node", "..."]`
|
|
199
205
|
- `model_reasoning_effort = "high"`
|
|
200
206
|
- `developer_instructions = "..."`
|
|
@@ -206,13 +212,12 @@ Important rule: do not shutdown while tasks are still `in_progress` unless abort
|
|
|
206
212
|
|
|
207
213
|
## Agents and Skills
|
|
208
214
|
|
|
209
|
-
- Prompts: `prompts/*.md` (installed to `~/.codex/prompts/`)
|
|
210
|
-
- Skills: `skills/*/SKILL.md` (installed to `~/.agents/skills/`)
|
|
215
|
+
- Prompts: `prompts/*.md` (installed to `~/.codex/prompts/` for `user`, `./.codex/prompts/` for `project-local`)
|
|
216
|
+
- Skills: `skills/*/SKILL.md` (installed to `~/.agents/skills/` for `user`, `./.agents/skills/` for `project-local`)
|
|
211
217
|
|
|
212
218
|
Examples:
|
|
213
219
|
- Agents: `architect`, `planner`, `executor`, `debugger`, `verifier`, `security-reviewer`
|
|
214
|
-
- `
|
|
215
|
-
- Skills: `autopilot`, `plan`, `team`, `ralph`, `ultrawork`, `ultrapilot`, `research`, `cancel`
|
|
220
|
+
- Skills: `autopilot`, `plan`, `team`, `ralph`, `ultrawork`, `research`, `cancel`
|
|
216
221
|
|
|
217
222
|
## Project Layout
|
|
218
223
|
|
|
@@ -247,6 +252,8 @@ npm test
|
|
|
247
252
|
|
|
248
253
|
## Notes
|
|
249
254
|
|
|
255
|
+
- Release notes: `CHANGELOG.md`
|
|
256
|
+
- Migration guide (post-v0.4.4 mainline): `docs/migration-mainline-post-v0.4.4.md`
|
|
250
257
|
- Coverage and parity notes: `COVERAGE.md`
|
|
251
258
|
- Hook extension workflow: `docs/hooks-extension.md`
|
|
252
259
|
- Setup and contribution details: `CONTRIBUTING.md`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;CACtE;
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnC,0BAA0B;IAC1B,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;IACvD,4BAA4B;IAC5B,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;CACtE;AAUD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CA+M7D,CAAC;AAEF,mCAAmC;AACnC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElE;AAED,mCAAmC;AACnC,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GAAG,eAAe,EAAE,CAE5F;AAED,0BAA0B;AAC1B,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC"}
|
|
@@ -10,11 +10,6 @@ const EXECUTOR_AGENT = {
|
|
|
10
10
|
tools: 'execution',
|
|
11
11
|
category: 'build',
|
|
12
12
|
};
|
|
13
|
-
const DEEP_EXECUTOR_ALIAS_AGENT = {
|
|
14
|
-
...EXECUTOR_AGENT,
|
|
15
|
-
name: 'deep-executor',
|
|
16
|
-
description: '[Deprecated] Backward-compatible alias of executor',
|
|
17
|
-
};
|
|
18
13
|
export const AGENT_DEFINITIONS = {
|
|
19
14
|
// Build/Analysis Lane
|
|
20
15
|
'explore': {
|
|
@@ -53,7 +48,6 @@ export const AGENT_DEFINITIONS = {
|
|
|
53
48
|
category: 'build',
|
|
54
49
|
},
|
|
55
50
|
'executor': EXECUTOR_AGENT,
|
|
56
|
-
'deep-executor': DEEP_EXECUTOR_ALIAS_AGENT,
|
|
57
51
|
'verifier': {
|
|
58
52
|
name: 'verifier',
|
|
59
53
|
description: 'Completion evidence, claim validation, test adequacy',
|
|
@@ -154,13 +148,6 @@ export const AGENT_DEFINITIONS = {
|
|
|
154
148
|
tools: 'execution',
|
|
155
149
|
category: 'domain',
|
|
156
150
|
},
|
|
157
|
-
'scientist': {
|
|
158
|
-
name: 'scientist',
|
|
159
|
-
description: 'Data/statistical analysis and hypothesis testing',
|
|
160
|
-
model: 'sonnet',
|
|
161
|
-
tools: 'data',
|
|
162
|
-
category: 'domain',
|
|
163
|
-
},
|
|
164
151
|
'git-master': {
|
|
165
152
|
name: 'git-master',
|
|
166
153
|
description: 'Commit strategy, history hygiene, rebasing',
|
|
@@ -168,6 +155,13 @@ export const AGENT_DEFINITIONS = {
|
|
|
168
155
|
tools: 'execution',
|
|
169
156
|
category: 'domain',
|
|
170
157
|
},
|
|
158
|
+
'code-simplifier': {
|
|
159
|
+
name: 'code-simplifier',
|
|
160
|
+
description: 'Simplifies recently modified code for clarity and consistency without changing behavior',
|
|
161
|
+
model: 'opus',
|
|
162
|
+
tools: 'execution',
|
|
163
|
+
category: 'domain',
|
|
164
|
+
},
|
|
171
165
|
'researcher': {
|
|
172
166
|
name: 'researcher',
|
|
173
167
|
description: 'External documentation and reference research',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,MAAM,cAAc,GAAoB;IACtC,IAAI,EAAE,UAAU;IAChB,WAAW,EAAE,gDAAgD;IAC7D,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,WAAW;IAClB,QAAQ,EAAE,OAAO;CAClB,CAAC;AAEF,MAAM,
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/agents/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native agent config generator for Codex CLI multi-agent roles
|
|
3
|
+
* Generates per-agent .toml files at ~/.omx/agents/<name>.toml
|
|
4
|
+
*/
|
|
5
|
+
import { AgentDefinition } from './definitions.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate TOML content for a single agent config file
|
|
8
|
+
*/
|
|
9
|
+
export declare function generateAgentToml(agent: AgentDefinition, promptContent: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Install native agent config .toml files to ~/.omx/agents/
|
|
12
|
+
* Returns the number of agents installed
|
|
13
|
+
*/
|
|
14
|
+
export declare function installNativeAgentConfigs(pkgRoot: string, options?: {
|
|
15
|
+
force?: boolean;
|
|
16
|
+
dryRun?: boolean;
|
|
17
|
+
verbose?: boolean;
|
|
18
|
+
agentsDir?: string;
|
|
19
|
+
}): Promise<number>;
|
|
20
|
+
//# sourceMappingURL=native-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-config.d.ts","sourceRoot":"","sources":["../../src/agents/native-config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAqB,eAAe,EAAE,MAAM,kBAAkB,CAAC;AA8BtE;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAavF;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACzF,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native agent config generator for Codex CLI multi-agent roles
|
|
3
|
+
* Generates per-agent .toml files at ~/.omx/agents/<name>.toml
|
|
4
|
+
*/
|
|
5
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
import { existsSync } from 'fs';
|
|
8
|
+
import { AGENT_DEFINITIONS } from './definitions.js';
|
|
9
|
+
import { omxAgentsConfigDir } from '../utils/paths.js';
|
|
10
|
+
// Map OMX model tiers to Codex reasoning effort levels
|
|
11
|
+
const REASONING_EFFORT_MAP = {
|
|
12
|
+
haiku: 'low',
|
|
13
|
+
sonnet: 'medium',
|
|
14
|
+
opus: 'high',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Strip YAML frontmatter (between --- markers) from markdown content
|
|
18
|
+
*/
|
|
19
|
+
function stripFrontmatter(content) {
|
|
20
|
+
const match = content.match(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/);
|
|
21
|
+
if (match) {
|
|
22
|
+
return content.slice(match[0].length).trim();
|
|
23
|
+
}
|
|
24
|
+
return content.trim();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Escape content for TOML triple-quoted strings.
|
|
28
|
+
* TOML """ strings only need to escape sequences of 3+ consecutive quotes.
|
|
29
|
+
*/
|
|
30
|
+
function escapeTomlMultiline(s) {
|
|
31
|
+
// Replace sequences of 3+ double quotes with escaped versions
|
|
32
|
+
return s.replace(/"{3,}/g, (match) => match.split('').join('\\'));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate TOML content for a single agent config file
|
|
36
|
+
*/
|
|
37
|
+
export function generateAgentToml(agent, promptContent) {
|
|
38
|
+
const instructions = stripFrontmatter(promptContent);
|
|
39
|
+
const effort = REASONING_EFFORT_MAP[agent.model];
|
|
40
|
+
const escaped = escapeTomlMultiline(instructions);
|
|
41
|
+
return [
|
|
42
|
+
`# oh-my-codex agent: ${agent.name}`,
|
|
43
|
+
`model_reasoning_effort = "${effort}"`,
|
|
44
|
+
`developer_instructions = """`,
|
|
45
|
+
escaped,
|
|
46
|
+
`"""`,
|
|
47
|
+
'',
|
|
48
|
+
].join('\n');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Install native agent config .toml files to ~/.omx/agents/
|
|
52
|
+
* Returns the number of agents installed
|
|
53
|
+
*/
|
|
54
|
+
export async function installNativeAgentConfigs(pkgRoot, options = {}) {
|
|
55
|
+
const { force = false, dryRun = false, verbose = false, agentsDir = omxAgentsConfigDir(), } = options;
|
|
56
|
+
if (!dryRun) {
|
|
57
|
+
await mkdir(agentsDir, { recursive: true });
|
|
58
|
+
}
|
|
59
|
+
let count = 0;
|
|
60
|
+
for (const [name, agent] of Object.entries(AGENT_DEFINITIONS)) {
|
|
61
|
+
const promptPath = join(pkgRoot, 'prompts', `${name}.md`);
|
|
62
|
+
if (!existsSync(promptPath)) {
|
|
63
|
+
if (verbose)
|
|
64
|
+
console.log(` skip ${name} (no prompt file)`);
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const dst = join(agentsDir, `${name}.toml`);
|
|
68
|
+
if (!force && existsSync(dst)) {
|
|
69
|
+
if (verbose)
|
|
70
|
+
console.log(` skip ${name} (already exists)`);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
const promptContent = await readFile(promptPath, 'utf-8');
|
|
74
|
+
const toml = generateAgentToml(agent, promptContent);
|
|
75
|
+
if (!dryRun) {
|
|
76
|
+
await writeFile(dst, toml);
|
|
77
|
+
}
|
|
78
|
+
if (verbose)
|
|
79
|
+
console.log(` ${name}.toml`);
|
|
80
|
+
count++;
|
|
81
|
+
}
|
|
82
|
+
return count;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=native-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-config.js","sourceRoot":"","sources":["../../src/agents/native-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.test.d.ts","sourceRoot":"","sources":["../../../src/catalog/__tests__/generator.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { mkdir, mkdtemp, readFile, writeFile } from 'fs/promises';
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { tmpdir } from 'os';
|
|
6
|
+
import { readCatalogManifest, toPublicCatalogContract } from '../reader.js';
|
|
7
|
+
async function readSourceManifestRaw() {
|
|
8
|
+
return readFile(join(process.cwd(), 'src', 'catalog', 'manifest.json'), 'utf8');
|
|
9
|
+
}
|
|
10
|
+
async function readSourceManifestCounts() {
|
|
11
|
+
const raw = await readSourceManifestRaw();
|
|
12
|
+
const parsed = JSON.parse(raw);
|
|
13
|
+
return {
|
|
14
|
+
skills: parsed.skills.length,
|
|
15
|
+
agents: parsed.agents.length,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
describe('catalog reader/contract', () => {
|
|
19
|
+
it('prefers template manifest path when present', async () => {
|
|
20
|
+
const root = await mkdtemp(join(tmpdir(), 'omx-catalog-'));
|
|
21
|
+
await mkdir(join(root, 'templates'), { recursive: true });
|
|
22
|
+
await writeFile(join(root, 'templates', 'catalog-manifest.json'), await readSourceManifestRaw());
|
|
23
|
+
const parsed = readCatalogManifest(root);
|
|
24
|
+
assert.equal(parsed.schemaVersion, 1);
|
|
25
|
+
assert.ok(parsed.skills.length > 0);
|
|
26
|
+
});
|
|
27
|
+
it('builds public contract with aliases and internalHidden', async () => {
|
|
28
|
+
const contract = toPublicCatalogContract(readCatalogManifest());
|
|
29
|
+
const expected = await readSourceManifestCounts();
|
|
30
|
+
assert.equal(contract.counts.skillCount, expected.skills);
|
|
31
|
+
assert.equal(contract.counts.promptCount, expected.agents);
|
|
32
|
+
assert.ok(contract.aliases.some((a) => a.name === 'swarm' && a.canonical === 'team'));
|
|
33
|
+
assert.ok(contract.internalHidden.includes('worker'));
|
|
34
|
+
assert.ok(contract.coreSkills.includes('autopilot'));
|
|
35
|
+
});
|
|
36
|
+
it('template manifest can be synced from source manifest', async () => {
|
|
37
|
+
const sourceRaw = await readFile(join(process.cwd(), 'src', 'catalog', 'manifest.json'), 'utf8');
|
|
38
|
+
const targetRaw = await readFile(join(process.cwd(), 'templates', 'catalog-manifest.json'), 'utf8');
|
|
39
|
+
assert.equal(JSON.parse(targetRaw).catalogVersion, JSON.parse(sourceRaw).catalogVersion);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=generator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.test.js","sourceRoot":"","sources":["../../../src/catalog/__tests__/generator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../../../src/catalog/__tests__/schema.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { summarizeCatalogCounts, validateCatalogManifest } from '../schema.js';
|
|
6
|
+
function readSourceManifest() {
|
|
7
|
+
const path = join(process.cwd(), 'src', 'catalog', 'manifest.json');
|
|
8
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
9
|
+
}
|
|
10
|
+
describe('catalog schema', () => {
|
|
11
|
+
it('validates repository manifest', () => {
|
|
12
|
+
const parsed = validateCatalogManifest(readSourceManifest());
|
|
13
|
+
assert.equal(parsed.schemaVersion, 1);
|
|
14
|
+
assert.ok(parsed.catalogVersion.length > 0);
|
|
15
|
+
assert.ok(parsed.skills.length > 0);
|
|
16
|
+
assert.ok(parsed.agents.length > 0);
|
|
17
|
+
});
|
|
18
|
+
it('enforces required core skills as active', () => {
|
|
19
|
+
const broken = JSON.parse(JSON.stringify(readSourceManifest()));
|
|
20
|
+
const idx = broken.skills.findIndex((s) => s.name === 'team');
|
|
21
|
+
broken.skills[idx].status = 'deprecated';
|
|
22
|
+
assert.throws(() => validateCatalogManifest(broken), /missing_core_skill:team/);
|
|
23
|
+
});
|
|
24
|
+
it('summarizes counts', () => {
|
|
25
|
+
const parsed = validateCatalogManifest(readSourceManifest());
|
|
26
|
+
const counts = summarizeCatalogCounts(parsed);
|
|
27
|
+
assert.equal(counts.skillCount, parsed.skills.length);
|
|
28
|
+
assert.equal(counts.promptCount, parsed.agents.length);
|
|
29
|
+
assert.ok(counts.activeSkillCount > 0);
|
|
30
|
+
assert.ok(counts.activeAgentCount > 0);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../../src/catalog/__tests__/schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAE/E,SAAS,kBAAkB;IACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IACpE,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,uBAAuB,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QAChF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,YAAY,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,MAAM,GAAG,uBAAuB,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type CatalogManifest, type CatalogCounts } from './schema.js';
|
|
2
|
+
export declare function readCatalogManifest(packageRoot?: string): CatalogManifest;
|
|
3
|
+
export declare function tryReadCatalogManifest(packageRoot?: string): CatalogManifest | null;
|
|
4
|
+
export declare function getCatalogCounts(packageRoot?: string): CatalogCounts;
|
|
5
|
+
export interface PublicCatalogContract {
|
|
6
|
+
generatedAt: string;
|
|
7
|
+
version: string;
|
|
8
|
+
counts: CatalogCounts;
|
|
9
|
+
coreSkills: string[];
|
|
10
|
+
skills: CatalogManifest['skills'];
|
|
11
|
+
agents: CatalogManifest['agents'];
|
|
12
|
+
aliases: Array<{
|
|
13
|
+
name: string;
|
|
14
|
+
canonical: string;
|
|
15
|
+
}>;
|
|
16
|
+
internalHidden: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function toPublicCatalogContract(manifest: CatalogManifest): PublicCatalogContract;
|
|
19
|
+
//# sourceMappingURL=reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/catalog/reader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAA0B,KAAK,aAAa,EAA2B,MAAM,aAAa,CAAC;AAmBxH,wBAAgB,mBAAmB,CAAC,WAAW,GAAE,MAAyB,GAAG,eAAe,CAa3F;AAED,wBAAgB,sBAAsB,CAAC,WAAW,GAAE,MAAyB,GAAG,eAAe,GAAG,IAAI,CAMrG;AAED,wBAAgB,gBAAgB,CAAC,WAAW,GAAE,MAAyB,GAAG,aAAa,CAGtF;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;IAClC,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpD,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,qBAAqB,CAkBxF"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { getPackageRoot } from '../utils/package.js';
|
|
4
|
+
import { summarizeCatalogCounts, validateCatalogManifest } from './schema.js';
|
|
5
|
+
const MANIFEST_CANDIDATE_PATHS = [
|
|
6
|
+
['templates', 'catalog-manifest.json'],
|
|
7
|
+
['src', 'catalog', 'manifest.json'],
|
|
8
|
+
['dist', 'catalog', 'manifest.json'],
|
|
9
|
+
];
|
|
10
|
+
let cachedManifest = null;
|
|
11
|
+
let cachedPath = null;
|
|
12
|
+
function resolveManifestPath(packageRoot) {
|
|
13
|
+
for (const segments of MANIFEST_CANDIDATE_PATHS) {
|
|
14
|
+
const fullPath = join(packageRoot, ...segments);
|
|
15
|
+
if (existsSync(fullPath))
|
|
16
|
+
return fullPath;
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
export function readCatalogManifest(packageRoot = getPackageRoot()) {
|
|
21
|
+
const path = resolveManifestPath(packageRoot);
|
|
22
|
+
if (!path) {
|
|
23
|
+
throw new Error('catalog_manifest_missing');
|
|
24
|
+
}
|
|
25
|
+
if (cachedManifest && cachedPath === path)
|
|
26
|
+
return cachedManifest;
|
|
27
|
+
const raw = JSON.parse(readFileSync(path, 'utf8'));
|
|
28
|
+
const manifest = validateCatalogManifest(raw);
|
|
29
|
+
cachedManifest = manifest;
|
|
30
|
+
cachedPath = path;
|
|
31
|
+
return manifest;
|
|
32
|
+
}
|
|
33
|
+
export function tryReadCatalogManifest(packageRoot = getPackageRoot()) {
|
|
34
|
+
try {
|
|
35
|
+
return readCatalogManifest(packageRoot);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function getCatalogCounts(packageRoot = getPackageRoot()) {
|
|
42
|
+
const manifest = readCatalogManifest(packageRoot);
|
|
43
|
+
return summarizeCatalogCounts(manifest);
|
|
44
|
+
}
|
|
45
|
+
export function toPublicCatalogContract(manifest) {
|
|
46
|
+
const aliases = manifest.skills
|
|
47
|
+
.filter((s) => (s.status === 'alias' || s.status === 'merged') && typeof s.canonical === 'string')
|
|
48
|
+
.map((s) => ({ name: s.name, canonical: s.canonical }));
|
|
49
|
+
const internalHidden = manifest.skills
|
|
50
|
+
.filter((s) => s.status === 'internal')
|
|
51
|
+
.map((s) => s.name);
|
|
52
|
+
return {
|
|
53
|
+
generatedAt: new Date().toISOString(),
|
|
54
|
+
version: manifest.catalogVersion,
|
|
55
|
+
counts: summarizeCatalogCounts(manifest),
|
|
56
|
+
coreSkills: manifest.skills.filter((s) => s.core).map((s) => s.name),
|
|
57
|
+
skills: manifest.skills,
|
|
58
|
+
agents: manifest.agents,
|
|
59
|
+
aliases,
|
|
60
|
+
internalHidden,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/catalog/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export type CatalogSkillCategory = 'execution' | 'planning' | 'shortcut' | 'utility';
|
|
2
|
+
export type CatalogAgentCategory = 'build' | 'review' | 'domain' | 'product' | 'coordination';
|
|
3
|
+
export type CatalogEntryStatus = 'active' | 'alias' | 'merged' | 'deprecated' | 'internal';
|
|
4
|
+
export interface CatalogSkillEntry {
|
|
5
|
+
name: string;
|
|
6
|
+
category: CatalogSkillCategory;
|
|
7
|
+
status: CatalogEntryStatus;
|
|
8
|
+
canonical?: string;
|
|
9
|
+
core?: boolean;
|
|
10
|
+
internalRequired?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface CatalogAgentEntry {
|
|
13
|
+
name: string;
|
|
14
|
+
category: CatalogAgentCategory;
|
|
15
|
+
status: CatalogEntryStatus;
|
|
16
|
+
canonical?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface CatalogManifest {
|
|
19
|
+
schemaVersion: number;
|
|
20
|
+
catalogVersion: string;
|
|
21
|
+
skills: CatalogSkillEntry[];
|
|
22
|
+
agents: CatalogAgentEntry[];
|
|
23
|
+
}
|
|
24
|
+
export declare function validateCatalogManifest(input: unknown): CatalogManifest;
|
|
25
|
+
export interface CatalogCounts {
|
|
26
|
+
skillCount: number;
|
|
27
|
+
promptCount: number;
|
|
28
|
+
activeSkillCount: number;
|
|
29
|
+
activeAgentCount: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function summarizeCatalogCounts(manifest: CatalogManifest): CatalogCounts;
|
|
32
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/catalog/schema.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;AACrF,MAAM,MAAM,oBAAoB,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,CAAC;AAC9F,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AAE3F,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,MAAM,EAAE,iBAAiB,EAAE,CAAC;CAC7B;AAiBD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAuFvE;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,eAAe,GAAG,aAAa,CAO/E"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
const SKILL_CATEGORIES = new Set(['execution', 'planning', 'shortcut', 'utility']);
|
|
2
|
+
const AGENT_CATEGORIES = new Set(['build', 'review', 'domain', 'product', 'coordination']);
|
|
3
|
+
const ENTRY_STATUSES = new Set(['active', 'alias', 'merged', 'deprecated', 'internal']);
|
|
4
|
+
const REQUIRED_CORE_SKILLS = new Set(['ralplan', 'team', 'ralph', 'ultrawork', 'autopilot']);
|
|
5
|
+
function isObject(value) {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
}
|
|
8
|
+
function assertNonEmptyString(value, field) {
|
|
9
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
10
|
+
throw new Error(`catalog_manifest_invalid:${field}`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function validateCatalogManifest(input) {
|
|
14
|
+
if (!isObject(input))
|
|
15
|
+
throw new Error('catalog_manifest_invalid:root');
|
|
16
|
+
if (typeof input.schemaVersion !== 'number' || !Number.isInteger(input.schemaVersion)) {
|
|
17
|
+
throw new Error('catalog_manifest_invalid:schemaVersion');
|
|
18
|
+
}
|
|
19
|
+
assertNonEmptyString(input.catalogVersion, 'catalogVersion');
|
|
20
|
+
if (!Array.isArray(input.skills))
|
|
21
|
+
throw new Error('catalog_manifest_invalid:skills');
|
|
22
|
+
if (!Array.isArray(input.agents))
|
|
23
|
+
throw new Error('catalog_manifest_invalid:agents');
|
|
24
|
+
const seenSkills = new Set();
|
|
25
|
+
const skills = input.skills.map((entry, index) => {
|
|
26
|
+
if (!isObject(entry))
|
|
27
|
+
throw new Error(`catalog_manifest_invalid:skills[${index}]`);
|
|
28
|
+
assertNonEmptyString(entry.name, `skills[${index}].name`);
|
|
29
|
+
assertNonEmptyString(entry.category, `skills[${index}].category`);
|
|
30
|
+
assertNonEmptyString(entry.status, `skills[${index}].status`);
|
|
31
|
+
if (!SKILL_CATEGORIES.has(entry.category)) {
|
|
32
|
+
throw new Error(`catalog_manifest_invalid:skills[${index}].category`);
|
|
33
|
+
}
|
|
34
|
+
if (!ENTRY_STATUSES.has(entry.status)) {
|
|
35
|
+
throw new Error(`catalog_manifest_invalid:skills[${index}].status`);
|
|
36
|
+
}
|
|
37
|
+
const name = entry.name.trim();
|
|
38
|
+
if (seenSkills.has(name))
|
|
39
|
+
throw new Error(`catalog_manifest_invalid:duplicate_skill:${name}`);
|
|
40
|
+
seenSkills.add(name);
|
|
41
|
+
const canonical = typeof entry.canonical === 'string' && entry.canonical.trim() !== ''
|
|
42
|
+
? entry.canonical.trim()
|
|
43
|
+
: undefined;
|
|
44
|
+
return {
|
|
45
|
+
name,
|
|
46
|
+
category: entry.category,
|
|
47
|
+
status: entry.status,
|
|
48
|
+
canonical,
|
|
49
|
+
core: entry.core === true,
|
|
50
|
+
internalRequired: entry.internalRequired === true,
|
|
51
|
+
};
|
|
52
|
+
});
|
|
53
|
+
const seenAgents = new Set();
|
|
54
|
+
const agents = input.agents.map((entry, index) => {
|
|
55
|
+
if (!isObject(entry))
|
|
56
|
+
throw new Error(`catalog_manifest_invalid:agents[${index}]`);
|
|
57
|
+
assertNonEmptyString(entry.name, `agents[${index}].name`);
|
|
58
|
+
assertNonEmptyString(entry.category, `agents[${index}].category`);
|
|
59
|
+
assertNonEmptyString(entry.status, `agents[${index}].status`);
|
|
60
|
+
if (!AGENT_CATEGORIES.has(entry.category)) {
|
|
61
|
+
throw new Error(`catalog_manifest_invalid:agents[${index}].category`);
|
|
62
|
+
}
|
|
63
|
+
if (!ENTRY_STATUSES.has(entry.status)) {
|
|
64
|
+
throw new Error(`catalog_manifest_invalid:agents[${index}].status`);
|
|
65
|
+
}
|
|
66
|
+
const name = entry.name.trim();
|
|
67
|
+
if (seenAgents.has(name))
|
|
68
|
+
throw new Error(`catalog_manifest_invalid:duplicate_agent:${name}`);
|
|
69
|
+
seenAgents.add(name);
|
|
70
|
+
const canonical = typeof entry.canonical === 'string' && entry.canonical.trim() !== ''
|
|
71
|
+
? entry.canonical.trim()
|
|
72
|
+
: undefined;
|
|
73
|
+
return {
|
|
74
|
+
name,
|
|
75
|
+
category: entry.category,
|
|
76
|
+
status: entry.status,
|
|
77
|
+
canonical,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
for (const coreSkill of REQUIRED_CORE_SKILLS) {
|
|
81
|
+
const skill = skills.find((s) => s.name === coreSkill);
|
|
82
|
+
if (!skill || skill.status !== 'active') {
|
|
83
|
+
throw new Error(`catalog_manifest_invalid:missing_core_skill:${coreSkill}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
schemaVersion: input.schemaVersion,
|
|
88
|
+
catalogVersion: input.catalogVersion,
|
|
89
|
+
skills,
|
|
90
|
+
agents,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
export function summarizeCatalogCounts(manifest) {
|
|
94
|
+
return {
|
|
95
|
+
skillCount: manifest.skills.length,
|
|
96
|
+
promptCount: manifest.agents.length,
|
|
97
|
+
activeSkillCount: manifest.skills.filter((s) => s.status === 'active').length,
|
|
98
|
+
activeAgentCount: manifest.agents.filter((a) => a.status === 'active').length,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/catalog/schema.ts"],"names":[],"mappings":"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"}
|