@damian87/omp 0.8.0 → 0.10.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/.github/skills/create-skill/SKILL.md +3 -3
- package/.github/skills/daily-log/SKILL.md +1 -1
- package/.github/skills/jira-ticket/SKILL.md +6 -3
- package/.github/skills/omp-autopilot/SKILL.md +1 -1
- package/.github/skills/ralph/SKILL.md +6 -4
- package/.github/skills/research-codebase/SKILL.md +6 -6
- package/.github/skills/research-codebase/reference/agent-prompts.md +8 -8
- package/.github/skills/slack/SKILL.md +83 -0
- package/.github/skills/team/SKILL.md +5 -3
- package/.github/skills/team/scripts/team-launch.sh +11 -5
- package/.github/skills/ultraqa/SKILL.md +5 -2
- package/.github/skills/ultrawork/SKILL.md +5 -5
- package/.github/skills/weighted-consensus/SKILL.md +4 -3
- package/README.md +36 -38
- package/catalog/capabilities.json +46 -0
- package/catalog/skills-general.json +26 -0
- package/dist/src/cli.js +58 -5
- package/dist/src/cli.js.map +1 -1
- package/dist/src/comms/index.d.ts +13 -6
- package/dist/src/comms/index.js +65 -10
- package/dist/src/comms/index.js.map +1 -1
- package/dist/src/copilot/doctor.js +40 -5
- package/dist/src/copilot/doctor.js.map +1 -1
- package/dist/src/copilot/env-passthrough.d.ts +16 -0
- package/dist/src/copilot/env-passthrough.js +28 -0
- package/dist/src/copilot/env-passthrough.js.map +1 -0
- package/dist/src/copilot/launch.js +9 -1
- package/dist/src/copilot/launch.js.map +1 -1
- package/dist/src/copilot/trust.d.ts +22 -0
- package/dist/src/copilot/trust.js +62 -0
- package/dist/src/copilot/trust.js.map +1 -0
- package/dist/src/copilot/version.js +10 -0
- package/dist/src/copilot/version.js.map +1 -1
- package/dist/src/env/init.d.ts +6 -0
- package/dist/src/env/init.js +18 -0
- package/dist/src/env/init.js.map +1 -1
- package/dist/src/gateway/notify.d.ts +35 -0
- package/dist/src/gateway/notify.js +261 -0
- package/dist/src/gateway/notify.js.map +1 -0
- package/dist/src/gateway/target-parser.d.ts +76 -0
- package/dist/src/gateway/target-parser.js +105 -0
- package/dist/src/gateway/target-parser.js.map +1 -0
- package/dist/src/instructions-memory.js +6 -5
- package/dist/src/instructions-memory.js.map +1 -1
- package/dist/src/schedule/commands.js +1 -0
- package/dist/src/schedule/commands.js.map +1 -1
- package/dist/src/schedule/runner.d.ts +9 -0
- package/dist/src/schedule/runner.js +31 -1
- package/dist/src/schedule/runner.js.map +1 -1
- package/dist/src/schedule/types.d.ts +9 -0
- package/dist/src/team/tmux.d.ts +1 -1
- package/dist/src/team/tmux.js +41 -10
- package/dist/src/team/tmux.js.map +1 -1
- package/docs/plans/copilot-native-hooks.md +119 -0
- package/docs/plans/verification-plan.md +104 -0
- package/docs/slack-setup.md +33 -0
- package/hooks/hooks.json +52 -72
- package/package.json +11 -3
- package/plugin.json +12 -4
- package/scripts/agent-stop.mjs +87 -0
- package/scripts/error.mjs +1 -1
- package/scripts/lib/hook-output.mjs +32 -3
- package/scripts/lib/loop-driver.mjs +44 -0
- package/scripts/lib/version-check.mjs +3 -0
- package/scripts/post-tool-use.mjs +1 -1
- package/scripts/pre-tool-use.mjs +1 -1
- package/scripts/prompt-submit.mjs +4 -6
- package/scripts/session-end.mjs +1 -1
- package/scripts/session-start.mjs +5 -9
- package/dist/src/mcp/server.d.ts +0 -10
- package/dist/src/mcp/server.js +0 -44
- package/dist/src/mcp/server.js.map +0 -1
- package/dist/src/mcp/tools/daily-log.d.ts +0 -2
- package/dist/src/mcp/tools/daily-log.js +0 -148
- package/dist/src/mcp/tools/daily-log.js.map +0 -1
- package/dist/src/mcp/tools/index.d.ts +0 -9
- package/dist/src/mcp/tools/index.js +0 -15
- package/dist/src/mcp/tools/index.js.map +0 -1
- package/dist/src/mcp/tools/notepad.d.ts +0 -2
- package/dist/src/mcp/tools/notepad.js +0 -135
- package/dist/src/mcp/tools/notepad.js.map +0 -1
- package/dist/src/mcp/tools/project-memory.d.ts +0 -2
- package/dist/src/mcp/tools/project-memory.js +0 -91
- package/dist/src/mcp/tools/project-memory.js.map +0 -1
- package/dist/src/mcp/tools/shared-memory.d.ts +0 -2
- package/dist/src/mcp/tools/shared-memory.js +0 -148
- package/dist/src/mcp/tools/shared-memory.js.map +0 -1
- package/dist/src/mcp/tools/state.d.ts +0 -2
- package/dist/src/mcp/tools/state.js +0 -107
- package/dist/src/mcp/tools/state.js.map +0 -1
- package/dist/src/mcp/tools/trace.d.ts +0 -10
- package/dist/src/mcp/tools/trace.js +0 -102
- package/dist/src/mcp/tools/trace.js.map +0 -1
- package/dist/src/mcp/types.d.ts +0 -29
- package/dist/src/mcp/types.js +0 -7
- package/dist/src/mcp/types.js.map +0 -1
- package/dist/test/catalog.test.d.ts +0 -1
- package/dist/test/catalog.test.js +0 -21
- package/dist/test/catalog.test.js.map +0 -1
- package/dist/test/jira.test.d.ts +0 -1
- package/dist/test/jira.test.js +0 -26
- package/dist/test/jira.test.js.map +0 -1
- package/dist/test/lint.test.d.ts +0 -1
- package/dist/test/lint.test.js +0 -9
- package/dist/test/lint.test.js.map +0 -1
- package/dist/test/sync.test.d.ts +0 -1
- package/dist/test/sync.test.js +0 -15
- package/dist/test/sync.test.js.map +0 -1
|
@@ -25,13 +25,13 @@ Skills are modular, self-contained packages that extend agent capabilities by pr
|
|
|
25
25
|
### Three-Level Loading System
|
|
26
26
|
|
|
27
27
|
1. **Metadata (name + description)** - Always in context (~100 words)
|
|
28
|
-
2. **SKILL.md body** - When skill triggers (
|
|
28
|
+
2. **SKILL.md body** - When skill triggers (under 200 lines; split overflow into `references/`)
|
|
29
29
|
3. **Bundled resources** - As needed by agent (unlimited)
|
|
30
30
|
|
|
31
31
|
### Why Progressive Disclosure Matters
|
|
32
32
|
|
|
33
|
-
-
|
|
34
|
-
-
|
|
33
|
+
- Smaller initial context load
|
|
34
|
+
- Faster activation — the agent loads the body only when the skill triggers
|
|
35
35
|
- Agent loads only what's needed, when it's needed
|
|
36
36
|
- Skills remain maintainable and focused
|
|
37
37
|
|
|
@@ -23,7 +23,7 @@ The SessionStart hook injects a one-line breadcrumb, e.g.:
|
|
|
23
23
|
|
|
24
24
|
```
|
|
25
25
|
[DAILY LOG] Goal: <today's goal>
|
|
26
|
-
N entries logged in the last 7 days — run `omp daily-log read` to load if relevant.
|
|
26
|
+
N entries logged in the last 7 days — run `omp daily-log read --days 7` to load if relevant.
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
If the breadcrumb looks relevant to what the user is asking for — same feature, an open
|
|
@@ -16,21 +16,24 @@ Use `/jira-ticket` when work tracking is requested.
|
|
|
16
16
|
## Operations
|
|
17
17
|
|
|
18
18
|
### Create
|
|
19
|
-
- Build from an approved plan or implementation slice
|
|
19
|
+
- Build from an approved plan or implementation slice (a plan file or markdown)
|
|
20
20
|
- Include: Summary, Description, Acceptance Criteria
|
|
21
|
-
-
|
|
21
|
+
- Render the payload with `omp jira render <plan-file>` — this **never** writes to Jira. To create/comment/update, run `omp jira apply <plan-file-or-ticket-key>`, which defaults to **dry-run** and only writes when Jira is configured with `JIRA_MODE=live` and the user has explicitly confirmed.
|
|
22
22
|
|
|
23
23
|
### Comment
|
|
24
24
|
- Add implementation evidence, verification results, or status updates
|
|
25
25
|
- Format for readability (use Jira wiki markup, not Markdown)
|
|
26
|
+
- Apply with `omp jira apply <ticket-key> --comment` (dry-run by default; preview before confirming)
|
|
26
27
|
|
|
27
28
|
### Safe update
|
|
28
29
|
- Only update known simple fields (summary, description, labels)
|
|
30
|
+
- Apply with `omp jira apply <ticket-key> --update` (dry-run by default)
|
|
29
31
|
- Do not guess transitions, issue links, project keys, or secrets
|
|
30
32
|
|
|
31
33
|
## Rules
|
|
32
34
|
|
|
33
|
-
-
|
|
35
|
+
- Always preview with `omp jira render` or `omp jira apply … --dry-run` (the default) before any live write
|
|
36
|
+
- If Jira config is missing, the commands stay in dry-run and print the payload — never fail silently
|
|
34
37
|
- Do not guess project keys, transitions, or credentials
|
|
35
38
|
- Keep acceptance criteria testable and specific
|
|
36
39
|
- Include file paths and evidence when commenting with implementation details
|
|
@@ -32,7 +32,7 @@ Run `/research-codebase` to understand current state. Skip if you already have f
|
|
|
32
32
|
|
|
33
33
|
### Phase 2 — Plan
|
|
34
34
|
|
|
35
|
-
Run `/ralplan` to produce an implementation plan with acceptance criteria. If a
|
|
35
|
+
Run `/ralplan` to produce an implementation plan with acceptance criteria. If a plan already exists from a prior `/ralplan`, skip this phase.
|
|
36
36
|
|
|
37
37
|
### Phase 3 — Execute
|
|
38
38
|
|
|
@@ -21,16 +21,18 @@ Use `/ralph` when one owner should complete one clear task end-to-end.
|
|
|
21
21
|
|
|
22
22
|
## Input
|
|
23
23
|
|
|
24
|
-
Accept a plan from `/ralplan`, a ticket, or a concrete task description. If a `/ralplan`
|
|
24
|
+
Accept a plan from `/ralplan`, a ticket, or a concrete task description. If a `/ralplan` plan exists, use its acceptance criteria as your definition of done.
|
|
25
25
|
|
|
26
26
|
## Steps
|
|
27
27
|
|
|
28
|
-
1. **
|
|
28
|
+
1. **Register the loop** — run `omp ralph start "<task>" --max-iterations 10`. This tracks the loop so `omp ralph status` and `/team` nudges can see it and the iteration cap is enforced. State what "done" looks like before writing code.
|
|
29
29
|
2. **Implement** one slice at a time, in plan order.
|
|
30
30
|
3. **Verify after each slice** — run tests, lint, type-check. Do not batch verification to the end.
|
|
31
31
|
4. **Fix** any failures immediately before moving to the next slice.
|
|
32
|
-
5. **
|
|
33
|
-
6. **
|
|
32
|
+
5. **Tick the loop** — run `omp ralph tick` after each slice. If it reports the iteration cap is reached, stop and report.
|
|
33
|
+
6. **Repeat** until all slices complete with evidence, or a blocker is hit.
|
|
34
|
+
7. **Final verification** — run the full test suite one last time after all slices.
|
|
35
|
+
8. **End the loop** — run `omp ralph cancel` once done or blocked, so the tracked state is cleared.
|
|
34
36
|
|
|
35
37
|
## Circuit breaker
|
|
36
38
|
|
|
@@ -22,7 +22,7 @@ Respond: "I'm ready to research the codebase. What area or question should I inv
|
|
|
22
22
|
|
|
23
23
|
### 1. Read mentioned files
|
|
24
24
|
|
|
25
|
-
If the user references specific files, read them
|
|
25
|
+
If the user references specific files, read them directly in the **main context** before anything else.
|
|
26
26
|
|
|
27
27
|
### 2. Scope the tech stack
|
|
28
28
|
|
|
@@ -32,14 +32,14 @@ Detect from `package.json`, config files, directory structure, and project conve
|
|
|
32
32
|
|
|
33
33
|
| Tier | When | Agent strategy |
|
|
34
34
|
|------|------|----------------|
|
|
35
|
-
| **Small** | Single file/component, narrow question |
|
|
36
|
-
| **Medium** | Cross-file, single area (e.g. "how does auth work") |
|
|
37
|
-
| **Large** | Cross-cutting, multi-area (e.g. "map the entire API layer") |
|
|
35
|
+
| **Small** | Single file/component, narrow question | Read and search directly (glob/grep/read). No delegation. |
|
|
36
|
+
| **Medium** | Cross-file, single area (e.g. "how does auth work") | Locate with glob/grep, then read and analyse the hits directly. |
|
|
37
|
+
| **Large** | Cross-cutting, multi-area (e.g. "map the entire API layer") | Sweep area-by-area (locate → analyse → find patterns), or delegate areas to parallel `omp team` workers (see `reference/agent-prompts.md`). |
|
|
38
38
|
|
|
39
39
|
### 4. Research
|
|
40
40
|
|
|
41
|
-
- Track subtasks
|
|
42
|
-
- For
|
|
41
|
+
- Track subtasks in a markdown checklist as you go
|
|
42
|
+
- For large: read `reference/agent-prompts.md` for `omp team` worker prompt templates
|
|
43
43
|
- **MUST GATE**: Before writing findings, show file:line evidence for every claim
|
|
44
44
|
|
|
45
45
|
### 5. Synthesise & write document
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Worker Prompt Templates
|
|
2
2
|
|
|
3
|
-
Use these templates when
|
|
3
|
+
Use these templates when delegating research areas to parallel `omp team` workers. Only needed for **large** research tasks; for small/medium, run these roles directly in the main agent with glob/grep/read.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Worker roles
|
|
6
6
|
|
|
7
7
|
### Locator — find WHERE files and components live
|
|
8
8
|
|
|
@@ -31,8 +31,8 @@ Do not evaluate consistency or suggest changes — only document occurrences.
|
|
|
31
31
|
|
|
32
32
|
## Guidelines
|
|
33
33
|
|
|
34
|
-
- Each
|
|
35
|
-
- Remind every
|
|
36
|
-
- Run independent explorations in parallel
|
|
37
|
-
- For web research (only if user explicitly asks),
|
|
38
|
-
- **
|
|
34
|
+
- Each worker is stateless — provide complete context in the prompt
|
|
35
|
+
- Remind every worker: "You are documenting, not evaluating"
|
|
36
|
+
- Run independent explorations in parallel across team panes
|
|
37
|
+
- For web research (only if user explicitly asks), do it in the main agent
|
|
38
|
+
- **Collect all worker outputs before synthesising**
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slack
|
|
3
|
+
description: Post an outbound Slack notification — ONLY when the user types the explicit `/slack` slash command. Never auto-trigger from natural-language phrases like "tell Slack" or "notify me on Slack"; those go to the regular chat. One-way (publish only); the v0.8.0 gateway bridge still handles bidirectional DM chat.
|
|
4
|
+
argument-hint: "<message> [--target slack:C…|D…|G…|U…]"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# /slack — outbound Slack notification
|
|
8
|
+
|
|
9
|
+
Post a single message to Slack and exit. **No conversation; no listener.** The
|
|
10
|
+
v0.8.0 chat bridge (`omp gateway serve` + `@omp-copilot` DM) handles bidirectional
|
|
11
|
+
chat; this skill is for one-shot publishes.
|
|
12
|
+
|
|
13
|
+
## Activation rules (read first)
|
|
14
|
+
|
|
15
|
+
- **Activate ONLY** when the user typed the literal slash command `/slack` (with or
|
|
16
|
+
without arguments). Never auto-activate from natural-language phrases like "tell
|
|
17
|
+
Slack X", "ping me on Slack", "notify me on Slack" — those are conversational.
|
|
18
|
+
- **Confirm the destination before posting**, every time:
|
|
19
|
+
- If `--target` is present, echo it back: "Sending to `slack:<ID>` — confirm? (y/N)"
|
|
20
|
+
- If `--target` is absent AND `SLACK_HOME_CHANNEL` is a channel (`C…`/`G…`):
|
|
21
|
+
treat as a potential broadcast. Ask: "Post to default channel `<id>` (a channel,
|
|
22
|
+
not a DM)? (y/N)" — only proceed on explicit `y`.
|
|
23
|
+
- If `SLACK_HOME_CHANNEL` is a user (`U…`) or DM (`D…`), proceed without
|
|
24
|
+
confirmation — the user already configured a personal default.
|
|
25
|
+
- If the user types just `/slack` with no message, ask: *"What should I send and where?"*.
|
|
26
|
+
|
|
27
|
+
## Contract
|
|
28
|
+
|
|
29
|
+
- Default target = `SLACK_HOME_CHANNEL` from `~/.omp/.env` (set via `omp env init`).
|
|
30
|
+
- Explicit target = `--target slack:<ID>` (ID = `C…`/`G…`/`D…`/`U…`).
|
|
31
|
+
- `U…` targets are auto-resolved to a DM channel (`conversations.open`) before posting.
|
|
32
|
+
- Stateless: each invocation is a fresh REST call to `chat.postMessage`. No daemon. No socket.
|
|
33
|
+
|
|
34
|
+
## When invoked
|
|
35
|
+
|
|
36
|
+
Follow the **Activation rules** above. After confirmation passes, post the message.
|
|
37
|
+
|
|
38
|
+
## How
|
|
39
|
+
|
|
40
|
+
Run via the omp CLI:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
omp gateway notify --text "<message>" [--target slack:<ID>] [--thread-ts <ts>]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
That's the only command this skill drives. The flags map 1:1 to user intent:
|
|
47
|
+
|
|
48
|
+
- No flags after `--text`: post to `SLACK_HOME_CHANNEL`.
|
|
49
|
+
- `--target slack:C0BOQV5434G`: explicit channel.
|
|
50
|
+
- `--target slack:U0123ABCD`: explicit user (auto-DM).
|
|
51
|
+
- `--target slack:C0…:1700.000123` or `--thread-ts 1700.000123`: pin to a thread.
|
|
52
|
+
|
|
53
|
+
## Output handling
|
|
54
|
+
|
|
55
|
+
The CLI returns a structured result:
|
|
56
|
+
|
|
57
|
+
- Success: `posted to <channel> (ts=<ts>[, opened IM])` — relay that.
|
|
58
|
+
- Failure: `notify failed [<CODE>]: <reason>` — surface the code + reason so the user
|
|
59
|
+
can act. Common codes:
|
|
60
|
+
- `MISSING_TEXT` — the message body was empty; pass a non-empty `--text`.
|
|
61
|
+
- `MISSING_TOKEN` — run `omp env init` to set `SLACK_BOT_TOKEN`.
|
|
62
|
+
- `MISSING_TARGET` — pass `--target` or run `omp env init` to set `SLACK_HOME_CHANNEL`.
|
|
63
|
+
- `BAD_TARGET` / `BAD_HOME_CHANNEL` — the ID is malformed; show the user the expected shape.
|
|
64
|
+
- `OPEN_FAILED` (user-id targets) — bot can't DM that user (likely missing `im:write` scope or user outside workspace).
|
|
65
|
+
- `POST_FAILED` — Slack returned `ok: false`; the reason field has Slack's own error name (`channel_not_found`, `not_in_channel`, etc.).
|
|
66
|
+
- `RATE_LIMITED` / `TIMEOUT` / `NETWORK_ERROR` — transient; try again.
|
|
67
|
+
|
|
68
|
+
## Boundaries
|
|
69
|
+
|
|
70
|
+
- This skill **never** waits for a reply. For interactive chat, the user opens Slack and DMs `@omp-copilot` (handled by `omp gateway serve`).
|
|
71
|
+
- This skill **never** stores state. There is no routing table, no per-session registration.
|
|
72
|
+
- This skill **does not** start the v0.8.0 inbound bridge. Daemons stay out of scope.
|
|
73
|
+
|
|
74
|
+
## Example exchanges
|
|
75
|
+
|
|
76
|
+
User: `/slack the migration just finished cleanly`
|
|
77
|
+
Tool call: `omp gateway notify --text "the migration just finished cleanly"`
|
|
78
|
+
|
|
79
|
+
User: `/slack tell #releases the build is green --target slack:C0RELEASE9`
|
|
80
|
+
Tool call: `omp gateway notify --text "the build is green" --target slack:C0RELEASE9`
|
|
81
|
+
|
|
82
|
+
User: `/slack ping U0123ABCD with "deploy needs review"`
|
|
83
|
+
Tool call: `omp gateway notify --text "deploy needs review" --target slack:U0123ABCD`
|
|
@@ -48,6 +48,8 @@ Write a temporary file at `/tmp/team-lanes-<timestamp>.json`:
|
|
|
48
48
|
### Step 2 — Launch
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
+
# Installed-plugin path (in a dev checkout the script is at the repo-relative
|
|
52
|
+
# .github/skills/team/scripts/team-launch.sh instead):
|
|
51
53
|
bash ~/.copilot/installed-plugins/oh-my-copilot/oh-my-copilot/.github/skills/team/scripts/team-launch.sh \
|
|
52
54
|
--session "team-<name>" --lanes <lanes-file>
|
|
53
55
|
```
|
|
@@ -76,7 +78,7 @@ Choose this only when the user explicitly wants the team to run in the backgroun
|
|
|
76
78
|
### Launch
|
|
77
79
|
|
|
78
80
|
```bash
|
|
79
|
-
omp team <N>:copilot "<task description>"
|
|
81
|
+
omp team <N>:copilot "<task description>" --name <name>
|
|
80
82
|
```
|
|
81
83
|
|
|
82
84
|
The runtime automatically:
|
|
@@ -89,9 +91,9 @@ The runtime automatically:
|
|
|
89
91
|
### Monitor and cleanup
|
|
90
92
|
|
|
91
93
|
```bash
|
|
92
|
-
omp team status <
|
|
94
|
+
omp team status <name> # check progress (same <name> passed to --name)
|
|
93
95
|
tmux attach -t omp-team-<name> # watch panes live
|
|
94
|
-
omp team shutdown <
|
|
96
|
+
omp team shutdown <name> # kill when done
|
|
95
97
|
```
|
|
96
98
|
|
|
97
99
|
## Prerequisites
|
|
@@ -45,7 +45,9 @@ fi
|
|
|
45
45
|
if command -v omp &>/dev/null; then
|
|
46
46
|
AGENT_CMD="omp --madmax"
|
|
47
47
|
elif command -v copilot &>/dev/null; then
|
|
48
|
-
|
|
48
|
+
# --yolo = all permissions (tools+paths+urls) so worker panes never block on a
|
|
49
|
+
# trust/permission dialog. Matches the bypass `omp --madmax` grants.
|
|
50
|
+
AGENT_CMD="copilot --yolo"
|
|
49
51
|
else
|
|
50
52
|
echo "Neither omp nor copilot CLI found" >&2; exit 1
|
|
51
53
|
fi
|
|
@@ -78,9 +80,11 @@ wait_for_ready() {
|
|
|
78
80
|
return 0
|
|
79
81
|
fi
|
|
80
82
|
|
|
81
|
-
# Auto-accept folder trust dialog
|
|
83
|
+
# Auto-accept folder trust dialog. Use the `Enter` key NAME, not C-m:
|
|
84
|
+
# Copilot CLI >=1.0.61 ignores a literal carriage return (C-m) for TUI
|
|
85
|
+
# selection/submit, so C-m left the trust dialog open and the agent hung.
|
|
82
86
|
if (( accepted == 0 )) && echo "$txt" | grep -q 'Do you trust'; then
|
|
83
|
-
tmux send-keys -t "$pane"
|
|
87
|
+
tmux send-keys -t "$pane" Enter
|
|
84
88
|
accepted=1
|
|
85
89
|
echo " ↳ Auto-accepted folder trust for $pane"
|
|
86
90
|
fi
|
|
@@ -142,10 +146,12 @@ for i in $(seq 0 $((LANE_COUNT - 1))); do
|
|
|
142
146
|
LANE_NAME=$(jq -r ".[$i].name" "$LANES_FILE")
|
|
143
147
|
PANE_ID="${PANE_IDS[$i]}"
|
|
144
148
|
|
|
145
|
-
# -l = literal (no key interpretation), then
|
|
149
|
+
# -l = literal (no key interpretation), then submit. Use the `Enter` key NAME,
|
|
150
|
+
# not C-m: Copilot CLI >=1.0.61 ignores a literal carriage return, so C-m left
|
|
151
|
+
# the prompt sitting unsent in the input buffer and the agent never started.
|
|
146
152
|
tmux send-keys -t "$PANE_ID" -l "$LANE_PROMPT"
|
|
147
153
|
sleep 0.3
|
|
148
|
-
tmux send-keys -t "$PANE_ID"
|
|
154
|
+
tmux send-keys -t "$PANE_ID" Enter
|
|
149
155
|
|
|
150
156
|
echo " 📨 Sent to $PANE_ID ($LANE_NAME)"
|
|
151
157
|
done
|
|
@@ -20,6 +20,8 @@ Use `/ultraqa` after implementation when shallow checks are not enough.
|
|
|
20
20
|
|
|
21
21
|
## Steps
|
|
22
22
|
|
|
23
|
+
Register the QA run first: `omp ultraqa start "<goal>" --max-cycles 5`. This tracks the cycle count and enforces the cap, and lets `omp ultraqa status`/`cancel` see the run.
|
|
24
|
+
|
|
23
25
|
### Cycle 1 (and each subsequent cycle)
|
|
24
26
|
|
|
25
27
|
Number every cycle explicitly: "Cycle 1", "Cycle 2", etc.
|
|
@@ -33,13 +35,14 @@ Number every cycle explicitly: "Cycle 1", "Cycle 2", etc.
|
|
|
33
35
|
|
|
34
36
|
### After each cycle
|
|
35
37
|
|
|
38
|
+
- Record the outcome: `omp ultraqa cycle fail` (issues found) or `omp ultraqa cycle pass` (clean). This increments the counter and reports when the cap is reached.
|
|
36
39
|
- If issues found → fix and start next cycle
|
|
37
|
-
- If clean → report PASS and
|
|
40
|
+
- If clean → report PASS and run `omp ultraqa cancel` to clear the run
|
|
38
41
|
- Track which issues were found and fixed per cycle
|
|
39
42
|
|
|
40
43
|
## Early exit conditions
|
|
41
44
|
|
|
42
|
-
- **5 cycles reached** — stop, report remaining issues as known gaps
|
|
45
|
+
- **5 cycles reached** (enforced by `omp ultraqa cycle`) — stop, report remaining issues as known gaps
|
|
43
46
|
- **Same failure 3 consecutive cycles** — stop, this is a design issue not a bug. Report it for `/ralplan`
|
|
44
47
|
- **Critical regression found** — stop immediately, report before fixing anything else
|
|
45
48
|
|
|
@@ -21,17 +21,17 @@ Use `/ultrawork` when there are many independent, low-conflict work items that c
|
|
|
21
21
|
|
|
22
22
|
## Composition
|
|
23
23
|
|
|
24
|
-
Ultrawork is the **
|
|
24
|
+
Ultrawork is the **batch-execution** branch of `/omp-autopilot` Phase 3 — a sibling of `/ralph` (single linear task) and `/team` (parallel panes), not nested inside them:
|
|
25
25
|
```
|
|
26
|
-
/omp-autopilot → /ralph
|
|
26
|
+
/omp-autopilot → /ralph OR /team OR /ultrawork
|
|
27
27
|
```
|
|
28
|
-
|
|
28
|
+
Pick `/ultrawork` when the work is many independent mechanical items. It can also be invoked directly.
|
|
29
29
|
|
|
30
30
|
## Steps
|
|
31
31
|
|
|
32
32
|
### 1. Inventory
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
Register the batch so the run is tracked and `/team` nudges can see it: `omp ultrawork start "<objective>" --task-count <n>`. Then list all tasks. For each, note the files it touches. Flag any collisions.
|
|
35
35
|
|
|
36
36
|
### 2. Dependency check
|
|
37
37
|
|
|
@@ -51,7 +51,7 @@ Process each wave. For each task in the wave:
|
|
|
51
51
|
|
|
52
52
|
### 4. Report
|
|
53
53
|
|
|
54
|
-
Summarise: completed, failed, blocked.
|
|
54
|
+
Summarise: completed, failed, blocked. Then clear the tracked state with `omp ultrawork cancel`.
|
|
55
55
|
|
|
56
56
|
## Stop conditions
|
|
57
57
|
|
|
@@ -70,9 +70,10 @@ omp council "<question>" [--models a,b,c | model:role:weight,...] \
|
|
|
70
70
|
- Timed-out members that produced valid JSON before the kill signal are
|
|
71
71
|
automatically recovered as survivors — they are not dropped.
|
|
72
72
|
|
|
73
|
-
If `omp council` is not found (the published `omp` predates this feature),
|
|
74
|
-
|
|
75
|
-
(
|
|
73
|
+
If `omp council` is not found (the published `omp` predates this feature),
|
|
74
|
+
update the global CLI: `npm i -g @damian87/omp@latest`, then re-run `omp council`.
|
|
75
|
+
(The `node dist/src/cli.js council` build only resolves from inside the
|
|
76
|
+
oh-my-copilot repo, so it is not a portable fallback for an arbitrary project.)
|
|
76
77
|
|
|
77
78
|
### Step 3 — Present the result
|
|
78
79
|
|
package/README.md
CHANGED
|
@@ -53,7 +53,8 @@ That's it.
|
|
|
53
53
|
- **Team-first orchestration** — parallel tmux panes, each running an independent agent session
|
|
54
54
|
- **Bare-flag bypass** — `omp --madmax` injects `--yolo` so non-interactive runs never block on a permission prompt
|
|
55
55
|
- **Persistent execution** — Ralph, UltraQA, and Ultrawork keep going until the goal is verified
|
|
56
|
-
- **
|
|
56
|
+
- **File-state coordination** — workers swap typed messages over an outbox/inbox cursor with atomic `O_EXCL` task locks; no broker or daemon to babysit
|
|
57
|
+
- **Chat bridge** — `omp gateway` runs long-lived chat connectors (Slack today, more next) so you can DM Copilot from anywhere
|
|
57
58
|
- **Lifecycle hooks** — `SessionStart`, `UserPromptSubmit`, `PreToolUse`, `PostToolUse`, `SessionEnd`, `Error`
|
|
58
59
|
- **Doctor included** — `omp doctor` verifies plugin manifest, skills discovery, hooks, and the underlying `copilot` CLI in one shot
|
|
59
60
|
|
|
@@ -76,14 +77,14 @@ That's it.
|
|
|
76
77
|
### Intelligent Orchestration
|
|
77
78
|
|
|
78
79
|
- **7 specialized agents** — planner, architect, executor, verifier, code-reviewer, designer, researcher (all `--agent <name>` compatible with Copilot CLI)
|
|
79
|
-
- **
|
|
80
|
+
- **22 in-session skills** auto-discovered from `.github/skills/`
|
|
80
81
|
- **Smart pipeline routing** — `/research-codebase` → `/ralplan` → `/team` / `/ralph` / `/ultrawork` → `/code-review` → `/ultraqa`
|
|
81
82
|
|
|
82
83
|
### Developer Experience
|
|
83
84
|
|
|
84
|
-
- **
|
|
85
|
+
- **Context & history as CLI subcommands** — `omp state` (key-value with TTL), `omp project-memory` (notes + directives), `omp trace` (per-session timeline + summary), `omp goal` / `omp memory sync` (managed repo context), `omp daily-log`
|
|
85
86
|
- **Lightweight Copilot context** — managed instructions keep only the repo goal plus on-demand memory commands; set `OMP_DISABLE_INSTRUCTIONS_MEMORY=1` to skip writing the managed block entirely
|
|
86
|
-
- **File-state coordination** — outbox JSONL + byte cursor, atomic `O_EXCL` task locks, optimistic CAS on claim
|
|
87
|
+
- **File-state worker coordination** — outbox JSONL + byte cursor, atomic `O_EXCL` task locks, optimistic CAS on claim
|
|
87
88
|
- **Idle nudge** — content-based pane idle detection that pokes stuck workers
|
|
88
89
|
- **Mode-state loops** — single source of truth per loop (Ralph/Ultrawork/UltraQA state files)
|
|
89
90
|
|
|
@@ -115,6 +116,8 @@ These run **inside a Copilot CLI session** after the plugin is installed.
|
|
|
115
116
|
| `/caveman` | Ultra-compressed communication mode | `/caveman` |
|
|
116
117
|
| `/worktree` | Git worktree-based parallel branch work | `/worktree` |
|
|
117
118
|
| `/schedule` | Durable local cron job — re-runs a prompt on a schedule, survives reboot | `/schedule "check the PR every 15 min"` |
|
|
119
|
+
| `/goal` | Set/read the repo-level goal injected into the managed Copilot context | `/goal "ship v1.0 of the billing flow"` |
|
|
120
|
+
| `/daily-log` | Per-day goal + work log surfaced at the start of new sessions | `/daily-log "ratelimit refactor landed"` |
|
|
118
121
|
|
|
119
122
|
---
|
|
120
123
|
|
|
@@ -195,15 +198,22 @@ omp council "<question>" [--models a,b,c] [--context @file] [--json] # multi-m
|
|
|
195
198
|
omp comms status | send | recv | ask # drive a running copilot tmux session
|
|
196
199
|
omp gateway serve [--only slack] # run chat connectors (today: slack)
|
|
197
200
|
omp gateway status [--json] # per-connector readiness (no sockets)
|
|
201
|
+
omp gateway notify --text "<msg>" [--target slack:C…|G…|D…|U… [:thread_ts]] [--thread-ts <ts>] [--json]
|
|
202
|
+
# one-shot outbound Slack post; falls back to SLACK_HOME_CHANNEL
|
|
198
203
|
omp slack serve # deprecated alias of `gateway serve --only slack`
|
|
199
204
|
omp slack doctor [--json] # deprecated alias of `gateway status --only slack`
|
|
200
205
|
omp env init [--force] # write ~/.omp/.env (interactive Slack token setup)
|
|
201
|
-
omp schedule add --id <id> --cron "*/15 * * * *" --prompt "<text>" [--allow-all-tools] [--cwd <dir>] [--model <m>] [--timeout <ms>] [--max-runs N] [--ttl-hours H] [--dry-run]
|
|
206
|
+
omp schedule add --id <id> --cron "*/15 * * * *" --prompt "<text>" [--allow-all-tools] [--cwd <dir>] [--model <m>] [--timeout <ms>] [--max-runs N] [--ttl-hours H] [--notify-target slack:U0123ABCD] [--dry-run]
|
|
202
207
|
omp schedule list # registered jobs + OS-install status
|
|
203
208
|
omp schedule status <id> # last run + result summary
|
|
204
209
|
omp schedule run-now <id> # trigger one run immediately
|
|
205
210
|
omp schedule remove <id> # uninstall the OS entry + delete the job
|
|
206
|
-
omp
|
|
211
|
+
omp goal set "<objective>" | read [--json]
|
|
212
|
+
omp memory sync [--json] # render goal + directives into copilot-instructions.md
|
|
213
|
+
omp daily-log set-goal "<text>" | add "<text>" | read [--days N] | prune [--keep-days N] [--json]
|
|
214
|
+
omp state write <key> <val> [--ttl <s>] | read | delete | status <key> | list | cleanup [--json]
|
|
215
|
+
omp project-memory read [<id>] | index | add-note "<title>" [--body "<text>"] | add-directive "<rule>" [--json]
|
|
216
|
+
omp trace timeline [<sessionId>] [--limit N] | summary [<sessionId>] | add <sessionId> <event> [<json>] [--json]
|
|
207
217
|
omp catalog list | validate | capability <id>
|
|
208
218
|
omp jira render <plan-file>
|
|
209
219
|
omp jira apply <key-or-plan> --comment|--update|--transition|--link
|
|
@@ -214,6 +224,7 @@ Environment overrides:
|
|
|
214
224
|
- `OMP_PLUGIN_ROOT` — path to the plugin checkout (with `OMC_PLUGIN_ROOT` accepted for back-compat)
|
|
215
225
|
- `OMP_COPILOT_BIN` — alternate `copilot` binary
|
|
216
226
|
- `OMP_BIN` — absolute path to the `omp` wrapper written into OS-scheduler entries (overrides `which omp`)
|
|
227
|
+
- `OMP_SKIP_USER_ENV` — when `1`, skip auto-loading `~/.omp/.env` (useful for hermetic CI runs)
|
|
217
228
|
|
|
218
229
|
**Scheduled jobs** register a durable per-job entry with the OS scheduler (macOS launchd,
|
|
219
230
|
Linux systemd-user timers, or a managed `crontab` block as a cross-platform fallback) that
|
|
@@ -252,43 +263,29 @@ Full Slack-app setup (manifest + scopes) lives in [`docs/slack-setup.md`](docs/s
|
|
|
252
263
|
|
|
253
264
|
## Roadmap
|
|
254
265
|
|
|
255
|
-
omp
|
|
266
|
+
omp grows in vertical slices. Items aren't pinned to specific semver versions — they land when they're ready.
|
|
256
267
|
|
|
257
|
-
###
|
|
268
|
+
### Already shipped
|
|
258
269
|
|
|
259
|
-
|
|
270
|
+
- **Scheduled tasks** (v0.6.0) — durable local cron: `omp schedule add --id pr-watch --cron "*/15 * * * *" --prompt "…"` plus `/schedule` in-session. Each job registers an OS-scheduler entry (launchd / systemd-user / crontab fallback) that fires a fresh agent session, survives reboot, locks out overlap, and surfaces results at the next session start.
|
|
271
|
+
- **Chat bridge — Slack inbound** (v0.8.0) — `omp gateway` runs long-lived chat connectors that forward messages into a running Copilot tmux session and post replies back. Slack is the first connector (Socket Mode, no public URL). `omp env init` walks you through one-time token setup; tokens live in `~/.omp/.env` (auto-loaded on every invocation). See [`docs/slack-setup.md`](docs/slack-setup.md).
|
|
272
|
+
- **Slack outbound — `omp gateway notify`** — stateless REST `chat.postMessage` from any process (cron `--notify-target`, in-session `/slack <message>`, ad-hoc `omp gateway notify --text "..."`). Default destination from `SLACK_HOME_CHANNEL`; explicit `--target slack:C…/G…/D…/U…` overrides; `U…` auto-resolves to a DM via `conversations.open`.
|
|
273
|
+
- **Weighted-consensus council** — multi-model council with role weights + minority report. Via `omp council` or `/weighted-consensus`.
|
|
274
|
+
- **Suggest** — `omp suggest "<task>"` recommends a slash-skill workflow without launching one.
|
|
260
275
|
|
|
261
|
-
###
|
|
276
|
+
### Up next
|
|
262
277
|
|
|
263
|
-
|
|
278
|
+
- **More chat connectors** — Telegram, Discord, generic webhook on the same `omp gateway` runtime. One file per connector.
|
|
279
|
+
- **Outbound notifications** — long-running modes ping you when they finish, fail, or stall (`omp notify add` + per-invocation `--telegram`/`--discord`/`--slack` tags).
|
|
280
|
+
- **Checkpoints + rollback** — auto-snapshot the working tree before any tool-driven file edit; `omp rollback [id]` reverts a checkpoint. Safety net for autonomous loops.
|
|
281
|
+
- **Browser tool** — web search / page extraction / full automation (navigate, click, type, screenshot) for research skills that need fresh data instead of training-cutoff guesses.
|
|
264
282
|
|
|
265
|
-
###
|
|
283
|
+
### Later
|
|
266
284
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
Durable local cron: `omp schedule add --id pr-watch --cron "*/15 * * * *" --prompt "…"` plus `/schedule` in-session. Each job registers an OS-scheduler entry (launchd / systemd-user / crontab fallback) that fires a fresh agent session, survives reboot, locks out overlap, and surfaces results at the next session start. Follow-ups: natural-language cron parsing, notification-gateway delivery, pause/resume/edit, and an orphan-sweep (`omp schedule gc`).
|
|
272
|
-
|
|
273
|
-
### v0.6 — Browser tool (MCP)
|
|
274
|
-
|
|
275
|
-
A first-class browser MCP tool: web search, page extraction, full automation (navigate, click, type, screenshot). For research skills that need fresh data instead of training-cutoff guesses.
|
|
276
|
-
|
|
277
|
-
### v0.7 — HUD-lite statusline
|
|
278
|
-
|
|
279
|
-
Live orchestration metrics in the terminal: active mode, current task, worker count, tokens, cache hit rate, last error.
|
|
280
|
-
|
|
281
|
-
### v0.8 — Provider routing
|
|
282
|
-
|
|
283
|
-
Fine-grained per-task provider selection — sorting, whitelists, priority ordering, cost-aware fallback. For mixed pipelines that want Opus for planning and Haiku for grunt work without manual model switching.
|
|
284
|
-
|
|
285
|
-
### v0.9 — Skill learning
|
|
286
|
-
|
|
287
|
-
Extract repeating patterns from session transcripts into reusable skill files with strict quality gates. Auto-injects into context when relevant triggers fire.
|
|
288
|
-
|
|
289
|
-
### v1.0 — Pre-built agent templates
|
|
290
|
-
|
|
291
|
-
One-shot deployable templates for common workflows: research, security audit, design-system migration, content automation. `omp template add <name>` drops a curated skill + agent pair into your project.
|
|
285
|
+
- **HUD-lite statusline** — live orchestration metrics in the terminal: active mode, current task, worker count, tokens, cache hit rate, last error.
|
|
286
|
+
- **Provider routing** — fine-grained per-task provider selection: sorting, whitelists, priority ordering, cost-aware fallback. For mixed pipelines that want Opus for planning and Haiku for grunt work without manual model switching.
|
|
287
|
+
- **Skill learning** — extract repeating patterns from session transcripts into reusable skill files with strict quality gates. Auto-injects into context when relevant triggers fire.
|
|
288
|
+
- **Pre-built agent templates** — one-shot deployable templates for common workflows (research, security audit, design-system migration, content automation). `omp template add <name>` drops a curated skill + agent pair into your project.
|
|
292
289
|
|
|
293
290
|
---
|
|
294
291
|
|
|
@@ -298,6 +295,7 @@ One-shot deployable templates for common workflows: research, security audit, de
|
|
|
298
295
|
- [Copilot distribution](docs/copilot-distribution.md) — project/user skill installs and the case against GitHub App Extensions
|
|
299
296
|
- [Jira adapter](docs/jira.md) — configuration discovery, safe operations, dry-runs, fallback payloads
|
|
300
297
|
- [Self-evolve](docs/self-evolve.md) — extracting reusable skills from session transcripts
|
|
298
|
+
- [Slack setup](docs/slack-setup.md) — Slack app manifest, scopes, Socket-Mode token, `omp gateway serve`
|
|
301
299
|
|
|
302
300
|
## Layout
|
|
303
301
|
|
|
@@ -306,7 +304,7 @@ One-shot deployable templates for common workflows: research, security audit, de
|
|
|
306
304
|
.github/skills/<name>/SKILL.md # in-session slash skills
|
|
307
305
|
hooks/hooks.json # lifecycle hook manifest
|
|
308
306
|
scripts/*.mjs # hook implementations
|
|
309
|
-
src/ # omp CLI,
|
|
307
|
+
src/ # omp CLI, team runtime, gateway/comms, schedule, mode-state loops
|
|
310
308
|
```
|
|
311
309
|
|
|
312
310
|
Skills follow the [Copilot agent-skills docs](https://docs.github.com/en/copilot) — project skills live in `.github/skills/` and are invoked with `/skill-name`.
|
|
@@ -862,6 +862,52 @@
|
|
|
862
862
|
"notes": "Use /weighted-consensus from .github/skills/weighted-consensus/SKILL.md."
|
|
863
863
|
}
|
|
864
864
|
}
|
|
865
|
+
},
|
|
866
|
+
{
|
|
867
|
+
"id": "slack",
|
|
868
|
+
"name": "slack",
|
|
869
|
+
"title": "Slack Notification",
|
|
870
|
+
"category": "notify",
|
|
871
|
+
"summary": "Post an outbound Slack notification from inside a Copilot session.",
|
|
872
|
+
"notes": "Thin in-session wrapper over `omp gateway notify`. Stateless REST call. v0.8.0 inbound chat bridge unchanged.",
|
|
873
|
+
"defaultCommand": "slack",
|
|
874
|
+
"phase1": true,
|
|
875
|
+
"sourceSkill": "slack",
|
|
876
|
+
"providers": {
|
|
877
|
+
"copilot": "supported"
|
|
878
|
+
},
|
|
879
|
+
"support": {
|
|
880
|
+
"copilot": "native"
|
|
881
|
+
},
|
|
882
|
+
"providerSupport": {
|
|
883
|
+
"copilot": {
|
|
884
|
+
"state": "native",
|
|
885
|
+
"notes": "Use /slack from .github/skills/slack/SKILL.md."
|
|
886
|
+
}
|
|
887
|
+
}
|
|
888
|
+
},
|
|
889
|
+
{
|
|
890
|
+
"id": "notify.slack",
|
|
891
|
+
"name": "notify.slack",
|
|
892
|
+
"title": "Slack Notification",
|
|
893
|
+
"category": "notify",
|
|
894
|
+
"summary": "Alias capability id for `slack`.",
|
|
895
|
+
"notes": "Same skill as `slack`.",
|
|
896
|
+
"defaultCommand": "slack",
|
|
897
|
+
"phase1": true,
|
|
898
|
+
"sourceSkill": "slack",
|
|
899
|
+
"providers": {
|
|
900
|
+
"copilot": "supported"
|
|
901
|
+
},
|
|
902
|
+
"support": {
|
|
903
|
+
"copilot": "native"
|
|
904
|
+
},
|
|
905
|
+
"providerSupport": {
|
|
906
|
+
"copilot": {
|
|
907
|
+
"state": "native",
|
|
908
|
+
"notes": "Use /slack from .github/skills/slack/SKILL.md."
|
|
909
|
+
}
|
|
910
|
+
}
|
|
865
911
|
}
|
|
866
912
|
]
|
|
867
913
|
}
|
|
@@ -502,6 +502,32 @@
|
|
|
502
502
|
},
|
|
503
503
|
"projection": "project-skill",
|
|
504
504
|
"phase1": true
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
"name": "slack",
|
|
508
|
+
"capabilityId": "slack",
|
|
509
|
+
"capabilityIds": [
|
|
510
|
+
"slack",
|
|
511
|
+
"notify.slack"
|
|
512
|
+
],
|
|
513
|
+
"source": ".github/skills/slack/SKILL.md",
|
|
514
|
+
"sourcePath": ".github/skills/slack/SKILL.md",
|
|
515
|
+
"canonicalPath": ".github/skills/slack/SKILL.md",
|
|
516
|
+
"description": "Post an outbound Slack notification from inside a Copilot session.",
|
|
517
|
+
"summary": "Post an outbound Slack notification from inside a Copilot session.",
|
|
518
|
+
"support": "project-skill",
|
|
519
|
+
"aliases": [],
|
|
520
|
+
"slashCommands": [
|
|
521
|
+
"slack"
|
|
522
|
+
],
|
|
523
|
+
"projections": {
|
|
524
|
+
"copilot": {
|
|
525
|
+
"command": "/slack",
|
|
526
|
+
"state": "supported"
|
|
527
|
+
}
|
|
528
|
+
},
|
|
529
|
+
"projection": "project-skill",
|
|
530
|
+
"phase1": true
|
|
505
531
|
}
|
|
506
532
|
]
|
|
507
533
|
}
|