@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
@@ -1,7 +1,7 @@
1
1
  # /ukit:handoff-fullstack — Full Pipeline: Plan → Implement → Review
2
2
 
3
3
  **Role: ORCHESTRATOR**
4
- **Tool: any** (Claude Code / Codex / Kilo / OpenCode — your choice)
4
+ **Tool: any** (Claude Code / Codex / omp / Kilo / OpenCode — your choice)
5
5
 
6
6
  ## Model Split
7
7
 
@@ -13,6 +13,8 @@
13
13
 
14
14
  > Claude Code: spawn `ukit-small-task-maintainer` (haiku) for light steps; spawn `handoff-planner` (opus) for planning; spawn `feature-implementer` (sonnet) agents for implementation; spawn `code-reviewer` (opus) per task for review.
15
15
 
16
+ > **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@lite` / `@code` / `@smart`.
17
+
16
18
  ---
17
19
 
18
20
  ## Problem / feature
@@ -86,7 +88,7 @@ Only when `RUN.md` is absent or `Phase: done` does `$ARGUMENTS` start a fresh cy
86
88
 
87
89
  ### P1 — Read context (lite model)
88
90
 
89
- **Claude Code — MANDATORY, do this before anything else in P1:** 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 it to return a compact summary of:
91
+ **Claude Code — MANDATORY, do this before anything else in P1:** 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 it to return a compact summary of:
90
92
 
91
93
  1. `docs/AI_HANDOFF/INDEX.md` — current tasks + statuses (or "empty / no tasks")
92
94
  2. `docs/AI_HANDOFF/ACTIVE.md` — active cycle info (or "no active cycle")
@@ -99,7 +101,7 @@ Return a compact summary. Do NOT write any files yet.
99
101
 
100
102
  ### P2 — Write PLAN.md + task files (strong model)
101
103
 
102
- **Claude Code — MANDATORY, do this before anything else in P2:** call the Agent tool with `subagent_type: "handoff-planner"`, passing it the P1 summary and `$ARGUMENTS`. 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.
104
+ **Claude Code — MANDATORY, do this before anything else in P2:** call the Agent tool with `subagent_type: "handoff-planner"` (omp: the `task` tool with `agent: "handoff-planner"`), passing it the P1 summary and `$ARGUMENTS`. 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.
103
105
 
104
106
  The planner agent does the following (use P1 summary — do NOT re-read files):
105
107
 
@@ -160,7 +162,7 @@ The planner agent does the following (use P1 summary — do NOT re-read files):
160
162
  The gate still does its job — two independent opus passes shape the plan before a line of code
161
163
  is written. What it no longer does is hand a stalled plan back to a human who isn't there.
162
164
 
163
- **Claude Code — MANDATORY, do this before anything else in P2.5:** 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 P2's `handoff-planner` call (fresh context) — same-session self-review defeats the purpose of an independent gate.
165
+ **Claude Code — MANDATORY, do this before anything else in P2.5:** 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 P2's `handoff-planner` call (fresh context) — same-session self-review defeats the purpose of an independent gate.
164
166
 
165
167
  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).
166
168
  2. `Issues Found` → route back to P2: `handoff-planner` revises `PLAN.md` and the affected `TASK-xxx.md` files to address every finding, then re-submit for one more P2.5 review round — subject to the loop cap above.
@@ -170,7 +172,7 @@ is written. What it no longer does is hand a stalled plan back to a human who is
170
172
 
171
173
  ### P3 — Commit the plan (lite model)
172
174
 
173
- **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` for this commit step (lite tier — haiku/unic-lite). Run:
175
+ **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` (omp: the `task` tool with `agent: "ukit-small-task-maintainer"`) for this commit step (lite tier — haiku/unic-lite). Run:
174
176
  ```bash
175
177
  git add docs/AI_HANDOFF/ && git commit -m "handoff: plan — <goal>"
