@ngockhoale/ukit 2.1.5 → 2.2.1

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 (38) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +7 -4
  3. package/manifests/platform.full.yaml +113 -24
  4. package/package.json +4 -3
  5. package/src/cli/adapters.js +47 -21
  6. package/src/cli/index.js +2 -2
  7. package/src/core/applyPlan.js +5 -2
  8. package/src/core/ensureGitignore.js +2 -0
  9. package/src/core/runInstallPipeline.js +19 -0
  10. package/src/core/runtimeConfig.js +6 -1
  11. package/src/core/status.js +3 -1
  12. package/src/core/uninstall.js +16 -0
  13. package/src/index/routeCatalog.js +1 -1
  14. package/src/manifest/selectItems.js +11 -5
  15. package/templates/.claude/commands/ukit/handoff-create.md +6 -4
  16. package/templates/.claude/commands/ukit/handoff-fullstack.md +12 -10
  17. package/templates/.claude/commands/ukit/handoff-implement.md +4 -2
  18. package/templates/.claude/commands/ukit/handoff-review.md +4 -2
  19. package/templates/.claude/ukit/index/route-catalog.mjs +1 -1
  20. package/templates/.claude/ukit/index/unic-gateway.mjs +46 -7
  21. package/templates/.codex/README.md +1 -1
  22. package/templates/.gitignore +2 -0
  23. package/templates/.omp/AGENTS.md +9 -0
  24. package/templates/.omp/README.md +96 -0
  25. package/templates/.omp/RULES.md +34 -0
  26. package/templates/.omp/agents/bug-debugger.md +85 -0
  27. package/templates/.omp/agents/code-reviewer.md +197 -0
  28. package/templates/.omp/agents/feature-implementer.md +123 -0
  29. package/templates/.omp/agents/handoff-planner.md +210 -0
  30. package/templates/.omp/agents/ukit-small-task-maintainer.md +72 -0
  31. package/templates/.omp/agents/ukit-vision-analyst.md +100 -0
  32. package/templates/.omp/config.yml +88 -0
  33. package/templates/.omp/hooks/pre/ukit-bridge.js +336 -0
  34. package/templates/AGENTS.md +2 -2
  35. package/templates/docs/PROJECT.md +1 -1
  36. package/templates/ukit/storage/config.json +10 -0
  37. package/templates/adapter-presets/antigravity/README.md +0 -22
  38. package/templates/adapter-presets/antigravity/rules.md +0 -49
package/CHANGELOG.md CHANGED
@@ -2,6 +2,37 @@
2
2
 
3
3
  All notable changes to UKit are documented here.
4
4
 
