oh-my-opencode 4.18.1 → 4.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +39 -16
- package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +111 -28
- package/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +4 -4
- package/README.ru.md +2 -2
- package/README.zh-cn.md +2 -2
- package/bin/AGENTS.md +33 -0
- package/dist/agents/atlas/agent.d.ts +6 -5
- package/dist/agents/sisyphus/index.d.ts +5 -0
- package/dist/agents/sisyphus/kimi-k3.d.ts +19 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
- package/dist/agents/sisyphus-junior/agent.d.ts +8 -4
- package/dist/agents/sisyphus-junior/index.d.ts +2 -0
- package/dist/agents/sisyphus-junior/kimi-k3.d.ts +12 -0
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/index.js +690 -139
- package/dist/cli-node/index.js +690 -139
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schema/browser-automation.d.ts +1 -0
- package/dist/config/schema/commands.d.ts +1 -3
- package/dist/config/schema/default-mode.d.ts +1 -1
- package/dist/config/schema/goal.d.ts +7 -0
- package/dist/config/schema/hooks.d.ts +1 -1
- package/dist/config/schema/oh-my-opencode-config.d.ts +6 -10
- package/dist/config/schema/ralph-loop.d.ts +1 -1
- package/dist/config/schema.d.ts +1 -1
- package/dist/create-hooks.d.ts +1 -1
- package/dist/features/builtin-commands/templates/goal.d.ts +1 -0
- package/dist/features/builtin-commands/templates/stop-continuation.d.ts +1 -1
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/hooks/anthropic-context-window-limit-recovery/empty-content-recovery-sdk.d.ts +6 -0
- package/dist/hooks/auto-slash-command/executor.d.ts +1 -0
- package/dist/hooks/category-skill-reminder/hook.d.ts +9 -1
- package/dist/hooks/comment-checker/hook.d.ts +8 -1
- package/dist/hooks/goal/command-arguments.d.ts +13 -0
- package/dist/hooks/goal/controller.d.ts +26 -0
- package/dist/hooks/goal/index.d.ts +23 -0
- package/dist/hooks/goal/prompt.d.ts +3 -0
- package/dist/hooks/goal/store.d.ts +8 -0
- package/dist/hooks/goal/tools.d.ts +10 -0
- package/dist/hooks/goal/types.d.ts +93 -0
- package/dist/hooks/goal/validation.d.ts +4 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/keyword-detector/hook.d.ts +1 -2
- package/dist/hooks/ralph-loop/types.d.ts +1 -1
- package/dist/hooks/todo-continuation-enforcer/types.d.ts +3 -0
- package/dist/index.js +3706 -4329
- package/dist/oh-my-opencode.schema.json +23 -19
- package/dist/plugin/chat-message/loop-commands.d.ts +1 -1
- package/dist/plugin/chat-message/types.d.ts +23 -10
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +3 -2
- package/dist/plugin/hooks/create-transform-hooks.d.ts +0 -2
- package/dist/plugin/messages-transform.d.ts +1 -0
- package/dist/plugin/stop-continuation.d.ts +2 -2
- package/dist/plugin-handlers/prometheus-agent-config-builder.d.ts +2 -0
- package/dist/shared/system-directive.d.ts +0 -1
- package/dist/skills/ulw-plan/SKILL.md +11 -7
- package/dist/skills/ulw-plan/references/full-workflow.md +117 -6
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/dist/skills/ulw-research/SKILL.md +3 -3
- package/dist/tools/delegate-task/types.d.ts +0 -1
- package/dist/tui.js +115 -28
- package/package.json +14 -14
- package/packages/git-bash-mcp/dist/cli.js +81 -19
- package/packages/lsp-core/src/lsp/client-diagnostics-freshness.integration.test.ts +4 -4
- package/packages/lsp-core/src/lsp/directory-diagnostics.test.ts +118 -1
- package/packages/lsp-core/src/lsp/directory-diagnostics.ts +1 -1
- package/packages/lsp-daemon/dist/cli.js +262 -63
- package/packages/lsp-daemon/dist/client.js +194 -50
- package/packages/lsp-daemon/dist/daemon-client.d.ts +2 -2
- package/packages/lsp-daemon/dist/daemon-client.js +26 -2
- package/packages/lsp-daemon/dist/ensure-daemon.d.ts +5 -4
- package/packages/lsp-daemon/dist/ensure-daemon.js +79 -18
- package/packages/lsp-daemon/dist/index.js +262 -63
- package/packages/lsp-daemon/dist/proxy.d.ts +2 -0
- package/packages/lsp-daemon/dist/proxy.js +79 -23
- package/packages/lsp-tools-mcp/dist/cli.js +82 -20
- package/packages/lsp-tools-mcp/dist/mcp.js +82 -20
- package/packages/lsp-tools-mcp/dist/tools.js +1 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/.mcp.json +2 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +352 -17
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +7 -6
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +195 -56
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +100 -28
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +21 -9
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +35 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +69 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +57 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/.mcp.json +2 -1
- package/packages/omo-codex/plugin/components/lsp/AGENTS.md +1 -0
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +3 -3
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +113 -31
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/test/package-smoke.test.ts +1 -0
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +1 -1
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +5 -3
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/README.md +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +3 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +148 -61
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +4 -72
- package/packages/omo-codex/plugin/components/start-work-continuation/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/plan-checklist.ts +171 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +213 -24
- package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +4 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +25 -4
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-scaffold.md +15 -0
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -10
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +50 -33
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +50 -33
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +11 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +50 -33
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +3 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +5 -6
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +5 -6
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +2 -2
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +32 -28
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +17 -45
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +455 -0
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +13 -20
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +7 -0
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +3 -2
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +50 -33
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +11 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +6 -6
- package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +3 -3
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +62 -0
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +271 -14
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +7 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +38 -22
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +0 -5
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +293 -0
- package/packages/omo-codex/scripts/install-config.test.mjs +10 -10
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +353 -18
- package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +39 -2
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +11 -7
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
- package/dist/features/builtin-commands/templates/ralph-loop.d.ts +0 -3
- package/dist/skills/ultraresearch/SKILL.md +0 -10
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +0 -273
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -12
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -107
- package/packages/shared-skills/skills/lcx-doctor/SKILL.md +0 -128
- package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +0 -11
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +0 -268
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +0 -11
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +0 -10
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/agents/openai.yaml +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/agents/openai.yaml +0 -0
|
@@ -36,6 +36,8 @@ DAEMON_DIST_BACKUP=""
|
|
|
36
36
|
DAEMON_DIST_WAS_PRESENT=0
|
|
37
37
|
DAEMON_DIST_PREPARED=0
|
|
38
38
|
BUILD_LOCK_DIR=""
|
|
39
|
+
CANCELLATION_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs"
|
|
40
|
+
COMMIT_BARRIER_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs"
|
|
39
41
|
|
|
40
42
|
log() { printf '[codex-lsp-e2e] %s\n' "$*" >&2; }
|
|
41
43
|
fail() { log "FAIL: $*"; return 1; }
|
|
@@ -110,6 +112,21 @@ require_bins() {
|
|
|
110
112
|
[ "$missing" -eq 0 ]
|
|
111
113
|
}
|
|
112
114
|
|
|
115
|
+
verify_tracked_cancellation_probes() {
|
|
116
|
+
local dependency ignored_evidence_root=".omo""/evidence"
|
|
117
|
+
if grep -Fq "$ignored_evidence_root" "${BASH_SOURCE[0]}"; then
|
|
118
|
+
fail "LSP QA driver references ignored evidence state"
|
|
119
|
+
return 1
|
|
120
|
+
fi
|
|
121
|
+
for dependency in "$CANCELLATION_SMOKE_RELATIVE" "$COMMIT_BARRIER_SMOKE_RELATIVE"; do
|
|
122
|
+
[ -f "$REPO_ROOT/$dependency" ] || { fail "missing cancellation QA dependency: $dependency"; return 1; }
|
|
123
|
+
git -C "$REPO_ROOT" ls-files --error-unmatch -- "$dependency" >/dev/null 2>&1 || {
|
|
124
|
+
fail "cancellation QA dependency is not tracked: $dependency"
|
|
125
|
+
return 1
|
|
126
|
+
}
|
|
127
|
+
done
|
|
128
|
+
}
|
|
129
|
+
|
|
113
130
|
hash_path() {
|
|
114
131
|
node --input-type=module - "$1" <<'NODE'
|
|
115
132
|
import { createHash } from "node:crypto";
|
|
@@ -970,24 +987,21 @@ NODE
|
|
|
970
987
|
}
|
|
971
988
|
|
|
972
989
|
run_cancellation_contract_probe() {
|
|
973
|
-
local cancellation_smoke="$REPO_ROOT
|
|
974
|
-
local commit_smoke="$REPO_ROOT
|
|
975
|
-
|
|
976
|
-
[ -f "$commit_smoke" ] || { fail "missing product commit-barrier smoke"; return 1; }
|
|
990
|
+
local cancellation_smoke="$REPO_ROOT/$CANCELLATION_SMOKE_RELATIVE"
|
|
991
|
+
local commit_smoke="$REPO_ROOT/$COMMIT_BARRIER_SMOKE_RELATIVE"
|
|
992
|
+
verify_tracked_cancellation_probes || return 1
|
|
977
993
|
|
|
978
|
-
run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" || return 1
|
|
979
|
-
run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" || return 1
|
|
994
|
+
run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" "$REPO_ROOT" || return 1
|
|
995
|
+
run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" "$REPO_ROOT" || return 1
|
|
980
996
|
|
|
981
997
|
node --input-type=module - \
|
|
982
998
|
"$EVIDENCE_DIR/cancellation-smoke-output.json" \
|
|
983
999
|
"$EVIDENCE_DIR/commit-barrier-smoke-output.json" \
|
|
984
|
-
"$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/ProductPhaseClaim.json" \
|
|
985
1000
|
"$EVIDENCE_DIR/cancellation-contract.json" "$SCENARIO" "codex" <<'NODE'
|
|
986
1001
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
987
|
-
const [cancelPath, commitPath,
|
|
1002
|
+
const [cancelPath, commitPath, outputPath, scenario, harness] = process.argv.slice(2);
|
|
988
1003
|
const cancel = JSON.parse(readFileSync(cancelPath, "utf8"));
|
|
989
1004
|
const commit = JSON.parse(readFileSync(commitPath, "utf8"));
|
|
990
|
-
const claim = JSON.parse(readFileSync(claimPath, "utf8"));
|
|
991
1005
|
const result = {
|
|
992
1006
|
result: "PASS",
|
|
993
1007
|
scenario,
|
|
@@ -1006,12 +1020,12 @@ const result = {
|
|
|
1006
1020
|
},
|
|
1007
1021
|
daemonTimeout: {
|
|
1008
1022
|
bounded: true,
|
|
1009
|
-
provenBy: "
|
|
1023
|
+
provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts and packages/lsp-core/src/lsp/json-rpc-connection-cancellation.test.ts",
|
|
1010
1024
|
},
|
|
1011
1025
|
socketDisconnect: {
|
|
1012
1026
|
abortsServerWork: true,
|
|
1013
1027
|
activeDaemonControllersAfter: 0,
|
|
1014
|
-
provenBy: "
|
|
1028
|
+
provenBy: "packages/lsp-daemon/test/request-routing.test.ts",
|
|
1015
1029
|
},
|
|
1016
1030
|
pendingAndLateResponse: {
|
|
1017
1031
|
lspPendingRequestsAfter: cancel.directPendingAfterLateResponse,
|
|
@@ -1019,7 +1033,7 @@ const result = {
|
|
|
1019
1033
|
},
|
|
1020
1034
|
directoryDiagnostics: {
|
|
1021
1035
|
stoppedSchedulingBetweenFiles: true,
|
|
1022
|
-
provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts
|
|
1036
|
+
provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts",
|
|
1023
1037
|
},
|
|
1024
1038
|
delayedRenamePreCommitGate: {
|
|
1025
1039
|
cancelTarget: commit.preGate.cancelTarget,
|
|
@@ -1041,7 +1055,7 @@ const result = {
|
|
|
1041
1055
|
readOnlyPreWriteConnectionFailureRetry: {
|
|
1042
1056
|
retryCount: 1,
|
|
1043
1057
|
requestCount: 1,
|
|
1044
|
-
provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts
|
|
1058
|
+
provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts",
|
|
1045
1059
|
},
|
|
1046
1060
|
sequentialProxyIds: {
|
|
1047
1061
|
distinct: true,
|
|
@@ -1056,7 +1070,6 @@ const result = {
|
|
|
1056
1070
|
cwdCanonical: true,
|
|
1057
1071
|
},
|
|
1058
1072
|
dirtyWorktreePreservation: {
|
|
1059
|
-
productPhasePreExistingDirtyScope: claim.scope?.preExistingDirtyScope,
|
|
1060
1073
|
driverMustPreserveDirtyWorktree: true,
|
|
1061
1074
|
},
|
|
1062
1075
|
noLeftovers: {
|
|
@@ -1067,7 +1080,10 @@ const result = {
|
|
|
1067
1080
|
artifacts: {
|
|
1068
1081
|
cancellationSmoke: "cancellation-smoke-output.json",
|
|
1069
1082
|
commitBarrierSmoke: "commit-barrier-smoke-output.json",
|
|
1070
|
-
|
|
1083
|
+
},
|
|
1084
|
+
sources: {
|
|
1085
|
+
cancellationSmoke: "packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs",
|
|
1086
|
+
commitBarrierSmoke: "packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs",
|
|
1071
1087
|
},
|
|
1072
1088
|
};
|
|
1073
1089
|
const required = [
|
|
@@ -3166,6 +3182,7 @@ run_self_test() {
|
|
|
3166
3182
|
require_bins bash node jq git || return 1
|
|
3167
3183
|
local root before_omo after_omo before_codex after_codex before_status after_status failures=0 out rc start end
|
|
3168
3184
|
local cancellation_result_fields=true client_package_result_fields=true installed_component_result_fields=true
|
|
3185
|
+
local qa_dependencies_portable=true
|
|
3169
3186
|
local fixture_run child sandbox_path attempts
|
|
3170
3187
|
local missing_dist_build_order='{"result":"NOT_RUN"}'
|
|
3171
3188
|
root="$(mktemp -d -t cqa-lsp-e2e.XXXXXX)" || return 1
|
|
@@ -3180,6 +3197,11 @@ run_self_test() {
|
|
|
3180
3197
|
if bash "${BASH_SOURCE[0]}" --scenario ../bad --evidence-dir "$root/bad" >>"$out" 2>&1; then failures=$((failures + 1)); fi
|
|
3181
3198
|
if bash "${BASH_SOURCE[0]}" --scenario ok --evidence-dir relative >>"$out" 2>&1; then failures=$((failures + 1)); fi
|
|
3182
3199
|
|
|
3200
|
+
if ! verify_tracked_cancellation_probes >>"$out" 2>&1; then
|
|
3201
|
+
qa_dependencies_portable=false
|
|
3202
|
+
failures=$((failures + 1))
|
|
3203
|
+
fi
|
|
3204
|
+
|
|
3183
3205
|
for fixture in fake-pass fake-skip; do
|
|
3184
3206
|
local ev="$root/$fixture"
|
|
3185
3207
|
mkdir -p "$ev"
|
|
@@ -3402,8 +3424,9 @@ NODE
|
|
|
3402
3424
|
[ "$before_codex" = "$after_codex" ] || failures=$((failures + 1))
|
|
3403
3425
|
[ "$before_status" = "$after_status" ] || failures=$((failures + 1))
|
|
3404
3426
|
|
|
3405
|
-
printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"missingDaemonDistBuildOrderIndependent":true,"cancellationResultFieldsMandatory":%s,"clientPackageResultFieldsMandatory":%s,"installedComponentResultFieldsMandatory":%s,"missingDistBuildOrder":%s,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
|
|
3427
|
+
printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"missingDaemonDistBuildOrderIndependent":true,"qaDependenciesPortable":%s,"cancellationResultFieldsMandatory":%s,"clientPackageResultFieldsMandatory":%s,"installedComponentResultFieldsMandatory":%s,"missingDistBuildOrder":%s,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
|
|
3406
3428
|
"$( [ "$failures" -eq 0 ] && echo PASS || echo FAIL )" \
|
|
3429
|
+
"$qa_dependencies_portable" \
|
|
3407
3430
|
"$cancellation_result_fields" \
|
|
3408
3431
|
"$client_package_result_fields" \
|
|
3409
3432
|
"$installed_component_result_fields" \
|
|
@@ -41,6 +41,8 @@ SSE_ATTEMPT_SECONDS=2
|
|
|
41
41
|
BUILD_LOCK_DIR=""
|
|
42
42
|
SOURCE_PACKAGE_STAMP=""
|
|
43
43
|
SOURCE_PACKAGE_STAMP_CREATED=0
|
|
44
|
+
CANCELLATION_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs"
|
|
45
|
+
COMMIT_BARRIER_SMOKE_RELATIVE="packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs"
|
|
44
46
|
|
|
45
47
|
log() { printf '[opencode-lsp-e2e] %s\n' "$*" >&2; }
|
|
46
48
|
fail() { log "FAIL: $*"; return 1; }
|
|
@@ -111,6 +113,21 @@ require_bins() {
|
|
|
111
113
|
[ "$missing" -eq 0 ]
|
|
112
114
|
}
|
|
113
115
|
|
|
116
|
+
verify_tracked_cancellation_probes() {
|
|
117
|
+
local dependency ignored_evidence_root=".omo""/evidence"
|
|
118
|
+
if grep -Fq "$ignored_evidence_root" "${BASH_SOURCE[0]}"; then
|
|
119
|
+
fail "LSP QA driver references ignored evidence state"
|
|
120
|
+
return 1
|
|
121
|
+
fi
|
|
122
|
+
for dependency in "$CANCELLATION_SMOKE_RELATIVE" "$COMMIT_BARRIER_SMOKE_RELATIVE"; do
|
|
123
|
+
[ -f "$REPO_ROOT/$dependency" ] || { fail "missing cancellation QA dependency: $dependency"; return 1; }
|
|
124
|
+
git -C "$REPO_ROOT" ls-files --error-unmatch -- "$dependency" >/dev/null 2>&1 || {
|
|
125
|
+
fail "cancellation QA dependency is not tracked: $dependency"
|
|
126
|
+
return 1
|
|
127
|
+
}
|
|
128
|
+
done
|
|
129
|
+
}
|
|
130
|
+
|
|
114
131
|
hash_path() {
|
|
115
132
|
node --input-type=module - "$1" <<'NODE'
|
|
116
133
|
import { createHash } from "node:crypto";
|
|
@@ -920,24 +937,21 @@ NODE
|
|
|
920
937
|
}
|
|
921
938
|
|
|
922
939
|
run_cancellation_contract_probe() {
|
|
923
|
-
local cancellation_smoke="$REPO_ROOT
|
|
924
|
-
local commit_smoke="$REPO_ROOT
|
|
925
|
-
|
|
926
|
-
[ -f "$commit_smoke" ] || { fail "missing product commit-barrier smoke"; return 1; }
|
|
940
|
+
local cancellation_smoke="$REPO_ROOT/$CANCELLATION_SMOKE_RELATIVE"
|
|
941
|
+
local commit_smoke="$REPO_ROOT/$COMMIT_BARRIER_SMOKE_RELATIVE"
|
|
942
|
+
verify_tracked_cancellation_probes || return 1
|
|
927
943
|
|
|
928
|
-
run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" || return 1
|
|
929
|
-
run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" || return 1
|
|
944
|
+
run_bounded 90 "$EVIDENCE_DIR/cancellation-smoke-output.json" bun "$cancellation_smoke" "$REPO_ROOT" || return 1
|
|
945
|
+
run_bounded 90 "$EVIDENCE_DIR/commit-barrier-smoke-output.json" bun "$commit_smoke" "$REPO_ROOT" || return 1
|
|
930
946
|
|
|
931
947
|
bun --input-type=module - \
|
|
932
948
|
"$EVIDENCE_DIR/cancellation-smoke-output.json" \
|
|
933
949
|
"$EVIDENCE_DIR/commit-barrier-smoke-output.json" \
|
|
934
|
-
"$REPO_ROOT/.omo/evidence/20260713-lsp-daemon-migration/task-7-cancellation/product-phase/ProductPhaseClaim.json" \
|
|
935
950
|
"$EVIDENCE_DIR/cancellation-contract.json" "$SCENARIO" "opencode" <<'NODE'
|
|
936
951
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
937
|
-
const [cancelPath, commitPath,
|
|
952
|
+
const [cancelPath, commitPath, outputPath, scenario, harness] = process.argv.slice(2);
|
|
938
953
|
const cancel = JSON.parse(readFileSync(cancelPath, "utf8"));
|
|
939
954
|
const commit = JSON.parse(readFileSync(commitPath, "utf8"));
|
|
940
|
-
const claim = JSON.parse(readFileSync(claimPath, "utf8"));
|
|
941
955
|
const result = {
|
|
942
956
|
result: "PASS",
|
|
943
957
|
scenario,
|
|
@@ -956,12 +970,12 @@ const result = {
|
|
|
956
970
|
},
|
|
957
971
|
daemonTimeout: {
|
|
958
972
|
bounded: true,
|
|
959
|
-
provenBy: "
|
|
973
|
+
provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts and packages/lsp-core/src/lsp/json-rpc-connection-cancellation.test.ts",
|
|
960
974
|
},
|
|
961
975
|
socketDisconnect: {
|
|
962
976
|
abortsServerWork: true,
|
|
963
977
|
activeDaemonControllersAfter: 0,
|
|
964
|
-
provenBy: "
|
|
978
|
+
provenBy: "packages/lsp-daemon/test/request-routing.test.ts",
|
|
965
979
|
},
|
|
966
980
|
pendingAndLateResponse: {
|
|
967
981
|
lspPendingRequestsAfter: cancel.directPendingAfterLateResponse,
|
|
@@ -969,7 +983,7 @@ const result = {
|
|
|
969
983
|
},
|
|
970
984
|
directoryDiagnostics: {
|
|
971
985
|
stoppedSchedulingBetweenFiles: true,
|
|
972
|
-
provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts
|
|
986
|
+
provenBy: "packages/lsp-core/src/lsp/directory-diagnostics.test.ts",
|
|
973
987
|
},
|
|
974
988
|
delayedRenamePreCommitGate: {
|
|
975
989
|
cancelTarget: commit.preGate.cancelTarget,
|
|
@@ -991,7 +1005,7 @@ const result = {
|
|
|
991
1005
|
readOnlyPreWriteConnectionFailureRetry: {
|
|
992
1006
|
retryCount: 1,
|
|
993
1007
|
requestCount: 1,
|
|
994
|
-
provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts
|
|
1008
|
+
provenBy: "packages/lsp-daemon/test/daemon-client-retry.test.ts",
|
|
995
1009
|
},
|
|
996
1010
|
sequentialProxyIds: {
|
|
997
1011
|
distinct: true,
|
|
@@ -1006,7 +1020,6 @@ const result = {
|
|
|
1006
1020
|
cwdCanonical: true,
|
|
1007
1021
|
},
|
|
1008
1022
|
dirtyWorktreePreservation: {
|
|
1009
|
-
productPhasePreExistingDirtyScope: claim.scope?.preExistingDirtyScope,
|
|
1010
1023
|
driverMustPreserveDirtyWorktree: true,
|
|
1011
1024
|
},
|
|
1012
1025
|
noLeftovers: {
|
|
@@ -1017,7 +1030,10 @@ const result = {
|
|
|
1017
1030
|
artifacts: {
|
|
1018
1031
|
cancellationSmoke: "cancellation-smoke-output.json",
|
|
1019
1032
|
commitBarrierSmoke: "commit-barrier-smoke-output.json",
|
|
1020
|
-
|
|
1033
|
+
},
|
|
1034
|
+
sources: {
|
|
1035
|
+
cancellationSmoke: "packages/lsp-daemon/scripts/qa/cancellation-smoke.mjs",
|
|
1036
|
+
commitBarrierSmoke: "packages/lsp-daemon/scripts/qa/commit-barrier-smoke.mjs",
|
|
1021
1037
|
},
|
|
1022
1038
|
};
|
|
1023
1039
|
const required = [
|
|
@@ -1762,19 +1778,79 @@ NODE
|
|
|
1762
1778
|
}
|
|
1763
1779
|
|
|
1764
1780
|
run_mcp_status_call() {
|
|
1765
|
-
local label="$1" output="$2"
|
|
1781
|
+
local label="$1" output="$2" stderr_output="$EVIDENCE_DIR/${1}.stderr.log"
|
|
1766
1782
|
shift 2
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
|
|
1776
|
-
|
|
1777
|
-
|
|
1783
|
+
env \
|
|
1784
|
+
HOME="$HOME" \
|
|
1785
|
+
XDG_CONFIG_HOME="$XDG_CONFIG_HOME" \
|
|
1786
|
+
OMO_LSP_DAEMON_DIR="$OMO_LSP_DAEMON_DIR" \
|
|
1787
|
+
${OMO_LSP_DAEMON_CLI+OMO_LSP_DAEMON_CLI="$OMO_LSP_DAEMON_CLI"} \
|
|
1788
|
+
${OMO_LSP_DAEMON_VERSION+OMO_LSP_DAEMON_VERSION="$OMO_LSP_DAEMON_VERSION"} \
|
|
1789
|
+
LSP_TOOLS_MCP_PROJECT_CONFIG="$SANDBOX_ROOT/project/.opencode/lsp.json:$SANDBOX_ROOT/project/.omo/lsp.json:$SANDBOX_ROOT/project/.omo/lsp-client.json" \
|
|
1790
|
+
LSP_TOOLS_MCP_USER_CONFIG="$XDG_CONFIG_HOME/opencode/lsp.json" \
|
|
1791
|
+
LSP_TOOLS_MCP_INSTALL_DECISIONS="$XDG_CONFIG_HOME/opencode/lsp-install-decisions.json" \
|
|
1792
|
+
node --input-type=module - "$output" "$stderr_output" "$@" <<'NODE'
|
|
1793
|
+
import { spawn } from "node:child_process";
|
|
1794
|
+
import { writeFileSync } from "node:fs";
|
|
1795
|
+
|
|
1796
|
+
const [output, stderrOutput, command, ...args] = process.argv.slice(2);
|
|
1797
|
+
if (!command) process.exit(125);
|
|
1798
|
+
|
|
1799
|
+
const child = spawn(command, args, { env: process.env, stdio: ["pipe", "pipe", "pipe"] });
|
|
1800
|
+
let stdout = "";
|
|
1801
|
+
let stderr = "";
|
|
1802
|
+
let responseSeen = false;
|
|
1803
|
+
let forceTimer;
|
|
1804
|
+
|
|
1805
|
+
child.stdout.setEncoding("utf8");
|
|
1806
|
+
child.stderr.setEncoding("utf8");
|
|
1807
|
+
child.stdout.on("data", (chunk) => {
|
|
1808
|
+
stdout += chunk;
|
|
1809
|
+
if (!responseSeen && stdout.includes("\n")) {
|
|
1810
|
+
responseSeen = true;
|
|
1811
|
+
child.stdin.end();
|
|
1812
|
+
}
|
|
1813
|
+
});
|
|
1814
|
+
child.stderr.on("data", (chunk) => {
|
|
1815
|
+
stderr += chunk;
|
|
1816
|
+
});
|
|
1817
|
+
child.stdin.on("error", (error) => {
|
|
1818
|
+
stderr += `${error instanceof Error ? error.stack ?? error.message : String(error)}\n`;
|
|
1819
|
+
});
|
|
1820
|
+
|
|
1821
|
+
const request = { jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "lsp_status", arguments: {} } };
|
|
1822
|
+
child.stdin.write(`${JSON.stringify(request)}\n`);
|
|
1823
|
+
|
|
1824
|
+
let timedOut = false;
|
|
1825
|
+
const timer = setTimeout(() => {
|
|
1826
|
+
timedOut = true;
|
|
1827
|
+
child.kill("SIGTERM");
|
|
1828
|
+
forceTimer = setTimeout(() => child.kill("SIGKILL"), 3000);
|
|
1829
|
+
}, 30000);
|
|
1830
|
+
const outcome = await new Promise((resolve) => {
|
|
1831
|
+
let settled = false;
|
|
1832
|
+
const finish = (value) => {
|
|
1833
|
+
if (settled) return;
|
|
1834
|
+
settled = true;
|
|
1835
|
+
resolve(value);
|
|
1836
|
+
};
|
|
1837
|
+
child.once("error", (error) => finish({ error }));
|
|
1838
|
+
child.once("close", (code, signal) => finish({ code, signal }));
|
|
1839
|
+
});
|
|
1840
|
+
clearTimeout(timer);
|
|
1841
|
+
if (forceTimer) clearTimeout(forceTimer);
|
|
1842
|
+
writeFileSync(output, stdout);
|
|
1843
|
+
writeFileSync(stderrOutput, stderr);
|
|
1844
|
+
|
|
1845
|
+
if (timedOut) process.exit(124);
|
|
1846
|
+
if ("error" in outcome) {
|
|
1847
|
+
console.error(outcome.error);
|
|
1848
|
+
process.exit(126);
|
|
1849
|
+
}
|
|
1850
|
+
if (!responseSeen) process.exit(1);
|
|
1851
|
+
if (typeof outcome.code === "number") process.exit(outcome.code);
|
|
1852
|
+
process.exit(outcome.signal ? 128 : 1);
|
|
1853
|
+
NODE
|
|
1778
1854
|
}
|
|
1779
1855
|
|
|
1780
1856
|
capture_current_daemon_owner() {
|
|
@@ -2416,6 +2492,7 @@ run_self_test() {
|
|
|
2416
2492
|
local fixture_run child sandbox_path attempts health_pid health_port accepted_count previous_opencode_pid
|
|
2417
2493
|
local sse_pid sse_port previous_sse_ready previous_sse_attempt
|
|
2418
2494
|
local terminal_pid terminal_port previous_scenario previous_evidence_dir terminal_killer
|
|
2495
|
+
local qa_dependencies_portable=true
|
|
2419
2496
|
root="$(mktemp -d -t oqa-lsp-e2e.XXXXXX)" || return 1
|
|
2420
2497
|
SANDBOX_ROOT="$root"
|
|
2421
2498
|
before_omo="$(hash_path "$REAL_OMO_ROOT")"
|
|
@@ -2429,6 +2506,11 @@ run_self_test() {
|
|
|
2429
2506
|
if bash "${BASH_SOURCE[0]}" --scenario ../bad --evidence-dir "$root/bad" >>"$out" 2>&1; then failures=$((failures + 1)); fi
|
|
2430
2507
|
if bash "${BASH_SOURCE[0]}" --scenario ok --evidence-dir relative >>"$out" 2>&1; then failures=$((failures + 1)); fi
|
|
2431
2508
|
|
|
2509
|
+
if ! verify_tracked_cancellation_probes >>"$out" 2>&1; then
|
|
2510
|
+
qa_dependencies_portable=false
|
|
2511
|
+
failures=$((failures + 1))
|
|
2512
|
+
fi
|
|
2513
|
+
|
|
2432
2514
|
for fixture in fake-pass fake-skip; do
|
|
2433
2515
|
local ev="$root/$fixture"
|
|
2434
2516
|
mkdir -p "$ev"
|
|
@@ -2763,8 +2845,9 @@ NODE
|
|
|
2763
2845
|
[ "$before_db" = "$after_db" ] || failures=$((failures + 1))
|
|
2764
2846
|
[ "$before_status" = "$after_status" ] || failures=$((failures + 1))
|
|
2765
2847
|
|
|
2766
|
-
printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"healthTimeoutReadinessBounded":true,"sseStartupRetryDeterministic":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"cancellationResultFieldsMandatory":true,"clientPackageResultFieldsMandatory":true,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
|
|
2848
|
+
printf '{"result":"%s","selfTest":true,"malformedArgsRejected":true,"fakePassRejected":true,"skipRejected":true,"hungCommandBounded":true,"healthTimeoutReadinessBounded":true,"sseStartupRetryDeterministic":true,"partialStagingCleanedTwice":true,"interruptCleanupRepeated":true,"qaDependenciesPortable":%s,"cancellationResultFieldsMandatory":true,"clientPackageResultFieldsMandatory":true,"dirtyWorktreePreserved":%s,"realHomesUnchanged":%s}\n' \
|
|
2767
2849
|
"$( [ "$failures" -eq 0 ] && echo PASS || echo FAIL )" \
|
|
2850
|
+
"$qa_dependencies_portable" \
|
|
2768
2851
|
"$( [ "$before_status" = "$after_status" ] && echo true || echo false )" \
|
|
2769
2852
|
"$( [ "$before_omo" = "$after_omo" ] && [ "$before_db" = "$after_db" ] && echo true || echo false )"
|
|
2770
2853
|
cleanup_all || failures=$((failures + 1))
|
package/README.ja.md
CHANGED
|
@@ -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-4-7` / **`kimi-k2.6`** / **`glm-5`**) はあなたのメインオーケストレーターです。計画を立て、専門家に委任し、攻撃的な並列実行でタスクを完了まで推進します。途中で投げ出すことはありません。
|
|
196
|
+
**Sisyphus** (`claude-opus-4-8` / `claude-opus-4-7` / **`kimi-k3`** / **`kimi-k2.6`** / **`glm-5`**) はあなたのメインオーケストレーターです。計画を立て、専門家に委任し、攻撃的な並列実行でタスクを完了まで推進します。途中で投げ出すことはありません。thinking token のコストを許容できる場合は **Kimi K3** を、そうでなければ **Claude Opus 4.8 / 4.7** または **Kimi K2.6** を推奨します。
|
|
197
197
|
|
|
198
198
|
**Hephaestus** (OpenAI または Vercel では `gpt-5.6-sol`、その次に `gpt-5.5`) はあなたの自律的なディープワーカーです。レシピではなく、目標を与えてください。手取り足取り教えなくても、コードベースを探索し、パターンを調査し、エンドツーエンドで実行します。*正当なる職人 (The Legitimate Craftsman).*
|
|
199
199
|
|
|
@@ -203,7 +203,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
|
|
|
203
203
|
|
|
204
204
|
> Anthropic が [私たちのせいで OpenCode をブロックしました。](https://x.com/thdxr/status/2010149530486911014) だからこそ Hephaestus は「正当なる職人 (The Legitimate Craftsman)」と呼ばれているのです。皮肉を込めています。
|
|
205
205
|
>
|
|
206
|
-
> Opus で最もよく動きますが、Kimi K2.6 + GPT-5.5 の組み合わせだけでも、バニラの Claude Code を軽く凌駕します。設定は一切不要です。
|
|
206
|
+
> Opus または Kimi K3 で最もよく動きますが、Kimi K2.6 + GPT-5.5 の組み合わせだけでも、バニラの Claude Code を軽く凌駕します。設定は一切不要です。
|
|
207
207
|
|
|
208
208
|
### Team Mode (v4.0)
|
|
209
209
|
|
package/README.ko.md
CHANGED
|
@@ -194,7 +194,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
|
|
|
194
194
|
<td align="center"><img src=".github/assets/hephaestus.png" height="300" /></td>
|
|
195
195
|
</tr></table>
|
|
196
196
|
|
|
197
|
-
**Sisyphus** (`claude-opus-4-7` / **`kimi-k2.6`** / **`glm-5`**)는 메인 오케스트레이터입니다. 계획을 세우고, 전문가에게 위임하고, 공격적인 병렬 실행으로 작업을 끝까지 밀어붙입니다. 중간에 멈추지 않습니다.
|
|
197
|
+
**Sisyphus** (`claude-opus-4-8` / `claude-opus-4-7` / **`kimi-k3`** / **`kimi-k2.6`** / **`glm-5`**)는 메인 오케스트레이터입니다. 계획을 세우고, 전문가에게 위임하고, 공격적인 병렬 실행으로 작업을 끝까지 밀어붙입니다. 중간에 멈추지 않습니다. thinking token 비용을 감수할 수 있다면 **Kimi K3**를, 그렇지 않으면 **Claude Opus 4.8 / 4.7** 또는 **Kimi K2.6**을 권장합니다.
|
|
198
198
|
|
|
199
199
|
**Hephaestus** (OpenAI 또는 Vercel에서 `gpt-5.6-sol`, 그다음 `gpt-5.5`)는 자율적으로 깊게 파는 작업자입니다. 레시피가 아니라 목표를 주세요. 코드베이스를 탐색하고, 패턴을 조사하고, 손을 잡아주지 않아도 엔드투엔드로 실행합니다. *The Legitimate Craftsman.*
|
|
200
200
|
|
|
@@ -204,7 +204,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
|
|
|
204
204
|
|
|
205
205
|
> Anthropic은 [우리 때문에 OpenCode를 차단했습니다.](https://x.com/thdxr/status/2010149530486911014) 그래서 Hephaestus에게 "The Legitimate Craftsman"이라는 별명이 붙었습니다. 의도된 아이러니입니다.
|
|
206
206
|
>
|
|
207
|
-
> Opus에서 가장 잘 돌지만, Kimi K2.6 + GPT-5.5 조합만으로도 이미 바닐라 Claude Code를 이깁니다. 별도 설정 없이요.
|
|
207
|
+
> Opus나 Kimi K3에서 가장 잘 돌지만, Kimi K2.6 + GPT-5.5 조합만으로도 이미 바닐라 Claude Code를 이깁니다. 별도 설정 없이요.
|
|
208
208
|
|
|
209
209
|
### Team Mode (v4.0)
|
|
210
210
|
|
package/README.md
CHANGED
|
@@ -221,7 +221,7 @@ Even with only the following subscriptions, `ultrawork` works well (this project
|
|
|
221
221
|
| 🔎 | **AST-Grep** | Ultimate | Pattern-aware code search and rewriting across 25 languages. |
|
|
222
222
|
| 🧠 | **Background Agents** | Ultimate | Fire 5+ specialists in parallel. Context stays lean. Results when ready. |
|
|
223
223
|
| 📚 | **Built-in MCPs** (web/docs/code search) | Ultimate | Exa (web search), Context7 (official docs), Grep.app (GitHub search). Always on. |
|
|
224
|
-
| 🔁 | **
|
|
224
|
+
| 🔁 | **Goal / `/goal`** | Ultimate | Persistent per-session objective. Re-injects a continuation prompt on every idle until a completion audit says it's done. |
|
|
225
225
|
| ✅ | **Todo Enforcer** | Ultimate | Agent goes idle? System yanks it back. Your task gets done, period. |
|
|
226
226
|
| 💬 | **Comment Checker** | Both | No AI slop in comments. Code reads like a senior wrote it. |
|
|
227
227
|
| 📐 | **Rules Injection** (`AGENTS.md` / `.omo/rules/**`) | Both | Project rules and AGENTS.md auto-loaded into the agent's context at every prompt. |
|
|
@@ -241,7 +241,7 @@ Even with only the following subscriptions, `ultrawork` works well (this project
|
|
|
241
241
|
<td align="center"><img src=".github/assets/hephaestus.png" height="300" /></td>
|
|
242
242
|
</tr></table>
|
|
243
243
|
|
|
244
|
-
**Sisyphus** (`claude-opus-4-7` / **`kimi-k2.6`** / **`glm-5`** ) is your main orchestrator. He plans, delegates to specialists, and drives tasks to completion with aggressive parallel execution. He does not stop halfway.
|
|
244
|
+
**Sisyphus** (`claude-opus-4-8` / `claude-opus-4-7` / **`kimi-k3`** / **`kimi-k2.6`** / **`glm-5`** ) is your main orchestrator. He plans, delegates to specialists, and drives tasks to completion with aggressive parallel execution. He does not stop halfway. Use **Kimi K3** when you can accept its thinking-token cost; otherwise **Claude Opus 4.8 / 4.7** or **Kimi K2.6** are the recommended defaults.
|
|
245
245
|
|
|
246
246
|
**Hephaestus** (`gpt-5.6-sol` on OpenAI or Vercel, then `gpt-5.5`) is your autonomous deep worker. Give him a goal, not a recipe. He explores the codebase, researches patterns, and executes end-to-end without hand-holding. *The Legitimate Craftsman.*
|
|
247
247
|
|
|
@@ -251,7 +251,7 @@ Every agent is tuned to its model's specific strengths. No manual model juggling
|
|
|
251
251
|
|
|
252
252
|
> Anthropic [blocked OpenCode because of us.](https://x.com/thdxr/status/2010149530486911014) That's why Hephaestus is called "The Legitimate Craftsman." The irony is intentional.
|
|
253
253
|
>
|
|
254
|
-
> We run best on Opus, but Kimi K2.6 + GPT-5.5 already beats vanilla Claude Code. Zero config needed.
|
|
254
|
+
> We run best on Opus or Kimi K3, but Kimi K2.6 + GPT-5.5 already beats vanilla Claude Code. Zero config needed.
|
|
255
255
|
|
|
256
256
|
### Team Mode (v4.0)
|
|
257
257
|
|
|
@@ -433,7 +433,7 @@ See full [Features Documentation](docs/reference/features.md).
|
|
|
433
433
|
- **Claude Code Compatibility**: Full hook system, commands, skills, agents, MCPs
|
|
434
434
|
- **Built-in MCPs**: websearch (Exa), context7 (docs), grep_app (GitHub search) — injected at runtime by the plugin; not visible in `opencode mcp list` (see [MCP docs](docs/reference/features.md#native-vs-plugin-injected-mcps))
|
|
435
435
|
- **Session Tools**: List, read, search, and analyze session history
|
|
436
|
-
- **Productivity Features**:
|
|
436
|
+
- **Productivity Features**: Goal, Todo Enforcer, Comment Checker, Think Mode, and more
|
|
437
437
|
- **Doctor Command**: Built-in diagnostics (`bunx oh-my-opencode doctor`) verify plugin registration, config, models, and environment
|
|
438
438
|
- **Model Fallbacks**: `fallback_models` can mix plain model strings with per-fallback object settings in the same array
|
|
439
439
|
- **File Prompts**: Load prompts from files with `file://` support in agent configurations
|
package/README.ru.md
CHANGED
|
@@ -192,7 +192,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
|
|
|
192
192
|
<td align="center"><img src=".github/assets/hephaestus.png" height="300" /></td>
|
|
193
193
|
</tr></table>
|
|
194
194
|
|
|
195
|
-
**Sisyphus** (`claude-opus-4-7` / **`kimi-k2.6`** / **`glm-5`**) — главный оркестратор. Он планирует, делегирует задачи специалистам и доводит их до завершения с агрессивным параллельным выполнением. Он не останавливается на полпути.
|
|
195
|
+
**Sisyphus** (`claude-opus-4-8` / `claude-opus-4-7` / **`kimi-k3`** / **`kimi-k2.6`** / **`glm-5`**) — главный оркестратор. Он планирует, делегирует задачи специалистам и доводит их до завершения с агрессивным параллельным выполнением. Он не останавливается на полпути. Используйте **Kimi K3**, если готовы оплатить повышенный расход thinking-токенов; иначе рекомендуем **Claude Opus 4.8 / 4.7** или **Kimi K2.6**.
|
|
196
196
|
|
|
197
197
|
**Hephaestus** (`gpt-5.6-sol` через OpenAI или Vercel, затем `gpt-5.5`) — автономный глубокий исполнитель. Дайте ему цель, а не рецепт. Он исследует кодовую базу, изучает паттерны и выполняет задачи сквозным образом без лишних подсказок. *Законный Мастер.*
|
|
198
198
|
|
|
@@ -202,7 +202,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
|
|
|
202
202
|
|
|
203
203
|
> Anthropic [заблокировал OpenCode из-за нас.](https://x.com/thdxr/status/2010149530486911014) Именно поэтому Hephaestus зовётся «Законным Мастером». Ирония намеренная.
|
|
204
204
|
>
|
|
205
|
-
> Мы работаем лучше всего на Opus, но Kimi K2.6 + GPT-5.5 уже превосходят ванильный Claude Code. Никакой настройки не требуется.
|
|
205
|
+
> Мы работаем лучше всего на Opus или Kimi K3, но Kimi K2.6 + GPT-5.5 уже превосходят ванильный Claude Code. Никакой настройки не требуется.
|
|
206
206
|
|
|
207
207
|
### Team Mode (v4.0)
|
|
208
208
|
|
package/README.zh-cn.md
CHANGED
|
@@ -199,7 +199,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
|
|
|
199
199
|
<td align="center"><img src=".github/assets/hephaestus.png" height="300" /></td>
|
|
200
200
|
</tr></table>
|
|
201
201
|
|
|
202
|
-
**Sisyphus** (`claude-opus-4-7` / **`kimi-k2.6`** / **`glm-5`**)
|
|
202
|
+
**Sisyphus** (`claude-opus-4-8` / `claude-opus-4-7` / **`kimi-k3`** / **`kimi-k2.6`** / **`glm-5`**) 是你的主指挥官。他负责制定计划、分配任务给专家团队,并以极其激进的并行策略推动任务直至完成。他从不半途而废。如果你能接受 thinking token 的成本,请使用 **Kimi K3**;否则推荐使用 **Claude Opus 4.8 / 4.7** 或 **Kimi K2.6**。
|
|
203
203
|
|
|
204
204
|
**Hephaestus** (在 OpenAI 或 Vercel 上优先 `gpt-5.6-sol`,其次 `gpt-5.5`) 是你的自主深度工作者。你只需要给他目标,不要给他具体做法。他会自动探索代码库模式,从头到尾独立执行任务,绝不会中途要你当保姆。*名副其实的正牌工匠。*
|
|
205
205
|
|
|
@@ -209,7 +209,7 @@ Read this and tell me why it's not just another boilerplate: https://raw.githubu
|
|
|
209
209
|
|
|
210
210
|
> Anthropic [因为我们屏蔽了 OpenCode](https://x.com/thdxr/status/2010149530486911014)。这就是为什么我们将 Hephaestus 命名为"正牌工匠 (The Legitimate Craftsman)"。这是一个故意的讽刺。
|
|
211
211
|
>
|
|
212
|
-
> 我们在 Opus 上运行得最好,但仅仅使用 Kimi K2.6 + GPT-5.5 就足以碾压原版的 Claude Code。完全不需要配置。
|
|
212
|
+
> 我们在 Opus 或 Kimi K3 上运行得最好,但仅仅使用 Kimi K2.6 + GPT-5.5 就足以碾压原版的 Claude Code。完全不需要配置。
|
|
213
213
|
|
|
214
214
|
### Team Mode (v4.0)
|
|
215
215
|
|
package/bin/AGENTS.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# bin/ - Published Launcher Shim
|
|
2
|
+
|
|
3
|
+
## OVERVIEW
|
|
4
|
+
|
|
5
|
+
Node-side launch surface for every public CLI alias. The root shim resolves a platform package and spawns its generated `bin/oh-my-opencode.js` launcher payload; it is not the TypeScript CLI implementation.
|
|
6
|
+
|
|
7
|
+
## WHERE TO LOOK
|
|
8
|
+
|
|
9
|
+
| Task | Location | Notes |
|
|
10
|
+
|------|----------|-------|
|
|
11
|
+
| Main launcher | `oh-my-opencode.js` | Entry for `oh-my-opencode`, `oh-my-openagent`, `omo`, `lazycodex`, and `lazycodex-ai` |
|
|
12
|
+
| Platform selection | `platform.js` | OS/arch/libc package candidates and baseline fallback |
|
|
13
|
+
| Platform types | `platform.d.ts` | Public declarations for the plain-JS selector |
|
|
14
|
+
| Version mismatch output | `version-mismatch.js` | User-facing installed-wrapper/platform-package mismatch diagnostics |
|
|
15
|
+
| Behavior tests | `*.test.ts` | Bun tests for invocation routing, platform selection, and diagnostics |
|
|
16
|
+
|
|
17
|
+
## RUNTIME FLOW
|
|
18
|
+
|
|
19
|
+
`oh-my-opencode.js` derives the invocation name, optionally routes the LazyCodex Node installer, resolves an ordered list of `oh-my-opencode-*` or `oh-my-openagent-*` platform package candidates, then spawns the first installed package's generated `bin/oh-my-opencode.js` launcher. Each generated Node launcher runs root `dist/cli` with Bun and, when Bun is missing or exits with `SIGILL`, falls back to root `dist/cli-node` with Node. The root shim retains ordered package fallback compatibility, including x64 `-baseline` candidates, but current generated platform payloads are identical Node scripts, so a Bun `SIGILL` is normally handled inside the selected launcher rather than by switching to a baseline package.
|
|
20
|
+
|
|
21
|
+
## CONVENTIONS
|
|
22
|
+
|
|
23
|
+
- Keep this surface Node-compatible; the root shim and generated launcher payloads are plain Node scripts.
|
|
24
|
+
- Preserve all five aliases. Alias-to-platform-family behavior is shared with `postinstall.mjs` and publish-time package rewrites.
|
|
25
|
+
- Keep error output actionable: report the detected platform and the ordered package candidates.
|
|
26
|
+
- Tests run from the root with `bun test bin` or as part of `bun test`.
|
|
27
|
+
|
|
28
|
+
## ANTI-PATTERNS
|
|
29
|
+
|
|
30
|
+
- Do not import adapter source from `packages/omo-opencode/src/`; this shim must remain usable from the published package layout.
|
|
31
|
+
- Do not hard-code one npm package family. `oh-my-opencode` and `oh-my-openagent` wrappers share the launcher.
|
|
32
|
+
- Do not edit generated launcher payloads under `packages/oh-my-opencode-*/bin/`; regenerate them through `script/build-binaries.ts`.
|
|
33
|
+
- Do not remove baseline fallback without updating platform tests and publish-platform coverage.
|
|
@@ -7,16 +7,17 @@
|
|
|
7
7
|
* 1. Claude Opus 4.7 → opus-4-7.md (literal-following + explicit fan-out push)
|
|
8
8
|
* 2. GPT family → gpt.md (calibrated for GPT-5.5)
|
|
9
9
|
* 3. Gemini family → gemini.md
|
|
10
|
-
* 4. Kimi
|
|
11
|
-
* 5. Kimi K2.
|
|
12
|
-
* 6.
|
|
13
|
-
* 7.
|
|
10
|
+
* 4. Kimi K3 → kimi-k3.md (K3-native; checked first among Kimi)
|
|
11
|
+
* 5. Kimi K2.7 → kimi-k2-7.md (restrained, outcome-first; checked before generic kimi)
|
|
12
|
+
* 6. Kimi K2.x family → kimi.md (Claude-family base + K2.6 thinking-mode calibration)
|
|
13
|
+
* 7. GLM family → glm.md (GLM 5.2 calibration)
|
|
14
|
+
* 8. Default (Claude 4.6 family: opus-4-6, sonnet-4-6, haiku-4-5, etc.) → default.md
|
|
14
15
|
*/
|
|
15
16
|
import type { AgentConfig } from "@opencode-ai/sdk";
|
|
16
17
|
import type { AgentPromptMetadata } from "../types";
|
|
17
18
|
import type { AvailableAgent, AvailableSkill } from "../dynamic-agent-prompt-builder";
|
|
18
19
|
import type { CategoryConfig } from "../../config/schema";
|
|
19
|
-
export type AtlasPromptSource = "default" | "gpt" | "gemini" | "kimi" | "kimi-k2-7" | "opus-4-7" | "glm";
|
|
20
|
+
export type AtlasPromptSource = "default" | "gpt" | "gemini" | "kimi" | "kimi-k3" | "kimi-k2-7" | "opus-4-7" | "glm";
|
|
20
21
|
export declare function getAtlasPromptSource(model?: string): AtlasPromptSource;
|
|
21
22
|
export interface OrchestratorContext {
|
|
22
23
|
model?: string;
|
|
@@ -9,6 +9,9 @@
|
|
|
9
9
|
* - gemini.ts: Corrective overlays for Gemini's aggressive tendencies
|
|
10
10
|
* - gpt-5-4.ts: Native GPT-5.4 prompt with block-structured guidance
|
|
11
11
|
* - gpt-5-5.ts: Native GPT-5.5 prompt with Codex-style sections
|
|
12
|
+
* - kimi-k2-6.ts: Kimi K2.6 native prompt with thinking-mode stop conditions
|
|
13
|
+
* - kimi-k2-7.ts: Kimi K2.7 native prompt, restrained and outcome-first
|
|
14
|
+
* - kimi-k3.ts: Kimi K3 native prompt with explicit anti-overthinking calibration
|
|
12
15
|
*/
|
|
13
16
|
export { buildDefaultSisyphusPrompt, buildTaskManagementSection } from "./default";
|
|
14
17
|
export { buildClaudeOpus47SisyphusPrompt } from "./claude-opus-4-7";
|
|
@@ -19,3 +22,5 @@ export { buildGpt54SisyphusPrompt } from "./gpt-5-4";
|
|
|
19
22
|
export { buildGpt55SisyphusPrompt } from "./gpt-5-5";
|
|
20
23
|
export { buildGlm52SisyphusPrompt } from "./glm-5-2";
|
|
21
24
|
export { buildKimiK26SisyphusPrompt } from "./kimi-k2-6";
|
|
25
|
+
export { buildKimiK27SisyphusPrompt } from "./kimi-k2-7";
|
|
26
|
+
export { buildKimiK3SisyphusPrompt } from "./kimi-k3";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kimi K3-native Sisyphus prompt.
|
|
3
|
+
*
|
|
4
|
+
* K3 inherits K2.7's restrained, outcome-first steerability, but its thinking
|
|
5
|
+
* policy is tuned even harder for long-horizon reasoning. The resulting value
|
|
6
|
+
* is real on ambiguous architecture, multi-step debugging, and failure
|
|
7
|
+
* diagnosis. The cost is a tendency to keep thinking once the decisive
|
|
8
|
+
* condition is already met — re-deriving given facts, enumerating unused
|
|
9
|
+
* alternatives, and second-guessing settled choices.
|
|
10
|
+
*
|
|
11
|
+
* This prompt does not suppress reasoning. It gives the reasoning a stop
|
|
12
|
+
* condition: terminal conditions, commitment framing, and an explicit
|
|
13
|
+
* "go work" rule. Everything else is the same shared builder surface as the
|
|
14
|
+
* other Sisyphus variants.
|
|
15
|
+
*/
|
|
16
|
+
import type { AvailableAgent, AvailableTool, AvailableSkill, AvailableCategory } from "../dynamic-agent-prompt-builder";
|
|
17
|
+
import { categorizeTools } from "../dynamic-agent-prompt-builder";
|
|
18
|
+
export declare function buildKimiK3SisyphusPrompt(model: string, availableAgents: AvailableAgent[], availableTools?: AvailableTool[], availableSkills?: AvailableSkill[], availableCategories?: AvailableCategory[], useTaskSystem?: boolean): string;
|
|
19
|
+
export { categorizeTools };
|
|
@@ -7,7 +7,7 @@ import type { AvailableAgent, AvailableCategory, AvailableSkill } from "./dynami
|
|
|
7
7
|
* runtime model resolves to a different family than the configured one, the baked
|
|
8
8
|
* body is the wrong family and must be rebuilt (issue #5297/#5316).
|
|
9
9
|
*/
|
|
10
|
-
export type SisyphusPromptFamily = "kimi-k2-7" | "kimi-k2-6" | "gpt-5-5" | "gpt-5-4" | "claude-fable-5" | "claude-opus-4-8" | "claude-opus-4-7" | "glm-5-2" | "fallback";
|
|
10
|
+
export type SisyphusPromptFamily = "kimi-k3" | "kimi-k2-7" | "kimi-k2-6" | "gpt-5-5" | "gpt-5-4" | "claude-fable-5" | "claude-opus-4-8" | "claude-opus-4-7" | "glm-5-2" | "fallback";
|
|
11
11
|
export declare function resolveSisyphusPromptFamily(model: string): SisyphusPromptFamily;
|
|
12
12
|
export declare function createSisyphusAgent(model: string, availableAgents?: AvailableAgent[], availableToolNames?: string[], availableSkills?: AvailableSkill[], availableCategories?: AvailableCategory[], useTaskSystem?: boolean): AgentConfig;
|
|
13
13
|
export declare namespace createSisyphusAgent {
|