oh-my-opencode 4.16.3 → 4.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/command/omomomo.md +1 -1
- package/.agents/command/publish.md +31 -58
- package/.agents/skills/hyperplan/SKILL.md +3 -3
- package/.agents/skills/omomomo/SKILL.md +1 -1
- package/.agents/skills/pre-publish-review/SKILL.md +1 -1
- package/.agents/skills/publish/SKILL.md +32 -59
- package/.opencode/command/omomomo.md +1 -1
- package/.opencode/command/publish.md +31 -58
- package/.opencode/skills/hyperplan/SKILL.md +3 -3
- package/.opencode/skills/pre-publish-review/SKILL.md +4 -1
- package/README.ja.md +4 -4
- package/README.ko.md +4 -4
- package/README.md +2 -2
- package/README.ru.md +4 -4
- package/README.zh-cn.md +4 -4
- package/dist/cli/index.js +195 -76
- package/dist/cli-node/index.js +195 -76
- package/dist/features/team-mode/test-support/async-test-helpers.d.ts +2 -2
- package/dist/index.js +310 -299
- package/dist/plugin/chat-message/types.d.ts +4 -0
- package/dist/plugin/command-execute-before.d.ts +1 -0
- package/dist/plugin/stop-continuation.d.ts +17 -0
- package/dist/skills/remove-ai-slops/SKILL.md +2 -2
- package/dist/skills/review-work/SKILL.md +10 -2
- package/dist/skills/start-work/SKILL.md +6 -3
- package/dist/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/dist/skills/ulw-plan/SKILL.md +2 -1
- package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
- package/dist/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/dist/skills/visual-qa/SKILL.md +9 -5
- package/dist/tui.js +79 -32
- package/package.json +15 -14
- package/packages/git-bash-mcp/package.json +27 -0
- package/packages/lsp-daemon/dist/cli.js +7 -13
- package/packages/lsp-daemon/dist/daemon-client.js +3 -5
- package/packages/lsp-daemon/dist/index.js +12 -18
- package/packages/lsp-daemon/dist/request-routing.js +6 -8
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +3 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +1080 -1017
- 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/package.json +1 -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/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/cli.js +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/dist/codex-hook.js +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/src/codex-hook.ts +6 -2
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/cli.test.ts +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/test/codex-hook.test.ts +67 -2
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +14 -14
- 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 +0 -13
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +2 -2
- package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +3 -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/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/test/codex-hook.test.ts +1 -79
- package/packages/omo-codex/plugin/components/teammode/AGENTS.md +2 -2
- 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/teammode/skills/teammode/SKILL.md +33 -16
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +2 -1
- package/packages/omo-codex/plugin/components/teammode/test/v2-spawn-schema.test.ts +69 -0
- 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/explorer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-code-reviewer.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-gate-reviewer.toml +6 -6
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-qa-executor.toml +5 -5
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-high.toml +26 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/{lazycodex-executor.toml → lazycodex-worker-low.toml} +6 -4
- package/packages/omo-codex/plugin/components/ultrawork/agents/lazycodex-worker-medium.toml +26 -0
- package/packages/omo-codex/plugin/components/ultrawork/agents/librarian.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +7 -7
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +76 -37
- 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 +76 -37
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +25 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +0 -68
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/CHANGELOG.md +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +3 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +76 -37
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.d.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-subcommands.js +13 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +405 -25
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/domain-types.d.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.d.ts +7 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/paths.js +16 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/plan-crud.js +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.d.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +20 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +12 -9
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.d.ts +3 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +148 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.d.ts +2 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/stop-resume-hook.js +209 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +25 -2
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +14 -15
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +30 -28
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-subcommands.ts +14 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +10 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +12 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/domain-types.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/paths.ts +27 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/plan-crud.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +23 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +16 -9
- package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +138 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/stop-resume-hook.ts +208 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-create-goals.test.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +4 -1
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +8 -35
- package/packages/omo-codex/plugin/components/ulw-loop/test/fixtures/quality-gate-builder.ts +24 -13
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +5 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/paths.test.ts +43 -8
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate.test.ts +55 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +228 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/stop-resume-hook.test.ts +193 -0
- 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 +18 -0
- 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 +17 -0
- 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 +2 -2
- 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/model-catalog.json +16 -7
- 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/catalog.mjs +16 -7
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +8 -2
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +18 -4
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +6 -3
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +33 -16
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +2 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +76 -37
- package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +14 -15
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +30 -28
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +11 -7
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +76 -16
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -2
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -1
- package/packages/omo-codex/plugin/test/aggregate-model-catalog.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +4 -4
- package/packages/omo-codex/plugin/test/component-hook-contract-cases.mjs +2 -2
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +4 -101
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +14 -14
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +11 -0
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -1
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +5 -3
- package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +25 -0
- package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +24 -0
- package/packages/omo-codex/plugin/test/ulw-plan-skill-contract.test.mjs +9 -40
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +4 -277
- package/packages/omo-codex/scripts/install-config-reasoning.test.mjs +5 -5
- package/packages/omo-codex/scripts/install-config.test.mjs +22 -3
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +98 -30
- package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +2 -2
- package/packages/shared-skills/skills/review-work/SKILL.md +10 -2
- package/packages/shared-skills/skills/start-work/SKILL.md +6 -3
- package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
- package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
- package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -1
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +4 -4
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +2 -2
- package/packages/shared-skills/skills/visual-qa/SKILL.md +9 -5
- package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
- package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +0 -70
- package/packages/omo-codex/plugin/test/ulw-research-epistemic-contract.test.mjs +0 -98
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +0 -296
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from "bun:test"
|
|
2
|
-
import { existsSync, readFileSync } from "node:fs"
|
|
3
|
-
import { dirname, join } from "node:path"
|
|
4
|
-
|
|
5
|
-
const repoRoot = findRepoRoot(import.meta.dir)
|
|
6
|
-
const sharedSkillPath = join(repoRoot, "packages", "shared-skills", "skills", "visual-qa", "SKILL.md")
|
|
7
|
-
const codexSkillPath = join(repoRoot, "packages", "omo-codex", "plugin", "skills", "visual-qa", "SKILL.md")
|
|
8
|
-
const referencesPath = join(
|
|
9
|
-
repoRoot,
|
|
10
|
-
"packages",
|
|
11
|
-
"shared-skills",
|
|
12
|
-
"skills",
|
|
13
|
-
"visual-qa",
|
|
14
|
-
"references",
|
|
15
|
-
"agent-browser-setup.md",
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
type PromptFixture = {
|
|
19
|
-
readonly label: string
|
|
20
|
-
readonly text: string
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function readPrompt(path: string): string {
|
|
24
|
-
return readFileSync(path, "utf8")
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function findRepoRoot(start: string): string {
|
|
28
|
-
let current = start
|
|
29
|
-
while (true) {
|
|
30
|
-
if (existsSync(join(current, "package.json")) && existsSync(join(current, "packages"))) {
|
|
31
|
-
return current
|
|
32
|
-
}
|
|
33
|
-
const parent = dirname(current)
|
|
34
|
-
if (parent === current) {
|
|
35
|
-
throw new Error(`repository root not found from ${start}`)
|
|
36
|
-
}
|
|
37
|
-
current = parent
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function fixtures(): readonly PromptFixture[] {
|
|
42
|
-
const promptFixtures: PromptFixture[] = [{ label: "shared skill", text: readPrompt(sharedSkillPath) }]
|
|
43
|
-
if (existsSync(codexSkillPath)) {
|
|
44
|
-
promptFixtures.push({ label: "codex plugin copy", text: readPrompt(codexSkillPath) })
|
|
45
|
-
}
|
|
46
|
-
return promptFixtures
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
function sectionBetween(text: string, startMarker: string, endMarker: string): string {
|
|
50
|
-
const start = text.indexOf(startMarker)
|
|
51
|
-
if (start < 0) {
|
|
52
|
-
throw new Error(`missing start marker: ${startMarker}`)
|
|
53
|
-
}
|
|
54
|
-
const end = text.indexOf(endMarker, start + startMarker.length)
|
|
55
|
-
if (end < 0) {
|
|
56
|
-
throw new Error(`missing end marker: ${endMarker}`)
|
|
57
|
-
}
|
|
58
|
-
return text.slice(start, end)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
describe("visual-qa skill prompt contract", () => {
|
|
62
|
-
test("#given visual QA prompts #when dispatching pass B #then the oracle must directly inspect screenshots and content for CJK wrapping", () => {
|
|
63
|
-
for (const fixture of fixtures()) {
|
|
64
|
-
const passB = sectionBetween(fixture.text, "### Pass B", "## Step 4")
|
|
65
|
-
const lowerPassB = passB.toLowerCase()
|
|
66
|
-
|
|
67
|
-
expect(lowerPassB, fixture.label).toContain("directly open")
|
|
68
|
-
expect(lowerPassB, fixture.label).toContain("view_image")
|
|
69
|
-
expect(lowerPassB, fixture.label).toContain("source code")
|
|
70
|
-
expect(passB, fixture.label).toContain("[Image #1]")
|
|
71
|
-
expect(passB, fixture.label).toContain("semantic phrases")
|
|
72
|
-
expect(passB, fixture.label).toContain("놀라운 변 / 화")
|
|
73
|
-
expect(passB, fixture.label).toContain("에이전트 오케스트")
|
|
74
|
-
expect(passB, fixture.label).toContain("레이션 현황 및 미")
|
|
75
|
-
expect(passB, fixture.label).toContain("래")
|
|
76
|
-
expect(passB, fixture.label).toContain("REVISE/FAIL")
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
test("#given visual QA prompts #when dispatching pass A #then the oracle must reject mock-only UI instead of accepting superficial screenshots", () => {
|
|
81
|
-
for (const fixture of fixtures()) {
|
|
82
|
-
const passA = sectionBetween(fixture.text, "### Pass A", "### Pass B")
|
|
83
|
-
const checkBlock = sectionBetween(passA, "CHECK EACH:", "OUTPUT:")
|
|
84
|
-
const outputBlock = sectionBetween(passA, "OUTPUT:", '"""')
|
|
85
|
-
const lowerCheckBlock = checkBlock.toLowerCase()
|
|
86
|
-
|
|
87
|
-
expect(lowerCheckBlock, fixture.label).toContain("mock-only")
|
|
88
|
-
expect(lowerCheckBlock, fixture.label).toContain("faked-with-an-image")
|
|
89
|
-
expect(lowerCheckBlock, fixture.label).toContain("coherent design tokens")
|
|
90
|
-
expect(lowerCheckBlock, fixture.label).toContain("reused primitives")
|
|
91
|
-
expect(lowerCheckBlock, fixture.label).toContain("blocking")
|
|
92
|
-
expect(outputBlock, fixture.label).toContain("BLOCKING:")
|
|
93
|
-
}
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
test("#given the Web capture path #when no browser tooling is configured #then it falls back to agent-browser", () => {
|
|
97
|
-
for (const fixture of fixtures()) {
|
|
98
|
-
const web = sectionBetween(fixture.text, "### Web", "### TUI")
|
|
99
|
-
|
|
100
|
-
expect(web, fixture.label).toContain("agent-browser")
|
|
101
|
-
expect(fixture.text, fixture.label).toContain("npm install -g agent-browser")
|
|
102
|
-
expect(fixture.text, fixture.label).toContain("https://github.com/vercel-labs/agent-browser")
|
|
103
|
-
expect(fixture.text, fixture.label).toContain("references/agent-browser-setup.md")
|
|
104
|
-
}
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
test("#given the agent-browser fallback #when documenting setup #then a references doc lists install, link, and help", () => {
|
|
108
|
-
expect(existsSync(referencesPath)).toBe(true)
|
|
109
|
-
const doc = readFileSync(referencesPath, "utf8")
|
|
110
|
-
|
|
111
|
-
expect(doc).toContain("npm install -g agent-browser")
|
|
112
|
-
expect(doc).toContain("agent-browser install")
|
|
113
|
-
expect(doc).toContain("https://github.com/vercel-labs/agent-browser")
|
|
114
|
-
expect(doc).toContain("agent-browser --help")
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
test("#given the visual QA evidence commands #when documented #then they use the Node bundle, not a Bun-only TypeScript launcher", () => {
|
|
118
|
-
for (const fixture of fixtures()) {
|
|
119
|
-
expect(fixture.text, fixture.label).toContain('node "$SKILL_DIR/scripts/visual-qa.mjs" image-diff')
|
|
120
|
-
expect(fixture.text, fixture.label).toContain('node "$SKILL_DIR/scripts/visual-qa.mjs" tui-check')
|
|
121
|
-
expect(fixture.text, fixture.label).not.toContain('bun "$SKILL_DIR/scripts/cli.ts"')
|
|
122
|
-
}
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
test("#given a concrete visual target #when in reference-fidelity mode #then dual pixel + code-fidelity verification loops until both pass", () => {
|
|
126
|
-
for (const fixture of fixtures()) {
|
|
127
|
-
const cloneMode = sectionBetween(fixture.text, "## Step 5", "## Reference evidence is not the verdict")
|
|
128
|
-
const lowerCloneMode = cloneMode.toLowerCase()
|
|
129
|
-
|
|
130
|
-
expect(lowerCloneMode, fixture.label).toContain("clone")
|
|
131
|
-
expect(lowerCloneMode, fixture.label).toContain("imagen")
|
|
132
|
-
expect(lowerCloneMode, fixture.label).toContain("stitch")
|
|
133
|
-
expect(lowerCloneMode, fixture.label).toContain("generated mockup")
|
|
134
|
-
expect(lowerCloneMode, fixture.label).toContain("overview")
|
|
135
|
-
expect(cloneMode, fixture.label).toContain("pixel-by-pixel")
|
|
136
|
-
expect(cloneMode, fixture.label).toContain("image-diff")
|
|
137
|
-
expect(cloneMode, fixture.label).toContain("lazycodex-clone-fidelity-reviewer")
|
|
138
|
-
expect(lowerCloneMode, fixture.label).toContain("extensible state variants")
|
|
139
|
-
expect(lowerCloneMode, fixture.label).toContain("retry")
|
|
140
|
-
}
|
|
141
|
-
})
|
|
142
|
-
})
|
|
143
|
-
|
|
144
|
-
describe("visual-qa skill exhaustive-coverage and review-gate contract", () => {
|
|
145
|
-
test("#given a multi-page surface #when capturing #then every page is enumerated and verified per page, not sampled", () => {
|
|
146
|
-
for (const fixture of fixtures()) {
|
|
147
|
-
const capture = sectionBetween(fixture.text, "## Step 2", "## Step 3")
|
|
148
|
-
const lower = capture.toLowerCase()
|
|
149
|
-
|
|
150
|
-
expect(lower, fixture.label).toContain("every page")
|
|
151
|
-
expect(lower, fixture.label).toContain("enumerate")
|
|
152
|
-
expect(lower, fixture.label).toContain("never sample")
|
|
153
|
-
expect(lower, fixture.label).toContain("per page")
|
|
154
|
-
expect(lower, fixture.label).toContain("one failing page fails")
|
|
155
|
-
}
|
|
156
|
-
})
|
|
157
|
-
|
|
158
|
-
test("#given prior QA artifacts #when verifying #then stale evidence older than the source must be regenerated", () => {
|
|
159
|
-
for (const fixture of fixtures()) {
|
|
160
|
-
const capture = sectionBetween(fixture.text, "## Step 2", "## Step 3")
|
|
161
|
-
const lower = capture.toLowerCase()
|
|
162
|
-
|
|
163
|
-
expect(lower, fixture.label).toContain("stale")
|
|
164
|
-
expect(lower, fixture.label).toContain("older than")
|
|
165
|
-
expect(lower, fixture.label).toContain("regenerate")
|
|
166
|
-
}
|
|
167
|
-
})
|
|
168
|
-
|
|
169
|
-
test("#given Step 3 dispatch #when running the review #then it is required pre-done, harness-native, and covers every enumerated page", () => {
|
|
170
|
-
for (const fixture of fixtures()) {
|
|
171
|
-
const dispatch = sectionBetween(fixture.text, "## Step 3", "### Pass A")
|
|
172
|
-
const lower = dispatch.toLowerCase()
|
|
173
|
-
|
|
174
|
-
expect(lower, fixture.label).toContain("required before")
|
|
175
|
-
expect(lower, fixture.label).toContain("do not self-review")
|
|
176
|
-
expect(dispatch, fixture.label).toContain("spawn_agent")
|
|
177
|
-
expect(dispatch, fixture.label).toContain("lazycodex-gate-reviewer")
|
|
178
|
-
expect(lower, fixture.label).toContain("every enumerated page")
|
|
179
|
-
}
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
test("#given the completion gate #when deciding done #then an independent reviewer must PASS on a fresh full capture, looping until clean", () => {
|
|
183
|
-
for (const fixture of fixtures()) {
|
|
184
|
-
const gate = sectionBetween(fixture.text, "## Step 4", "## Step 5")
|
|
185
|
-
const lower = gate.toLowerCase()
|
|
186
|
-
|
|
187
|
-
expect(lower, fixture.label).toContain("hard stop rule")
|
|
188
|
-
expect(lower, fixture.label).toContain("independent")
|
|
189
|
-
expect(lower, fixture.label).toContain("no blocking")
|
|
190
|
-
expect(lower, fixture.label).toContain("fresh")
|
|
191
|
-
expect(lower, fixture.label).toContain("every enumerated page")
|
|
192
|
-
expect(lower, fixture.label).toContain("loop until")
|
|
193
|
-
expect(lower, fixture.label).toContain("do not stop because the automated script")
|
|
194
|
-
}
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
test("#given Pass B CJK checks #when inspecting #then it flags topic, connective, and source-citation splits across every page", () => {
|
|
198
|
-
for (const fixture of fixtures()) {
|
|
199
|
-
const passB = sectionBetween(fixture.text, "### Pass B", "## Step 4")
|
|
200
|
-
const lower = passB.toLowerCase()
|
|
201
|
-
|
|
202
|
-
expect(passB, fixture.label).toContain("두 강은")
|
|
203
|
-
expect(passB, fixture.label).toContain("쓸 수")
|
|
204
|
-
expect(passB, fixture.label).toContain("Attention Is")
|
|
205
|
-
expect(lower, fixture.label).toContain("citation")
|
|
206
|
-
expect(lower, fixture.label).toContain("every page")
|
|
207
|
-
expect(lower, fixture.label).toContain("regardless of similarityscore")
|
|
208
|
-
}
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
test("#given a generated reference packet #when reviewing #then Pass A and B require extensible design-system code and pixel-level reference matching", () => {
|
|
212
|
-
for (const fixture of fixtures()) {
|
|
213
|
-
const passA = sectionBetween(fixture.text, "### Pass A", "### Pass B")
|
|
214
|
-
const passB = sectionBetween(fixture.text, "### Pass B", "## Step 4")
|
|
215
|
-
const lowerPassA = passA.toLowerCase()
|
|
216
|
-
const lowerPassB = passB.toLowerCase()
|
|
217
|
-
|
|
218
|
-
expect(passA, fixture.label).toContain("REFERENCE PACKET:")
|
|
219
|
-
expect(passB, fixture.label).toContain("REFERENCE PACKET:")
|
|
220
|
-
expect(lowerPassA, fixture.label).toContain("reusable tokens/primitives")
|
|
221
|
-
expect(lowerPassA, fixture.label).toContain("extend to new pages")
|
|
222
|
-
expect(lowerPassA, fixture.label).toContain("missing overview content")
|
|
223
|
-
expect(lowerPassB, fixture.label).toContain("pixel-perfectly")
|
|
224
|
-
expect(lowerPassB, fixture.label).toContain("actual against reference")
|
|
225
|
-
expect(lowerPassB, fixture.label).toContain("overview text is part of the target")
|
|
226
|
-
}
|
|
227
|
-
})
|
|
228
|
-
|
|
229
|
-
test("#given reference packet evidence #when prompting reviewers #then sensitive content is redacted and annotations stay untrusted data", () => {
|
|
230
|
-
for (const fixture of fixtures()) {
|
|
231
|
-
const capture = sectionBetween(fixture.text, "## Step 2", "## Step 3")
|
|
232
|
-
const passA = sectionBetween(fixture.text, "### Pass A", "### Pass B")
|
|
233
|
-
const passB = sectionBetween(fixture.text, "### Pass B", "## Step 4")
|
|
234
|
-
const combined = `${capture}\n${passA}\n${passB}`.toLowerCase()
|
|
235
|
-
|
|
236
|
-
expect(combined, fixture.label).toContain("redact or omit secrets")
|
|
237
|
-
expect(combined, fixture.label).toContain("credentials")
|
|
238
|
-
expect(combined, fixture.label).toContain("tokens")
|
|
239
|
-
expect(combined, fixture.label).toContain("auth headers")
|
|
240
|
-
expect(combined, fixture.label).toContain("customer data")
|
|
241
|
-
expect(combined, fixture.label).toContain("private messages")
|
|
242
|
-
expect(combined, fixture.label).toContain("internal urls")
|
|
243
|
-
expect(combined, fixture.label).toContain("other sensitive content")
|
|
244
|
-
expect(combined, fixture.label).toContain("overview text")
|
|
245
|
-
expect(combined, fixture.label).toContain("annotations")
|
|
246
|
-
expect(combined, fixture.label).toContain("untrusted data")
|
|
247
|
-
expect(combined, fixture.label).toContain("captured ui copy")
|
|
248
|
-
expect(combined, fixture.label).toContain("comments")
|
|
249
|
-
expect(combined, fixture.label).toContain("filenames")
|
|
250
|
-
expect(combined, fixture.label).toContain("not reviewer instructions")
|
|
251
|
-
expect(combined, fixture.label).toContain("never as instructions")
|
|
252
|
-
}
|
|
253
|
-
})
|
|
254
|
-
})
|
|
255
|
-
|
|
256
|
-
describe("visual-qa motion capture and slop-animation contract", () => {
|
|
257
|
-
test("#given an animated or interactive surface #when capturing #then rest, mid-transition and settled frames are driven and captured", () => {
|
|
258
|
-
for (const fixture of fixtures()) {
|
|
259
|
-
const motion = sectionBetween(fixture.text, "### Motion and interaction capture", "## Step 3")
|
|
260
|
-
const lower = motion.toLowerCase()
|
|
261
|
-
|
|
262
|
-
expect(lower, fixture.label).toContain("rest")
|
|
263
|
-
expect(lower, fixture.label).toContain("mid-transition")
|
|
264
|
-
expect(lower, fixture.label).toContain("settled")
|
|
265
|
-
expect(lower, fixture.label).toContain("hover")
|
|
266
|
-
expect(lower, fixture.label).toContain("focus")
|
|
267
|
-
expect(lower, fixture.label).toContain("click")
|
|
268
|
-
expect(lower, fixture.label).toContain("scroll-triggered")
|
|
269
|
-
expect(lower, fixture.label).toContain("load animation")
|
|
270
|
-
}
|
|
271
|
-
})
|
|
272
|
-
|
|
273
|
-
test("#given animation-induced pixel diff #when judging fidelity #then it is never an excuse to dismiss a defect", () => {
|
|
274
|
-
for (const fixture of fixtures()) {
|
|
275
|
-
const motion = sectionBetween(fixture.text, "### Motion and interaction capture", "## Step 3")
|
|
276
|
-
const lower = motion.toLowerCase()
|
|
277
|
-
|
|
278
|
-
expect(lower, fixture.label).toContain("never a valid excuse")
|
|
279
|
-
expect(lower, fixture.label).toContain("settled state to settled state")
|
|
280
|
-
expect(lower, fixture.label).toContain("reference's own motion")
|
|
281
|
-
}
|
|
282
|
-
})
|
|
283
|
-
|
|
284
|
-
test("#given meaningless motion #when reviewing #then Pass A flags slop animation, especially hover-without-action", () => {
|
|
285
|
-
for (const fixture of fixtures()) {
|
|
286
|
-
const passA = sectionBetween(fixture.text, "### Pass A", "### Pass B")
|
|
287
|
-
const checkBlock = sectionBetween(passA, "CHECK EACH:", "OUTPUT:")
|
|
288
|
-
const lower = checkBlock.toLowerCase()
|
|
289
|
-
|
|
290
|
-
expect(lower, fixture.label).toContain("slop animation")
|
|
291
|
-
expect(lower, fixture.label).toContain("non-interactive")
|
|
292
|
-
expect(lower, fixture.label).toContain("no state change")
|
|
293
|
-
expect(lower, fixture.label).toContain("hover-without-action")
|
|
294
|
-
}
|
|
295
|
-
})
|
|
296
|
-
})
|