176
178
  ```
@@ -185,7 +187,7 @@ Replace `<goal>` with the one-sentence goal from ACTIVE.md. This locks the plan
185
187
 
186
188
  ### I1 — Setup + verify (lite model)
187
189
 
188
- **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` for I1. Ask it to read:
190
+ **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` (omp: the `task` tool with `agent: "ukit-small-task-maintainer"`) for I1. Ask it to read:
189
191
  - `docs/AI_HANDOFF/ACTIVE.md` → get `Base: <BASE>`
190
192
  - `docs/AI_HANDOFF/INDEX.md` → collect all `ready` tasks
191
193
 
@@ -234,7 +236,7 @@ leaves worktrees behind. Batching only ever narrows a wave, never reorders acros
234
236
 
235
237
  ### I3 — Execute wave by wave (code model agents)
236
238
 
237
- **Claude Code — MANDATORY, do this before anything else in I3:** for each wave, call the Agent tool once per task **in the current batch** (in parallel, at most `handoff.maxParallelAgents`), each with `subagent_type: "feature-implementer"`. Do NOT implement the tasks yourself in the current session — this step is contracted to the code tier (sonnet/unic-code), which only the spawned agent's frontmatter model guarantees.
239
+ **Claude Code — MANDATORY, do this before anything else in I3:** for each wave, call the Agent tool once per task **in the current batch** (in parallel, at most `handoff.maxParallelAgents`), each with `subagent_type: "feature-implementer"` (omp: the `task` tool with `agent: "feature-implementer"`, likewise invoked once per task in the batch, not once per wave). Do NOT implement the tasks yourself in the current session — this step is contracted to the code tier (sonnet/unic-code), which only the spawned agent's frontmatter model guarantees.
238
240
 
239
241
  For each wave:
240
242
 
@@ -356,7 +358,7 @@ logs used to cost. That difference is what makes a multi-wave cycle finish in on
356
358
 
357
359
  ### I4 — Consolidate + update INDEX (lite model)
358
360
 
359
- **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` for I4. After all waves complete, ask it to:
361
+ **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` (omp: the `task` tool with `agent: "ukit-small-task-maintainer"`) for I4. After all waves complete, ask it to:
360
362
 
361
363
  1. Update `docs/AI_HANDOFF/INDEX.md`:
362
364
  - PASS tasks → `pending_review`
@@ -376,7 +378,7 @@ logs used to cost. That difference is what makes a multi-wave cycle finish in on
376
378
 
377
379
  ### R1 — Setup (lite model)
378
380
 
379
- **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` for the R1 reads. Ask it to read:
381
+ **Claude Code — MANDATORY:** call the Agent tool with `subagent_type: "ukit-small-task-maintainer"` (omp: the `task` tool with `agent: "ukit-small-task-maintainer"`) for the R1 reads. Ask it to read:
380
382
  - `docs/AI_HANDOFF/ACTIVE.md` → get `Base: <BASE>`
381
383
  - `docs/AI_HANDOFF/INDEX.md` → collect `pending_review` tasks
382
384
 
@@ -400,7 +402,7 @@ If that diff is empty → implement was not completed. Do not stop: re-enter Pha
400
402
 
401
403
  **Batch the review set — mandatory.** Read `handoff.maxParallelAgents` from `.ukit/storage/config.json`. If more `pending_review` tasks exist than that, split into consecutive batches of at most that many; finish one batch's verdicts (R2–R4, appended to each task file) before starting the next.
402
404
 
403
- **Claude Code — MANDATORY, do this before anything else in R2–R4:** for each batch, call the Agent tool once per `pending_review` task **in parallel** (at most `handoff.maxParallelAgents`), each with `subagent_type: "code-reviewer"`. Reviewer agents only read the diff and append a verdict to their own task file — no worktree, no shared write target — so running them in parallel carries none of Phase 3's file-conflict risk. Do NOT review the diff yourself in the current session — this step is contracted to the strong tier (opus/unic-smart) and MUST differ from the executor's model, which only the spawned agent's frontmatter model guarantees.
405
+ **Claude Code — MANDATORY, do this before anything else in R2–R4:** for each batch, call the Agent tool once per `pending_review` task **in parallel** (at most `handoff.maxParallelAgents`), each with `subagent_type: "code-reviewer"` (omp: the `task` tool with `agent: "code-reviewer"`, likewise invoked once per task in the batch, not once per wave). Reviewer agents only read the diff and append a verdict to their own task file — no worktree, no shared write target — so running them in parallel carries none of Phase 3's file-conflict risk. Do NOT review the diff yourself in the current session — this step is contracted to the strong tier (opus/unic-smart) and MUST differ from the executor's model, which only the spawned agent's frontmatter model guarantees.
404
406
 
