oh-my-opencode 5.0.0-beta.12 → 5.0.0-beta.14

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 (145) hide show
  1. package/.agents/skills/senpi-qa/SKILL.md +80 -0
  2. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs +65 -0
  3. package/.agents/skills/senpi-qa/scripts/resolve-evidence-dir.test.mjs +171 -0
  4. package/README.ja.md +25 -21
  5. package/README.ko.md +25 -21
  6. package/README.md +26 -22
  7. package/README.ru.md +24 -20
  8. package/README.zh-cn.md +25 -21
  9. package/dist/cli/index.js +16747 -15223
  10. package/dist/cli-node/index.js +16898 -15374
  11. package/dist/create-hooks.d.ts +1 -0
  12. package/dist/features/btw-side/btw-command-draft.d.ts +7 -0
  13. package/dist/features/btw-side/context-injector.d.ts +15 -0
  14. package/dist/features/btw-side/index.d.ts +8 -0
  15. package/dist/features/btw-side/metadata.d.ts +15 -0
  16. package/dist/features/btw-side/parent-context-budget.d.ts +9 -0
  17. package/dist/features/btw-side/server-session-registry.d.ts +8 -0
  18. package/dist/features/btw-side/tui-adoption-cache.d.ts +13 -0
  19. package/dist/features/btw-side/tui-adoption-guard.d.ts +5 -0
  20. package/dist/features/btw-side/tui-controller-types.d.ts +68 -0
  21. package/dist/features/btw-side/tui-controller.d.ts +19 -0
  22. package/dist/features/btw-side/tui-escape-return.d.ts +12 -0
  23. package/dist/features/btw-side/tui-keymap.d.ts +17 -0
  24. package/dist/features/btw-side/tui-parent-validator.d.ts +6 -0
  25. package/dist/features/btw-side/tui-picker-options.d.ts +20 -0
  26. package/dist/features/btw-side/tui-picker.d.ts +9 -0
  27. package/dist/features/btw-side/tui-prompt-queue.d.ts +8 -0
  28. package/dist/features/btw-side/tui-session-bridge.d.ts +11 -0
  29. package/dist/features/btw-side/tui-session-catalog.d.ts +35 -0
  30. package/dist/features/btw-side/tui-side-removal.d.ts +11 -0
  31. package/dist/features/btw-side/tui-side-start.d.ts +9 -0
  32. package/dist/features/btw-side/tui-wiring.d.ts +8 -0
  33. package/dist/features/opengateway-provider/index.d.ts +13 -0
  34. package/dist/hooks/runtime-fallback/chat-message-handler.d.ts +2 -0
  35. package/dist/hooks/runtime-fallback/retry-model-payload.d.ts +1 -0
  36. package/dist/hooks/runtime-fallback/runtime-model-settings.d.ts +6 -0
  37. package/dist/hooks/runtime-fallback/session-status-handler.d.ts +1 -1
  38. package/dist/hooks/runtime-fallback/types.d.ts +3 -1
  39. package/dist/index.js +10814 -6018
  40. package/dist/plugin/event-session-lifecycle.d.ts +1 -0
  41. package/dist/plugin/hooks/create-core-hooks.d.ts +1 -0
  42. package/dist/plugin/hooks/create-transform-hooks.d.ts +2 -0
  43. package/dist/plugin/messages-transform.d.ts +1 -0
  44. package/dist/shared/index.d.ts +1 -0
  45. package/dist/shared/runtime-fallback-retry-marker.d.ts +16 -0
  46. package/dist/skills/frontend/SKILL.md +1 -0
  47. package/dist/skills/frontend/references/design/print-paged-media.md +76 -0
  48. package/dist/skills/ulw-research/SKILL.md +1 -1
  49. package/dist/skills/visual-qa/SKILL.md +3 -2
  50. package/dist/tui.js +8273 -8493
  51. package/package.json +30 -29
  52. package/packages/git-bash-mcp/dist/cli.js +5 -1
  53. package/packages/git-bash-mcp/package.json +1 -1
  54. package/packages/lsp-daemon/dist/cli.js +86 -114
  55. package/packages/lsp-daemon/dist/client.js +87 -118
  56. package/packages/lsp-daemon/dist/ensure-daemon.js +1 -0
  57. package/packages/lsp-daemon/dist/index.js +93 -123
  58. package/packages/lsp-daemon/dist/version-reap.js +1 -1
  59. package/packages/lsp-tools-mcp/dist/cli.js +67 -94
  60. package/packages/lsp-tools-mcp/dist/lsp/manager.js +62 -92
  61. package/packages/lsp-tools-mcp/dist/mcp.js +69 -96
  62. package/packages/lsp-tools-mcp/dist/request-context.js +11 -12
  63. package/packages/lsp-tools-mcp/dist/tools.js +73 -104
  64. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  65. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +30 -29
  66. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  67. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  68. package/packages/omo-codex/plugin/components/bootstrap/src/hook.ts +1 -0
  69. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +86 -65
  70. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +86 -66
  71. package/packages/omo-codex/plugin/components/codegraph/package.json +4 -4
  72. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +1 -0
  73. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +1 -0
  74. package/packages/omo-codex/plugin/components/comment-checker/dist/cli.js +2 -1
  75. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  76. package/packages/omo-codex/plugin/components/comment-checker/package.json +5 -5
  77. package/packages/omo-codex/plugin/components/comment-checker/src/runner.ts +1 -0
  78. package/packages/omo-codex/plugin/components/git-bash/AGENTS.md +1 -1
  79. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  80. package/packages/omo-codex/plugin/components/git-bash/package.json +3 -4
  81. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  82. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +5 -5
  83. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
  84. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +70 -107
  85. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  86. package/packages/omo-codex/plugin/components/lsp/package.json +5 -5
  87. package/packages/omo-codex/plugin/components/lsp/src/cli.ts +1 -1
  88. package/packages/omo-codex/plugin/components/rules/dist/cli.js +14 -12
  89. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  90. package/packages/omo-codex/plugin/components/rules/package.json +7 -7
  91. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  92. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +5 -5
  93. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  94. package/packages/omo-codex/plugin/components/teammode/package.json +5 -5
  95. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +2266 -405
  96. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +2270 -409
  97. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  98. package/packages/omo-codex/plugin/components/telemetry/package.json +5 -5
  99. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  100. package/packages/omo-codex/plugin/components/ultrawork/package.json +5 -5
  101. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +1 -3
  102. package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +1 -1
  103. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  104. package/packages/omo-codex/plugin/components/ulw-loop/package.json +5 -5
  105. package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +1 -1
  106. package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +25 -0
  107. package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +9 -0
  108. package/packages/omo-codex/plugin/components/ulw-loop/vitest.config.ts +1 -0
  109. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  110. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  111. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  112. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  113. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  114. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  115. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  116. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  117. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  118. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  119. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  120. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  121. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  122. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  123. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  124. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  125. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  126. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  127. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  128. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  129. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  130. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  131. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  132. package/packages/omo-codex/plugin/package-lock.json +661 -375
  133. package/packages/omo-codex/plugin/package.json +1 -1
  134. package/packages/omo-codex/plugin/shared/package.json +2 -3
  135. package/packages/omo-codex/plugin/skills/frontend/SKILL.md +1 -0
  136. package/packages/omo-codex/plugin/skills/frontend/references/design/print-paged-media.md +76 -0
  137. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +1 -1
  138. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +3 -2
  139. package/packages/omo-codex/scripts/install-dist/install-local.mjs +2410 -504
  140. package/packages/shared-skills/skills/frontend/SKILL.md +1 -0
  141. package/packages/shared-skills/skills/frontend/references/design/print-paged-media.md +76 -0
  142. package/packages/shared-skills/skills/ulw-research/SKILL.md +1 -1
  143. package/packages/shared-skills/skills/visual-qa/SKILL.md +3 -2
  144. package/script/qa/web-terminal-visual-qa.mjs +2 -0
  145. package/script/qa/xterm-live-terminal.mjs +18 -2
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: senpi-qa
3
+ description: "QA the omo Senpi adapter (packages/omo-senpi, packages/senpi-task) against the REAL senpi binary in strict isolation, and write every artifact to the one canonical evidence path .omo/evidence/omo-senpi-adapter/<slug>/. The live drivers under packages/omo-senpi/scripts/qa/ create their own isolated SENPI_CODING_AGENT_DIR and ignore the caller's, so the real ~/.senpi/agent is never written. Ships scripts/resolve-evidence-dir.mjs, which is the ONLY sanctioned way to pick an evidence directory: it rejects traversal, separators, absolute paths, and stray roots such as local-ignore/qa-evidence. Use whenever someone changes anything under packages/omo-senpi or packages/senpi-task, or wants to QA, smoke-test, verify, or debug the Senpi adapter, the task/team engine, the DAG, task RPC, or skill delivery. Triggers: senpi qa, qa senpi, senpi-qa, test senpi adapter, verify senpi task, senpi task e2e, senpi team e2e, task dag qa, live senpi driver, senpi evidence path."
4
+ ---
5
+
6
+ # Senpi QA
7
+
8
+ QA the omo Senpi adapter (`packages/omo-senpi/`) and the task engine
9
+ (`packages/senpi-task/`) by driving the REAL `senpi` binary. Unit tests never
10
+ count as live QA here: `bun run test:senpi` is the package gate, the drivers in
11
+ `packages/omo-senpi/scripts/qa/` are the harness proof.
12
+
13
+ ## Golden rules
14
+
15
+ - **Evidence lives at exactly one path.** Every artifact goes under
16
+ `.omo/evidence/omo-senpi-adapter/<slug>/`. Pick it with
17
+ `scripts/resolve-evidence-dir.mjs` and nothing else — a hand-typed path is how
18
+ runs end up somewhere like `local-ignore/qa-evidence/`, which no reviewer reads
19
+ and the PR cannot cite.
20
+ - **The real agent dir stays untouched.** The live drivers build their own
21
+ isolated `SENPI_CODING_AGENT_DIR` and deliberately IGNORE a caller-provided
22
+ one, so `~/.senpi/agent` is never used as the sandbox. Report the driver's
23
+ `realSenpiUntouched` / changed-path fields and the isolated agent-dir path;
24
+ treat a whole-directory digest as supporting evidence, not proof by itself.
25
+ - **No binary means SKIP, not silence.** When `senpi` is absent the live drivers
26
+ report `SKIP` or `FAIL` in their final JSON rather than degrading to the real
27
+ home. A `SKIP` is not a pass — say so in the evidence README.
28
+ - **The captured JSON is the evidence.** No file on disk means the QA did not
29
+ happen, which means no commit and no push.
30
+
31
+ ## Resolve the evidence directory first
32
+
33
+ ```bash
34
+ ev="$(node .agents/skills/senpi-qa/scripts/resolve-evidence-dir.mjs \
35
+ --repo-root "$(git rev-parse --show-toplevel)" --slug <YYYYMMDD>-<short-slug>)"
36
+ mkdir -p "$ev"
37
+ ```
38
+
39
+ The resolver returns an absolute path and creates nothing, so the caller decides
40
+ when the directory appears. A slug is ONE relative segment of lowercase letters,
41
+ digits, and hyphens (`20260820-senpi-qa-contract`). Separators, `.`/`..`,
42
+ traversal, absolute paths, and a non-git root are rejected with a non-zero exit
43
+ and a message naming the offending slug.
44
+
45
+ ## Router: pick your case
46
+
47
+ | You changed… | Run | Proves |
48
+ |---|---|---|
49
+ | Any adapter code, as the fast precondition | `node packages/omo-senpi/scripts/qa/drive.mjs --self-test` | the driver + isolation harness itself works |
50
+ | Adapter wiring reaching a live session | `node packages/omo-senpi/scripts/qa/drive.mjs` | a real senpi run with the plugin loaded, isolated agent dir, and no attributed real-home changes |
51
+ | Task lifecycle (single + batch) | `SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/task-e2e.mjs` | live task start/stream/terminal states |
52
+ | Team delivery, shutdown, reclaim, restart recovery | `SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/team-e2e.mjs` | injection delivery and exactly-once recovery |
53
+ | Task RPC driver scripts | `node packages/omo-senpi/scripts/qa/task-rpc-e2e.mjs --self-test` | the RPC surface contract |
54
+ | Skill delivery into a task | `SENPI_BIN="$(command -v senpi)" node packages/omo-senpi/scripts/qa/task-load-skills-e2e.mjs` | skills reach the child |
55
+ | Continuation behavior | `node packages/omo-senpi/scripts/qa/probe-continuation.mjs` | turns continue as expected |
56
+ | DAG state machine / runners | `bun test packages/senpi-task` | unit + chaos invariants (NOT live proof) |
57
+
58
+ Point a driver's output at the resolved directory, e.g.:
59
+
60
+ ```bash
61
+ TASK_E2E_OUT_DIR="$ev/live-task-dag" SENPI_BIN="$(command -v senpi)" \
62
+ node packages/omo-senpi/scripts/qa/task-e2e.mjs
63
+ ```
64
+
65
+ ## Package gate
66
+
67
+ ```bash
68
+ tsgo --noEmit -p packages/omo-senpi/tsconfig.json
69
+ bun run test:senpi
70
+ ```
71
+
72
+ ## Write the evidence README
73
+
74
+ Every run leaves `$ev/README.md` a reviewer can read without rerunning anything.
75
+ The required sections are the repo-wide evidence rules in the root
76
+ [`AGENTS.md`](../../../AGENTS.md) (what was tested / observed / why it is enough /
77
+ what was omitted). For Senpi, record the driver's changed-path/isolation fields
78
+ and sandbox agent-dir path. Some drivers report sandbox paths without removing
79
+ them; the caller must delete every task-owned sandbox and verify child PIDs are
80
+ terminal before writing the cleanup receipt.
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env node
2
+ // resolve-evidence-dir.mjs - pick the canonical evidence directory for a live Senpi QA run.
3
+ //
4
+ // Live Senpi QA artifacts belong under .omo/evidence/omo-senpi-adapter/<slug>/ and nowhere else.
5
+ // That path is the repository-standard location every reviewer and AGENTS.md rule points at, so a
6
+ // hand-typed alternative (local-ignore/qa-evidence/..., a temp dir, a traversal) silently strands
7
+ // the evidence where the PR cannot cite it. Resolving through this script makes the path a checked
8
+ // contract instead of a convention.
9
+ //
10
+ // The resolver COMPUTES and VALIDATES only; creating the directory stays the caller's decision, so
11
+ // a rejected slug never leaves a stray directory behind.
12
+ //
13
+ // node resolve-evidence-dir.mjs --repo-root "$(git rev-parse --show-toplevel)" --slug 20260820-my-run
14
+ //
15
+ // Prints the absolute path to stdout. Exit 0 iff the root is a git worktree and the slug is safe.
16
+ import { existsSync, realpathSync } from "node:fs"
17
+ import { join, resolve } from "node:path"
18
+ import { fileURLToPath } from "node:url"
19
+
20
+ export const EVIDENCE_RELATIVE_ROOT = join(".omo", "evidence", "omo-senpi-adapter")
21
+
22
+ // One relative segment: lowercase alphanumerics joined by single hyphens. This is what makes the
23
+ // path predictable - it also rejects every separator, traversal, and absolute form outright, since
24
+ // none of them can match.
25
+ const SAFE_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/
26
+
27
+ /**
28
+ * @param {{ repoRoot: string, slug: string }} input
29
+ * @returns {string} absolute evidence directory; NOT created
30
+ */
31
+ export function resolveEvidenceDir({ repoRoot, slug }) {
32
+ if (typeof repoRoot !== "string" || repoRoot.length === 0) {
33
+ throw new Error("repoRoot must be a non-empty path to a git worktree")
34
+ }
35
+ if (!existsSync(join(repoRoot, ".git"))) {
36
+ throw new Error(`repoRoot is not a git worktree: ${repoRoot}`)
37
+ }
38
+ if (typeof slug !== "string" || !SAFE_SLUG.test(slug)) {
39
+ throw new Error(
40
+ `slug must be one lowercase alphanumeric-and-hyphen segment (got ${JSON.stringify(slug)}); ` +
41
+ `evidence lives under ${EVIDENCE_RELATIVE_ROOT}/<slug>`,
42
+ )
43
+ }
44
+ return resolve(repoRoot, EVIDENCE_RELATIVE_ROOT, slug)
45
+ }
46
+
47
+ const isDirectRun =
48
+ process.argv[1] !== undefined &&
49
+ existsSync(process.argv[1]) &&
50
+ realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))
51
+
52
+ if (isDirectRun) {
53
+ const args = process.argv.slice(2)
54
+ const read = (flag) => {
55
+ const at = args.indexOf(flag)
56
+ return at === -1 ? undefined : args[at + 1]
57
+ }
58
+ try {
59
+ const dir = resolveEvidenceDir({ repoRoot: read("--repo-root") ?? process.cwd(), slug: read("--slug") })
60
+ process.stdout.write(`${dir}\n`)
61
+ } catch (error) {
62
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`)
63
+ process.exit(1)
64
+ }
65
+ }
@@ -0,0 +1,171 @@
1
+ import { afterEach, describe, expect, test } from "bun:test"
2
+ import { spawnSync } from "node:child_process"
3
+ import { existsSync, mkdirSync, mkdtempSync, rmSync, symlinkSync } from "node:fs"
4
+ import { tmpdir } from "node:os"
5
+ import { join, relative } from "node:path"
6
+ import { fileURLToPath, pathToFileURL } from "node:url"
7
+
8
+ import { EVIDENCE_RELATIVE_ROOT, resolveEvidenceDir } from "./resolve-evidence-dir.mjs"
9
+
10
+ const cleanupRoots = []
11
+ const cliPath = fileURLToPath(new URL("./resolve-evidence-dir.mjs", import.meta.url))
12
+
13
+ afterEach(() => {
14
+ for (const root of cleanupRoots.splice(0)) rmSync(root, { recursive: true, force: true })
15
+ })
16
+
17
+ function makeGitRoot() {
18
+ const root = mkdtempSync(join(tmpdir(), "senpi-qa-evidence-"))
19
+ cleanupRoots.push(root)
20
+ mkdirSync(join(root, ".git"))
21
+ return root
22
+ }
23
+
24
+ describe("resolveEvidenceDir", () => {
25
+ test("#given a git worktree and a safe slug #when resolved #then it returns the canonical adapter evidence directory", () => {
26
+ // given
27
+ const repoRoot = makeGitRoot()
28
+
29
+ // when
30
+ const resolved = resolveEvidenceDir({ repoRoot, slug: "20260820-senpi-qa-contract" })
31
+
32
+ // then
33
+ expect(resolved).toBe(join(repoRoot, ".omo", "evidence", "omo-senpi-adapter", "20260820-senpi-qa-contract"))
34
+ })
35
+
36
+ test("#given a relative git worktree path #when resolved #then it still returns an absolute evidence directory", () => {
37
+ // given
38
+ const repoRoot = makeGitRoot()
39
+ const relativeRoot = relative(process.cwd(), repoRoot)
40
+
41
+ // when
42
+ const resolved = resolveEvidenceDir({ repoRoot: relativeRoot, slug: "20260820-relative-root" })
43
+
44
+ // then
45
+ expect(resolved).toBe(join(repoRoot, ".omo", "evidence", "omo-senpi-adapter", "20260820-relative-root"))
46
+ })
47
+
48
+ test("#given a resolved evidence path #when the resolver returns #then it has created no directory", () => {
49
+ // given
50
+ const repoRoot = makeGitRoot()
51
+
52
+ // when
53
+ const resolved = resolveEvidenceDir({ repoRoot, slug: "20260820-senpi-qa-contract" })
54
+
55
+ // then
56
+ expect(existsSync(resolved)).toBe(false)
57
+ expect(existsSync(join(repoRoot, ".omo"))).toBe(false)
58
+ })
59
+
60
+ test("#given the adapter evidence root #when it is the declared relative root #then it stays under .omo/evidence", () => {
61
+ // given / when / then
62
+ expect(EVIDENCE_RELATIVE_ROOT).toBe(join(".omo", "evidence", "omo-senpi-adapter"))
63
+ })
64
+
65
+ test("#given an unsafe slug #when resolved #then it is rejected before any path is produced", () => {
66
+ // given
67
+ const repoRoot = makeGitRoot()
68
+ const unsafeSlugs = [
69
+ "",
70
+ " ",
71
+ ".",
72
+ "..",
73
+ "../escape",
74
+ "nested/slug",
75
+ "nested\\slug",
76
+ "/absolute",
77
+ join(repoRoot, "absolute"),
78
+ "local-ignore/qa-evidence/20260819-senpi",
79
+ "..%2Fescape",
80
+ "-leading-hyphen",
81
+ "trailing-hyphen-",
82
+ "Upper-Case",
83
+ "under_score",
84
+ ]
85
+
86
+ // when / then
87
+ for (const slug of unsafeSlugs) {
88
+ expect(() => resolveEvidenceDir({ repoRoot, slug }), `must reject ${JSON.stringify(slug)}`).toThrow()
89
+ }
90
+ })
91
+
92
+ test("#given a directory that is not a git worktree #when resolved #then it is rejected", () => {
93
+ // given
94
+ const notARepo = mkdtempSync(join(tmpdir(), "senpi-qa-not-git-"))
95
+ cleanupRoots.push(notARepo)
96
+
97
+ // when / then
98
+ expect(() => resolveEvidenceDir({ repoRoot: notARepo, slug: "20260820-senpi-qa-contract" })).toThrow(/git/i)
99
+ })
100
+
101
+ test("#given a rejected slug #when the error surfaces #then it names the offending slug for the operator", () => {
102
+ // given
103
+ const repoRoot = makeGitRoot()
104
+
105
+ // when / then
106
+ expect(() => resolveEvidenceDir({ repoRoot, slug: "local-ignore/qa-evidence/x" })).toThrow(
107
+ /local-ignore\/qa-evidence\/x/,
108
+ )
109
+ })
110
+
111
+ test("#given the documented Node CLI #when valid and invalid slugs run #then stdout and exit codes enforce the contract", () => {
112
+ // given
113
+ const repoRoot = makeGitRoot()
114
+
115
+ // when
116
+ const valid = spawnSync("node", [cliPath, "--repo-root", repoRoot, "--slug", "20260820-node-cli"], {
117
+ encoding: "utf8",
118
+ })
119
+ const invalid = spawnSync(
120
+ "node",
121
+ [cliPath, "--repo-root", repoRoot, "--slug", "local-ignore/qa-evidence/x"],
122
+ { encoding: "utf8" },
123
+ )
124
+
125
+ // then
126
+ expect(valid.status).toBe(0)
127
+ expect(valid.stdout.trim()).toBe(join(repoRoot, EVIDENCE_RELATIVE_ROOT, "20260820-node-cli"))
128
+ expect(invalid.status).toBe(1)
129
+ expect(invalid.stderr).toContain("local-ignore/qa-evidence/x")
130
+ })
131
+
132
+ test("#given a symlink to the documented Node CLI #when invoked #then the entrypoint still enforces the contract", () => {
133
+ // given
134
+ const repoRoot = makeGitRoot()
135
+ const symlinkPath = join(repoRoot, "resolve-evidence-dir.mjs")
136
+ symlinkSync(cliPath, symlinkPath)
137
+
138
+ // when
139
+ const result = spawnSync(
140
+ "node",
141
+ [symlinkPath, "--repo-root", repoRoot, "--slug", "20260820-symlink-cli"],
142
+ { encoding: "utf8" },
143
+ )
144
+
145
+ // then
146
+ expect(result.status).toBe(0)
147
+ expect(result.stdout.trim()).toBe(join(repoRoot, EVIDENCE_RELATIVE_ROOT, "20260820-symlink-cli"))
148
+ })
149
+
150
+ test("#given an embedding runner with a missing argv path #when the module is imported #then exports still load", () => {
151
+ // given
152
+ const missingEntrypoint = join(tmpdir(), `missing-senpi-qa-entrypoint-${process.pid}.mjs`)
153
+ const moduleUrl = pathToFileURL(cliPath).href
154
+
155
+ // when
156
+ const result = spawnSync(
157
+ "node",
158
+ [
159
+ "--input-type=module",
160
+ "--eval",
161
+ `process.argv[1] = ${JSON.stringify(missingEntrypoint)}; await import(${JSON.stringify(moduleUrl)})`,
162
+ ],
163
+ { encoding: "utf8" },
164
+ )
165
+
166
+ // then
167
+ expect(result.status).toBe(0)
168
+ expect(result.stdout).toBe("")
169
+ expect(result.stderr).toBe("")
170
+ })
171
+ })
package/README.ja.md CHANGED
@@ -67,7 +67,7 @@
67
67
  [![GitHub Issues](https://img.shields.io/github/issues/code-yeongyu/oh-my-openagent?color=ff80eb&labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/issues)
68
68
  [![License](https://img.shields.io/badge/license-SUL--1.0-white?labelColor=black&style=flat-square)](https://github.com/code-yeongyu/oh-my-openagent/blob/dev/LICENSE.md)
69
69
  [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/code-yeongyu/oh-my-openagent)
70
- [![Docs](https://img.shields.io/badge/docs-omo.vibetip.help-369eff?labelColor=black&logo=readthedocs&logoColor=white&style=flat-square)](https://omo.vibetip.help/docs)
70
+ [![Docs](https://img.shields.io/badge/docs-omo.dev-369eff?labelColor=black&logo=readthedocs&logoColor=white&style=flat-square)](https://omo.dev/docs)
71
71
 
72
72
  [English](README.md) | [한국어](README.ko.md) | [日本語](README.ja.md) | [简体中文](README.zh-cn.md)
73
73
 
@@ -129,11 +129,11 @@ https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/do
129
129
  curl -s https://raw.githubusercontent.com/code-yeongyu/oh-my-openagent/refs/heads/dev/docs/guide/installation.md
130
130
  ```
131
131
 
132
- **注記**: 公開されている npm パッケージと CLI バイナリ名は引き続き `oh-my-opencode` です (移行期間中は `oh-my-openagent` としても同時に公開されています)。`opencode.json` 内では、互換性レイヤーがプラグインエントリ `oh-my-openagent` を優先するようになりました。従来の `oh-my-opencode` エントリも警告付きで引き続き読み込まれます。プラグイン設定ファイルは依然として `oh-my-opencode.json` または `oh-my-opencode.jsonc` が一般的で、移行期間中は従来のファイル名と改名後のファイル名の両方が認識されます。
132
+ **注記**: 公開されている npm パッケージと CLI バイナリ名は引き続き `oh-my-opencode` です (移行期間中は `oh-my-openagent` としても同時に公開されています)。`opencode.json` 内では、互換性レイヤーがプラグインエントリ `oh-my-openagent` を優先するようになりました。従来の `oh-my-opencode` エントリも警告付きで引き続き読み込まれます。ランタイム設定は `~/.omo/omo.jsonc` と、上位ディレクトリへたどるプロジェクトの `.omo/omo.jsonc` です。従来の `oh-my-openagent.json[c]` / `oh-my-opencode.json[c]` はマイグレーションエンジンが一度だけ取り込み、以降は読み込まれません。
133
133
 
134
134
  匿名のテレメトリは、アクティブなインストール数(DAU/WAU/MAU)の集計のためにデフォルトで有効になっています。マシン1台につきUTC日あたり最大1回イベントが送信され、ハッシュ化されたインストール識別子を使用し、生のホスト名は使用せず、PostHog person profile も作成されません。無効化するには `OMO_SEND_ANONYMOUS_TELEMETRY=0` または `OMO_DISABLE_POSTHOG=1` を設定してください。[プライバシーポリシー](docs/legal/privacy-policy.md)と[利用規約](docs/legal/terms-of-service.md)をご覧ください。
135
135
 
136
- **Ultimate と Light:** oh-my-openagent は同じ製品の 2 つのエディションとして提供されます。**Ultimate エディション**(`bunx oh-my-openagent install` または `--platform=opencode`、デフォルト)は OpenCode 上のフル機能で、11 エージェント、54+ フック、Team Mode、すべての MCP、スラッシュコマンド、IntentGate モードを提供します。**Light エディション**(`npx lazycodex-ai install` または `bunx oh-my-openagent install --platform=codex`)は OpenAI Codex CLI のプラグインシステムへ綺麗に移植できる 8 コンポーネント(`rules`、`comment-checker`、`git-bash`、`lsp`、`ultrawork`、`ulw-loop`、`start-work-continuation`、`telemetry`)を提供します。両方を同時にインストールするには `--platform=both`。Codex 専用テレメトリは `OMO_CODEX_DISABLE_POSTHOG=1` または `OMO_CODEX_SEND_ANONYMOUS_TELEMETRY=0` で無効化できます。
136
+ **Ultimate と Light:** oh-my-openagent は同じ製品の 2 つのエディションとして提供されます。**Ultimate エディション**(`bunx oh-my-openagent install` または `--platform=opencode`、デフォルト)は OpenCode 上のフル機能で、11 エージェント、54+ フック、Team Mode、すべての MCP、スラッシュコマンド、IntentGate モードを提供します。**Light エディション**(`npx lazycodex-ai install` または `bunx oh-my-openagent install --platform=codex`)は OpenAI Codex CLI のプラグインシステムへ綺麗に移植できるコアコンポーネント(`rules`、`comment-checker`、`git-bash`、`lsp`、`ultrawork`、`ulw-loop`、`start-work-continuation`、`telemetry`)に加え、`teammode` と補助コンポーネント(`bootstrap`、`codegraph`、`lcx` など)を提供し、Codex エージェントの TOML を `~/.codex/agents/` にインストールします。両方を同時にインストールするには `--platform=both`。Codex 専用テレメトリは `OMO_CODEX_DISABLE_POSTHOG=1` または `OMO_CODEX_SEND_ANONYMOUS_TELEMETRY=0` で無効化できます。
137
137
 
138
138
  ---
139
139
 
@@ -165,19 +165,19 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
165
165
  | | 機能 | Editions | 何をするのか |
166
166
  | :---: | :------------------------------------------------------- | :------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
167
167
  | 🤖 | **規律あるエージェント (Discipline Agents)** | Ultimate | Sisyphus が Hephaestus、Oracle、Librarian、Explore をオーケストレーションします。完全な AI 開発チームが並列で動きます。 |
168
- | 🧩 | **Codex CLI Light Edition** | Light | OpenAI Codex CLI 上で動作する omo 8 つの移植コンポーネント (rules, comment-checker, git-bash, LSP, ultrawork, ulw-loop, start-work continuation, telemetry)。インストール: `npx lazycodex-ai install`。 |
168
+ | 🧩 | **Codex CLI Light Edition** | Light | OpenAI Codex CLI 上で動作する omo の移植コンポーネント (rules, comment-checker, git-bash, LSP, ultrawork, ulw-loop, start-work continuation, telemetry, teammode など)。インストール: `npx lazycodex-ai install`。 |
169
169
  | 👥 | **Team Mode** (v4.0, オプトイン) | Ultimate | リードエージェント + 最大 8 メンバーの並列実行、リアルタイム tmux 可視化、専用 `team_*` ツール群。`hyperplan`(5 人の敵対的批評家)と `security-research`(3 人のハンター + 2 人の PoC エンジニア)を駆動します。[ドキュメント →](docs/guide/team-mode.md) |
170
170
  | ⚡ | **`ultrawork` / `ulw`** | Both | 一言で OK。すべてのエージェント (Ultimate) または Codex `ultrawork` コンポーネント (Light) がアクティブになり、終わるまで止まりません。 |
171
- | 🚪 | **[IntentGate](https://factory.ai/news/terminal-bench)** | Ultimate | ユーザーの真の意図を分析してから分類・行動します。`search` / `analyze` / `team` / `hyperplan` をトリガー。(Light は `ulw` / `ultrawork` のみフック。) |
172
- | 🔗 | **ハッシュベースの編集ツール** | Ultimate | `LINE#ID` のコンテンツハッシュですべての変更を検証します。stale-line エラー 0%。[oh-my-pi](https://github.com/can1357/oh-my-pi) にインスパイア。[The Harness Problem →](https://blog.can.ac/2026/02/12/the-harness-problem/) (Codex はネイティブの `apply_patch` を使用。) |
171
+ | 🚪 | **[IntentGate](https://factory.ai/news/terminal-bench)** | Ultimate | ユーザーの真の意図を分析してから分類・行動します。字面通りの誤解釈はもうありません。(Light は `ulw` / `ultrawork` キーワードのみ認識。) |
172
+ | 🔗 | **ハッシュベースの編集ツール** | Ultimate | Hashline (`LINE#ID`) による編集/読取タグ付け。オプトイン: `~/.omo/omo.jsonc` で `hashline_edit: true` を設定。stale-line エラー 0%。[oh-my-pi](https://github.com/can1357/oh-my-pi) にインスパイア。[The Harness Problem →](https://blog.can.ac/2026/02/12/the-harness-problem/) (Codex はネイティブの `apply_patch` を使用。) |
173
173
  | 🛠️ | **LSP + AST-Grep** | Both | ワークスペース単位のリネーム、ビルド前の診断、AST を考慮した書き換え。LSP は MCP として、AST-Grep は共有 `ast-grep` skill と `sg` として提供します。 |
174
174
  | 🧠 | **バックグラウンドエージェント** | Ultimate | 5 人以上の専門家を並列で投入。コンテキストは軽く保ち、結果は準備ができ次第受け取ります。 |
175
175
  | 📚 | **組み込み MCP** | Both | Ultimate は Exa (Web 検索)、Context7 (公式ドキュメント)、Grep.app (GitHub 検索) をランタイム注入します。Light は plugin-scoped MCP として `grep_app`、`context7`、`git_bash`、`lsp` を提供します。 |
176
- | 🔁 | **Ralph Loop / `/ulw-loop`** | Ultimate | 自己参照ループ。100% 完了するまで絶対に止まりません。 |
176
+ | 🔁 | **Goal / `/goal`** | Ultimate | `/goal` がスレッドの永続目標を設定します。idle continuation は `goal.enabled` が true のときのみ動作します (デフォルト false)。 |
177
177
  | ✅ | **Todo Enforcer** (Boulder) | Ultimate | エージェントがサボる?システムが首根っこを掴んで戻します。あなたのタスクは必ず終わります。 |
178
178
  | 💬 | **コメントチェッカー** | Both | コメントから AI 臭い無駄話を排除。両エディションで同じ `@code-yeongyu/comment-checker` バイナリが動作。 |
179
179
  | 📜 | **Rules Injection** | Both | `AGENTS.md` / `CLAUDE.md` / `.omo/rules/**` の階層的コンテキスト注入。Ultimate はフック、Light は `rules` コンポーネント。 |
180
- | 🧬 | **Ulw Loop** | Light | `.omo/ulw-loop/` evidence audit ベースの永続的マルチゴール オーケストレーション。現在は Codex 専用; OpenCode 側への移植はロードマップ。 |
180
+ | 🧬 | **Ulw Loop** | Light | evidence audit を備えた永続的マルチゴール オーケストレーションのための Codex コンポーネント + CLI。OpenCode では **Goal / `/goal`** を使ってください。 |
181
181
  | 🖥️ | **Tmux 統合** | Ultimate | 完全なインタラクティブターミナル。REPL、デバッガー、TUI アプリがすべてリアルタイムで動きます。 |
182
182
  | 🔌 | **Claude Code 互換性** | Ultimate | 既存のフック、コマンド、スキル、MCP、プラグイン?すべてここでそのまま動きます。(Codex は独自のネイティブプラグインシステムを保有。) |
183
183
  | 🎯 | **スキル内蔵 MCP** | Ultimate | スキルが独自の MCP サーバーを持ち歩きます。コンテキストが肥大化しません。 |
@@ -193,7 +193,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
193
193
  <td align="center"><img src=".github/assets/hephaestus.png" height="300" /></td>
194
194
  </tr></table>
195
195
 
196
- **Sisyphus** (`claude-opus-5` / **`kimi-k3`** / **`glm-5`**) はあなたのメインオーケストレーターです。計画を立て、専門家に委任し、攻撃的な並列実行でタスクを完了まで推進します。途中で投げ出すことはありません。Claude Opus 5 と Kimi K3 が推奨デフォルトです。
196
+ **Sisyphus** (`claude-opus-5` / **`kimi-k3`** / **`gpt-5.6-sol`** / **`glm-5.2`**) はあなたのメインオーケストレーターです。計画を立て、専門家に委任し、攻撃的な並列実行でタスクを完了まで推進します。途中で投げ出すことはありません。Claude Opus 5 と Kimi K3 が推奨デフォルトです。
197
197
 
198
198
  **Hephaestus** (OpenAI、GitHub Copilot、Vercel、または OpenCode 経由で medium effort の `gpt-5.6-sol` のみを使う) はあなたの自律的なディープワーカーです。レシピではなく、目標を与えてください。手取り足取り教えなくても、コードベースを探索し、パターンを調査し、エンドツーエンドで実行します。*正当なる職人 (The Legitimate Craftsman).*
199
199
 
@@ -212,7 +212,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
212
212
  **Team Mode** は oh-my-openagent を「サブエージェント付きの一体のエージェント」から、本物のマルチエージェントシステムへと変えます。リードエージェントがカテゴリ特化のメンバーチームを統括し、全員が**並列で**動き、専用ツール(`team_create`、`team_send_message`、`team_task_create`、`team_status`、…)で通信します。tmux レイアウトの focus + grid ウィンドウで、全メンバーの作業を同時に観察できます。
213
213
 
214
214
  ```jsonc
215
- // .opencode/oh-my-openagent.jsonc
215
+ // ~/.omo/omo.jsonc (またはプロジェクトの .omo/omo.jsonc)
216
216
  {
217
217
  "team_mode": {
218
218
  "enabled": true,
@@ -240,7 +240,7 @@ Sisyphus がサブエージェントにタスクを委任する際、モデル
240
240
  | `quick` | 単一ファイルの変更、タイポの修正 |
241
241
  | `ultrabrain` | ハードロジック、アーキテクチャの決定 |
242
242
 
243
- エージェントは作業の種類を伝えるだけで、ハーネスが適切なモデルを選びます。`ultrabrain` は OpenAI または Vercel で利用可能な場合は GPT-5.6 Sol xhigh に、その次に GPT-5.6 Sol xhigh にルーティングされます。あなたが触るものは何もありません。
243
+ エージェントは作業の種類を伝えるだけで、ハーネスが適切なモデルを選びます。`ultrabrain` は GPT-5.6 Sol max にルーティングされます (OpenAI / Vercel、次に GitHub Copilot、次に OpenCode)。あなたが触るものは何もありません。
244
244
 
245
245
  ### Claude Code 互換性
246
246
 
@@ -271,7 +271,7 @@ MCP サーバーはあなたのコンテキスト予算を食いつぶします
271
271
  >
272
272
  > <br/>- [Can Bölük, The Harness Problem](https://blog.can.ac/2026/02/12/the-harness-problem/)
273
273
 
274
- [oh-my-pi](https://github.com/can1357/oh-my-pi) に触発され、**Hashline** を実装しました。エージェントが読むすべての行にコンテンツハッシュがタグ付けされて返ってきます:
274
+ [oh-my-pi](https://github.com/can1357/oh-my-pi) に触発され、**Hashline** を実装しました。`hashline_edit` を有効にすると、エージェントが読むすべての行にコンテンツハッシュがタグ付けされて返ってきます:
275
275
 
276
276
  ```
277
277
  11#VK| function hello() {
@@ -302,7 +302,7 @@ project/
302
302
 
303
303
  複雑なタスクですか?プロンプトを投げて祈るのはやめましょう。
304
304
 
305
- `/start-work` Prometheus が呼び出されます。**本物のエンジニアのようにあなたにインタビューし**、スコープと曖昧さを特定し、コードに触れる前に検証済みの計画を構築します。エージェントは作業を始める前に、自分が何を作るべきか正確に理解しています。
305
+ Prometheus は**本物のエンジニアのようにあなたにインタビューし**、スコープと曖昧さを特定し、コードに触れる前に検証済みの計画を `.omo/plans/` に書きます。`/start-work` はその計画から **Atlas** のワークセッションを開始します。エージェントは作業を始める前に、自分が何を作るべきか正確に理解しています。
306
306
 
307
307
  ### スキル (Skills)
308
308
 
@@ -340,12 +340,16 @@ oh-my-openagent を削除するには:
340
340
  2. **設定ファイルを削除する (オプション)**
341
341
 
342
342
  ```bash
343
- # 互換期間中に認識されるプラグイン設定ファイルを削除
344
- rm -f ~/.config/opencode/oh-my-openagent.jsonc ~/.config/opencode/oh-my-openagent.json \
345
- ~/.config/opencode/oh-my-opencode.jsonc ~/.config/opencode/oh-my-opencode.json
343
+ # ランタイム設定ファイルを削除
344
+ rm -f ~/.omo/omo.jsonc ~/.omo/omo.json
346
345
 
347
346
  # プロジェクト設定を削除 (存在する場合)
348
- rm -f .opencode/oh-my-openagent.jsonc .opencode/oh-my-openagent.json \
347
+ rm -f .omo/omo.jsonc .omo/omo.json
348
+
349
+ # 残っているレガシーのマイグレーションバックアップを削除 (あれば)
350
+ rm -f ~/.config/opencode/oh-my-openagent.jsonc ~/.config/opencode/oh-my-openagent.json \
351
+ ~/.config/opencode/oh-my-opencode.jsonc ~/.config/opencode/oh-my-opencode.json \
352
+ .opencode/oh-my-openagent.jsonc .opencode/oh-my-openagent.json \
349
353
  .opencode/oh-my-opencode.jsonc .opencode/oh-my-opencode.json
350
354
  ```
351
355
 
@@ -374,12 +378,12 @@ oh-my-openagent を削除するには:
374
378
  - **エージェント**: Sisyphus (メインエージェント)、Prometheus (プランナー)、Oracle (アーキテクチャ・デバッグ)、Librarian (ドキュメント・コード検索)、Explore (高速な codebase grep)、Multimodal Looker
375
379
  - **バックグラウンドエージェント**: 本物の開発チームのように複数エージェントを並列実行
376
380
  - **LSP & AST ツール**: リファクタリング、リネーム、診断、AST 対応のコード検索
377
- - **ハッシュベース編集ツール**: `LINE#ID` 参照で全ての変更前に内容を検証。外科的な編集、stale-line エラー 0
381
+ - **ハッシュベース編集ツール** (`hashline_edit: true` でオプトイン): `LINE#ID` 参照で全ての変更前に内容を検証。外科的な編集、stale-line エラー 0
378
382
  - **コンテキスト注入**: AGENTS.md、README.md、条件付きルールを自動注入
379
383
  - **Claude Code 互換性**: 完全なフックシステム、コマンド、スキル、エージェント、MCP
380
384
  - **組み込み MCP**: websearch (Exa)、context7 (ドキュメント)、grep_app (GitHub 検索)
381
385
  - **セッションツール**: セッション履歴のリスト・閲覧・検索・分析
382
- - **生産性機能**: Ralph Loop、Todo Enforcer、Comment Checker、Think Mode など
386
+ - **生産性機能**: Goal、Todo Enforcer、Comment Checker、Think Mode など
383
387
  - **Doctor コマンド**: 組み込みの診断 (`bunx oh-my-opencode doctor`) でプラグイン登録、設定、モデル、環境を検証
384
388
  - **モデルフォールバック**: `fallback_models` で単純なモデル文字列と per-fallback オブジェクト設定を同じ配列に混在可能
385
389
  - **ファイルプロンプト**: エージェント設定で `file://` を使ってファイルからプロンプトを読み込み
@@ -393,13 +397,13 @@ oh-my-openagent を削除するには:
393
397
  詳細は [Configuration Documentation](docs/reference/configuration.md) を参照してください。
394
398
 
395
399
  **概要:**
396
- - **設定ファイルの場所**: 互換性レイヤーは `oh-my-openagent.json[c]` と従来の `oh-my-opencode.json[c]` の両方のプラグイン設定ファイルを認識します。既存のインストールは依然として従来のファイル名を使っていることが多いです。
400
+ - **設定ファイルの場所**: ユーザーの `~/.omo/omo.jsonc` と、`$HOME` までたどるプロジェクトの `.omo/omo.jsonc`。近い設定が優先されます。レガシーの `oh-my-*` ファイルは一度だけ `omo.jsonc` にマイグレーションされます。
397
401
  - **JSONC サポート**: コメントと末尾カンマをサポート
398
402
  - **エージェント**: どのエージェントについてもモデル、temperature、プロンプト、権限をオーバーライド可能
399
403
  - **組み込みスキル**: `playwright` (ブラウザ自動化)、`git-master` (atomic コミット)
400
404
  - **Sisyphus エージェント**: Prometheus (プランナー) と Metis (プランコンサルタント) を伴うメインオーケストレーター
401
405
  - **バックグラウンドタスク**: プロバイダー/モデル別の同時実行数を設定
402
- - **カテゴリー**: ドメイン別のタスク委任 (`visual`、`business-logic`、カスタム)
406
+ - **カテゴリー**: `visual-engineering`、`ultrabrain`、`deep`、`artistry`、`quick`、`unspecified-low`、`unspecified-high`、`writing`、加えてカスタム名
403
407
  - **フック**: 54 以上の組み込みライフサイクルフック(Team Mode 有効時は 61)。すべて `disabled_hooks` で制御可能
404
408
  - **MCP**: 組み込み websearch (Exa)、context7 (ドキュメント)、grep_app (GitHub 検索)
405
409
  - **LSP**: リファクタリングツールまで含む完全な LSP サポート