oh-my-copilot 4.13.2 → 4.13.21
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/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +1 -1
- package/bridge/cli.cjs +2522 -949
- package/bridge/mcp-server.cjs +97 -9
- package/bridge/runtime-cli.cjs +1256 -133
- package/bridge/team.js +1241 -65
- package/dist/__tests__/auto-slash-aliases.test.js +91 -0
- package/dist/__tests__/auto-slash-aliases.test.js.map +1 -1
- package/dist/__tests__/hud/labels.test.d.ts +2 -0
- package/dist/__tests__/hud/labels.test.d.ts.map +1 -0
- package/dist/__tests__/hud/labels.test.js +158 -0
- package/dist/__tests__/hud/labels.test.js.map +1 -0
- package/dist/__tests__/hud/render-rate-limits-priority.test.js +26 -0
- package/dist/__tests__/hud/render-rate-limits-priority.test.js.map +1 -1
- package/dist/__tests__/hud-marketplace-resolution.test.js +34 -0
- package/dist/__tests__/hud-marketplace-resolution.test.js.map +1 -1
- package/dist/__tests__/installer-hud-skip.test.js +6 -0
- package/dist/__tests__/installer-hud-skip.test.js.map +1 -1
- package/dist/__tests__/installer-omc-reference.test.js +1 -1
- package/dist/__tests__/installer-omc-reference.test.js.map +1 -1
- package/dist/__tests__/mnemosyne/detector.test.js +2 -0
- package/dist/__tests__/mnemosyne/detector.test.js.map +1 -1
- package/dist/__tests__/notepad.test.js +2 -2
- package/dist/__tests__/notepad.test.js.map +1 -1
- package/dist/__tests__/pre-tool-enforcer.test.js +84 -1
- package/dist/__tests__/pre-tool-enforcer.test.js.map +1 -1
- package/dist/__tests__/ralph-prd-mandatory.test.js +11 -1
- package/dist/__tests__/ralph-prd-mandatory.test.js.map +1 -1
- package/dist/__tests__/ralph-prd.test.js +40 -2
- package/dist/__tests__/ralph-prd.test.js.map +1 -1
- package/dist/__tests__/skills.test.js +363 -4
- package/dist/__tests__/skills.test.js.map +1 -1
- package/dist/__tests__/state-root-resolution.test.js +56 -6
- package/dist/__tests__/state-root-resolution.test.js.map +1 -1
- package/dist/autoresearch/__tests__/runtime.test.js +225 -28
- package/dist/autoresearch/__tests__/runtime.test.js.map +1 -1
- package/dist/autoresearch/runtime.d.ts.map +1 -1
- package/dist/autoresearch/runtime.js +9 -5
- package/dist/autoresearch/runtime.js.map +1 -1
- package/dist/cli/autoresearch.d.ts +1 -1
- package/dist/cli/autoresearch.d.ts.map +1 -1
- package/dist/cli/autoresearch.js +4 -4
- package/dist/cli/commands/team.d.ts +1 -0
- package/dist/cli/commands/team.d.ts.map +1 -1
- package/dist/cli/commands/team.js +14 -2
- package/dist/cli/commands/team.js.map +1 -1
- package/dist/cli/index.js +3 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/team.d.ts +6 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +23 -1
- package/dist/cli/team.js.map +1 -1
- package/dist/config/__tests__/loader.test.js.map +1 -1
- package/dist/features/boulder-state/constants.d.ts +1 -1
- package/dist/features/boulder-state/constants.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.d.ts.map +1 -1
- package/dist/features/builtin-skills/skills.js +11 -3
- package/dist/features/builtin-skills/skills.js.map +1 -1
- package/dist/features/builtin-skills/types.d.ts +7 -0
- package/dist/features/builtin-skills/types.d.ts.map +1 -1
- package/dist/features/magic-keywords.d.ts.map +1 -1
- package/dist/features/magic-keywords.js +30 -1
- package/dist/features/magic-keywords.js.map +1 -1
- package/dist/features/rate-limit-wait/tmux-detector.d.ts +4 -4
- package/dist/features/rate-limit-wait/tmux-detector.js +9 -9
- package/dist/features/rate-limit-wait/tmux-detector.js.map +1 -1
- package/dist/hooks/__tests__/bridge-routing.test.js +156 -0
- package/dist/hooks/__tests__/bridge-routing.test.js.map +1 -1
- package/dist/hooks/auto-slash-command/constants.d.ts.map +1 -1
- package/dist/hooks/auto-slash-command/constants.js +1 -0
- package/dist/hooks/auto-slash-command/constants.js.map +1 -1
- package/dist/hooks/auto-slash-command/executor.d.ts.map +1 -1
- package/dist/hooks/auto-slash-command/executor.js +29 -0
- package/dist/hooks/auto-slash-command/executor.js.map +1 -1
- package/dist/hooks/bridge.d.ts.map +1 -1
- package/dist/hooks/bridge.js +184 -1
- package/dist/hooks/bridge.js.map +1 -1
- package/dist/hooks/learner/detector.js +1 -1
- package/dist/hooks/mode-registry/__tests__/session-isolation.test.js +16 -0
- package/dist/hooks/mode-registry/__tests__/session-isolation.test.js.map +1 -1
- package/dist/hooks/notepad/index.d.ts +4 -1
- package/dist/hooks/notepad/index.d.ts.map +1 -1
- package/dist/hooks/notepad/index.js +7 -4
- package/dist/hooks/notepad/index.js.map +1 -1
- package/dist/hooks/persistent-mode/__tests__/ralph-verification-flow.test.js +70 -3
- package/dist/hooks/persistent-mode/__tests__/ralph-verification-flow.test.js.map +1 -1
- package/dist/hooks/persistent-mode/index.d.ts.map +1 -1
- package/dist/hooks/persistent-mode/index.js +10 -9
- package/dist/hooks/persistent-mode/index.js.map +1 -1
- package/dist/hooks/persistent-mode/stop-hook-blocking.test.js +64 -9
- package/dist/hooks/persistent-mode/stop-hook-blocking.test.js.map +1 -1
- package/dist/hooks/project-memory/__tests__/integration.test.js +117 -3
- package/dist/hooks/project-memory/__tests__/integration.test.js.map +1 -1
- package/dist/hooks/project-memory/__tests__/storage.test.js +11 -11
- package/dist/hooks/project-memory/__tests__/storage.test.js.map +1 -1
- package/dist/hooks/project-memory/index.d.ts.map +1 -1
- package/dist/hooks/project-memory/index.js +24 -12
- package/dist/hooks/project-memory/index.js.map +1 -1
- package/dist/hooks/ralph/index.d.ts +1 -1
- package/dist/hooks/ralph/index.d.ts.map +1 -1
- package/dist/hooks/ralph/index.js +1 -1
- package/dist/hooks/ralph/index.js.map +1 -1
- package/dist/hooks/ralph/loop.d.ts +6 -6
- package/dist/hooks/ralph/loop.d.ts.map +1 -1
- package/dist/hooks/ralph/loop.js +18 -18
- package/dist/hooks/ralph/loop.js.map +1 -1
- package/dist/hooks/ralph/prd.d.ts +23 -12
- package/dist/hooks/ralph/prd.d.ts.map +1 -1
- package/dist/hooks/ralph/prd.js +88 -42
- package/dist/hooks/ralph/prd.js.map +1 -1
- package/dist/hooks/session-end/__tests__/mode-state-cleanup.test.js +20 -0
- package/dist/hooks/session-end/__tests__/mode-state-cleanup.test.js.map +1 -1
- package/dist/hooks/session-end/index.d.ts +9 -0
- package/dist/hooks/session-end/index.d.ts.map +1 -1
- package/dist/hooks/session-end/index.js +67 -0
- package/dist/hooks/session-end/index.js.map +1 -1
- package/dist/hooks/skill-bridge.cjs +6 -5
- package/dist/hooks/skill-state/index.d.ts.map +1 -1
- package/dist/hooks/skill-state/index.js +1 -0
- package/dist/hooks/skill-state/index.js.map +1 -1
- package/dist/hud/__tests__/git-status.test.js +18 -0
- package/dist/hud/__tests__/git-status.test.js.map +1 -1
- package/dist/hud/elements/background.d.ts +3 -3
- package/dist/hud/elements/background.d.ts.map +1 -1
- package/dist/hud/elements/background.js +5 -4
- package/dist/hud/elements/background.js.map +1 -1
- package/dist/hud/elements/call-counts.d.ts +2 -2
- package/dist/hud/elements/call-counts.d.ts.map +1 -1
- package/dist/hud/elements/call-counts.js +7 -6
- package/dist/hud/elements/call-counts.js.map +1 -1
- package/dist/hud/elements/context.d.ts +3 -3
- package/dist/hud/elements/context.d.ts.map +1 -1
- package/dist/hud/elements/context.js +5 -4
- package/dist/hud/elements/context.js.map +1 -1
- package/dist/hud/elements/git.d.ts +2 -1
- package/dist/hud/elements/git.d.ts.map +1 -1
- package/dist/hud/elements/git.js +7 -6
- package/dist/hud/elements/git.js.map +1 -1
- package/dist/hud/elements/ralph.d.ts +2 -2
- package/dist/hud/elements/ralph.d.ts.map +1 -1
- package/dist/hud/elements/ralph.js +3 -2
- package/dist/hud/elements/ralph.js.map +1 -1
- package/dist/hud/elements/thinking.d.ts +2 -2
- package/dist/hud/elements/thinking.d.ts.map +1 -1
- package/dist/hud/elements/thinking.js +3 -2
- package/dist/hud/elements/thinking.js.map +1 -1
- package/dist/hud/elements/token-usage.d.ts +2 -2
- package/dist/hud/elements/token-usage.d.ts.map +1 -1
- package/dist/hud/elements/token-usage.js +3 -2
- package/dist/hud/elements/token-usage.js.map +1 -1
- package/dist/hud/render.d.ts.map +1 -1
- package/dist/hud/render.js +11 -10
- package/dist/hud/render.js.map +1 -1
- package/dist/hud/state.d.ts.map +1 -1
- package/dist/hud/state.js +18 -1
- package/dist/hud/state.js.map +1 -1
- package/dist/hud/types.d.ts +26 -0
- package/dist/hud/types.d.ts.map +1 -1
- package/dist/hud/types.js +58 -0
- package/dist/hud/types.js.map +1 -1
- package/dist/installer/__tests__/hud-cache-wrapper.test.d.ts +2 -0
- package/dist/installer/__tests__/hud-cache-wrapper.test.d.ts.map +1 -0
- package/dist/installer/__tests__/hud-cache-wrapper.test.js +235 -0
- package/dist/installer/__tests__/hud-cache-wrapper.test.js.map +1 -0
- package/dist/installer/__tests__/standalone-hook-reconcile.test.js +2 -0
- package/dist/installer/__tests__/standalone-hook-reconcile.test.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +19 -7
- package/dist/installer/index.js.map +1 -1
- package/dist/lib/__tests__/worktree-paths.test.js +162 -39
- package/dist/lib/__tests__/worktree-paths.test.js.map +1 -1
- package/dist/lib/worktree-paths.d.ts +87 -9
- package/dist/lib/worktree-paths.d.ts.map +1 -1
- package/dist/lib/worktree-paths.js +209 -27
- package/dist/lib/worktree-paths.js.map +1 -1
- package/dist/team/__tests__/auto-merge-restart.test.d.ts +2 -0
- package/dist/team/__tests__/auto-merge-restart.test.d.ts.map +1 -0
- package/dist/team/__tests__/auto-merge-restart.test.js +128 -0
- package/dist/team/__tests__/auto-merge-restart.test.js.map +1 -0
- package/dist/team/__tests__/auto-merge.perf.test.d.ts +2 -0
- package/dist/team/__tests__/auto-merge.perf.test.d.ts.map +1 -0
- package/dist/team/__tests__/auto-merge.perf.test.js +85 -0
- package/dist/team/__tests__/auto-merge.perf.test.js.map +1 -0
- package/dist/team/__tests__/conflict-mailbox.test.d.ts +2 -0
- package/dist/team/__tests__/conflict-mailbox.test.d.ts.map +1 -0
- package/dist/team/__tests__/conflict-mailbox.test.js +238 -0
- package/dist/team/__tests__/conflict-mailbox.test.js.map +1 -0
- package/dist/team/__tests__/helpers/git-fixture.d.ts +72 -0
- package/dist/team/__tests__/helpers/git-fixture.d.ts.map +1 -0
- package/dist/team/__tests__/helpers/git-fixture.js +252 -0
- package/dist/team/__tests__/helpers/git-fixture.js.map +1 -0
- package/dist/team/__tests__/leader-inbox.test.d.ts +2 -0
- package/dist/team/__tests__/leader-inbox.test.d.ts.map +1 -0
- package/dist/team/__tests__/leader-inbox.test.js +152 -0
- package/dist/team/__tests__/leader-inbox.test.js.map +1 -0
- package/dist/team/__tests__/merge-orchestrator.test.d.ts +2 -0
- package/dist/team/__tests__/merge-orchestrator.test.d.ts.map +1 -0
- package/dist/team/__tests__/merge-orchestrator.test.js +779 -0
- package/dist/team/__tests__/merge-orchestrator.test.js.map +1 -0
- package/dist/team/__tests__/rebase-smoke.test.d.ts +2 -0
- package/dist/team/__tests__/rebase-smoke.test.d.ts.map +1 -0
- package/dist/team/__tests__/rebase-smoke.test.js +272 -0
- package/dist/team/__tests__/rebase-smoke.test.js.map +1 -0
- package/dist/team/__tests__/runtime-cli.test.js +9 -1
- package/dist/team/__tests__/runtime-cli.test.js.map +1 -1
- package/dist/team/__tests__/runtime-v2.dispatch.test.js +150 -1
- package/dist/team/__tests__/runtime-v2.dispatch.test.js.map +1 -1
- package/dist/team/__tests__/teardown-invariant.test.d.ts +2 -0
- package/dist/team/__tests__/teardown-invariant.test.d.ts.map +1 -0
- package/dist/team/__tests__/teardown-invariant.test.js +176 -0
- package/dist/team/__tests__/teardown-invariant.test.js.map +1 -0
- package/dist/team/__tests__/worker-commit-cadence.test.d.ts +2 -0
- package/dist/team/__tests__/worker-commit-cadence.test.d.ts.map +1 -0
- package/dist/team/__tests__/worker-commit-cadence.test.js +315 -0
- package/dist/team/__tests__/worker-commit-cadence.test.js.map +1 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.d.ts +2 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.d.ts.map +1 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.js +182 -0
- package/dist/team/__tests__/worktree-runtime-e2e.test.js.map +1 -0
- package/dist/team/conflict-mailbox.d.ts +49 -0
- package/dist/team/conflict-mailbox.d.ts.map +1 -0
- package/dist/team/conflict-mailbox.js +98 -0
- package/dist/team/conflict-mailbox.js.map +1 -0
- package/dist/team/leader-inbox.d.ts +28 -0
- package/dist/team/leader-inbox.d.ts.map +1 -0
- package/dist/team/leader-inbox.js +68 -0
- package/dist/team/leader-inbox.js.map +1 -0
- package/dist/team/merge-coordinator.d.ts +6 -0
- package/dist/team/merge-coordinator.d.ts.map +1 -1
- package/dist/team/merge-coordinator.js +6 -2
- package/dist/team/merge-coordinator.js.map +1 -1
- package/dist/team/merge-orchestrator.d.ts +41 -0
- package/dist/team/merge-orchestrator.d.ts.map +1 -0
- package/dist/team/merge-orchestrator.js +736 -0
- package/dist/team/merge-orchestrator.js.map +1 -0
- package/dist/team/runtime-cli.d.ts +1 -0
- package/dist/team/runtime-cli.d.ts.map +1 -1
- package/dist/team/runtime-cli.js +15 -2
- package/dist/team/runtime-cli.js.map +1 -1
- package/dist/team/runtime-flags.d.ts +5 -0
- package/dist/team/runtime-flags.d.ts.map +1 -0
- package/dist/team/runtime-flags.js +12 -0
- package/dist/team/runtime-flags.js.map +1 -0
- package/dist/team/runtime-v2.d.ts +7 -1
- package/dist/team/runtime-v2.d.ts.map +1 -1
- package/dist/team/runtime-v2.js +185 -8
- package/dist/team/runtime-v2.js.map +1 -1
- package/dist/team/worker-bootstrap.d.ts +4 -0
- package/dist/team/worker-bootstrap.d.ts.map +1 -1
- package/dist/team/worker-bootstrap.js +10 -1
- package/dist/team/worker-bootstrap.js.map +1 -1
- package/dist/team/worker-commit-cadence.d.ts +70 -0
- package/dist/team/worker-commit-cadence.d.ts.map +1 -0
- package/dist/team/worker-commit-cadence.js +271 -0
- package/dist/team/worker-commit-cadence.js.map +1 -0
- package/dist/tools/__tests__/memory-tools.test.js +4 -4
- package/dist/tools/__tests__/memory-tools.test.js.map +1 -1
- package/dist/tools/__tests__/state-tools.test.js +13 -1
- package/dist/tools/__tests__/state-tools.test.js.map +1 -1
- package/docs/GETTING-STARTED.md +415 -0
- package/docs/MIGRATION.md +66 -66
- package/docs/REFERENCE.md +21 -4
- package/docs/company-context-interface.md +5 -16
- package/docs/copilot-instructions.md +1 -1
- package/package.json +1 -1
- package/scripts/lib/hud-cache-wrapper.sh +122 -0
- package/scripts/plugin-setup.mjs +10 -1
- package/scripts/post-tool-verifier.mjs +118 -5
- package/scripts/pre-tool-enforcer.mjs +54 -6
- package/scripts/session-start.mjs +171 -3
- package/skills/AGENTS.md +22 -91
- package/skills/ai-slop-cleaner/SKILL.md +118 -120
- package/skills/ask/SKILL.md +6 -8
- package/skills/autopilot/SKILL.md +1 -28
- package/skills/autoresearch/SKILL.md +5 -5
- package/skills/cancel/SKILL.md +13 -13
- package/skills/cccg/SKILL.md +1 -0
- package/skills/configure-notifications/SKILL.md +80 -215
- package/skills/debug/SKILL.md +3 -2
- package/skills/deep-dive/SKILL.md +20 -9
- package/skills/deep-interview/SKILL.md +32 -4
- package/skills/deepinit/SKILL.md +1 -0
- package/skills/external-context/SKILL.md +2 -1
- package/skills/hud/SKILL.md +22 -52
- package/skills/learner/SKILL.md +90 -57
- package/skills/mcp-setup/SKILL.md +45 -60
- package/skills/omc-doctor/SKILL.md +1 -1
- package/skills/omc-reference/SKILL.md +6 -6
- package/skills/omc-setup/SKILL.md +30 -74
- package/skills/omc-setup/phases/01-install-claude-md.md +97 -0
- package/skills/omc-setup/phases/02-configure.md +25 -40
- package/skills/omc-setup/phases/03-integrations.md +100 -69
- package/skills/omc-setup/phases/04-welcome.md +102 -44
- package/skills/omc-teams/SKILL.md +63 -26
- package/skills/plan/SKILL.md +11 -9
- package/skills/ralph/SKILL.md +42 -41
- package/skills/ralplan/SKILL.md +3 -10
- package/skills/release/SKILL.md +168 -57
- package/skills/remember/SKILL.md +2 -1
- package/skills/sciomc/SKILL.md +12 -11
- package/skills/self-improve/SKILL.md +4 -4
- package/skills/setup/SKILL.md +1 -0
- package/skills/skill/SKILL.md +21 -20
- package/skills/skillify/SKILL.md +34 -3
- package/skills/team/SKILL.md +62 -44
- package/skills/ultraqa/SKILL.md +1 -2
- package/skills/ultrawork/SKILL.md +28 -21
- package/skills/verify/SKILL.md +2 -1
- package/skills/writer-memory/SKILL.md +2 -1
- package/templates/hooks/pre-tool-use.mjs +144 -45
package/skills/team/SKILL.md
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: team
|
|
3
|
-
description: N coordinated agents on shared task list using
|
|
3
|
+
description: N coordinated agents on shared task list using Claude Code native teams
|
|
4
4
|
argument-hint: "[N:agent-type] [ralph] <task description>"
|
|
5
5
|
aliases: []
|
|
6
|
+
level: 4
|
|
6
7
|
---
|
|
7
8
|
|
|
8
9
|
# Team Skill
|
|
9
10
|
|
|
10
|
-
Spawn N coordinated agents working on a shared task list using
|
|
11
|
+
Spawn N coordinated agents working on a shared task list using Claude Code's native team tools. Replaces the legacy `/swarm` skill (SQLite-based) with built-in team management, inter-agent messaging, and task dependencies -- no external dependencies required.
|
|
11
12
|
|
|
12
13
|
The `swarm` compatibility alias was removed in #1131.
|
|
13
14
|
|
|
@@ -38,7 +39,7 @@ The `swarm` compatibility alias was removed in #1131.
|
|
|
38
39
|
/team 2:codex "review architecture and suggest improvements"
|
|
39
40
|
# With Gemini CLI workers (requires: npm install -g @google/gemini-cli)
|
|
40
41
|
/team 2:gemini "redesign the UI components"
|
|
41
|
-
# Mixed: Codex for backend analysis, Gemini for frontend (use /
|
|
42
|
+
# Mixed: Codex for backend analysis, Gemini for frontend (use /ccg instead for this)
|
|
42
43
|
```
|
|
43
44
|
|
|
44
45
|
## Architecture
|
|
@@ -76,9 +77,9 @@ User: "/team 3:executor fix all TypeScript errors"
|
|
|
76
77
|
-> rm .omcp/state/team-state.json
|
|
77
78
|
```
|
|
78
79
|
|
|
79
|
-
**Storage layout (managed by
|
|
80
|
+
**Storage layout (managed by Claude Code):**
|
|
80
81
|
```
|
|
81
|
-
~/.
|
|
82
|
+
~/.claude/
|
|
82
83
|
teams/fix-ts-errors/
|
|
83
84
|
config.json # Team metadata + members array
|
|
84
85
|
tasks/fix-ts-errors/
|
|
@@ -110,7 +111,7 @@ Each pipeline stage uses **specialized agents** -- not just executors. The lead
|
|
|
110
111
|
**Routing rules:**
|
|
111
112
|
|
|
112
113
|
1. **The lead picks agents per stage, not the user.** The user's `N:agent-type` parameter only overrides the `team-exec` stage worker type. All other stages use stage-appropriate specialists.
|
|
113
|
-
2. **Specialist agents complement executor agents.** Route analysis/review to architect/critic
|
|
114
|
+
2. **Specialist agents complement executor agents.** Route analysis/review to architect/critic Claude agents and UI work to designer agents. Tmux CLI workers are one-shot and don't participate in team communication.
|
|
114
115
|
3. **Cost mode affects model tier.** In downgrade: `opus` agents to `sonnet`, `sonnet` to `haiku` where quality permits. `team-verify` always uses at least `sonnet`.
|
|
115
116
|
4. **Risk level escalates review.** Security-sensitive or >20 file changes must include `security-reviewer` + `code-reviewer` (opus) in `team-verify`.
|
|
116
117
|
|
|
@@ -221,7 +222,7 @@ Call `TeamCreate` with a slug derived from the task:
|
|
|
221
222
|
```json
|
|
222
223
|
{
|
|
223
224
|
"team_name": "fix-ts-errors",
|
|
224
|
-
"team_file_path": "~/.
|
|
225
|
+
"team_file_path": "~/.claude/teams/fix-ts-errors/config.json",
|
|
225
226
|
"lead_agent_id": "team-lead@fix-ts-errors"
|
|
226
227
|
}
|
|
227
228
|
```
|
|
@@ -477,7 +478,7 @@ Do NOT mark the task as completed. Leave it in_progress so the lead can reassign
|
|
|
477
478
|
== RULES ==
|
|
478
479
|
- NEVER spawn sub-agents or use the Task tool
|
|
479
480
|
- NEVER run tmux pane/session orchestration commands (for example `tmux split-window`, `tmux new-session`)
|
|
480
|
-
- NEVER run team spawning/orchestration skills or commands (for example `$team`, `$ultrawork`, `$autopilot`, `$ralph`, `
|
|
481
|
+
- NEVER run team spawning/orchestration skills or commands (for example `$team`, `$ultrawork`, `$autopilot`, `$ralph`, `omc team ...`, `omx team ...`)
|
|
481
482
|
- ALWAYS use absolute file paths
|
|
482
483
|
- ALWAYS report progress via SendMessage to "team-lead"
|
|
483
484
|
- Use SendMessage with type "message" only -- never "broadcast"
|
|
@@ -488,7 +489,7 @@ Do NOT mark the task as completed. Leave it in_progress so the lead can reassign
|
|
|
488
489
|
When composing teammate prompts, append a short addendum based on worker type:
|
|
489
490
|
|
|
490
491
|
- `claude_worker`: Emphasize strict TaskList/TaskUpdate/SendMessage loop and no orchestration commands.
|
|
491
|
-
- `codex_worker`: Emphasize CLI API lifecycle (`
|
|
492
|
+
- `codex_worker`: Emphasize CLI API lifecycle (`omc team api ... --json`) and explicit failure ACKs with stderr.
|
|
492
493
|
- `gemini_worker`: Emphasize bounded file ownership and milestone ACKs after each completed sub-step.
|
|
493
494
|
|
|
494
495
|
This addendum must preserve the core rule: **worker = executor only, never leader/orchestrator**.
|
|
@@ -575,7 +576,7 @@ After approval:
|
|
|
575
576
|
|
|
576
577
|
Check for agent processes that survived TeamDelete:
|
|
577
578
|
```bash
|
|
578
|
-
node "${
|
|
579
|
+
node "${CLAUDE_PLUGIN_ROOT}/scripts/cleanup-orphans.mjs" --team-name fix-ts-errors
|
|
579
580
|
```
|
|
580
581
|
|
|
581
582
|
This scans for processes matching the team name whose config no longer exists, and terminates them (SIGTERM → 5s wait → SIGKILL). Supports `--dry-run` for inspection.
|
|
@@ -588,7 +589,7 @@ This scans for processes matching the team name whose config no longer exists, a
|
|
|
588
589
|
|
|
589
590
|
## CLI Workers (Codex and Gemini)
|
|
590
591
|
|
|
591
|
-
The team skill supports **hybrid execution** combining
|
|
592
|
+
The team skill supports **hybrid execution** combining Claude agent teammates with external CLI workers (Codex CLI and Gemini CLI). Both types can make code changes -- they differ in capabilities and cost. These are standalone CLI tools, not MCP servers.
|
|
592
593
|
|
|
593
594
|
### Execution Modes
|
|
594
595
|
|
|
@@ -596,7 +597,7 @@ Tasks are tagged with an execution mode during decomposition:
|
|
|
596
597
|
|
|
597
598
|
| Execution Mode | Provider | Capabilities |
|
|
598
599
|
|---------------|----------|-------------|
|
|
599
|
-
| `claude_worker` |
|
|
600
|
+
| `claude_worker` | Claude agent | Full Claude Code tool access (Read/Write/Edit/Bash/Task). Best for tasks needing Claude's reasoning + iterative tool use. |
|
|
600
601
|
| `codex_worker` | Codex CLI (tmux pane) | Full filesystem access in working_directory. Runs autonomously via tmux pane. Best for code review, security analysis, refactoring, architecture. Requires `npm install -g @openai/codex`. |
|
|
601
602
|
| `gemini_worker` | Gemini CLI (tmux pane) | Full filesystem access in working_directory. Runs autonomously via tmux pane. Best for UI/design work, documentation, large-context tasks. Requires `npm install -g @google/gemini-cli`. |
|
|
602
603
|
|
|
@@ -610,8 +611,8 @@ Tmux CLI workers run in dedicated tmux panes with filesystem access. They are **
|
|
|
610
611
|
4. Results/summary are written to an output file
|
|
611
612
|
5. Lead reads the output, marks the task complete, and feeds results to dependent tasks
|
|
612
613
|
|
|
613
|
-
**Key difference from
|
|
614
|
-
- CLI workers operate via tmux, not
|
|
614
|
+
**Key difference from Claude teammates:**
|
|
615
|
+
- CLI workers operate via tmux, not Claude Code's tool system
|
|
615
616
|
- They cannot use TaskList/TaskUpdate/SendMessage (no team awareness)
|
|
616
617
|
- They run as one-shot autonomous jobs, not persistent teammates
|
|
617
618
|
- The lead manages their lifecycle (spawn, monitor, collect results)
|
|
@@ -620,14 +621,14 @@ Tmux CLI workers run in dedicated tmux panes with filesystem access. They are **
|
|
|
620
621
|
|
|
621
622
|
| Task Type | Best Route | Why |
|
|
622
623
|
|-----------|-----------|-----|
|
|
623
|
-
| Iterative multi-step work |
|
|
624
|
+
| Iterative multi-step work | Claude teammate | Needs tool-mediated iteration + team communication |
|
|
624
625
|
| Code review / security audit | CLI worker or specialist agent | Autonomous execution, good at structured analysis |
|
|
625
|
-
| Architecture analysis / planning | architect
|
|
626
|
+
| Architecture analysis / planning | architect Claude agent | Strong analytical reasoning with codebase access |
|
|
626
627
|
| Refactoring (well-scoped) | CLI worker or executor agent | Autonomous execution, good at structured transforms |
|
|
627
|
-
| UI/frontend implementation | designer
|
|
628
|
-
| Large-scale documentation | writer
|
|
629
|
-
| Build/test iteration loops |
|
|
630
|
-
| Tasks needing team coordination |
|
|
628
|
+
| UI/frontend implementation | designer Claude agent | Design expertise, framework idioms |
|
|
629
|
+
| Large-scale documentation | writer Claude agent | Writing expertise + large context for consistency |
|
|
630
|
+
| Build/test iteration loops | Claude teammate | Needs Bash tool + iterative fix cycles |
|
|
631
|
+
| Tasks needing team coordination | Claude teammate | Needs SendMessage for status updates |
|
|
631
632
|
|
|
632
633
|
### Example: Hybrid Team with CLI Workers
|
|
633
634
|
|
|
@@ -642,13 +643,13 @@ Task decomposition:
|
|
|
642
643
|
#5 [gemini_worker] Final code review of all changes
|
|
643
644
|
```
|
|
644
645
|
|
|
645
|
-
The lead runs #1 (Codex security analysis), then #2 and #3 in parallel (Codex refactors backend, designer agent redesigns frontend), then #4 (
|
|
646
|
+
The lead runs #1 (Codex security analysis), then #2 and #3 in parallel (Codex refactors backend, designer agent redesigns frontend), then #4 (Claude teammate handles test iteration), then #5 (Gemini final review).
|
|
646
647
|
|
|
647
648
|
### Pre-flight Analysis (Optional)
|
|
648
649
|
|
|
649
650
|
For large ambiguous tasks, run analysis before team creation:
|
|
650
651
|
|
|
651
|
-
1. Spawn `Task(subagent_type="oh-my-copilot:planner",
|
|
652
|
+
1. Spawn `Task(subagent_type="oh-my-copilot:planner", ...)` with task description + codebase context
|
|
652
653
|
2. Use the analysis to produce better task decomposition
|
|
653
654
|
3. Create team and tasks with enriched context
|
|
654
655
|
|
|
@@ -712,18 +713,7 @@ if (status.taskSummary.pending === 0 && status.taskSummary.inProgress === 0) {
|
|
|
712
713
|
| `shutdown_ack` | Worker acknowledged shutdown -- safe to remove from team |
|
|
713
714
|
| `heartbeat` | Update liveness tracking (redundant with heartbeat files but useful for latency monitoring) |
|
|
714
715
|
|
|
715
|
-
This approach complements the existing `SendMessage`-based communication by providing a pull-based mechanism for MCP workers that cannot use
|
|
716
|
-
|
|
717
|
-
## Failure Recovery
|
|
718
|
-
|
|
719
|
-
When a teammate agent fails, the structured recovery manager classifies the failure and determines the action:
|
|
720
|
-
- **rate_limited**: Retry with exponential backoff
|
|
721
|
-
- **auth_failure**: Escalate immediately (needs user credentials/permissions)
|
|
722
|
-
- **build_error**: Retry with additional context about the error
|
|
723
|
-
- **circular_fix**: Stop retrying and generate escalation report
|
|
724
|
-
- **unknown**: Retry up to 3 times, then escalate
|
|
725
|
-
|
|
726
|
-
The recovery manager integrates with the circular fix detector — if the same error recurs 3+ times across iterations, it escalates rather than continuing to retry.
|
|
716
|
+
This approach complements the existing `SendMessage`-based communication by providing a pull-based mechanism for MCP workers that cannot use Claude Code's team messaging tools.
|
|
727
717
|
|
|
728
718
|
## Error Handling
|
|
729
719
|
|
|
@@ -822,13 +812,13 @@ This prevents duplicate teams and allows graceful recovery from lead failures.
|
|
|
822
812
|
|
|
823
813
|
| Aspect | Team (Native) | Swarm (Legacy SQLite) |
|
|
824
814
|
|--------|--------------|----------------------|
|
|
825
|
-
| **Storage** | JSON files in `~/.
|
|
815
|
+
| **Storage** | JSON files in `~/.claude/teams/` and `~/.claude/tasks/` | SQLite in `.omcp/state/swarm.db` |
|
|
826
816
|
| **Dependencies** | `better-sqlite3` not needed | Requires `better-sqlite3` npm package |
|
|
827
817
|
| **Task claiming** | `TaskUpdate(owner + in_progress)` -- lead pre-assigns | SQLite IMMEDIATE transaction -- atomic |
|
|
828
818
|
| **Race conditions** | Possible if two agents claim same task (mitigate by pre-assigning) | None (SQLite transactions) |
|
|
829
819
|
| **Communication** | `SendMessage` (DM, broadcast, shutdown) | None (fire-and-forget agents) |
|
|
830
820
|
| **Task dependencies** | Built-in `blocks` / `blockedBy` arrays | Not supported |
|
|
831
|
-
| **Heartbeat** | Automatic idle notifications from
|
|
821
|
+
| **Heartbeat** | Automatic idle notifications from Claude Code | Manual heartbeat table + polling |
|
|
832
822
|
| **Shutdown** | Graceful request/response protocol | Signal-based termination |
|
|
833
823
|
| **Agent lifecycle** | Auto-tracked via internal tasks + config members | Manual tracking via heartbeat table |
|
|
834
824
|
| **Progress visibility** | `TaskList` shows live status with owner | SQL queries on tasks table |
|
|
@@ -836,7 +826,7 @@ This prevents duplicate teams and allows graceful recovery from lead failures.
|
|
|
836
826
|
| **Crash recovery** | Lead detects via missing messages, reassigns | Auto-release after 5-min lease timeout |
|
|
837
827
|
| **State cleanup** | `TeamDelete` removes everything | Manual `rm` of SQLite database |
|
|
838
828
|
|
|
839
|
-
**When to use Team over Swarm:** Always prefer `/team` for new work. It uses
|
|
829
|
+
**When to use Team over Swarm:** Always prefer `/team` for new work. It uses Claude Code's built-in infrastructure, requires no external dependencies, supports inter-agent communication, and has task dependency management.
|
|
840
830
|
|
|
841
831
|
## Cancellation
|
|
842
832
|
|
|
@@ -857,7 +847,7 @@ When team is linked to ralph, cancellation follows dependency order:
|
|
|
857
847
|
- **Cancel triggered from Team context:** Clear Team state, then mark Ralph as cancelled. Ralph's stop hook will detect the missing team and stop iterating.
|
|
858
848
|
- **Force cancel (`--force`):** Clears both `team` and `ralph` state unconditionally via `state_clear`.
|
|
859
849
|
|
|
860
|
-
If teammates are unresponsive, `TeamDelete` may fail. In that case, the cancel skill should wait briefly and retry, or inform the user to manually clean up `~/.
|
|
850
|
+
If teammates are unresponsive, `TeamDelete` may fail. In that case, the cancel skill should wait briefly and retry, or inform the user to manually clean up `~/.claude/teams/{team_name}/` and `~/.claude/tasks/{team_name}/`.
|
|
861
851
|
|
|
862
852
|
## Runtime V2 (Event-Driven)
|
|
863
853
|
|
|
@@ -882,7 +872,7 @@ When `OMC_TEAM_SCALING_ENABLED=1` is set, the team supports mid-session scaling:
|
|
|
882
872
|
|
|
883
873
|
## Configuration
|
|
884
874
|
|
|
885
|
-
Optional settings live in `.copilot/omg.jsonc` (project) or `~/.config/copilot-omg/config.jsonc` (user). Project values override user values; `
|
|
875
|
+
Optional settings live in `.copilot/omg.jsonc` (project) or `~/.config/copilot-omg/config.jsonc` (user). Project values override user values; `OMC_TEAM_ROLE_OVERRIDES` (env JSON) supersedes both.
|
|
886
876
|
|
|
887
877
|
```jsonc
|
|
888
878
|
{
|
|
@@ -902,7 +892,7 @@ Optional settings live in `.copilot/omg.jsonc` (project) or `~/.config/copilot-o
|
|
|
902
892
|
- **ops.monitorIntervalMs** - How often to poll `TaskList` (default: 30s)
|
|
903
893
|
- **ops.shutdownTimeoutMs** - How long to wait for shutdown responses (default: 15s)
|
|
904
894
|
|
|
905
|
-
> **Note:** Team members do not have a hardcoded model default. Each teammate is a separate
|
|
895
|
+
> **Note:** Team members do not have a hardcoded model default. Each teammate is a separate Claude Code session that inherits the user's configured model. Since teammates can spawn their own subagents, the session model acts as the orchestration layer while subagents can use any model tier.
|
|
906
896
|
|
|
907
897
|
## Per-Role Provider & Model Routing
|
|
908
898
|
|
|
@@ -945,13 +935,41 @@ Declare which provider (`claude`, `codex`, `gemini`) and which model tier should
|
|
|
945
935
|
|
|
946
936
|
User-friendly aliases normalize via `normalizeDelegationRole()` — e.g. `reviewer` → `code-reviewer`, `quality-reviewer` → `code-reviewer`, `harsh-critic` → `critic`, `build-fixer` → `debugger`. Accepted alias keys are honored during resolved snapshot creation and later stage routing, not just validation. Unknown roles fail validation at parse time.
|
|
947
937
|
|
|
938
|
+
### Spec fields (`TeamRoleAssignmentSpec`)
|
|
939
|
+
|
|
940
|
+
- **provider** — `"claude" | "codex" | "gemini"`. Omitted → defaults to `claude`.
|
|
941
|
+
- **model** — tier name (`"HIGH" | "MEDIUM" | "LOW"`) or an explicit model ID. Tiers resolve through `routing.tierModels`.
|
|
942
|
+
- **agent** — optional Claude agent name (e.g. `"critic"`, `"executor"`). Only honored when the resolved provider is `claude`.
|
|
943
|
+
|
|
944
|
+
`orchestrator` is pinned to `claude`; only `model` is user-configurable. Any other key on `orchestrator` is rejected by the validator.
|
|
945
|
+
|
|
946
|
+
### Env override
|
|
947
|
+
|
|
948
|
+
```bash
|
|
949
|
+
OMC_TEAM_ROLE_OVERRIDES='{"critic":{"provider":"codex"},"code-reviewer":{"provider":"gemini"}}'
|
|
950
|
+
```
|
|
951
|
+
|
|
952
|
+
Precedence: `OMC_TEAM_ROLE_OVERRIDES` > `.copilot/omg.jsonc` (project) > `~/.config/copilot-omg/config.jsonc` (user) > built-in defaults. Invalid JSON logs a warning and is ignored — env overrides are best-effort and never abort the run.
|
|
953
|
+
|
|
954
|
+
### Fallback when a CLI is missing
|
|
955
|
+
|
|
956
|
+
If the CLI for a configured provider is absent from `PATH` at spawn time, `buildLaunchArgs()` throws, the team lead emits a visible `SendMessage` warning, and the runtime falls back to a deterministic Claude assignment pre-computed by `buildResolvedRoutingSnapshot` (same tier + same agent, `provider: "claude"`). Fallback is loud by design — silent fallback is a test failure. Probe provider availability with `omc doctor --team-routing`.
|
|
957
|
+
|
|
958
|
+
### Stickiness — resolved once, reused everywhere
|
|
959
|
+
|
|
960
|
+
Resolved routing is immutable per team. Editing config mid-team-lifetime does not affect running teams; a new `/team` invocation picks up the new mapping. This guarantees that spawn, scale-up, and worker-restart all see identical routing, including across worktree detaches (the snapshot travels with `TeamConfig`).
|
|
961
|
+
|
|
962
|
+
### Zero-config behavior
|
|
963
|
+
|
|
964
|
+
An empty `team.roleRouting` preserves pre-patch behavior: every worker is Claude, model tiers follow `routing.tierModels`, and `/team 3:executor ...` still spawns three Claude Sonnet executors.
|
|
965
|
+
|
|
948
966
|
## State Cleanup
|
|
949
967
|
|
|
950
968
|
On successful completion:
|
|
951
969
|
|
|
952
|
-
1. `TeamDelete` handles all
|
|
953
|
-
- Removes `~/.
|
|
954
|
-
- Removes `~/.
|
|
970
|
+
1. `TeamDelete` handles all Claude Code state:
|
|
971
|
+
- Removes `~/.claude/teams/{team_name}/` (config)
|
|
972
|
+
- Removes `~/.claude/tasks/{team_name}/` (all task files + lock)
|
|
955
973
|
2. OMC state cleanup via MCP tools:
|
|
956
974
|
```
|
|
957
975
|
state_clear(mode="team")
|
|
@@ -1019,4 +1037,4 @@ MCP workers can operate in isolated git worktrees to prevent file conflicts betw
|
|
|
1019
1037
|
|
|
1020
1038
|
10. **Broadcast is expensive** -- Each broadcast sends a separate message to every teammate. Use `message` (DM) by default. Only broadcast for truly team-wide critical alerts.
|
|
1021
1039
|
|
|
1022
|
-
11. **CLI workers are one-shot, not persistent** -- Tmux CLI workers have full filesystem access and CAN make code changes. However, they run as autonomous one-shot jobs -- they cannot use TaskList/TaskUpdate/SendMessage. The lead must manage their lifecycle: write prompt_file, spawn CLI worker, read output_file, mark task complete. They don't participate in team communication like
|
|
1040
|
+
11. **CLI workers are one-shot, not persistent** -- Tmux CLI workers have full filesystem access and CAN make code changes. However, they run as autonomous one-shot jobs -- they cannot use TaskList/TaskUpdate/SendMessage. The lead must manage their lifecycle: write prompt_file, spawn CLI worker, read output_file, mark task complete. They don't participate in team communication like Claude teammates do.
|
package/skills/ultraqa/SKILL.md
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: ultraqa
|
|
3
3
|
description: QA cycling workflow - test, verify, fix, repeat until goal met
|
|
4
4
|
argument-hint: "[--tests|--build|--lint|--typecheck|--custom <pattern>] [--interactive]"
|
|
5
|
+
level: 3
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# UltraQA Skill
|
|
@@ -75,7 +76,6 @@ If no structured goal provided, interpret the argument as a custom goal.
|
|
|
75
76
|
| **Goal Met** | Exit with success: "ULTRAQA COMPLETE: Goal met after N cycles" |
|
|
76
77
|
| **Cycle 5 Reached** | Exit with diagnosis: "ULTRAQA STOPPED: Max cycles. Diagnosis: ..." |
|
|
77
78
|
| **Same Failure 3x** | Exit early: "ULTRAQA STOPPED: Same failure detected 3 times. Root cause: ..." |
|
|
78
|
-
| **Circular Fix Detected** | Exit with escalation report: Generate structured report at `.omcp/escalation-report.md` with error pattern hash, occurrence count, error timeline, and recommended manual interventions. Set ultraqa state to stopped. |
|
|
79
79
|
| **Environment Error** | Exit: "ULTRAQA ERROR: [tmux/port/dependency issue]" |
|
|
80
80
|
|
|
81
81
|
## Observability
|
|
@@ -118,7 +118,6 @@ User can cancel with `/oh-my-copilot:cancel` which clears the state file.
|
|
|
118
118
|
3. **EARLY EXIT on pattern** - 3x same failure = stop and surface
|
|
119
119
|
4. **CLEAR OUTPUT** - User should always know current cycle and status
|
|
120
120
|
5. **CLEAN UP** - Clear state file on completion or cancellation
|
|
121
|
-
6. **CIRCULAR FIX DETECTION** - The system tracks error hashes across cycles. If the same normalized error appears 3+ times within a 2-hour window, stop immediately and generate an escalation report at `.omcp/escalation-report.md` instead of continuing to retry. This prevents wasting cycles on fundamentally broken fixes.
|
|
122
121
|
|
|
123
122
|
## STATE CLEANUP ON COMPLETION
|
|
124
123
|
|
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
name: ultrawork
|
|
3
3
|
description: Parallel execution engine for high-throughput task completion
|
|
4
4
|
argument-hint: "<task description with parallel work items>"
|
|
5
|
+
level: 4
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
<Purpose>
|
|
8
|
-
Ultrawork is a parallel execution engine
|
|
9
|
+
Ultrawork is a parallel execution engine and execution protocol for independent work. It emphasizes intent grounding, parallel context gathering, dependency-aware task graphs for non-trivial work, and concise evidence-backed execution summaries. It is a component, not a standalone persistence mode -- it provides parallelism and routing guidance, but not persistence, verification loops, or long-lived state management.
|
|
9
10
|
</Purpose>
|
|
10
11
|
|
|
11
12
|
<Use_When>
|
|
@@ -28,26 +29,38 @@ Sequential task execution wastes time when tasks are independent. Ultrawork enab
|
|
|
28
29
|
|
|
29
30
|
<Execution_Policy>
|
|
30
31
|
- Fire all independent agent calls simultaneously -- never serialize independent work
|
|
31
|
-
- **Stagger parallel launches**: When firing N parallel tasks, stagger launches by 1 second between each (e.g., fire task 1, wait 1s, fire task 2, wait 1s, fire task 3). This prevents thundering herd rate limits. The system will inject stagger advisories if launches are too rapid.
|
|
32
32
|
- Always pass the `model` parameter explicitly when delegating
|
|
33
33
|
- Read `docs/shared/agent-tiers.md` before first delegation for agent selection guidance
|
|
34
34
|
- Use `run_in_background: true` for operations over ~30 seconds (installs, builds, tests)
|
|
35
35
|
- Run quick commands (git status, file reads, simple checks) in the foreground
|
|
36
|
+
- Resolve intent and uncertainty before implementation; explore first, ask only when still blocked
|
|
37
|
+
- For non-trivial tasks, produce a dependency-aware plan with parallel waves before execution
|
|
38
|
+
- Keep delegated-task reports concise: short summary, files touched, verification status, blockers
|
|
39
|
+
- Manual QA is required for implemented behavior, not just diagnostics
|
|
36
40
|
</Execution_Policy>
|
|
37
41
|
|
|
38
42
|
<Steps>
|
|
39
43
|
1. **Read agent reference**: Load `docs/shared/agent-tiers.md` for tier selection
|
|
40
|
-
2. **
|
|
41
|
-
3. **
|
|
44
|
+
2. **Ground intent first**: Confirm whether the request is implementation, investigation, evaluation, or research; do not code before that is clear
|
|
45
|
+
3. **Gather context in parallel**:
|
|
46
|
+
- direct tools for quick reads/searches
|
|
47
|
+
- exploration/docs agents for broad context
|
|
48
|
+
4. **Classify tasks by independence**: Identify which tasks can run in parallel vs which have dependencies
|
|
49
|
+
5. **Create a task graph for non-trivial work**:
|
|
50
|
+
- Parallel Execution Waves
|
|
51
|
+
- Dependency Matrix
|
|
52
|
+
- acceptance criteria and verification steps per task
|
|
53
|
+
6. **Route to correct tiers**:
|
|
42
54
|
- Simple lookups/definitions: LOW tier (Haiku)
|
|
43
55
|
- Standard implementation: MEDIUM tier (Sonnet)
|
|
44
56
|
- Complex analysis/refactoring: HIGH tier (Opus)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
57
|
+
7. **Fire independent tasks simultaneously**: Launch all parallel-safe tasks at once
|
|
58
|
+
8. **Run dependent tasks sequentially**: Wait for prerequisites before launching dependent work
|
|
59
|
+
9. **Background long operations**: Builds, installs, and test suites use `run_in_background: true`
|
|
60
|
+
10. **Verify when all tasks complete** (lightweight):
|
|
49
61
|
- Build/typecheck passes
|
|
50
62
|
- Affected tests pass
|
|
63
|
+
- Manual QA completed for implemented behavior
|
|
51
64
|
- No new errors introduced
|
|
52
65
|
</Steps>
|
|
53
66
|
|
|
@@ -63,9 +76,9 @@ Sequential task execution wastes time when tasks are independent. Ultrawork enab
|
|
|
63
76
|
<Good>
|
|
64
77
|
Three independent tasks fired simultaneously:
|
|
65
78
|
```
|
|
66
|
-
Task(subagent_type="oh-my-copilot:executor", model="haiku",
|
|
67
|
-
Task(subagent_type="oh-my-copilot:executor", model="sonnet",
|
|
68
|
-
Task(subagent_type="oh-my-copilot:executor", model="sonnet",
|
|
79
|
+
Task(subagent_type="oh-my-copilot:executor", model="haiku", prompt="Add missing type export for Config interface")
|
|
80
|
+
Task(subagent_type="oh-my-copilot:executor", model="sonnet", prompt="Implement the /api/users endpoint with validation")
|
|
81
|
+
Task(subagent_type="oh-my-copilot:executor", model="sonnet", prompt="Add integration tests for the auth middleware")
|
|
69
82
|
```
|
|
70
83
|
Why good: Independent tasks at appropriate tiers, all fired at once.
|
|
71
84
|
</Good>
|
|
@@ -73,8 +86,8 @@ Why good: Independent tasks at appropriate tiers, all fired at once.
|
|
|
73
86
|
<Good>
|
|
74
87
|
Correct use of background execution:
|
|
75
88
|
```
|
|
76
|
-
Task(subagent_type="oh-my-copilot:executor", model="sonnet",
|
|
77
|
-
Task(subagent_type="oh-my-copilot:executor", model="haiku",
|
|
89
|
+
Task(subagent_type="oh-my-copilot:executor", model="sonnet", prompt="npm install && npm run build", run_in_background=true)
|
|
90
|
+
Task(subagent_type="oh-my-copilot:executor", model="haiku", prompt="Update the README with new API endpoints")
|
|
78
91
|
```
|
|
79
92
|
Why good: Long build runs in background while short task runs in foreground.
|
|
80
93
|
</Good>
|
|
@@ -92,7 +105,7 @@ Why bad: These tasks are independent. Running them sequentially wastes time.
|
|
|
92
105
|
<Bad>
|
|
93
106
|
Wrong tier selection:
|
|
94
107
|
```
|
|
95
|
-
Task(subagent_type="oh-my-copilot:executor", model="opus",
|
|
108
|
+
Task(subagent_type="oh-my-copilot:executor", model="opus", prompt="Add a missing semicolon")
|
|
96
109
|
```
|
|
97
110
|
Why bad: Opus is expensive overkill for a trivial fix. Use executor with Haiku instead.
|
|
98
111
|
</Bad>
|
|
@@ -101,7 +114,7 @@ Why bad: Opus is expensive overkill for a trivial fix. Use executor with Haiku i
|
|
|
101
114
|
<Escalation_And_Stop_Conditions>
|
|
102
115
|
- When ultrawork is invoked directly (not via ralph), apply lightweight verification only -- build passes, tests pass, no new errors
|
|
103
116
|
- For full persistence and comprehensive architect verification, recommend switching to `ralph` mode
|
|
104
|
-
- If a task fails
|
|
117
|
+
- If a task fails repeatedly across retries, report the issue rather than retrying indefinitely
|
|
105
118
|
- Escalate to the user when tasks have unclear dependencies or conflicting requirements
|
|
106
119
|
</Escalation_And_Stop_Conditions>
|
|
107
120
|
|
|
@@ -126,10 +139,4 @@ autopilot (autonomous execution)
|
|
|
126
139
|
```
|
|
127
140
|
|
|
128
141
|
Ultrawork is the parallelism layer. Ralph adds persistence and verification. Autopilot adds the full lifecycle pipeline.
|
|
129
|
-
|
|
130
|
-
## Stagger Delay
|
|
131
|
-
|
|
132
|
-
When launching multiple parallel agents, a 1-second stagger delay is applied between launches to prevent rate limiting. This is advisory — the system injects guidance when rapid-fire Task calls are detected.
|
|
133
|
-
|
|
134
|
-
Configuration: The stagger delay can be customized via the `stagger_delay_ms` field in ultrawork state (default: 1000ms).
|
|
135
142
|
</Advanced>
|
package/skills/verify/SKILL.md
CHANGED
|
@@ -8,7 +8,7 @@ description: Verify that a change really works before you claim completion
|
|
|
8
8
|
Use this skill when the user wants confidence that a feature, fix, or refactor actually works.
|
|
9
9
|
|
|
10
10
|
## Goal
|
|
11
|
-
Turn vague
|
|
11
|
+
Turn vague “it should work” claims into concrete evidence.
|
|
12
12
|
|
|
13
13
|
## Workflow
|
|
14
14
|
1. Identify the exact behavior that must be proven.
|
|
@@ -34,3 +34,4 @@ Turn vague "it should work" claims into concrete evidence.
|
|
|
34
34
|
- Which commands/tests were run
|
|
35
35
|
- What passed
|
|
36
36
|
- What failed or remains unverified
|
|
37
|
+
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
name: writer-memory
|
|
3
3
|
description: Agentic memory system for writers - track characters, relationships, scenes, and themes
|
|
4
4
|
argument-hint: "init|char|rel|scene|query|validate|synopsis|status|export [args]"
|
|
5
|
+
level: 7
|
|
5
6
|
---
|
|
6
7
|
|
|
7
8
|
# Writer Memory - Agentic Memory System for Writers
|
|
@@ -10,7 +11,7 @@ Persistent memory system designed for creative writers, with first-class support
|
|
|
10
11
|
|
|
11
12
|
## Overview
|
|
12
13
|
|
|
13
|
-
Writer Memory maintains context across
|
|
14
|
+
Writer Memory maintains context across Claude sessions for fiction writers. It tracks:
|
|
14
15
|
|
|
15
16
|
- **Characters (캐릭터)**: Emotional arcs (감정궤도), attitudes (태도), dialogue tone (대사톤), speech levels
|
|
16
17
|
- **World (세계관)**: Settings, rules, atmosphere, constraints
|
|
@@ -16,6 +16,150 @@ const __dirname = dirname(__filename);
|
|
|
16
16
|
// Dynamic import for the shared stdin module
|
|
17
17
|
const { readStdin } = await import(pathToFileURL(path.join(__dirname, 'lib', 'stdin.mjs')).href);
|
|
18
18
|
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Skill Active State (issue #1033)
|
|
21
|
+
// Writes skill-active-state.json so the persistent-mode Stop hook can prevent
|
|
22
|
+
// premature session termination while a skill is executing.
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Skill protection levels: none/light/medium/heavy.
|
|
27
|
+
* - 'none': Already has dedicated mode state (ralph, autopilot) or instant/read-only
|
|
28
|
+
* - 'light': Quick agent shortcuts (3 reinforcements, 5 min TTL)
|
|
29
|
+
* - 'medium': Review/planning skills that run multiple agents (5 reinforcements, 15 min TTL)
|
|
30
|
+
* - 'heavy': Long-running skills (10 reinforcements, 30 min TTL)
|
|
31
|
+
*/
|
|
32
|
+
const PROTECTION_CONFIGS = {
|
|
33
|
+
none: { maxReinforcements: 0, staleTtlMs: 0 },
|
|
34
|
+
light: { maxReinforcements: 3, staleTtlMs: 5 * 60 * 1000 },
|
|
35
|
+
medium: { maxReinforcements: 5, staleTtlMs: 15 * 60 * 1000 },
|
|
36
|
+
heavy: { maxReinforcements: 10, staleTtlMs: 30 * 60 * 1000 },
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const SKILL_PROTECTION = {
|
|
40
|
+
// Already have mode state → no protection needed
|
|
41
|
+
autopilot: 'none', ralph: 'none', ultrawork: 'none', team: 'none',
|
|
42
|
+
'omc-teams': 'none', ultraqa: 'none', cancel: 'none',
|
|
43
|
+
// Instant / read-only → no protection needed
|
|
44
|
+
trace: 'none', hud: 'none', 'omc-doctor': 'none', 'omc-help': 'none',
|
|
45
|
+
'learn-about-omc': 'none', note: 'none',
|
|
46
|
+
// Light protection (3 reinforcements)
|
|
47
|
+
tdd: 'light', 'build-fix': 'light', analyze: 'light', skill: 'light',
|
|
48
|
+
'configure-notifications': 'light',
|
|
49
|
+
// Medium protection (5 reinforcements)
|
|
50
|
+
'code-review': 'medium', 'security-review': 'medium', plan: 'medium',
|
|
51
|
+
ralplan: 'medium', review: 'medium', 'external-context': 'medium',
|
|
52
|
+
sciomc: 'medium', skillify: 'medium', learner: 'medium', 'omc-setup': 'medium',
|
|
53
|
+
'mcp-setup': 'medium', 'project-session-manager': 'medium',
|
|
54
|
+
'writer-memory': 'medium', 'ralph-init': 'medium', ccg: 'medium',
|
|
55
|
+
// Heavy protection (10 reinforcements)
|
|
56
|
+
deepinit: 'heavy',
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
function getSkillProtection(skillName) {
|
|
60
|
+
const normalized = (skillName || '').toLowerCase().replace(/^oh-my-(?:claudecode|copilot):/, '');
|
|
61
|
+
return SKILL_PROTECTION[normalized] || 'light';
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function getInvokedSkillName(toolInput) {
|
|
65
|
+
if (!toolInput || typeof toolInput !== 'object') return null;
|
|
66
|
+
const rawSkill = toolInput.skill || toolInput.skill_name || toolInput.skillName || toolInput.command || null;
|
|
67
|
+
if (typeof rawSkill !== 'string' || !rawSkill.trim()) return null;
|
|
68
|
+
const normalized = rawSkill.trim();
|
|
69
|
+
return normalized.includes(':') ? normalized.split(':').at(-1).toLowerCase() : normalized.toLowerCase();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const SESSION_ID_ALLOWLIST = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,255}$/;
|
|
73
|
+
|
|
74
|
+
function writeSkillActiveState(directory, skillName, sessionId) {
|
|
75
|
+
const protection = getSkillProtection(skillName);
|
|
76
|
+
if (protection === 'none') return;
|
|
77
|
+
|
|
78
|
+
const config = PROTECTION_CONFIGS[protection];
|
|
79
|
+
const now = new Date().toISOString();
|
|
80
|
+
const normalized = (skillName || '').toLowerCase().replace(/^oh-my-(?:claudecode|copilot):/, '');
|
|
81
|
+
|
|
82
|
+
const state = {
|
|
83
|
+
active: true,
|
|
84
|
+
skill_name: normalized,
|
|
85
|
+
session_id: sessionId || undefined,
|
|
86
|
+
started_at: now,
|
|
87
|
+
last_checked_at: now,
|
|
88
|
+
reinforcement_count: 0,
|
|
89
|
+
max_reinforcements: config.maxReinforcements,
|
|
90
|
+
stale_ttl_ms: config.staleTtlMs,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const stateDir = path.join(directory, '.omc', 'state');
|
|
94
|
+
|
|
95
|
+
// Write to session-scoped path when sessionId is available (must match persistent-mode.mjs reads)
|
|
96
|
+
const safeSessionId = sessionId && SESSION_ID_ALLOWLIST.test(sessionId) ? sessionId : '';
|
|
97
|
+
const targetDir = safeSessionId
|
|
98
|
+
? path.join(stateDir, 'sessions', safeSessionId)
|
|
99
|
+
: stateDir;
|
|
100
|
+
const targetPath = path.join(targetDir, 'skill-active-state.json');
|
|
101
|
+
|
|
102
|
+
try {
|
|
103
|
+
if (!existsSync(targetDir)) {
|
|
104
|
+
mkdirSync(targetDir, { recursive: true });
|
|
105
|
+
}
|
|
106
|
+
const tmpPath = targetPath + '.tmp';
|
|
107
|
+
writeFileSync(tmpPath, JSON.stringify(state, null, 2), { mode: 0o600 });
|
|
108
|
+
renameSync(tmpPath, targetPath);
|
|
109
|
+
} catch {
|
|
110
|
+
// Best-effort; don't fail the hook
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
function clearAwaitingConfirmationFlag(directory, stateName, sessionId) {
|
|
116
|
+
const stateDir = path.join(directory, '.omc', 'state');
|
|
117
|
+
const safeSessionId = sessionId && SESSION_ID_ALLOWLIST.test(sessionId) ? sessionId : '';
|
|
118
|
+
const paths = [
|
|
119
|
+
safeSessionId ? path.join(stateDir, 'sessions', safeSessionId, `${stateName}-state.json`) : null,
|
|
120
|
+
path.join(stateDir, `${stateName}-state.json`),
|
|
121
|
+
path.join(homedir(), '.omc', 'state', `${stateName}-state.json`),
|
|
122
|
+
].filter(Boolean);
|
|
123
|
+
|
|
124
|
+
for (const statePath of paths) {
|
|
125
|
+
try {
|
|
126
|
+
if (!existsSync(statePath)) continue;
|
|
127
|
+
const state = JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
128
|
+
if (!state || typeof state !== 'object' || !state.awaiting_confirmation) continue;
|
|
129
|
+
delete state.awaiting_confirmation;
|
|
130
|
+
const tmpPath = statePath + '.tmp';
|
|
131
|
+
writeFileSync(tmpPath, JSON.stringify(state, null, 2), { mode: 0o600 });
|
|
132
|
+
renameSync(tmpPath, statePath);
|
|
133
|
+
} catch {
|
|
134
|
+
// Best-effort; don't fail the hook
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function confirmSkillModeStates(directory, skillName, sessionId) {
|
|
140
|
+
switch (skillName) {
|
|
141
|
+
case 'ralph':
|
|
142
|
+
clearAwaitingConfirmationFlag(directory, 'ralph', sessionId);
|
|
143
|
+
clearAwaitingConfirmationFlag(directory, 'ultrawork', sessionId);
|
|
144
|
+
break;
|
|
145
|
+
case 'ultrawork':
|
|
146
|
+
clearAwaitingConfirmationFlag(directory, 'ultrawork', sessionId);
|
|
147
|
+
break;
|
|
148
|
+
case 'autopilot':
|
|
149
|
+
clearAwaitingConfirmationFlag(directory, 'autopilot', sessionId);
|
|
150
|
+
break;
|
|
151
|
+
case 'ralplan':
|
|
152
|
+
clearAwaitingConfirmationFlag(directory, 'ralplan', sessionId);
|
|
153
|
+
break;
|
|
154
|
+
default:
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Delegation enforcement
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
|
|
19
163
|
// Allowed path patterns (no warning)
|
|
20
164
|
// Paths are normalized to forward slashes before matching
|
|
21
165
|
const ALLOWED_PATH_PATTERNS = [
|
|
@@ -87,51 +231,6 @@ function workerCommandViolation(command) {
|
|
|
87
231
|
return null;
|
|
88
232
|
}
|
|
89
233
|
|
|
90
|
-
const SESSION_ID_ALLOWLIST = /^[a-zA-Z0-9][a-zA-Z0-9_-]{0,255}$/;
|
|
91
|
-
|
|
92
|
-
function clearAwaitingConfirmationFlag(directory, stateName, sessionId) {
|
|
93
|
-
const stateDir = path.join(directory, '.omcp', 'state');
|
|
94
|
-
const safeSessionId = sessionId && SESSION_ID_ALLOWLIST.test(sessionId) ? sessionId : '';
|
|
95
|
-
const paths = [
|
|
96
|
-
safeSessionId ? path.join(stateDir, 'sessions', safeSessionId, `${stateName}-state.json`) : null,
|
|
97
|
-
path.join(stateDir, `${stateName}-state.json`),
|
|
98
|
-
path.join(homedir(), '.omcp', 'state', `${stateName}-state.json`),
|
|
99
|
-
].filter(Boolean);
|
|
100
|
-
|
|
101
|
-
for (const statePath of paths) {
|
|
102
|
-
try {
|
|
103
|
-
if (!existsSync(statePath)) continue;
|
|
104
|
-
const state = JSON.parse(readFileSync(statePath, 'utf-8'));
|
|
105
|
-
if (!state || typeof state !== 'object' || !state.awaiting_confirmation) continue;
|
|
106
|
-
delete state.awaiting_confirmation;
|
|
107
|
-
const tmpPath = statePath + '.tmp';
|
|
108
|
-
writeFileSync(tmpPath, JSON.stringify(state, null, 2), { mode: 0o600 });
|
|
109
|
-
renameSync(tmpPath, statePath);
|
|
110
|
-
} catch {
|
|
111
|
-
// Best-effort; don't fail the hook
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function confirmSkillModeStates(directory, skillName, sessionId) {
|
|
117
|
-
switch (skillName) {
|
|
118
|
-
case 'ralph':
|
|
119
|
-
clearAwaitingConfirmationFlag(directory, 'ralph', sessionId);
|
|
120
|
-
clearAwaitingConfirmationFlag(directory, 'ultrawork', sessionId);
|
|
121
|
-
break;
|
|
122
|
-
case 'ultrawork':
|
|
123
|
-
clearAwaitingConfirmationFlag(directory, 'ultrawork', sessionId);
|
|
124
|
-
break;
|
|
125
|
-
case 'autopilot':
|
|
126
|
-
clearAwaitingConfirmationFlag(directory, 'autopilot', sessionId);
|
|
127
|
-
break;
|
|
128
|
-
case 'ralplan':
|
|
129
|
-
clearAwaitingConfirmationFlag(directory, 'ralplan', sessionId);
|
|
130
|
-
break;
|
|
131
|
-
default:
|
|
132
|
-
break;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
234
|
|
|
136
235
|
function checkBashCommand(command) {
|
|
137
236
|
// Check if command might modify files
|