405
407
  The spawned reviewer agent reads `EXECUTOR_MODEL` from each task file `## Executor Report`:
406
408
 
@@ -1,9 +1,11 @@
1
1
  # /ukit:handoff-implement — Phase 3: Execute
2
2
 
3
3
  **Role: EXECUTOR (orchestrated)**
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: code model** (Sonnet · unic-code · cheap-smart)
6
6
 
7
+ > **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@lite` / `@code` / `@smart`.
8
+
7
9
  ## Target (optional)
8
10
  $ARGUMENTS
9
11
  _Empty = all `ready` tasks. Or: "TASK-001" for a specific task._
@@ -117,7 +119,7 @@ git worktree add -b handoff/task-xxx .worktrees/task-xxx $BASE
117
119
 
118
120
  ### 3b — Run tasks in parallel (one agent/session per task)
119
121
 
120
- **Claude Code — MANDATORY, do this before anything else in this wave:** call the Agent tool once per task **in the current batch** (in parallel, at most `handoff.maxParallelAgents`), each with `subagent_type: "feature-implementer"`. Do NOT implement the tasks yourself in the current session — this step is contracted to the code tier (sonnet/unic-code), which only the spawned agent's frontmatter model guarantees.
122
+ **Claude Code — MANDATORY, do this before anything else in this wave:** call the Agent tool once per task **in the current batch** (in parallel, at most `handoff.maxParallelAgents`), each with `subagent_type: "feature-implementer"` (omp: the `task` tool with `agent: "feature-implementer"`, likewise invoked once per task in the batch, not once per wave). Do NOT implement the tasks yourself in the current session — this step is contracted to the code tier (sonnet/unic-code), which only the spawned agent's frontmatter model guarantees.
121
123
 
122
124
  Each spawned agent works independently in its own worktree — **NO git commit, NO git add**:
123
125
 
@@ -1,9 +1,11 @@
1
1
  # /ukit:handoff-review — Phase 4: Review
2
2
 
3
3
  **Role: REVIEWER**
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: strong model, MUST differ from executor** (Opus · unic-smart · strongest available)
6
6
 
7
+ > **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@lite` / `@code` / `@smart`.
8
+
7
9
  ## Target (optional)
8
10
  $ARGUMENTS
9
11
  _Empty = all `pending_review` tasks. Or: "TASK-001" for a specific task._
@@ -52,7 +54,7 @@ If that diff is empty → handoff-implement was not completed. Report which task
52
54
 
53
55
  **Batch the review set — mandatory.** Read `handoff.maxParallelAgents` from `.ukit/storage/config.json`. If more `pending_review` tasks exist than that, split into consecutive batches of at most that many; finish one batch's verdicts (2a–2d, appended to each task file) before starting the next.
54
56
 
55
- **Claude Code — MANDATORY, do this before anything else:** for each batch, call the Agent tool once per `pending_review` task **in parallel** (at most `handoff.maxParallelAgents`), each with `subagent_type: "code-reviewer"`. Reviewer agents only read the diff and append a verdict to their own task file — no worktree, no shared write target — so running them in parallel carries none of Phase 3's file-conflict risk. Do NOT review the diff yourself in the current session — this step is contracted to the strong tier (opus/unic-smart) and MUST differ from the executor's model, which only the spawned agent's frontmatter model guarantees. Pass each agent: the task file path, the executor's report, and the diff.
57
+ **Claude Code — MANDATORY, do this before anything else:** for each batch, call the Agent tool once per `pending_review` task **in parallel** (at most `handoff.maxParallelAgents`), each with `subagent_type: "code-reviewer"` (omp: the `task` tool with `agent: "code-reviewer"`, likewise invoked once per task in the batch, not once per wave). Reviewer agents only read the diff and append a verdict to their own task file — no worktree, no shared write target — so running them in parallel carries none of Phase 3's file-conflict risk. Do NOT review the diff yourself in the current session — this step is contracted to the strong tier (opus/unic-smart) and MUST differ from the executor's model, which only the spawned agent's frontmatter model guarantees. Pass each agent: the task file path, the executor's report, and the diff.
56
58
 
57
59
  The spawned reviewer agent performs 2a–2d below per task:
