@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.
- package/CHANGELOG.md +31 -0
- package/README.md +7 -4
- package/manifests/platform.full.yaml +113 -24
- package/package.json +4 -3
- package/src/cli/adapters.js +47 -21
- package/src/cli/index.js +2 -2
- package/src/core/applyPlan.js +5 -2
- package/src/core/ensureGitignore.js +2 -0
- package/src/core/runInstallPipeline.js +19 -0
- package/src/core/runtimeConfig.js +6 -1
- package/src/core/status.js +3 -1
- package/src/core/uninstall.js +16 -0
- package/src/index/routeCatalog.js +1 -1
- package/src/manifest/selectItems.js +11 -5
- package/templates/.claude/commands/ukit/handoff-create.md +6 -4
- package/templates/.claude/commands/ukit/handoff-fullstack.md +12 -10
- package/templates/.claude/commands/ukit/handoff-implement.md +4 -2
- package/templates/.claude/commands/ukit/handoff-review.md +4 -2
- package/templates/.claude/ukit/index/route-catalog.mjs +1 -1
- package/templates/.claude/ukit/index/unic-gateway.mjs +46 -7
- package/templates/.codex/README.md +1 -1
- package/templates/.gitignore +2 -0
- package/templates/.omp/AGENTS.md +9 -0
- package/templates/.omp/README.md +96 -0
- package/templates/.omp/RULES.md +34 -0
- package/templates/.omp/agents/bug-debugger.md +85 -0
- package/templates/.omp/agents/code-reviewer.md +197 -0
- package/templates/.omp/agents/feature-implementer.md +123 -0
- package/templates/.omp/agents/handoff-planner.md +210 -0
- package/templates/.omp/agents/ukit-small-task-maintainer.md +72 -0
- package/templates/.omp/agents/ukit-vision-analyst.md +100 -0
- package/templates/.omp/config.yml +88 -0
- package/templates/.omp/hooks/pre/ukit-bridge.js +336 -0
- package/templates/AGENTS.md +2 -2
- package/templates/docs/PROJECT.md +1 -1
- package/templates/ukit/storage/config.json +10 -0
- package/templates/adapter-presets/antigravity/README.md +0 -22
- 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,
|
|
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
|
-
# ---
|
|
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-
|
|
1527
|
-
type:
|
|
1528
|
-
sourceTemplate: .
|
|
1529
|
-
targetPath: .
|
|
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-
|
|
1536
|
-
type:
|
|
1537
|
-
sourceTemplate: .
|
|
1538
|
-
targetPath: .
|
|
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-
|
|
1545
|
-
type:
|
|
1546
|
-
sourceTemplate: .
|
|
1547
|
-
targetPath: .
|
|
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-
|
|
1578
|
+
- id: multi-omp-readme
|
|
1554
1579
|
type: config
|
|
1555
|
-
sourceTemplate:
|
|
1556
|
-
targetPath: .
|
|
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-
|
|
1592
|
+
- id: multi-omp-hook-bridge
|
|
1567
1593
|
type: config
|
|
1568
|
-
sourceTemplate:
|
|
1569
|
-
targetPath: .
|
|
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
|
-
|
|
1574
|
-
|
|
1575
|
-
-
|
|
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
|
|
4
|
-
"description": "Install/update an index-first AI workspace for Claude Code,
|
|
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",
|
package/src/cli/adapters.js
CHANGED
|
@@ -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,
|
|
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
|
|
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,
|
|
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');
|
package/src/core/applyPlan.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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',
|
package/src/core/status.js
CHANGED
|
@@ -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) {
|
package/src/core/uninstall.js
CHANGED
|
@@ -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 /
|
|
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"
|
|
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"
|
|
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"
|
|
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`.
|