5
+ ## 2.2.1 - 2026-08-22
6
+
7
+ UKit gains a fourth runtime and loses one. omp (Oh My Pi) reaches full parity with the Claude Code workspace — same agents, same skills, same hooks, same `/ukit:*` commands — and the Antigravity adapter, unused and unmaintained, is gone. The parity is deliberate rather than incidental: the port reuses the existing `.claude/` assets wherever omp's discovery can already reach them, so there is one source of truth per capability, not two that drift.
8
+
9
+ ### Added
10
+
11
+ - **omp (Oh My Pi) adapter — `ukit install --tools=omp`** (alias `--tools=oh-my-pi`). Installs 11 files: `.omp/AGENTS.md` (a thin `@../AGENTS.md` import rather than a copy, so the shared instructions have exactly one home), `.omp/RULES.md` (sticky hard rules), `.omp/config.yml`, `.omp/README.md`, `.omp/hooks/pre/ukit-bridge.js`, and the six agents under `.omp/agents/`. **No symlinks are created.** omp's discovery providers already rank its `claude` provider above nothing at all for skills and commands, so `.claude/skills/` and `.claude/commands/` are read directly — an `.omp/skills` symlink would shadow the canonical tree for no benefit. `.omp/agents/` must be real files because omp explicitly skips `.claude/agents/*.md`.
12
+ - **All six shared agents ported to omp's task-agent contract**: `bug-debugger`, `code-reviewer`, `feature-implementer`, `handoff-planner`, `ukit-small-task-maintainer`, `ukit-vision-analyst`. The differences between each agent's Claude Code and omp form — and why each one is or is not a faithful port — are recorded in [`docs/research/2026-08-22_omp-agent-parity.md`](docs/research/2026-08-22_omp-agent-parity.md).
13
+ - **UNIC model names survive the port.** `.omp/config.yml` ships `modelRoles` with all four lanes intact: `lite: unic-lite`, `code: unic-code`, `smart: unic-smart`, `vision: unic-vision`. The vision lane stays a capability lane, not a fourth cost tier.
14
+ - **Hook bridge — one source of truth, two runtimes.** `.omp/hooks/pre/ukit-bridge.js` is an omp hook factory (`export default function hook(pi)`) that translates omp's events into the Claude Code hook JSON shape and then executes the **existing** `.claude/hooks/*.sh` scripts. The 20 shell hooks are not duplicated, forked, or rewritten for omp; a fix to one fixes both runtimes.
15
+ - **Auto-compact parity.** `compact.agentContext.targets` gains an `omp` entry using `mode: 'precompact-reinject'` — the same strategy as `claude`, not Codex's `soft-handoff`. omp exposes real pre-compaction hook events, so there is nothing to work around with a state file.
16
+ - **`agent-code-reviewer` manifest item.** `templates/.claude/agents/code-reviewer.md` had shipped as a template with no manifest item since it was introduced, and `autoDiscoverTemplates: false` meant it was therefore **silently never installed** — UKit was installing five of its six Claude agents. Both the handoff Phase 4 reviewer and the Post-Edit Sidecar Review added in 2.1.5 instruct the model to spawn an agent that was not present in any installed project. Found by the omp parity work, because the new adapter would otherwise have shipped a strictly better agent set than the one it was porting from.
17
+
18
+ ### Changed
19
+
20
+ - **`/ukit:*` commands are phrased for whichever runtime is reading them.** The command bodies no longer assume Claude Code's spawn mechanics; each names its model tier and its delegation step in runtime-neutral terms, so the same file drives the same pipeline under Claude Code and under omp.
21
+ - **`ukit status` reports `Oh My Pi (omp)`** and checks `.omp/config.yml`; the Antigravity row is gone.
22
+ - **`.omp/` is TCC-protected** (`applyPlan.js`) and **git-ignored** by the managed `.gitignore` block, alongside `.claude/` and `.codex/`.
23
+
24
+ ### Removed
25
+
26
+ - **The Antigravity adapter.** `templates/.antigravity/`, `templates/adapter-presets/antigravity/`, the five `multi-antigravity-*` manifest items, its entry in `src/cli/adapters.js`, and every user-facing mention — in `README.md`, `QUICK_START.md`, `docs/PROJECT.md`, and in the installed workspace itself: `AGENTS.md`, `.codex/README.md` and the four `/ukit:handoff-*` command files all named Antigravity as a tool you could use. `--tools=antigravity` now fails fast with `Antigravity has been removed as a UKit adapter.` plus the list of adapters that do exist, rather than silently installing nothing.
27
+ - **Legacy cleanup is retained, not removed.** `ukit uninstall` still cleans `.antigravity/`, and `.antigravity/` keeps its TCC protection, because a stale pre-2.2.0 install still has the directory. Install-time pruning now covers it too: `.antigravity/` joined `AUTO_PRUNE_OBSOLETE_PREFIXES`, so a re-install removes the stale symlinks a pre-2.2.0 install left behind. Without it those links would dangle forever — pruning is the only pass that ever revisits them, and removing the adapter took them out of the manifest that uninstall reads. Only paths UKit itself recorded in `install.json` are considered, and a path the user has replaced with a real directory is skipped with a warning instead of being silently left behind.
28
+
29
+ ### Fixed
30
+
31
+ - **Deselecting omp no longer orphans its agents.** `OPTIONAL_ADAPTERS`' `managedPaths` listed `.omp/agents` as a single entry, copying the shape of Codex's `.codex/agents`. Codex's is a symlink; omp's is a real directory of six real files. `removeFileOrLinkOnly` refuses real directories, so re-running `ukit install` without `omp` and confirming removal deleted nothing — while the metadata pass still dropped all six from `install.json`, leaving them on disk and untracked forever. The six paths are now listed individually, matching `uninstall.js`'s own list. Full `ukit uninstall` was never affected.
32
+ - **The `--tools=antigravity` regression test was passing vacuously.** It asserted on a directory the install pipeline had never been pointed at, so the "no partial write" half would have held even if the error path did write. It now runs the real `bin/ukit`, and checks the exit code, the stderr text, the absence of a stack frame, and that not even the always-on `.claude/` adapter was written.
33
+
34
+ **Known gap:** omp was not installed on the machine this release was built on. Every omp assertion in the test suite is against the generated `.omp/` tree and the bridge module's shape — the packed-tarball test confirms `templates/.omp/**` actually publishes, but nothing here observes omp's runtime behaviour. The three open verification items (does omp emit `session_start` on a post-compact continuation; omp's real base-URL key; omp's real auto-compact-window key) are recorded in `docs/AI_HANDOFF/tasks/TASK-008.md`.
35
+
5
36
  ## 2.1.5 - 2026-08-19
6
37
 
7
38
  `local-build` was the one execution contract in the daily (non-handoff) flow that let the executor claim done off write evidence alone — and it is also the busiest lane a weaker `unic-code` backend hits. This closes that gap and adds a non-blocking second opinion, without adding wait time to the main task.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # UKit
2
2
 
3
- UKit installs a project-local AI workspace (`.claude/`, adapters, docs, and index helpers) so your team can work with Claude Code, Antigravity, OpenAI Codex, and OpenCode from the same repo setup.
3
+ UKit installs a project-local AI workspace (`.claude/`, adapters, docs, and index helpers) so your team can work with Claude Code, OpenAI Codex, OpenCode, and omp (Oh My Pi) from the same repo setup.
4
4
 
5
5
  ## Highest-Priority Team Rule
6
6
 
@@ -57,10 +57,13 @@ If maintainers roll out a newer CLI build, the in-project workflow still stays t
57
57
  - `AGENTS.md` — shared instructions for AGENTS-compatible tools
58
58
 
59
59
  **Adapters**
60
- - `.antigravity/skills/` → symlink to `.claude/skills/`
61
- - `.antigravity/rules/` — Antigravity rules
62
60
  - `.codex/settings.json` + `.codex/settings.local.json` — Codex config
