@damian87/omp 0.1.0 → 0.2.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/copilot-instructions.md +15 -0
- package/.github/skills/caveman/SKILL.md +22 -11
- package/.github/skills/code-review/SKILL.md +27 -13
- package/.github/skills/debug/SKILL.md +29 -13
- package/.github/skills/grill-me/SKILL.md +19 -7
- package/.github/skills/jira-ticket/SKILL.md +34 -12
- package/.github/skills/omp-autopilot/SKILL.md +67 -12
- package/.github/skills/prototype/SKILL.md +30 -12
- package/.github/skills/ralph/SKILL.md +62 -13
- package/.github/skills/ralplan/SKILL.md +21 -12
- package/.github/skills/research-codebase/SKILL.md +58 -0
- package/.github/skills/research-codebase/reference/agent-prompts.md +38 -0
- package/.github/skills/research-codebase/reference/follow-up.md +21 -0
- package/.github/skills/research-codebase/reference/permalink.md +26 -0
- package/.github/skills/research-codebase/reference/template.md +75 -0
- package/.github/skills/tdd/SKILL.md +27 -10
- package/.github/skills/team/SKILL.md +95 -13
- package/.github/skills/team/scripts/team-launch.sh +132 -0
- package/.github/skills/ultraqa/SKILL.md +55 -11
- package/.github/skills/ultrawork/SKILL.md +66 -13
- package/.github/skills/verify/SKILL.md +29 -11
- package/.github/skills/worktree/SKILL.md +51 -0
- package/README.md +28 -14
- package/catalog/capabilities.json +104 -12
- package/catalog/skills-general.json +62 -10
- package/dist/src/copilot/launch.js +42 -2
- package/dist/src/copilot/launch.js.map +1 -1
- package/docs/general-skills.md +5 -4
- package/docs/self-evolve.md +2 -2
- package/package.json +1 -1
- package/scripts/lib/version-check.mjs +82 -0
- package/scripts/session-start.mjs +8 -2
- package/.github/skills/codebase-research/SKILL.md +0 -20
package/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# oh-my-copilot
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@damian87/omp)
|
|
4
|
+
[](https://www.npmjs.com/package/@damian87/omp)
|
|
3
5
|
[](https://opensource.org/licenses/MIT)
|
|
4
6
|
|
|
5
7
|
**Multi-agent orchestration for GitHub Copilot CLI. Zero learning curve.**
|
|
@@ -10,25 +12,27 @@ _Don't relearn Copilot. Just use omp._
|
|
|
10
12
|
|
|
11
13
|
---
|
|
12
14
|
|
|
15
|
+
> Now on npm as [`@damian87/omp`](https://www.npmjs.com/package/@damian87/omp). One command and you're running.
|
|
16
|
+
|
|
13
17
|
## Quick Start
|
|
14
18
|
|
|
15
19
|
**Step 1: Install**
|
|
16
20
|
|
|
17
|
-
|
|
21
|
+
The shell CLI (`omp`):
|
|
18
22
|
|
|
19
23
|
```bash
|
|
20
|
-
|
|
21
|
-
copilot plugin install oh-my-copilot@oh-my-copilot
|
|
24
|
+
npm i -g @damian87/omp
|
|
22
25
|
```
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
If you prefer the npm path for the local runtime:
|
|
27
|
+
And the in-session skills, as a Copilot CLI plugin:
|
|
27
28
|
|
|
28
29
|
```bash
|
|
29
|
-
|
|
30
|
+
copilot plugin marketplace add damian87x/oh-my-copilot
|
|
31
|
+
copilot plugin install oh-my-copilot@oh-my-copilot
|
|
30
32
|
```
|
|
31
33
|
|
|
34
|
+
Requires Copilot CLI v1.0.48+. After install, `omp --madmax` works from any shell, and `/omp-autopilot`, `/ralplan`, `/code-review`, `/create-skill`, `/self-evolve`, and the rest are available inside any Copilot session.
|
|
35
|
+
|
|
32
36
|
**Step 2: Build something**
|
|
33
37
|
|
|
34
38
|
```bash
|
|
@@ -46,7 +50,7 @@ That's it.
|
|
|
46
50
|
## Why oh-my-copilot?
|
|
47
51
|
|
|
48
52
|
- **Zero configuration** — works out of the box with sane defaults
|
|
49
|
-
- **Team-first orchestration** —
|
|
53
|
+
- **Team-first orchestration** — parallel tmux panes, each running an independent agent session
|
|
50
54
|
- **Bare-flag bypass** — `omp --madmax` injects `--yolo` so non-interactive runs never block on a permission prompt
|
|
51
55
|
- **Persistent execution** — Ralph, UltraQA, and Ultrawork keep going until the goal is verified
|
|
52
56
|
- **MCP-powered shared state** — workers swap typed messages over an outbox/inbox cursor instead of summarising each other's summaries
|
|
@@ -72,8 +76,8 @@ That's it.
|
|
|
72
76
|
### Intelligent Orchestration
|
|
73
77
|
|
|
74
78
|
- **7 specialized agents** — planner, architect, executor, verifier, code-reviewer, designer, researcher (all `--agent <name>` compatible with Copilot CLI)
|
|
75
|
-
- **
|
|
76
|
-
- **Smart pipeline routing** — `/codebase
|
|
79
|
+
- **18 in-session skills** auto-discovered from `.github/skills/`
|
|
80
|
+
- **Smart pipeline routing** — `/research-codebase` → `/ralplan` → `/team` / `/ralph` / `/ultrawork` → `/code-review` → `/ultraqa`
|
|
77
81
|
|
|
78
82
|
### Developer Experience
|
|
79
83
|
|
|
@@ -95,9 +99,9 @@ These run **inside a Copilot CLI session** after the plugin is installed.
|
|
|
95
99
|
| `/ultrawork` | Maximum parallelism | `/ultrawork "fix all type errors"` |
|
|
96
100
|
| `/ultraqa` | QA cycling until goal met | `/ultraqa "build green, tests pass"` |
|
|
97
101
|
| `/ralplan` | Consensus planning | `/ralplan "plan this feature"` |
|
|
98
|
-
| `/team` |
|
|
102
|
+
| `/team` | Parallel tmux agent panes | `/team` |
|
|
99
103
|
| `/code-review` | Diff-focused reviewer | `/code-review` |
|
|
100
|
-
| `/codebase
|
|
104
|
+
| `/research-codebase` | Map an area of the codebase | `/research-codebase "auth middleware"` |
|
|
101
105
|
| `/debug` | Disciplined diagnose-reproduce-fix loop | `/debug "flaky integration test"` |
|
|
102
106
|
| `/tdd` | Red-green-refactor cycle | `/tdd "add pagination to /users"` |
|
|
103
107
|
| `/verify` | Exercise a change end-to-end | `/verify` |
|
|
@@ -107,6 +111,7 @@ These run **inside a Copilot CLI session** after the plugin is installed.
|
|
|
107
111
|
| `/prototype` | Throwaway prototype to flesh out a design | `/prototype "state shape"` |
|
|
108
112
|
| `/grill-me` | Stress-test a plan with Socratic questions | `/grill-me` |
|
|
109
113
|
| `/caveman` | Ultra-compressed communication mode | `/caveman` |
|
|
114
|
+
| `/worktree` | Git worktree-based parallel branch work | `/worktree` |
|
|
110
115
|
|
|
111
116
|
---
|
|
112
117
|
|
|
@@ -207,8 +212,17 @@ Skills follow the [Copilot agent-skills docs](https://docs.github.com/en/copilot
|
|
|
207
212
|
```bash
|
|
208
213
|
npm install
|
|
209
214
|
npm run build
|
|
210
|
-
npm
|
|
215
|
+
npm link # makes `omp` point to your local checkout
|
|
216
|
+
npm test
|
|
211
217
|
npm run lint:skills
|
|
212
218
|
npm run sync:dry-run
|
|
213
|
-
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
After `npm link`, the global `omp` command runs your local build. Any changes you make are reflected after `npm run build`.
|
|
222
|
+
|
|
223
|
+
To unlink and revert to the published package:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
npm unlink -g @damian87/omp
|
|
227
|
+
npm i -g @damian87/omp
|
|
214
228
|
```
|
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
],
|
|
14
14
|
"capabilities": [
|
|
15
15
|
{
|
|
16
|
-
"id": "codebase
|
|
17
|
-
"name": "codebase
|
|
16
|
+
"id": "research-codebase",
|
|
17
|
+
"name": "research-codebase",
|
|
18
18
|
"title": "Codebase research",
|
|
19
19
|
"category": "research",
|
|
20
|
-
"summary": "
|
|
21
|
-
"notes": "
|
|
22
|
-
"defaultCommand": "codebase
|
|
20
|
+
"summary": "Comprehensive codebase research with progressive disclosure and tiered effort.",
|
|
21
|
+
"notes": "Progressive disclosure skill with reference/ folder; scales effort to task complexity.",
|
|
22
|
+
"defaultCommand": "research-codebase",
|
|
23
23
|
"phase1": true,
|
|
24
|
-
"sourceSkill": "codebase
|
|
24
|
+
"sourceSkill": "research-codebase",
|
|
25
25
|
"providers": {
|
|
26
26
|
"copilot": "supported"
|
|
27
27
|
},
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"providerSupport": {
|
|
32
32
|
"copilot": {
|
|
33
33
|
"state": "native",
|
|
34
|
-
"notes": "Use /codebase
|
|
34
|
+
"notes": "Use /research-codebase from .github/skills/research-codebase/SKILL.md."
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
},
|
|
@@ -40,11 +40,11 @@
|
|
|
40
40
|
"name": "research.codebase",
|
|
41
41
|
"title": "Codebase research",
|
|
42
42
|
"category": "research",
|
|
43
|
-
"summary": "
|
|
44
|
-
"notes": "
|
|
45
|
-
"defaultCommand": "codebase
|
|
43
|
+
"summary": "Comprehensive codebase research with progressive disclosure and tiered effort.",
|
|
44
|
+
"notes": "Alias for research-codebase capability.",
|
|
45
|
+
"defaultCommand": "research-codebase",
|
|
46
46
|
"phase1": true,
|
|
47
|
-
"sourceSkill": "codebase
|
|
47
|
+
"sourceSkill": "research-codebase",
|
|
48
48
|
"providers": {
|
|
49
49
|
"copilot": "supported"
|
|
50
50
|
},
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
"providerSupport": {
|
|
55
55
|
"copilot": {
|
|
56
56
|
"state": "native",
|
|
57
|
-
"notes": "Use /codebase
|
|
57
|
+
"notes": "Use /research-codebase from .github/skills/research-codebase/SKILL.md."
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
},
|
|
@@ -724,6 +724,98 @@
|
|
|
724
724
|
"notes": "Use /self-evolve from .github/skills/self-evolve/SKILL.md."
|
|
725
725
|
}
|
|
726
726
|
}
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
"id": "worktree",
|
|
730
|
+
"name": "worktree",
|
|
731
|
+
"title": "Worktree",
|
|
732
|
+
"category": "workflow",
|
|
733
|
+
"summary": "Git worktree-based parallel branch work.",
|
|
734
|
+
"notes": "Guides worktree setup for tickets and PR reviews.",
|
|
735
|
+
"defaultCommand": "worktree",
|
|
736
|
+
"phase1": true,
|
|
737
|
+
"sourceSkill": "worktree",
|
|
738
|
+
"providers": {
|
|
739
|
+
"copilot": "supported"
|
|
740
|
+
},
|
|
741
|
+
"support": {
|
|
742
|
+
"copilot": "native"
|
|
743
|
+
},
|
|
744
|
+
"providerSupport": {
|
|
745
|
+
"copilot": {
|
|
746
|
+
"state": "native",
|
|
747
|
+
"notes": "Use /worktree from .github/skills/worktree/SKILL.md."
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
},
|
|
751
|
+
{
|
|
752
|
+
"id": "workflow.worktree",
|
|
753
|
+
"name": "workflow.worktree",
|
|
754
|
+
"title": "Worktree workflow",
|
|
755
|
+
"category": "workflow",
|
|
756
|
+
"summary": "Git worktree-based parallel branch work.",
|
|
757
|
+
"notes": "Alias for worktree capability.",
|
|
758
|
+
"defaultCommand": "worktree",
|
|
759
|
+
"phase1": true,
|
|
760
|
+
"sourceSkill": "worktree",
|
|
761
|
+
"providers": {
|
|
762
|
+
"copilot": "supported"
|
|
763
|
+
},
|
|
764
|
+
"support": {
|
|
765
|
+
"copilot": "native"
|
|
766
|
+
},
|
|
767
|
+
"providerSupport": {
|
|
768
|
+
"copilot": {
|
|
769
|
+
"state": "native",
|
|
770
|
+
"notes": "Use /worktree from .github/skills/worktree/SKILL.md."
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
},
|
|
774
|
+
{
|
|
775
|
+
"id": "create-skill",
|
|
776
|
+
"name": "create-skill",
|
|
777
|
+
"title": "Skill authoring guide",
|
|
778
|
+
"category": "meta",
|
|
779
|
+
"summary": "Guide for creating effective skills following best practices.",
|
|
780
|
+
"notes": "Helps create or update skills that extend agent capabilities.",
|
|
781
|
+
"defaultCommand": "create-skill",
|
|
782
|
+
"phase1": true,
|
|
783
|
+
"sourceSkill": "create-skill",
|
|
784
|
+
"providers": {
|
|
785
|
+
"copilot": "supported"
|
|
786
|
+
},
|
|
787
|
+
"support": {
|
|
788
|
+
"copilot": "native"
|
|
789
|
+
},
|
|
790
|
+
"providerSupport": {
|
|
791
|
+
"copilot": {
|
|
792
|
+
"state": "native",
|
|
793
|
+
"notes": "Use /create-skill from .github/skills/create-skill/SKILL.md."
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
"id": "meta.skill-authoring",
|
|
799
|
+
"name": "meta.skill-authoring",
|
|
800
|
+
"title": "Skill authoring",
|
|
801
|
+
"category": "meta",
|
|
802
|
+
"summary": "Guide for creating effective skills.",
|
|
803
|
+
"notes": "Alias for create-skill capability.",
|
|
804
|
+
"defaultCommand": "create-skill",
|
|
805
|
+
"phase1": true,
|
|
806
|
+
"sourceSkill": "create-skill",
|
|
807
|
+
"providers": {
|
|
808
|
+
"copilot": "supported"
|
|
809
|
+
},
|
|
810
|
+
"support": {
|
|
811
|
+
"copilot": "native"
|
|
812
|
+
},
|
|
813
|
+
"providerSupport": {
|
|
814
|
+
"copilot": {
|
|
815
|
+
"state": "native",
|
|
816
|
+
"notes": "Use /create-skill from .github/skills/create-skill/SKILL.md."
|
|
817
|
+
}
|
|
818
|
+
}
|
|
727
819
|
}
|
|
728
820
|
]
|
|
729
821
|
}
|
|
@@ -4,25 +4,25 @@
|
|
|
4
4
|
"commandPrefix": "/",
|
|
5
5
|
"skills": [
|
|
6
6
|
{
|
|
7
|
-
"name": "codebase
|
|
8
|
-
"capabilityId": "codebase
|
|
7
|
+
"name": "research-codebase",
|
|
8
|
+
"capabilityId": "research-codebase",
|
|
9
9
|
"capabilityIds": [
|
|
10
|
-
"codebase
|
|
10
|
+
"research-codebase",
|
|
11
11
|
"research.codebase"
|
|
12
12
|
],
|
|
13
|
-
"source": ".github/skills/codebase
|
|
14
|
-
"sourcePath": ".github/skills/codebase
|
|
15
|
-
"canonicalPath": ".github/skills/codebase
|
|
16
|
-
"description": "
|
|
17
|
-
"summary": "
|
|
13
|
+
"source": ".github/skills/research-codebase/SKILL.md",
|
|
14
|
+
"sourcePath": ".github/skills/research-codebase/SKILL.md",
|
|
15
|
+
"canonicalPath": ".github/skills/research-codebase/SKILL.md",
|
|
16
|
+
"description": "Comprehensive codebase research with progressive disclosure and tiered effort.",
|
|
17
|
+
"summary": "Comprehensive codebase research with progressive disclosure and tiered effort.",
|
|
18
18
|
"support": "project-skill",
|
|
19
19
|
"aliases": [],
|
|
20
20
|
"slashCommands": [
|
|
21
|
-
"codebase
|
|
21
|
+
"research-codebase"
|
|
22
22
|
],
|
|
23
23
|
"projections": {
|
|
24
24
|
"copilot": {
|
|
25
|
-
"command": "/codebase
|
|
25
|
+
"command": "/research-codebase",
|
|
26
26
|
"state": "supported"
|
|
27
27
|
}
|
|
28
28
|
},
|
|
@@ -422,6 +422,58 @@
|
|
|
422
422
|
},
|
|
423
423
|
"projection": "project-skill",
|
|
424
424
|
"phase1": true
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"name": "worktree",
|
|
428
|
+
"capabilityId": "worktree",
|
|
429
|
+
"capabilityIds": [
|
|
430
|
+
"worktree",
|
|
431
|
+
"workflow.worktree"
|
|
432
|
+
],
|
|
433
|
+
"source": ".github/skills/worktree/SKILL.md",
|
|
434
|
+
"sourcePath": ".github/skills/worktree/SKILL.md",
|
|
435
|
+
"canonicalPath": ".github/skills/worktree/SKILL.md",
|
|
436
|
+
"description": "Git worktree-based parallel branch work.",
|
|
437
|
+
"summary": "Git worktree-based parallel branch work.",
|
|
438
|
+
"support": "project-skill",
|
|
439
|
+
"aliases": [],
|
|
440
|
+
"slashCommands": [
|
|
441
|
+
"worktree"
|
|
442
|
+
],
|
|
443
|
+
"projections": {
|
|
444
|
+
"copilot": {
|
|
445
|
+
"command": "/worktree",
|
|
446
|
+
"state": "supported"
|
|
447
|
+
}
|
|
448
|
+
},
|
|
449
|
+
"projection": "project-skill",
|
|
450
|
+
"phase1": true
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
"name": "create-skill",
|
|
454
|
+
"capabilityId": "create-skill",
|
|
455
|
+
"capabilityIds": [
|
|
456
|
+
"create-skill",
|
|
457
|
+
"meta.skill-authoring"
|
|
458
|
+
],
|
|
459
|
+
"source": ".github/skills/create-skill/SKILL.md",
|
|
460
|
+
"sourcePath": ".github/skills/create-skill/SKILL.md",
|
|
461
|
+
"canonicalPath": ".github/skills/create-skill/SKILL.md",
|
|
462
|
+
"description": "Guide for creating effective skills following best practices.",
|
|
463
|
+
"summary": "Guide for creating effective skills following best practices.",
|
|
464
|
+
"support": "project-skill",
|
|
465
|
+
"aliases": [],
|
|
466
|
+
"slashCommands": [
|
|
467
|
+
"create-skill"
|
|
468
|
+
],
|
|
469
|
+
"projections": {
|
|
470
|
+
"copilot": {
|
|
471
|
+
"command": "/create-skill",
|
|
472
|
+
"state": "supported"
|
|
473
|
+
}
|
|
474
|
+
},
|
|
475
|
+
"projection": "project-skill",
|
|
476
|
+
"phase1": true
|
|
425
477
|
}
|
|
426
478
|
]
|
|
427
479
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
1
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
2
2
|
const MADMAX_FLAG = "--madmax";
|
|
3
3
|
const COPILOT_BYPASS_FLAG = "--yolo";
|
|
4
4
|
export function normalizeCopilotLaunchArgs(args) {
|
|
@@ -36,14 +36,49 @@ export function resolveCopilotBin(override) {
|
|
|
36
36
|
return fromEnv;
|
|
37
37
|
return "copilot";
|
|
38
38
|
}
|
|
39
|
+
function isInsideTmux() {
|
|
40
|
+
return !!process.env.TMUX;
|
|
41
|
+
}
|
|
42
|
+
function tmuxAvailable() {
|
|
43
|
+
const r = spawnSync("tmux", ["-V"], { encoding: "utf8", timeout: 3000 });
|
|
44
|
+
return r.status === 0;
|
|
45
|
+
}
|
|
39
46
|
export async function launchCopilot(options) {
|
|
40
47
|
const bin = resolveCopilotBin(options.bin);
|
|
41
48
|
const args = normalizeCopilotLaunchArgs(options.args);
|
|
49
|
+
const cwd = options.cwd ?? process.cwd();
|
|
50
|
+
// If not already inside tmux and tmux is available, wrap in a tmux session
|
|
51
|
+
if (!isInsideTmux() && tmuxAvailable()) {
|
|
52
|
+
const sessionName = `omp-${Date.now()}`;
|
|
53
|
+
const copilotCmd = [bin, ...args].map(shellEscape).join(" ");
|
|
54
|
+
return new Promise((resolveFn) => {
|
|
55
|
+
let settled = false;
|
|
56
|
+
const child = spawn("tmux", ["new-session", "-s", sessionName, "-c", cwd, copilotCmd], {
|
|
57
|
+
stdio: "inherit",
|
|
58
|
+
cwd,
|
|
59
|
+
env: options.env ?? process.env,
|
|
60
|
+
});
|
|
61
|
+
child.on("error", () => {
|
|
62
|
+
if (settled)
|
|
63
|
+
return;
|
|
64
|
+
settled = true;
|
|
65
|
+
resolveFn({ ok: false, exitCode: 127, bin });
|
|
66
|
+
});
|
|
67
|
+
child.on("close", (code) => {
|
|
68
|
+
if (settled)
|
|
69
|
+
return;
|
|
70
|
+
settled = true;
|
|
71
|
+
const exitCode = typeof code === "number" ? code : 1;
|
|
72
|
+
resolveFn({ ok: exitCode === 0, exitCode, bin });
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Already inside tmux or tmux not available — launch directly
|
|
42
77
|
return new Promise((resolveFn) => {
|
|
43
78
|
let settled = false;
|
|
44
79
|
const child = spawn(bin, args, {
|
|
45
80
|
stdio: "inherit",
|
|
46
|
-
cwd
|
|
81
|
+
cwd,
|
|
47
82
|
env: options.env ?? process.env,
|
|
48
83
|
});
|
|
49
84
|
child.on("error", () => {
|
|
@@ -61,4 +96,9 @@ export async function launchCopilot(options) {
|
|
|
61
96
|
});
|
|
62
97
|
});
|
|
63
98
|
}
|
|
99
|
+
function shellEscape(s) {
|
|
100
|
+
if (/^[a-zA-Z0-9_./:=-]+$/.test(s))
|
|
101
|
+
return s;
|
|
102
|
+
return `'${s.replace(/'/g, "'\\''")}'`;
|
|
103
|
+
}
|
|
64
104
|
//# sourceMappingURL=launch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/copilot/launch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/copilot/launch.ts"],"names":[],"mappings":"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"}
|
package/docs/general-skills.md
CHANGED
|
@@ -6,14 +6,14 @@ The canonical skill source is the repo-local `.github/skills` directory. This is
|
|
|
6
6
|
|
|
7
7
|
| Skill | Capability IDs | Purpose |
|
|
8
8
|
| --- | --- | --- |
|
|
9
|
-
| `/codebase
|
|
9
|
+
| `/research-codebase` | `research-codebase`, `research.codebase` | Comprehensive codebase research with tiered effort. |
|
|
10
10
|
| `/grill-me` | `grill-me`, `planning.challenge` | Ask one sharp clarification question when ambiguity remains. |
|
|
11
11
|
| `/ralplan` | `ralplan`, `planning.consensus` | Produce implementation-ready plan, tests, and risks. |
|
|
12
|
-
| `/team` | `team`, `execution.parallel` | Split approved work into parallel
|
|
12
|
+
| `/team` | `team`, `execution.parallel` | Split approved work into parallel tmux panes running interactive agents. |
|
|
13
13
|
| `/ralph` | `ralph`, `execution.single-owner` | Single-owner execute-fix-verify loop. |
|
|
14
14
|
| `/ultrawork` | `ultrawork`, `execution.parallel` | Batch many independent small tasks. |
|
|
15
15
|
| `/ultraqa` | `ultraqa`, `qa.behavioral` | Adversarial behavior and regression QA. |
|
|
16
|
-
| `/
|
|
16
|
+
| `/omp-autopilot` | `omp-autopilot`, `execution.autonomous` | Lightweight end-to-end flow across the other skills. (Renamed from `/autopilot` to avoid Copilot CLI built-in collision.) |
|
|
17
17
|
| `/code-review` | `code-review`, `review.independent` | Review completed changes before merge or handoff. |
|
|
18
18
|
| `/verify` | `verify`, `verification.evidence` | Prove completion claims with evidence. |
|
|
19
19
|
| `/jira-ticket` | `jira-ticket`, `tracker.ticket` | Render Jira create/comment/safe-update payloads. |
|
|
@@ -21,6 +21,7 @@ The canonical skill source is the repo-local `.github/skills` directory. This is
|
|
|
21
21
|
| `/caveman` | `caveman`, `communication.compact` | Ultra-compact response mode. |
|
|
22
22
|
| `/debug` | `debug`, `debug.systematic` | Reproduce, diagnose, fix, and regression-test bugs. |
|
|
23
23
|
| `/tdd` | `tdd`, `testing.tdd` | Red-green-refactor for behavior changes. |
|
|
24
|
+
| `/worktree` | `worktree`, `workflow.worktree` | Git worktree-based parallel branch work. |
|
|
24
25
|
|
|
25
26
|
## Repo-local layout
|
|
26
27
|
|
|
@@ -52,7 +53,7 @@ It does not imply a durable execution runtime. Phase 1 execution skills such as
|
|
|
52
53
|
## Phase 1 flow
|
|
53
54
|
|
|
54
55
|
```text
|
|
55
|
-
/codebase
|
|
56
|
+
/research-codebase
|
|
56
57
|
-> /grill-me when unclear or risky
|
|
57
58
|
-> /ralplan
|
|
58
59
|
-> /team if lanes are independent, otherwise /ralph or /ultrawork
|
package/docs/self-evolve.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
A two-file mechanism that turns repeated user corrections into draft project skills.
|
|
4
4
|
|
|
5
|
-
-
|
|
5
|
+
- `.github/copilot-instructions.md` ships with the plugin and instructs the agent to invoke `/self-evolve` before ending a session — so the trigger fires in every project where the plugin is active, not only inside this repo.
|
|
6
6
|
- `.github/skills/self-evolve/SKILL.md` is the loop itself: log corrections to `.oh-my-copilot/self-evolve/log.md`, count repeats per topic, and when a topic recurs three times draft `.oh-my-copilot/self-evolve/drafts/<slug>/SKILL.md` with `status: draft`.
|
|
7
7
|
|
|
8
8
|
## Why drafts live outside `.github/skills/`
|
|
@@ -19,4 +19,4 @@ Move the draft directory from `.oh-my-copilot/self-evolve/drafts/<slug>/` to `.g
|
|
|
19
19
|
|
|
20
20
|
## Why agent-driven, not a CLI
|
|
21
21
|
|
|
22
|
-
Copilot CLI exposes no user-installable hook surface. The cheapest reliable trigger is the agent itself:
|
|
22
|
+
Copilot CLI exposes no user-installable hook surface. The cheapest reliable trigger is the agent itself: `.github/copilot-instructions.md` is loaded into every session where the plugin is active, and the instruction there ensures `/self-evolve` runs at wrap-up without any binary, dependency, or shell modification.
|
package/package.json
CHANGED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
const CACHE_TTL_MS = 6 * 60 * 60 * 1000;
|
|
6
|
+
const FETCH_TIMEOUT_MS = 2000;
|
|
7
|
+
const PACKAGE_NAME = "@damian87/omp";
|
|
8
|
+
|
|
9
|
+
export function isNewer(latest, current) {
|
|
10
|
+
if (!latest || !current) return false;
|
|
11
|
+
const [a = 0, b = 0, c = 0] = String(latest).split(".").map((n) => Number.parseInt(n, 10));
|
|
12
|
+
const [x = 0, y = 0, z = 0] = String(current).split(".").map((n) => Number.parseInt(n, 10));
|
|
13
|
+
if ([a, b, c, x, y, z].some(Number.isNaN)) return false;
|
|
14
|
+
if (a !== x) return a > x;
|
|
15
|
+
if (b !== y) return b > y;
|
|
16
|
+
return c > z;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function formatUpdateNotice(current, latest) {
|
|
20
|
+
return `[OMP UPDATE AVAILABLE]\n\nA new version of ${PACKAGE_NAME} is available: v${latest} (current: v${current})\nTo update, run: npm i -g ${PACKAGE_NAME}@latest`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function readCurrentVersion() {
|
|
24
|
+
try {
|
|
25
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
26
|
+
const pkgPath = join(here, "..", "..", "package.json");
|
|
27
|
+
return JSON.parse(readFileSync(pkgPath, "utf8")).version ?? null;
|
|
28
|
+
} catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function fetchLatestVersion() {
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const timer = setTimeout(() => controller.abort(), FETCH_TIMEOUT_MS);
|
|
36
|
+
try {
|
|
37
|
+
const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {
|
|
38
|
+
signal: controller.signal,
|
|
39
|
+
});
|
|
40
|
+
if (!res.ok) return null;
|
|
41
|
+
const data = await res.json();
|
|
42
|
+
return typeof data?.version === "string" ? data.version : null;
|
|
43
|
+
} catch {
|
|
44
|
+
return null;
|
|
45
|
+
} finally {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function checkForUpdate({ stateDir, now = Date.now(), fetchLatest = fetchLatestVersion } = {}) {
|
|
51
|
+
const current = readCurrentVersion();
|
|
52
|
+
if (!current || !stateDir) return null;
|
|
53
|
+
|
|
54
|
+
const cachePath = join(stateDir, "version-check.json");
|
|
55
|
+
let latest = null;
|
|
56
|
+
|
|
57
|
+
if (existsSync(cachePath)) {
|
|
58
|
+
try {
|
|
59
|
+
const cache = JSON.parse(readFileSync(cachePath, "utf8"));
|
|
60
|
+
if (cache?.checkedAt && now - cache.checkedAt < CACHE_TTL_MS && typeof cache.latest === "string") {
|
|
61
|
+
latest = cache.latest;
|
|
62
|
+
}
|
|
63
|
+
} catch {
|
|
64
|
+
// ignore corrupt cache
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!latest) {
|
|
69
|
+
latest = await fetchLatest();
|
|
70
|
+
if (latest) {
|
|
71
|
+
try {
|
|
72
|
+
mkdirSync(stateDir, { recursive: true });
|
|
73
|
+
writeFileSync(cachePath, JSON.stringify({ checkedAt: now, latest }));
|
|
74
|
+
} catch {
|
|
75
|
+
// best-effort cache write
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!latest || !isNewer(latest, current)) return null;
|
|
81
|
+
return { current, latest };
|
|
82
|
+
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { appendFileSync, mkdirSync } from "node:fs";
|
|
3
3
|
import { dirname, join } from "node:path";
|
|
4
4
|
import { readStdin } from "./lib/stdin.mjs";
|
|
5
|
+
import { checkForUpdate, formatUpdateNotice } from "./lib/version-check.mjs";
|
|
5
6
|
|
|
6
7
|
const HOOK_NAME = "SessionStart";
|
|
7
8
|
|
|
@@ -11,7 +12,8 @@ const HOOK_NAME = "SessionStart";
|
|
|
11
12
|
const data = raw ? JSON.parse(raw) : {};
|
|
12
13
|
const sessionId = data.sessionId ?? data.session_id ?? "unknown";
|
|
13
14
|
const directory = data.directory ?? process.cwd();
|
|
14
|
-
const
|
|
15
|
+
const stateDir = join(directory, ".omp", "state");
|
|
16
|
+
const logFile = join(stateDir, "hooks.log");
|
|
15
17
|
mkdirSync(dirname(logFile), { recursive: true });
|
|
16
18
|
const line = JSON.stringify({
|
|
17
19
|
ts: new Date().toISOString(),
|
|
@@ -20,10 +22,14 @@ const HOOK_NAME = "SessionStart";
|
|
|
20
22
|
directory,
|
|
21
23
|
});
|
|
22
24
|
appendFileSync(logFile, `${line}\n`);
|
|
25
|
+
|
|
26
|
+
const update = await checkForUpdate({ stateDir });
|
|
27
|
+
const additionalContext = update ? formatUpdateNotice(update.current, update.latest) : "";
|
|
28
|
+
|
|
23
29
|
console.log(
|
|
24
30
|
JSON.stringify({
|
|
25
31
|
continue: true,
|
|
26
|
-
hookSpecificOutput: { hookEventName: HOOK_NAME, additionalContext
|
|
32
|
+
hookSpecificOutput: { hookEventName: HOOK_NAME, additionalContext },
|
|
27
33
|
}),
|
|
28
34
|
);
|
|
29
35
|
} catch (err) {
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: codebase-research
|
|
3
|
-
description: Read the repo first, map evidence, and return the smallest useful implementation context. Use with /codebase-research before planning or asking when repo facts matter.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Codebase Research
|
|
7
|
-
|
|
8
|
-
Use `/codebase-research` before planning or asking when repo facts matter.
|
|
9
|
-
|
|
10
|
-
Do:
|
|
11
|
-
- Find relevant files, symbols, tests, docs, and existing patterns.
|
|
12
|
-
- Separate evidence from inference.
|
|
13
|
-
- Name the likely change surface and risks.
|
|
14
|
-
- Ask nothing if the repo can answer it.
|
|
15
|
-
|
|
16
|
-
Output:
|
|
17
|
-
- `Evidence` — file paths and facts.
|
|
18
|
-
- `Likely path` — what should change.
|
|
19
|
-
- `Unknowns` — blockers only.
|
|
20
|
-
- `Next skill` — usually `/grill-me`, `/ralplan`, `/debug`, or `/tdd`.
|