@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.
Files changed (33) hide show
  1. package/.github/copilot-instructions.md +15 -0
  2. package/.github/skills/caveman/SKILL.md +22 -11
  3. package/.github/skills/code-review/SKILL.md +27 -13
  4. package/.github/skills/debug/SKILL.md +29 -13
  5. package/.github/skills/grill-me/SKILL.md +19 -7
  6. package/.github/skills/jira-ticket/SKILL.md +34 -12
  7. package/.github/skills/omp-autopilot/SKILL.md +67 -12
  8. package/.github/skills/prototype/SKILL.md +30 -12
  9. package/.github/skills/ralph/SKILL.md +62 -13
  10. package/.github/skills/ralplan/SKILL.md +21 -12
  11. package/.github/skills/research-codebase/SKILL.md +58 -0
  12. package/.github/skills/research-codebase/reference/agent-prompts.md +38 -0
  13. package/.github/skills/research-codebase/reference/follow-up.md +21 -0
  14. package/.github/skills/research-codebase/reference/permalink.md +26 -0
  15. package/.github/skills/research-codebase/reference/template.md +75 -0
  16. package/.github/skills/tdd/SKILL.md +27 -10
  17. package/.github/skills/team/SKILL.md +95 -13
  18. package/.github/skills/team/scripts/team-launch.sh +132 -0
  19. package/.github/skills/ultraqa/SKILL.md +55 -11
  20. package/.github/skills/ultrawork/SKILL.md +66 -13
  21. package/.github/skills/verify/SKILL.md +29 -11
  22. package/.github/skills/worktree/SKILL.md +51 -0
  23. package/README.md +28 -14
  24. package/catalog/capabilities.json +104 -12
  25. package/catalog/skills-general.json +62 -10
  26. package/dist/src/copilot/launch.js +42 -2
  27. package/dist/src/copilot/launch.js.map +1 -1
  28. package/docs/general-skills.md +5 -4
  29. package/docs/self-evolve.md +2 -2
  30. package/package.json +1 -1
  31. package/scripts/lib/version-check.mjs +82 -0
  32. package/scripts/session-start.mjs +8 -2
  33. 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
+ [![npm version](https://img.shields.io/npm/v/@damian87/omp.svg)](https://www.npmjs.com/package/@damian87/omp)
4
+ [![npm downloads](https://img.shields.io/npm/dm/@damian87/omp.svg)](https://www.npmjs.com/package/@damian87/omp)
3
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](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
- Two commands install all 17 omp skills as a Copilot CLI plugin:
21
+ The shell CLI (`omp`):
18
22
 
19
23
  ```bash
20
- copilot plugin marketplace add damian87x/oh-my-copilot
21
- copilot plugin install oh-my-copilot@oh-my-copilot
24
+ npm i -g @damian87/omp
22
25
  ```
23
26
 
24
- Requires Copilot CLI v1.0.48+. After install, `/omp-autopilot`, `/ralplan`, `/code-review`, `/create-skill`, `/self-evolve`, and the rest are available inside any Copilot session.
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
- npm i -g @damian87/omp
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** — staged pipelines on a shared task list
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
- - **17 in-session skills** auto-discovered from `.github/skills/`
76
- - **Smart pipeline routing** — `/codebase-research` → `/ralplan` → `/team` / `/ralph` / `/ultrawork` → `/code-review` → `/ultraqa`
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` | Coordinated multi-agent task list | `/team 3:executor "ship the migration"` |
102
+ | `/team` | Parallel tmux agent panes | `/team` |
99
103
  | `/code-review` | Diff-focused reviewer | `/code-review` |
100
- | `/codebase-research` | Map an area of the codebase | `/codebase-research "auth middleware"` |
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 test # 137 tests
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
- npx tsx src/cli.ts skill install .github/skills/create-skill --dry-run
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-research",
17
- "name": "codebase-research",
16
+ "id": "research-codebase",
17
+ "name": "research-codebase",
18
18
  "title": "Codebase research",
19
19
  "category": "research",
20
- "summary": "Read repo evidence before planning or asking.",
21
- "notes": "Lite slash project skill; no bundled scripts or external runtime requirement.",
22
- "defaultCommand": "codebase-research",
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-research",
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-research from .github/skills/codebase-research/SKILL.md."
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": "Read repo evidence before planning or asking.",
44
- "notes": "Lite slash project skill; no bundled scripts or external runtime requirement.",
45
- "defaultCommand": "codebase-research",
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-research",
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-research from .github/skills/codebase-research/SKILL.md."
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-research",
8
- "capabilityId": "codebase-research",
7
+ "name": "research-codebase",
8
+ "capabilityId": "research-codebase",
9
9
  "capabilityIds": [
10
- "codebase-research",
10
+ "research-codebase",
11
11
  "research.codebase"
12
12
  ],
13
- "source": ".github/skills/codebase-research/SKILL.md",
14
- "sourcePath": ".github/skills/codebase-research/SKILL.md",
15
- "canonicalPath": ".github/skills/codebase-research/SKILL.md",
16
- "description": "Read repo evidence before planning or asking.",
17
- "summary": "Read repo evidence before planning or asking.",
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-research"
21
+ "research-codebase"
22
22
  ],
23
23
  "projections": {
24
24
  "copilot": {
25
- "command": "/codebase-research",
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: options.cwd ?? process.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":"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"}
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/copilot/launch.ts"],"names":[],"mappings":"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"}
@@ -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-research` | `codebase-research`, `research.codebase` | Read repo evidence before planning or asking. |
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 lanes. |
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
- | `/omc-autopilot` | `omc-autopilot`, `execution.autonomous` | Lightweight end-to-end flow across the other skills. (Renamed from `/autopilot` to avoid Copilot CLI built-in collision.) |
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-research
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  A two-file mechanism that turns repeated user corrections into draft project skills.
4
4
 
5
- - `AGENTS.md` instructs the agent to invoke `/self-evolve` before ending a session.
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: `AGENTS.md` is loaded into every session, and the instruction there ensures `/self-evolve` runs at wrap-up without any binary, dependency, or shell modification.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damian87/omp",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "GitHub Copilot project skills catalog and Jira handoff tools.",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -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 logFile = join(directory, ".omp", "state", "hooks.log");
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`.