63
61
  - `opencode.json` — OpenCode project config with UKit-safe guardrails
62
+ - `.omp/AGENTS.md` — thin `@../AGENTS.md` import so omp reads the shared instructions
63
+ - `.omp/RULES.md` — sticky hard rules for omp sessions
64
+ - `.omp/config.yml` — omp model roles, tool approval, and bash patterns
65
+ - `.omp/agents/` — the six shared agents in omp's task-agent format
66
+ - `.omp/hooks/pre/ukit-bridge.js` — bridges omp events onto the existing `.claude/hooks/*.sh`
64
67
 
65
68
  **Project support files**
66
69
  - `.claude/ukit/.ukit/` — installer manifests, metadata, backups
@@ -192,8 +195,8 @@ For deeper index development, repo-level scripts are available:
192
195
  | Tool | Instructions | Skills | Config |
193
196
  |------|-------------|--------|--------|
194
197
  | Claude Code | `CLAUDE.md` | `.claude/skills/` (canonical) | `.claude/settings.json` |
195
- | Antigravity | `AGENTS.md` | `.antigravity/skills/` (symlink) | `.antigravity/rules/`, `.antigravity/README.md` |
196
198
  | OpenAI Codex | `AGENTS.md` | `.claude/skills/` (referenced) | `.codex/settings.json`, `.codex/settings.local.json`, `.codex/README.md` |
197
199
  | OpenCode | `AGENTS.md` | `.claude/skills/` (native Claude-compatible support) | `opencode.json` |