58
60
 
@@ -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
  {
@@ -13,14 +13,27 @@
13
13
  * 1. process.env.ANTHROPIC_BASE_URL -> 'env'
14
14
  * 2. project .claude/settings.json -> env.ANTHROPIC_BASE_URL -> 'claude-settings'
15
15
  * 3. ~/.claude/settings.json -> env.ANTHROPIC_BASE_URL -> 'claude-settings'
16
+ * 4. process.env.OMP_BASE_URL (TASK-004, name unverified) -> 'omp-env'
17
+ * 5. project .omp/config.yml -> baseUrl (TASK-004, key unverified) -> 'omp-config'
16
18
  *
17
- * Cross-tool configs are NOT probed. This module is only ever invoked from Claude Code hooks
18
- * (vision-router.sh, vision-gate.sh, route-task.mjs) to gate what THIS session does — a Codex
19
- * `config.toml` `base_url`, a Kilo `secrets.json` endpoint, or an `OPENAI_BASE_URL` env var
20
- * describe a completely different tool's outbound endpoint and say nothing about where Claude
21
- * Code itself is sending requests. Treating them as evidence produced permanent false positives
22
- * (any machine with Codex/Kilo pointed at the UNIC gateway would report `unicMode: true` for
23
- * every plain Claude Code session, deadlocking Edit/Write on any image-mentioning turn).
19
+ * Every probe here (including the two omp probes) is scoped to what changes the CALLING
20
+ * runtime's OWN outbound endpoint — same rule that already governs probes 1-3. Cross-tool
21
+ * configs are NOT probed. This module is only ever invoked from Claude Code / omp hooks
22
+ * (vision-router.sh, vision-gate.sh, route-task.mjs, and the omp bridge) to gate what THIS
23
+ * session does — a Codex `config.toml` `base_url`, a Kilo `secrets.json` endpoint, or an
24
+ * `OPENAI_BASE_URL` env var describe a completely different tool's outbound endpoint and say
25
+ * nothing about where Claude Code or omp itself is sending requests. Treating them as evidence
26
+ * produced permanent false positives (any machine with Codex/Kilo pointed at the UNIC gateway
27
+ * would report `unicMode: true` for every plain Claude Code session, deadlocking Edit/Write on
28
+ * any image-mentioning turn).
29
+ *
30
+ * Fail-safe direction (do not re-flip this): `unicMode` keeps BINARY semantics on every runtime
31
+ * — `unicMode = sources.length > 0`, default `false`. Inconclusive detection never resolves to
32
+ * `true`. The "assume UNIC when ambiguous" fail-safe some tools want belongs ONLY to the static
33
+ * `modelRoles` values TASK-003 writes unconditionally into `templates/.omp/config.yml`
34
+ * (`@vision: unic-vision`, no probe involved) — never to this module's boolean, because this
35
+ * module is shared by every runtime and flipping its default would make Codex/Kilo/OPENAI_BASE_URL
36
+ * sessions with zero omp/Claude signal start false-positively reporting UNIC mode.
24
37
  *
25
38
  * Contract: this module must NEVER throw and must NEVER exit non-zero, in any case (missing files,
26
39
  * malformed JSON, unreadable paths, etc. all degrade to a clean "no hit").
@@ -38,6 +51,22 @@ import { fileURLToPath } from 'node:url';
38
51
  const UNIC_TOKEN = 'unicjsc.com';
39
52
  const VISION_MODEL_ALIAS = 'unic-vision';
40
53
 
54
+ // TODO(verify): omp's own base-URL env var name is a guess -- omp is not installed on this
55
+ // machine and no source/schema is vendored, so this has never been confirmed against a real
56
+ // omp runtime. Resolve via TASK-008's manual smoke test before treating this as confirmed.
57
+ const OMP_BASE_URL_ENV_VAR = 'OMP_BASE_URL';
58
+
59
+ // TODO(verify): the `.omp/config.yml` key path (`baseUrl`, top-level) is a guess for the same
60
+ // reason as OMP_BASE_URL_ENV_VAR above. Deliberately matched with a narrow anchored regex
61
+ // instead of importing the `yaml` package at runtime -- this file is installed into end-user
62
+ // projects via `ukit install` and must not risk depending on `yaml` being resolvable from a
63
+ // target project's own node_modules tree for a single-key check. This mirrors the codebase's
64
+ // own established precedent for the analogous Codex `config.toml` probe (see git history:
65
+ // CODEX_BASE_URL_UNIC_RE, pre-TASK-007), which rejected a TOML parser dependency for the same
66
+ // reason and documented the trade-off: a malformed/unexpected file just degrades to no hit,
67
+ // which fails safe rather than throwing.
68
+ const OMP_CONFIG_BASE_URL_UNIC_RE = /^\s*baseUrl\s*:\s*["']?[^"'\r\n#]*unicjsc\.com[^"'\r\n#]*["']?\s*(?:#.*)?$/m;
69
+
41
70
  function safeReadFile(filePath) {
42
71
  try {
43
72
  return fs.readFileSync(filePath, 'utf8');
@@ -84,6 +113,14 @@ function probeClaudeSettings(filePath) {
84
113
  return typeof value === 'string' && value.includes(UNIC_TOKEN);
85
114
  }
86
115
 
116
+ // Narrow anchored regex probe (no YAML parsing) for the omp config file's `baseUrl` key. A
117
+ // missing file, unreadable path, or malformed YAML all degrade to "no hit" -- never throws.
118
+ function probeOmpConfig(filePath) {
119
+ const raw = safeReadFile(filePath);
120
+ if (raw == null) return false;
121
+ return OMP_CONFIG_BASE_URL_UNIC_RE.test(raw);
122
+ }
123
+
87
124
  /**
88
125
  * Checks whether the Codex model catalog exists and, if so, whether it lists `unic-vision`.
89
126
  * A missing/unreadable/malformed catalog is never an error — it degrades to "unknown" and the
@@ -126,6 +163,8 @@ export function detectUnicGateway(options = {}) {
126
163
  () => recordHit(probeEnvVar('ANTHROPIC_BASE_URL'), 'env'),
127
164
  () => recordHit(probeClaudeSettings(path.join(rootDir, '.claude', 'settings.json')), 'claude-settings'),
128
165
  () => recordHit(probeClaudeSettings(path.join(homeDir, '.claude', 'settings.json')), 'claude-settings'),
166
+ () => recordHit(probeEnvVar(OMP_BASE_URL_ENV_VAR), 'omp-env'),
167
+ () => recordHit(probeOmpConfig(path.join(rootDir, '.omp', 'config.yml')), 'omp-config'),
129
168
  ];
130
169
  for (const probe of probes) {
131
170
  try {
@@ -8,7 +8,7 @@ Auto-generated by UKit for OpenAI Codex.
8
8
  ## Core UKit Rule
9
9
 
10
10
  - Human-facing workflow should optimize for one remembered command: `ukit install`.
11
- - After install, normal work should feel natural inside **Claude/Codex/OpenCode** (and Antigravity when installed).
11
+ - After install, normal work should feel natural inside **Claude/Codex/OpenCode/omp**.
12
12
  - **Quality first, then speed, then token discipline**: do not waste reads, logs, or repeated helper output.
13
13
  - **Never stop after read-only steps.** For implement/apply/fix requests, continue to actual Edit/Write and verification in the same turn.
14
14
 
@@ -46,9 +46,11 @@ Thumbs.db
46
46
  .claude/ukit/permission-usage.json
47
47
  .claude/ukit/permission-audit.log
48
48
  .cache/
49
+ # legacy: Antigravity adapter removed in v2.2.0; leftovers must stay ignored
49
50
  .antigravity/
50
51
  .claude/
51
52
  .codex/
53
+ .omp/
52
54
  .ukit/
53
55
  opencode.json
54
56
  AGENTS.md
@@ -0,0 +1,9 @@
1
+ # .omp/AGENTS.md — thin import, not a copy
2
+
3
+ This file exists only so omp's native `.omp/AGENTS.md` provider (priority 100) does not shadow the
4
+ project-root `AGENTS.md` (agents-md provider, priority 10) with duplicated content. omp resolves `@`
5
+ imports relative to this file's own directory, so the single import line below pulls in the real,
6
+ single-source-of-truth project instructions from the repo root. Do not inline root `AGENTS.md`'s body
7
+ here — that would make root `AGENTS.md` stop loading on omp and let the two drift silently.
8
+
9
+ @../AGENTS.md
@@ -0,0 +1,96 @@
1
+ # omp (Oh My Pi) adapter — {{project.name}}
2
+
3
+ UKit installs this workspace so that [omp](https://omp.sh) gets the same guardrails, agents and
4
+ context that Claude Code gets — without a second copy of the logic to keep in sync.
5
+
6
+ Stack: {{project.stack}} · package manager: `{{runtime.packageManager}}`
7
+
8
+ ## What `ukit install` puts here
9
+
10
+ Eleven files, all managed by UKit. Re-running `ukit install` overwrites them and keeps a backup of
11
+ whatever was there before, so local edits are never silently lost — they move, they do not vanish.
12
+
13
+ | Path | What it is |
14
+ |------|------------|
15
+ | `.omp/AGENTS.md` | Thin context entry point. Imports the root `AGENTS.md` (`@../AGENTS.md`) rather than duplicating it. |
16
+ | `.omp/RULES.md` | Sticky hard rules that must survive compaction. |
17
+ | `.omp/config.yml` | Model roles, tool approval policy, dangerous-command patterns, memory and compact settings. |
18
+ | `.omp/README.md` | This file. |
19
+ | `.omp/hooks/pre/ukit-bridge.js` | Translates omp events into Claude Code hook payloads and runs the real `.claude/hooks/*.sh` scripts. |
20
+ | `.omp/agents/bug-debugger.md` | Debugging lane. |
21
+ | `.omp/agents/code-reviewer.md` | Independent review lane. |
22
+ | `.omp/agents/feature-implementer.md` | Implementation lane. |
23
+ | `.omp/agents/handoff-planner.md` | Handoff planning lane. |
24
+ | `.omp/agents/ukit-small-task-maintainer.md` | Low-risk chores lane. |
25
+ | `.omp/agents/ukit-vision-analyst.md` | The only lane allowed to interpret images. |
26
+
27
+ ## Model roles
28
+
29
+ `.omp/config.yml` defines four roles. Agent frontmatter references them as `@lite` / `@code` /
30
+ `@smart` / `@vision`, so retargeting a whole tier is a one-line edit in one file.
31
+
32
+ | Role | Default model | Agents using it |
33
+ |------|---------------|-----------------|
34
+ | `lite` | `unic-lite` | `ukit-small-task-maintainer` |
35
+ | `code` | `unic-code` | `feature-implementer`, `bug-debugger` |
36
+ | `smart` | `unic-smart` | `handoff-planner`, `code-reviewer` |
37
+ | `vision` | `unic-vision` | `ukit-vision-analyst` |
38
+
39
+ These are **literal model names on the UNIC gateway, not aliases**, and they ship as the installed
40
+ default. If this project does not run against UNIC, a maintainer swaps the three cost tiers for the
41
+ values in `orchestration.modelTiers[*].claudeModel` in `.ukit/storage/config.json`.
42
+
43
+ `vision` is the exception and stays `unic-vision` either way: it is a *capability* lane, not a cost
44
+ tier. `unic-code` and `unic-smart` cannot read images on this gateway, so substituting one of them
45
+ would not downgrade image analysis — it would silently produce guesses.
46
+
47
+ ## The six agents are shared with Claude Code
48
+
49
+ The agent names here are verbatim the same as the ones under `.claude/agents/`, so the same
50
+ instruction ("hand this to the code reviewer") routes to the same role on either runtime.
51
+
52
+ What differs is only the frontmatter contract: omp reads task agents from `.omp/agents/` and
53
+ deliberately skips `.claude/agents/*.md`, and its model field takes a `@role` reference instead of a
54
+ model id. The prompt bodies are ported, not rewritten.
55
+
56
+ ## The hook bridge
57
+
58
+ `.omp/hooks/pre/ukit-bridge.js` does not reimplement any guardrail. It maps an omp event to the
59
+ matching Claude Code hook payload and executes the existing shell script under `.claude/hooks/`.
60
+ One source of truth, two runtimes — fix a hook once and both runtimes get the fix.
61
+
62
+ Two things worth knowing:
63
+
64
+ **Tool names are mapped explicitly, never guessed.** omp's write surface is `edit`, `write` *and*
65
+ `ast_edit`; all three map to the `Edit` group, or `ast_edit` would slip past `protect-files.sh` and
66
+ `vision-gate.sh`. `eval` maps to `Bash` so it still hits `block-dangerous.sh`. Anything not in the
67
+ table maps to nothing and runs zero scripts — it never falls back to `Bash` or `Edit`.
68
+
69
+ **Failure direction is per-script, transcribed from each script's own header — not a blanket rule.**
70
+
71
+ - *Fail closed* (a crash or non-zero exit blocks the action): `protect-files.sh`,
72
+ `stale-spec-guard.sh`, `handoff-model-guard.sh`, `vision-gate.sh`, `context-hardcap-gate.sh`,
73
+ `block-dangerous.sh`, `verification-guard.sh`. These are gates; a broken gate must not open.
74
+ - *Fail open* (a crash logs a warning and the action proceeds): the advisory scripts —
75
+ routing, backups, output compression, context reinjection, pressure reset, handoff resume.
76
+ These improve a session; none of them should be able to halt one.
77
+
78
+ ## Why there is no `.omp/skills/` or `.omp/commands/`
79
+
80
+ Their absence is deliberate, not an oversight — and if you "fix" it, a test will fail on purpose.
81
+
82
+ omp discovers capabilities from several providers in priority order, and its `claude` provider
83
+ already reads `.claude/skills/` and `.claude/commands/` directly. A copy or symlink under `.omp/`
84
+ would register at higher (native) priority, win deduplication, and give you a second location to
85
+ keep in sync for exactly zero new capability.
86
+
87
+ `.omp/agents/` is the one case that *must* be real files, because omp explicitly does not read
88
+ `.claude/agents/*.md`.
89
+
90
+ ## Installing / removing
91
+
92
+ ```bash
93
+ ukit install --tools=omp # or --tools=oh-my-pi
94
+ ukit install # installs every adapter, omp included
95
+ ukit uninstall # removes the paths listed above
96
+ ```
@@ -0,0 +1,34 @@
1
+ # .omp/RULES.md — sticky always-apply rules
2
+
3
+ omp re-attaches this file near every turn from its native location (`.omp/RULES.md` only, never a
4
+ copy elsewhere). It carries the always-apply subset of root `CLAUDE.md` that omp's claude provider
5
+ cannot see — that provider only reads `~/.claude/CLAUDE.md` and `<cwd>/.claude/CLAUDE.md`, never root
6
+ `CLAUDE.md`. Keep this short: every line here is a per-turn tax.
7
+
8
+ ## 1. Execution Contract
9
+
10
+ For implement/apply/fix requests, continue until the actual edit is made or a real blocker is found.
11
+ Do not stop after a read-only inspection step (read/grep/glob/search).
12
+
13
+ ## 2. No "done" after read-only
14
+
15
+ Never say "done", "applied", or "fixed" after a read-only step. Completion wording requires concrete
16
+ edit/write evidence in the current turn, plus verification when the change is risky.
17
+
18
+ ## 3. Index-first loop
19
+
20
+ Check `.cache/index/` freshness first. Then run
21
+ `node .claude/ukit/index/query-index.mjs "<error|symbol|path>"` and open only the top 1-3 suspect
22
+ files before widening further. These node scripts work unchanged under omp.
23
+
24
+ ## 4. Safe Patch
25
+
26
+ Prefer unique current-file anchors over line numbers or stale pasted blocks. Never silently merge a
27
+ stale spec — re-read current source and confirm before applying. Preserve existing BOM and line
28
+ endings.
29
+
30
+ ## Model roles (see `.omp/config.yml`)
31
+
32
+ `modelRoles` ships UNIC gateway names as the default. A maintainer on a non-UNIC omp provider edits
33
+ only the three cost-tier values — `lite`, `code`, `smart` — never `vision`, which stays `unic-vision`
34
+ because it is a capability lane, not a cost tier.
@@ -0,0 +1,85 @@
1
+ ---
2
+ name: bug-debugger
3
+ description: "Debugging specialist for reproducible errors, failing tests, and unexpected behavior. Use proactively when investigation will involve noisy logs, stack traces, or a self-contained reproduce-trace-fix-verify loop. Do not use for trivial obvious fixes or broad architecture ideation."
4
+ model: "@code"
5
+ tools: ["read","grep","glob","bash","edit","ast_edit"]
6
+ ---
7
+
8
+ Systematic debugging — understand before fixing.
9
+
10
+ **Two modes:**
11
+ - **Daily/ad-hoc** (DEFAULT): bug not coming from `docs/AI_HANDOFF/` → reproduce → fix → verify (no mandatory regression test if no pre-existing coverage; original lightweight flow).
12
+ - **Handoff mode**: bug task lives in `docs/AI_HANDOFF/tasks/TASK-xxx.md` → activate Quality Gate: regression-test-first → green → reviewer.
13
+
14
+ ## Workflow
15
+
16
+ ### 1. Reproduce (required)
17
+
18
+ - Run the failing command/action.
19
+ - Capture exact error message and stack trace.
20
+ - If not reproducible → document conditions and ask user.
21
+
22
+ ### 2. Trace Root Cause
23
+
24
+ - Read error location and surrounding code.
25
+ - Trace data flow: input → processing → failure point.
26
+ - Identify: logic / state / integration error?
27
+
28
+ ### 3. Regression Test First (RED) — Handoff mode
29
+
30
+ - Write a regression test that reproduces the bug as a failing test.
31
+ - Run it: must FAIL with the original error/signature.
32
+ - If you truly cannot write a regression test (pure UI glitch, env-only issue), document why and attach a manual repro script.
33
+ - **Daily mode**: write a regression test only if the file already has tests; otherwise rely on the original repro command for verification.
34
+
35
+ ### 4. Fix (GREEN)
36
+
37
+ - Apply smallest reliable fix at the root cause.
38
+ - Do NOT patch symptoms — fix the cause.
39
+ - Re-run the regression test: must PASS.
40
+
41
+ ### 5. Verify
42
+
43
+ - Re-run the original failing command → must pass.
44
+ - Run related tests: `yarn test [relevant-file]`.
45
+ - If shared code touched, run wider suite.
46
+ - Check no regression in adjacent functionality.
47
+
48
+ ### 6. Report
49
+
50
+ ```
51
+ STATUS: DONE | BLOCKED | PARTIAL
52
+ EXECUTOR_TOOL: [claude-code | kilo-code | codex | opencode | other]
53
+ EXECUTOR_MODEL: [exact model name you are running as. "unknown" if you cannot tell.]
54
+ EXECUTOR_SUBAGENT: [subagent name within your host, if any, else "-"]
55
+ SUMMARY: [1-2 sentences — root cause and fix]
56
+ ROOT_CAUSE: [what caused the bug]
57
+ REGRESSION_TEST:
58
+ file: [path]
59
+ red_before: [exact error captured]
60
+ green_after: [pass output line]
61
+ FILES_CHANGED:
62
+ - [file path]: [what changed]
63
+ VERIFICATION:
64
+ command: [exact command]
65
+ result: [N pass / M fail / exit code]
66
+ ISSUES: [any remaining risks or edge cases, or "none"]
67
+ HANDOFF_TO_REVIEWER: yes | no — reason
68
+ NEXT: [follow-up needed, or "ready for review"]
69
+ ```
70
+
71
+ ### 7. Trigger Reviewer — Handoff mode ONLY
72
+
73
+ Daily mode: skip. Handoff mode: set task status `pending_review` in `INDEX.md`; a reviewer session (model from `handoff.reviewer.model`, MUST differ from this debugger's model) will pick it up.
74
+
75
+ ## Rules
76
+
77
+ - **Iron law (Handoff mode):** no `DONE` without (a) regression test passing and (b) original failing command passing, both in this turn.
78
+ - **Daily mode:** original — original failing command must pass; regression test optional unless prior coverage exists.
79
+ - Don't patch blindly — confirm root cause with evidence.
80
+ - For bug triage, use graduated doc budget:
81
+ - obvious/simple bug: `docs/MEMORY.md` only
82
+ - non-trivial bug: `docs/MEMORY.md` + `docs/PROJECT.md` + `docs/CODE_MAP.md`
83
+ - read `docs/WORKLOG.md` only recent relevant entries
84
+ - Keep fix scope minimal — no drive-by refactors.
85
+ - If root cause is unclear after 5 minutes of tracing → ask user for more context.