200
+ | omp (Oh My Pi) | `.omp/AGENTS.md` (imports `AGENTS.md`) | `.claude/skills/` (read via omp's claude provider — no symlink) | `.omp/config.yml`, `.omp/RULES.md`, `.omp/README.md` |
198
201
 
199
202
  All supported tools share the same SKILL.md ecosystem so the workspace is authored once and reused everywhere.
@@ -830,6 +830,20 @@ items:
830
830
  packs:
831
831
  - core
832
832
 
833
+ # The .omp/ mirror of this agent has always been installed; the .claude/ original was
834
+ # shipped as a template with no manifest item, so autoDiscoverTemplates:false meant it
835
+ # was silently never installed. Both handoff Phase 4 and the sidecar diff review need it.
836
+ - id: agent-code-reviewer
837
+ type: agent
838
+ sourceTemplate: .claude/agents/code-reviewer.md
839
+ targetPath: .claude/agents/code-reviewer.md
840
+ requires: []
841
+ mergeStrategy: overwrite_with_backup
842
+ variables: []
843
+ enabledByDefault: true
844
+ packs:
845
+ - core
846
+
833
847
  - id: agent-ukit-small-task-maintainer
834
848
  type: agent
835
849
  sourceTemplate: .claude/agents/ukit-small-task-maintainer.md
@@ -1517,62 +1531,137 @@ items:
1517
1531
 
1518
1532
  # ═══════════════════════════════════════════════════════════════
1519
1533
  # Multi-tool Adapters
1520
- # Symlink .claude/skills/ into Antigravity discovery paths.
1521
1534
  # Config files generated from templates.
1522
1535
  # ═══════════════════════════════════════════════════════════════
1523
1536
 
1524
- # --- Google Antigravity ---
1537
+ # --- omp (Oh My Pi) ---
1538
+ # No `type: link` items on purpose (PLAN.md §3 D10): omp's `claude` discovery provider
1539
+ # already reads `.claude/skills` and `.claude/commands`, so a native-priority duplicate
1540
+ # under `.omp/` would buy nothing. `.omp/agents/` must be real files because omp skips
1541
+ # `.claude/agents/*.md` outright (TASK_AGENT_CONFIG_SOURCE = ".omp").
1542
+ # `autoDiscoverTemplates: false` means a template file without an item here is silently
1543
+ # never installed — every file under `templates/.omp/` needs exactly one entry below.
1525
1544
 
1526
- - id: multi-antigravity-skills-link
1527
- type: link
1528
- sourceTemplate: .claude/skills
1529
- targetPath: .antigravity/skills
1545
+ - id: multi-omp-agents-md
1546
+ type: config
1547
+ sourceTemplate: .omp/AGENTS.md
1548
+ targetPath: .omp/AGENTS.md
1530
1549
  requires: []
1550
+ mergeStrategy: overwrite_with_backup
1551
+ variables: []
1531
1552
  enabledByDefault: true
1532
1553
  packs:
1533
1554
  - core
1534
1555
 
1535
- - id: multi-antigravity-ukit-link
1536
- type: link
1537
- sourceTemplate: .claude/ukit
1538
- targetPath: .antigravity/ukit
1556
+ - id: multi-omp-rules
1557
+ type: config
1558
+ sourceTemplate: .omp/RULES.md
1559
+ targetPath: .omp/RULES.md
1539
1560
  requires: []
1561
+ mergeStrategy: overwrite_with_backup
1562
+ variables: []
1540
1563
  enabledByDefault: true
1541
1564
  packs:
1542
1565
  - core
1543
1566
 
1544
- - id: multi-antigravity-agents-link
1545
- type: link
1546
- sourceTemplate: .claude/agents
1547
- targetPath: .antigravity/agents
1567
+ - id: multi-omp-config
1568
+ type: config
1569
+ sourceTemplate: .omp/config.yml
1570
+ targetPath: .omp/config.yml
1548
1571
  requires: []
1572
+ mergeStrategy: overwrite_with_backup
1573
+ variables: []
1549
1574
  enabledByDefault: true
1550
1575
  packs:
1551
1576
  - core
1552
1577
 
1553
- - id: multi-antigravity-rules
1578
+ - id: multi-omp-readme
1554
1579
  type: config
1555
- sourceTemplate: adapter-presets/antigravity/rules.md
1556
- targetPath: .antigravity/rules/rules.md
1580
+ sourceTemplate: .omp/README.md
1581
+ targetPath: .omp/README.md
1557
1582
  requires: []
1558
1583
  mergeStrategy: overwrite_with_backup
1559
1584
  variables:
1560
1585
  - project.name
1586
+ - project.stack
1561
1587
  - runtime.packageManager
1562
1588
  enabledByDefault: true
1563
1589
  packs:
1564
1590
  - core
1565
1591
 
1566
- - id: multi-antigravity-readme
1592
+ - id: multi-omp-hook-bridge
1567
1593
  type: config
1568
- sourceTemplate: adapter-presets/antigravity/README.md
1569
- targetPath: .antigravity/README.md
1594
+ sourceTemplate: .omp/hooks/pre/ukit-bridge.js
1595
+ targetPath: .omp/hooks/pre/ukit-bridge.js
1570
1596
  requires: []
1571
1597
  mergeStrategy: overwrite_with_backup
1572
- variables:
1573
- - project.name
1574
- - project.stack
1575
- - runtime.packageManager
1598
+ variables: []
1599
+ enabledByDefault: true
1600
+ packs:
1601
+ - core
1602
+
1603
+ - id: multi-omp-agent-bug-debugger
1604
+ type: config
1605
+ sourceTemplate: .omp/agents/bug-debugger.md
1606
+ targetPath: .omp/agents/bug-debugger.md
1607
+ requires: []
1608
+ mergeStrategy: overwrite_with_backup
1609
+ variables: []
1610
+ enabledByDefault: true
1611
+ packs:
1612
+ - core
1613
+
1614
+ - id: multi-omp-agent-code-reviewer
1615
+ type: config
1616
+ sourceTemplate: .omp/agents/code-reviewer.md
1617
+ targetPath: .omp/agents/code-reviewer.md
1618
+ requires: []
1619
+ mergeStrategy: overwrite_with_backup
1620
+ variables: []
1621
+ enabledByDefault: true
1622
+ packs:
1623
+ - core
1624
+
1625
+ - id: multi-omp-agent-feature-implementer
1626
+ type: config
1627
+ sourceTemplate: .omp/agents/feature-implementer.md
1628
+ targetPath: .omp/agents/feature-implementer.md
1629
+ requires: []
1630
+ mergeStrategy: overwrite_with_backup
1631
+ variables: []
1632
+ enabledByDefault: true
1633
+ packs:
1634
+ - core
1635
+
1636
+ - id: multi-omp-agent-handoff-planner
1637
+ type: config
1638
+ sourceTemplate: .omp/agents/handoff-planner.md
1639
+ targetPath: .omp/agents/handoff-planner.md
1640
+ requires: []
1641
+ mergeStrategy: overwrite_with_backup
1642
+ variables: []
1643
+ enabledByDefault: true
1644
+ packs:
1645
+ - core
1646
+
1647
+ - id: multi-omp-agent-ukit-small-task-maintainer
1648
+ type: config
1649
+ sourceTemplate: .omp/agents/ukit-small-task-maintainer.md
1650
+ targetPath: .omp/agents/ukit-small-task-maintainer.md
1651
+ requires: []
1652
+ mergeStrategy: overwrite_with_backup
1653
+ variables: []
1654
+ enabledByDefault: true
1655
+ packs:
1656
+ - core
1657
+
1658
+ - id: multi-omp-agent-ukit-vision-analyst
1659
+ type: config
1660
+ sourceTemplate: .omp/agents/ukit-vision-analyst.md
1661
+ targetPath: .omp/agents/ukit-vision-analyst.md
1662
+ requires: []
1663
+ mergeStrategy: overwrite_with_backup
1664
+ variables: []
1576
1665
  enabledByDefault: true
1577
1666
  packs:
1578
1667
  - core
package/package.json CHANGED
@@ -1,16 +1,17 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "2.1.5",
4
- "description": "Install/update an index-first AI workspace for Claude Code, Antigravity, OpenAI Codex, and OpenCode.",
3
+ "version": "2.2.1",
4
+ "description": "Install/update an index-first AI workspace for Claude Code, OpenAI Codex, OpenCode, and omp (Oh My Pi).",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "keywords": [
8
8
  "ukit",
9
9
  "claude",
10
10
  "codex",
11
- "antigravity",
12
11
  "claude-code",
13
12
  "opencode",
13
+ "omp",
14
+ "oh-my-pi",
14
15
  "skills",
15
16
  "agents",
16
17
  "ai",
@@ -1,22 +1,4 @@
1
1
  export const OPTIONAL_ADAPTERS = [
2
- {
3
- key: 'antigravity',
4
- label: 'Antigravity',
5
- itemIds: [
6
- 'multi-antigravity-skills-link',
7
- 'multi-antigravity-ukit-link',
8
- 'multi-antigravity-rules',
9
- 'multi-antigravity-readme',
10
- 'multi-antigravity-agents-link',
11
- ],
12
- managedPaths: [
13
- '.antigravity/skills',
14
- '.antigravity/ukit',
15
- '.antigravity/rules/rules.md',
16
- '.antigravity/README.md',
17
- '.antigravity/agents',
18
- ],
19
- },
20
2
  {
21
3
  key: 'codex',
22
4
  label: 'OpenAI Codex',
@@ -47,6 +29,42 @@ export const OPTIONAL_ADAPTERS = [
47
29
  'opencode.json',
48
30
  ],
49
31
  },
32
+ {
33
+ key: 'omp',
34
+ label: 'Oh My Pi (omp)',
35
+ itemIds: [
36
+ 'multi-omp-agents-md',
37
+ 'multi-omp-rules',
38
+ 'multi-omp-config',
39
+ 'multi-omp-readme',
40
+ 'multi-omp-hook-bridge',
41
+ 'multi-omp-agent-bug-debugger',
42
+ 'multi-omp-agent-code-reviewer',
43
+ 'multi-omp-agent-feature-implementer',
44
+ 'multi-omp-agent-handoff-planner',
45
+ 'multi-omp-agent-ukit-small-task-maintainer',
46
+ 'multi-omp-agent-ukit-vision-analyst',
47
+ ],
48
+ managedPaths: [
49
+ '.omp/AGENTS.md',
50
+ '.omp/RULES.md',
51
+ '.omp/config.yml',
52
+ '.omp/README.md',
53
+ '.omp/hooks/pre/ukit-bridge.js',
54
+ // Listed file-by-file, unlike Codex's single '.codex/agents' entry. Codex's is a
55
+ // symlink; omp's is a real directory of real files (manifest: omp skips .claude/agents,
56
+ // so these must be real). Deselect calls removeFileOrLinkOnly, which refuses real
57
+ // directories — a single '.omp/agents' entry would drop all six from install.json
58
+ // while leaving them on disk, orphaned and no longer tracked. Keep in sync with
59
+ // buildFallbackPaths in src/core/uninstall.js.
60
+ '.omp/agents/bug-debugger.md',
61
+ '.omp/agents/code-reviewer.md',
62
+ '.omp/agents/feature-implementer.md',
63
+ '.omp/agents/handoff-planner.md',
64
+ '.omp/agents/ukit-small-task-maintainer.md',
65
+ '.omp/agents/ukit-vision-analyst.md',
66
+ ],
67
+ },
50
68
  ];
51
69
 
52
70
  export const ADAPTER_BY_KEY = new Map(OPTIONAL_ADAPTERS.map((adapter) => [adapter.key, adapter]));
@@ -55,14 +73,15 @@ export const DEFAULT_OPTIONAL_TOOL_KEYS = OPTIONAL_ADAPTERS.map((adapter) => ada
55
73
  export const TOOL_ALIASES = new Map([
56
74
  ['claude', 'claude'],
57
75
  ['claude-code', 'claude'],
58
- ['antigravity', 'antigravity'],
59
76
  ['codex', 'codex'],
60
77
  ['openai-codex', 'codex'],
61
78
  ['opencode', 'opencode'],
62
79
  ['open-code', 'opencode'],
80
+ ['omp', 'omp'],
81
+ ['oh-my-pi', 'omp'],
63
82
  ]);
64
83
 
65
- export const TOOLS_FLAG_HELP = 'all|none|claude,antigravity,codex,opencode';
84
+ export const TOOLS_FLAG_HELP = 'all|none|claude,codex,opencode,omp';
66
85
 
67
86
  export function parseToolsArg(argv = []) {
68
87
  let toolsArg = null;
@@ -111,7 +130,14 @@ export function resolveOptionalToolKeys(toolsArg) {
111
130
  const token = rawToken.trim();
112
131
  if (!token) continue;
113
132
 
114
- const normalizedTool = TOOL_ALIASES.get(token.toLowerCase()) ?? null;
133
+ const normalizedToken = token.toLowerCase();
134
+ if (normalizedToken === 'antigravity' || normalizedToken === 'google-antigravity') {
135
+ throw new Error(
136
+ `Antigravity has been removed as a UKit adapter. Allowed: ${TOOLS_FLAG_HELP}`,
137
+ );
138
+ }
139
+
140
+ const normalizedTool = TOOL_ALIASES.get(normalizedToken) ?? null;
115
141
  if (!normalizedTool) {
116
142
  throw new Error(`Unknown tool '${token}'. Allowed: ${TOOLS_FLAG_HELP}`);
117
143
  }
package/src/cli/index.js CHANGED
@@ -96,8 +96,8 @@ export async function runCli({ argv, packageRoot, projectRoot, packageVersion })
96
96
  console.log('');
97
97
  console.log('Options (install / diff):');
98
98
  console.log(' --tools=<list> Comma-separated adapters to enable (default: all)');
99
- console.log(' Values: claude, antigravity, codex, opencode');
100
- console.log(' Example: ukit install --tools=claude,codex,opencode');
99
+ console.log(' Values: claude, codex, opencode, omp');
100
+ console.log(' Example: ukit install --tools=claude,codex,opencode,omp');
101
101
  console.log(' Use --tools=none to disable all optional adapters');
102
102
  console.log(' --with-codegraph Enable CodeGraph MCP integration in CLAUDE.md');
103
103
  console.log(' Adds routing rules that prefer codegraph_* tools for');
@@ -2,9 +2,12 @@ import fs from 'node:fs/promises';
2
2
  import path from 'node:path';
3
3
  import { writeFileAtomic, copyFileSafe, createDirectoryLink, removeLinkOnly } from './fileOps.js';
4
4
 
5
- const TCC_PROTECTED_PREFIXES = ['.codex/', '.antigravity/'];
5
+ // legacy: '.antigravity/' stays TCC-protected — Antigravity adapter removed in v2.2.0, but a
6
+ // stale install may still have the dir and must not lose TCC protection.
7
+ const TCC_PROTECTED_PREFIXES = ['.codex/', '.antigravity/', '.omp/'];
6
8
 
7
- function isTccProtectedPath(filePath) {
9
+ // Exported for tests: the prefix boundary is security-relevant and worth asserting directly.
10
+ export function isTccProtectedPath(filePath) {
8
11
  const normalized = filePath.replace(/\\/g, '/');
9
12
  return TCC_PROTECTED_PREFIXES.some((prefix) => {
10
13
  const idx = normalized.indexOf(`/${prefix}`);
@@ -4,9 +4,11 @@ import { writeFileAtomic } from './fileOps.js';
4
4
 
5
5
  const UKIT_ENTRIES = [
6
6
  '.cache/',
7
+ // legacy: Antigravity adapter removed in v2.2.0; leftovers must stay ignored
7
8
  '.antigravity/',
8
9
  '.claude/',
9
10
  '.codex/',
11
+ '.omp/',
10
12
  '.ukit/',
11
13
  'opencode.json',
12
14
  'AGENTS.md',
@@ -16,6 +16,10 @@ import { cleanupEmptyParents, readJsonIfExists, removeFileOrLinkOnly, resolvePro
16
16
 
17
17
  const AUTO_PRUNE_OBSOLETE_PREFIXES = [
18
18
  '.claude/skills/',
19
+ // The Antigravity adapter was removed in v2.2.0. Without this, a pre-2.2.0 install
20
+ // leaves its .antigravity/ links dangling forever, since nothing else ever revisits
21
+ // them. Only paths UKit itself recorded in install.json are considered here.
22
+ '.antigravity/',
19
23
  ];
20
24
 
21
25
  const AUTO_PRUNE_OBSOLETE_PATHS = new Set([
@@ -219,6 +223,21 @@ async function pruneObsoleteManagedPaths({
219
223
  if (removed) {
220
224
  removedCount += 1;
221
225
  await cleanupEmptyParents(absolutePath, projectRoot);
226
+ continue;
227
+ }
228
+
229
+ // removeFileOrLinkOnly refuses real directories. A path recorded as managed that is
230
+ // now a real directory means the user replaced it — say so instead of silently
231
+ // leaving it behind, matching the link-update warning in applyPlan.js.
232
+ try {
233
+ const stat = await fs.lstat(absolutePath);
234
+ if (stat.isDirectory() && !stat.isSymbolicLink()) {
235
+ console.warn(
236
+ `[UKit] Warning: skipping obsolete path ${absolutePath} — exists as a real directory (possible user content). Remove it manually if intended.`,
237
+ );
238
+ }
239
+ } catch {
240
+ // Already gone — nothing to prune and nothing to warn about.
222
241
  }
223
242
  }
224
243
 
@@ -6,7 +6,9 @@ import { buildRuntimePaths } from './runtimePaths.js';
6
6
  const require = createRequire(import.meta.url);
7
7
  const { version: PACKAGE_VERSION } = require('../../package.json');
8
8
 
9
- const VALID_AGENTS = new Set(['claude-code', 'codex', 'antigravity', 'opencode']);
9
+ // legacy: 'antigravity' stays valid — Antigravity adapter removed in v2.2.0, but an existing
10
+ // config.json naming it must not become invalid.
11
+ const VALID_AGENTS = new Set(['claude-code', 'codex', 'antigravity', 'opencode', 'omp']);
10
12
 
11
13
  const BLOCKED_MERGE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
12
14
 
@@ -79,6 +81,9 @@ export function buildDefaultRuntimeConfig(overrides = {}) {
79
81
  targets: {
80
82
  claude: { autoCompact: true, mode: 'precompact-reinject', preserveExistingHooks: true },
81
83
  opencode: { autoCompact: true, mode: 'native-auto-prune', preserveExistingCompaction: true },
84
+ // 'precompact-reinject' like claude, NOT codex's 'soft-handoff': omp exposes real
85
+ // pre-compaction hook events, so there is nothing to work around with a state file.
86
+ omp: { autoCompact: true, mode: 'precompact-reinject', preserveExistingHooks: true },
82
87
  codex: {
83
88
  autoCompact: true,
84
89
  mode: 'soft-handoff',
@@ -11,8 +11,10 @@ import { detectProjectContext } from '../context/detectProjectContext.js';
11
11
  function formatPrimaryAgent(agentKey) {
12
12
  if (agentKey === 'claude-code') return 'Claude Code';
13
13
  if (agentKey === 'codex') return 'OpenAI Codex';
14
+ // legacy: Antigravity adapter removed in this release; existing config.json may still name it
14
15
  if (agentKey === 'antigravity') return 'Antigravity';
15
16
  if (agentKey === 'opencode') return 'OpenCode';
17
+ if (agentKey === 'omp') return 'Oh My Pi (omp)';
16
18
  return agentKey || 'Unknown';
17
19
  }
18
20
 
@@ -20,9 +22,9 @@ async function detectAdapterLabels(projectRoot, primaryAgent) {
20
22
  const labels = [formatPrimaryAgent(primaryAgent)];
21
23
 
22
24
  const checks = [
23
- { label: 'Antigravity', path: '.antigravity/README.md' },
24
25
  { label: 'OpenAI Codex', path: '.codex/settings.json' },
25
26
  { label: 'OpenCode', path: 'opencode.json' },
27
+ { label: 'Oh My Pi (omp)', path: '.omp/config.yml' },
26
28
  ];
27
29
 
28
30
  for (const check of checks) {
@@ -24,8 +24,10 @@ const ALLOWED_UNINSTALL_PREFIXES = [
24
24
  'AGENTS.md',
25
25
  'docs/',
26
26
  '.claude/',
27
+ // legacy: Antigravity adapter removed in v2.2.0; still cleaned up on repos that installed it
27
28
  '.antigravity/',
28
29
  '.codex/',
30
+ '.omp/',
29
31
  '.ukit/',
30
32
  'opencode.json',
31
33
  ];
@@ -77,14 +79,28 @@ function buildFallbackPaths(projectRoot) {
77
79
  path.join(projectRoot, '.claude', 'ukit', '.env.example'),
78
80
  path.join(projectRoot, '.claude', 'ukit', 'permission-usage.json'),
79
81
  path.join(projectRoot, '.claude', 'ukit', 'permission-audit.log'),
82
+ // legacy: Antigravity adapter removed in v2.2.0; still cleaned up on repos that installed it
80
83
  path.join(projectRoot, '.antigravity', 'rules', 'rules.md'),
81
84
  path.join(projectRoot, '.antigravity', 'README.md'),
82
85
  path.join(projectRoot, '.codex', 'README.md'),
83
86
  path.join(projectRoot, 'opencode.json'),
87
+ // omp adapter — 11 managed files, no symlinks (the adapter creates none)
88
+ path.join(projectRoot, '.omp', 'AGENTS.md'),
89
+ path.join(projectRoot, '.omp', 'RULES.md'),
90
+ path.join(projectRoot, '.omp', 'config.yml'),
91
+ path.join(projectRoot, '.omp', 'README.md'),
92
+ path.join(projectRoot, '.omp', 'hooks', 'pre', 'ukit-bridge.js'),
93
+ path.join(projectRoot, '.omp', 'agents', 'bug-debugger.md'),
94
+ path.join(projectRoot, '.omp', 'agents', 'code-reviewer.md'),
95
+ path.join(projectRoot, '.omp', 'agents', 'feature-implementer.md'),
96
+ path.join(projectRoot, '.omp', 'agents', 'handoff-planner.md'),
97
+ path.join(projectRoot, '.omp', 'agents', 'ukit-small-task-maintainer.md'),
98
+ path.join(projectRoot, '.omp', 'agents', 'ukit-vision-analyst.md'),
84
99
  path.join(projectRoot, '.ukit'),
85
100
  stateDir,
86
101
  ],
87
102
  linkPaths: [
103
+ // legacy: Antigravity adapter removed in v2.2.0; still cleaned up on repos that installed it
88
104
  path.join(projectRoot, '.antigravity', 'skills'),
89
105
  path.join(projectRoot, '.antigravity', 'ukit'),
90
106
  path.join(projectRoot, '.codex', 'skills'),
@@ -256,7 +256,7 @@ export const ROUTE_CATALOG = [
256
256
  signals: [
257
257
  { type: 'prompt', regex: /\b(stale|refresh|cleanup|reinstall|maintenance|workspace drift|index freshness|out of date)\b/i, score: 4 },
258
258
  { type: 'command', regex: /\bukit install\b|\brefresh-index\.mjs\b|\bbuild-index\.mjs\b/i, score: 3 },
259
- { type: 'file', regex: /\.claude\/|\.codex\/|\.antigravity\//i, score: 1 },
259
+ { type: 'file', regex: /\.claude\/|\.codex\/|\.antigravity\/|\.omp\//i, score: 1 },
260
260
  ],
261
261
  },
262
262
  {
@@ -1,9 +1,4 @@
1
1
  export const OPTIONAL_ADAPTER_ITEM_IDS = new Set([
2
- 'multi-antigravity-skills-link',
3
- 'multi-antigravity-ukit-link',
4
- 'multi-antigravity-rules',
5
- 'multi-antigravity-readme',
6
- 'multi-antigravity-agents-link',
7
2
  'multi-codex-skills-link',
8
3
  'multi-codex-ukit-link',
9
4
  'multi-codex-readme',
@@ -11,6 +6,17 @@ export const OPTIONAL_ADAPTER_ITEM_IDS = new Set([
11
6
  'multi-codex-settings-local',
12
7
  'multi-codex-agents-link',
13
8
  'multi-opencode-config',
9
+ 'multi-omp-agents-md',
10
+ 'multi-omp-rules',
11
+ 'multi-omp-config',
12
+ 'multi-omp-readme',
13
+ 'multi-omp-hook-bridge',
14
+ 'multi-omp-agent-bug-debugger',
15
+ 'multi-omp-agent-code-reviewer',
16
+ 'multi-omp-agent-feature-implementer',
17
+ 'multi-omp-agent-handoff-planner',
18
+ 'multi-omp-agent-ukit-small-task-maintainer',
19
+ 'multi-omp-agent-ukit-vision-analyst',
14
20
  ]);
15
21
 
16
22
  function resolveItemOrder(items) {
@@ -1,11 +1,13 @@
1
1
  # /ukit:handoff-create — Phase 1 + 2: Plan
2
2
 
3
3
  **Role: PLANNER**
4
- **Tool: any** (Claude Code / Codex / Antigravity / Kilo / OpenCode — your choice)
4
+ **Tool: any** (Claude Code / Codex / omp / Kilo / OpenCode — your choice)
5
5
  **Model split:**
6
6
  - Read/understand → lite model (haiku · unic-lite · cheapest available)
7
7
  - Write plan + tasks → strong model (Opus · unic-smart · strongest available)
8
8
 
9
+ > **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@lite` / `@code` / `@smart`.
10
+
9
11
  ## Problem / feature
10
12
  $ARGUMENTS
11
13
 
@@ -39,7 +41,7 @@ After the batched call, run Steps 1–2.5 to completion without further question
39
41
 
40
42
  ## Step 1 — Read context (lite model)
41
43
 
42
- **Claude Code — MANDATORY, do this before anything else:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"`. Do NOT read these files yourself in the current session — this step is contracted to the lite tier (haiku/unic-lite), which only the spawned agent's frontmatter model guarantees. Ask the agent to:
44
+ **Claude Code — MANDATORY, do this before anything else:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` (omp: the `task` tool with `agent: "ukit-small-task-maintainer"`). Do NOT read these files yourself in the current session — this step is contracted to the lite tier (haiku/unic-lite), which only the spawned agent's frontmatter model guarantees. Ask the agent to:
43
45
 
44
46
  1. Read `docs/AI_HANDOFF/INDEX.md` → current tasks + statuses (or "empty")
45
47
  2. Read `docs/AI_HANDOFF/ACTIVE.md` → active cycle info (or "no active cycle")
@@ -53,7 +55,7 @@ After the batched call, run Steps 1–2.5 to completion without further question
53
55
 
54
56
  ## Step 2 — Write plan + tasks (strong model)
55
57
 
56
- **Claude Code — MANDATORY, do this before anything else:** call the Agent tool with `subagent_type: "handoff-planner"`, passing it the Step 1 summary and the problem/feature description. Do NOT write PLAN.md or task files yourself in the current session — this step is contracted to the strong tier (opus/unic-smart), which only the spawned agent's frontmatter model guarantees.
58
+ **Claude Code — MANDATORY, do this before anything else:** call the Agent tool with `subagent_type: "handoff-planner"` (omp: the `task` tool with `agent: "handoff-planner"`), passing it the Step 1 summary and the problem/feature description. Do NOT write PLAN.md or task files yourself in the current session — this step is contracted to the strong tier (opus/unic-smart), which only the spawned agent's frontmatter model guarantees.
57
59
 
58
60
  The planner agent does the following (use Step 1 summary — do NOT re-read files):
59
61
 
@@ -119,7 +121,7 @@ The planner agent does the following (use Step 1 summary — do NOT re-read file
119
121
  Two independent strong-model passes shape the plan before any code is written — that gate is
120
122
  intact. What it no longer does is hand a stalled plan back and wait.
121
123
 
122
- **Claude Code — MANDATORY, do this before anything else:** call the Agent tool with `subagent_type: "code-reviewer"`, passing `REVIEW_TARGET_TYPE=plan` and the path to `docs/AI_HANDOFF/PLAN.md`. This MUST be a separate agent invocation from Step 2's `handoff-planner` call (fresh context) — same-session self-review defeats the purpose of an independent gate.
124
+ **Claude Code — MANDATORY, do this before anything else:** call the Agent tool with `subagent_type: "code-reviewer"` (omp: the `task` tool with `agent: "code-reviewer"`), passing `REVIEW_TARGET_TYPE=plan` and the path to `docs/AI_HANDOFF/PLAN.md`. This MUST be a separate agent invocation from Step 2's `handoff-planner` call (fresh context) — same-session self-review defeats the purpose of an independent gate.
123
125
 
124
126
  1. Reviewer reads `PLAN.md` only (no diff, no task files, no executor report), checks Completeness / Consistency / Clarity / Scope / YAGNI — see `.claude/agents/code-reviewer.md` → Spec/Plan Review — and appends its verdict to PLAN.md's `## Plan Review Log` (new round entry, prior rounds kept).
125
127
  2. `Issues Found` → route back to Step 2: planner revises `PLAN.md` and the affected `TASK-xxx.md` files to address every finding, then re-submit for another Step 2.5 review (this becomes the next round). Do NOT commit or hand off to executor on `Issues Found`.