@simplysm/sd-claude 14.0.65 → 14.0.66
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/claude/references/sd-requirement-source-handling.md +64 -0
- package/claude/references/sd-simplysm14/README.md +44 -40
- package/claude/references/sd-simplysm14/apis/angular/README.md +95 -0
- package/claude/references/sd-simplysm14/apis/angular/app-structure.md +49 -0
- package/claude/references/sd-simplysm14/apis/angular/buttons.md +42 -0
- package/claude/references/sd-simplysm14/apis/angular/crud.md +35 -0
- package/claude/references/sd-simplysm14/apis/angular/forms.md +63 -0
- package/claude/references/sd-simplysm14/apis/angular/infrastructure.md +80 -0
- package/claude/references/sd-simplysm14/apis/angular/kanban.md +33 -0
- package/claude/references/sd-simplysm14/apis/angular/layout.md +41 -0
- package/claude/references/sd-simplysm14/apis/angular/modal.md +63 -0
- package/claude/references/sd-simplysm14/apis/angular/routing.md +45 -0
- package/claude/references/sd-simplysm14/apis/angular/select-dropdown.md +35 -0
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +50 -0
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +42 -0
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +52 -0
- package/claude/references/sd-simplysm14/apis/angular/toast.md +46 -0
- package/claude/references/sd-simplysm14/apis/angular/visual.md +41 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +76 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +83 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +80 -0
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +39 -0
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +112 -0
- package/claude/references/sd-simplysm14/apis/core-common/README.md +53 -0
- package/claude/references/sd-simplysm14/apis/core-common/extensions.md +123 -0
- package/claude/references/sd-simplysm14/apis/core-common/features.md +46 -0
- package/claude/references/sd-simplysm14/apis/core-common/types.md +114 -0
- package/claude/references/sd-simplysm14/apis/core-common/utils.md +158 -0
- package/claude/references/sd-simplysm14/apis/core-node/README.md +12 -0
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +64 -0
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +52 -0
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +53 -0
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +81 -0
- package/claude/references/sd-simplysm14/apis/core-node/pathx.md +55 -0
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +111 -0
- package/claude/references/sd-simplysm14/apis/excel/README.md +81 -0
- package/claude/references/sd-simplysm14/apis/lint/README.md +80 -0
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +33 -0
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +77 -0
- package/claude/references/sd-simplysm14/apis/orm-common/executable.md +20 -0
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +92 -0
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +98 -0
- package/claude/references/sd-simplysm14/apis/orm-common/schema-builders.md +128 -0
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +59 -0
- package/claude/references/sd-simplysm14/apis/sd-claude/README.md +9 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +50 -0
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config.md +155 -0
- package/claude/references/sd-simplysm14/apis/service-client/README.md +92 -0
- package/claude/references/sd-simplysm14/apis/service-common/README.md +29 -0
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +63 -0
- package/claude/references/sd-simplysm14/apis/service-common/messages.md +56 -0
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +64 -0
- package/claude/references/sd-simplysm14/apis/service-common/service-types.md +43 -0
- package/claude/references/sd-simplysm14/apis/service-server/README.md +20 -0
- package/claude/references/sd-simplysm14/apis/service-server/auth.md +31 -0
- package/claude/references/sd-simplysm14/apis/service-server/builtin-services.md +47 -0
- package/claude/references/sd-simplysm14/apis/service-server/define-service.md +71 -0
- package/claude/references/sd-simplysm14/apis/service-server/internals.md +41 -0
- package/claude/references/sd-simplysm14/apis/service-server/server.md +66 -0
- package/claude/references/sd-simplysm14/apis/storage/README.md +69 -0
- package/claude/references/sd-simplysm14/{client-component.md → manuals/client-component.md} +133 -128
- package/claude/references/sd-simplysm14/manuals/client-crud.md +102 -0
- package/claude/references/sd-simplysm14/manuals/client-demo.md +128 -0
- package/claude/references/sd-simplysm14/manuals/client-rules.md +7 -0
- package/claude/references/sd-simplysm14/{client-setup.md → manuals/client-setup.md} +2 -2
- package/claude/references/sd-simplysm14/{client-tab.md → manuals/client-tab.md} +13 -11
- package/claude/references/sd-simplysm14/{orm-union.md → manuals/orm-union.md} +1 -1
- package/claude/references/sd-simplysm14/manuals/orm.md +75 -0
- package/claude/rules/sd-base-rules.md +172 -79
- package/claude/sd-check-bash.py +5 -0
- package/claude/sd-statusline.py +7 -12
- package/claude/skills/sd-commit/SKILL.md +7 -3
- package/claude/skills/sd-demo/SKILL.md +81 -62
- package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +42 -0
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +75 -0
- package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +45 -0
- package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +33 -0
- package/claude/skills/sd-demo/evals/golden.jsonl +5 -3
- package/claude/skills/sd-dev/SKILL.md +33 -63
- package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +13 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +10 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +11 -0
- package/claude/skills/sd-dev/evals/fixtures/case-modify/tsconfig.json +12 -0
- package/claude/skills/sd-dev/evals/golden.jsonl +3 -3
- package/claude/skills/sd-docs/SKILL.md +53 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/.claude/references/sd-simplysm14/README.md +7 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/bar/src/index.ts +3 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/package.json +6 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/baz/src/index.ts +1 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/new-write/packages/foo/src/index.ts +8 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/README.md +7 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/.claude/references/sd-simplysm14/apis/foo/README.md +3 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/bar/src/index.ts +3 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/package.json +6 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/baz/src/index.ts +1 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/package.json +5 -0
- package/claude/skills/sd-docs/evals/fixtures/update-mixed/packages/foo/src/index.ts +8 -0
- package/claude/skills/sd-docs/evals/golden.jsonl +2 -0
- package/claude/skills/sd-docs/references/subagent-prompt.md +100 -0
- package/claude/skills/sd-impl/SKILL.md +125 -46
- package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/250/353/215/270.txt +1 -0
- package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.txt +1 -0
- package/claude/skills/sd-impl/evals/golden.jsonl +2 -3
- package/claude/skills/sd-skill/SKILL.md +3 -3
- package/claude/skills/sd-skill/evals/golden.jsonl +0 -1
- package/claude/skills/sd-skill/references/eval-authoring.md +15 -0
- package/claude/skills/sd-skill/references/eval-run.md +1 -1
- package/claude/skills/sd-skill/references/skill-authoring.md +8 -5
- package/claude/skills/sd-skill/scripts/run_eval.py +39 -60
- package/claude/skills/sd-spec/SKILL.md +163 -105
- package/claude/skills/sd-spec/references/example-spec.md +585 -0
- package/claude/skills/sd-spec/references/spec-authoring.md +287 -0
- package/claude/skills/sd-spec/references/spec-md-template.md +15 -93
- package/claude/skills/sd-unpack/SKILL.md +7 -1
- package/claude/skills/sd-unpack/scripts/handlers/_common.py +10 -0
- package/claude/skills/sd-unpack/scripts/handlers/eml_handler.py +5 -13
- package/claude/skills/sd-unpack/scripts/handlers/msg_handler.py +3 -12
- package/claude/skills/sd-unpack/scripts/handlers/office_com.py +23 -37
- package/claude/skills/sd-unpack/scripts/handlers/office_worker.py +1 -4
- package/claude/skills/sd-unpack/scripts/handlers/pdf_handler.py +4 -13
- package/claude/skills/sd-unpack/scripts/unpack.py +4 -4
- package/claude/skills/sd-use/SKILL.md +1 -0
- package/claude/skills/sd-wip/SKILL.md +38 -0
- package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/_wip.md +3 -0
- package/claude/skills/sd-wip/evals/fixtures/with-artifact/projects/acct/spec.md +15 -0
- package/claude/skills/sd-wip/evals/fixtures/with-existing-wip/.wips/260101120000_acct.md +6 -0
- package/claude/skills/sd-wip/evals/fixtures/with-existing-wip-for-compact/.wips/260101120000_acct.md +14 -0
- package/claude/skills/sd-wip/evals/golden.jsonl +4 -0
- package/claude/skills/sd-wip/references/compact.md +79 -0
- package/package.json +1 -1
- package/claude/references/sd-simplysm14/orm.md +0 -11
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -27
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/.specs/260503143025/overview.md +0 -12
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Button.tsx +0 -12
- package/claude/skills/sd-demo/evals/fixtures/basic-single-req/src/components/Input.tsx +0 -27
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -25
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/.specs/260503143025/overview.md +0 -12
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/components/Input.tsx +0 -25
- package/claude/skills/sd-demo/evals/fixtures/mock-data-policy/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-001-RTP/354/236/205/353/240/245/355/231/224/353/251/264/spec.md +0 -19
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/REQ-002-RTP/354/266/234/353/240/245/355/231/224/353/251/264/spec.md +0 -20
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/.specs/260503143025/overview.md +0 -16
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Button.tsx +0 -6
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/components/Input.tsx +0 -15
- package/claude/skills/sd-demo/evals/fixtures/multi-req-domain/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-demo/references/demo-md-template.md +0 -92
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260301_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/232/224/354/262/255.eml +0 -5
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260305_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/354/232/224/354/262/255.eml +0 -6
- package/claude/skills/sd-dev/evals/fixtures/multi-req-stop-after-spec/.docs/20260310_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234.eml +0 -6
- package/claude/skills/sd-dev/evals/fixtures/single-req-auto-chain/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/start-from-plan/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-dev/evals/fixtures/start-from-plan/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/plan.md +0 -28
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -14
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/components/Input.tsx +0 -6
- package/claude/skills/sd-impl/evals/fixtures/basic-single-r/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/plan.md +0 -40
- package/claude/skills/sd-impl/evals/fixtures/multi-r/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/spec.md +0 -13
- package/claude/skills/sd-impl/evals/fixtures/multi-r/src/components/Input.tsx +0 -25
- package/claude/skills/sd-impl/evals/fixtures/multi-r/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -26
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-impl/evals/fixtures/with-test-file/src/lib/.gitkeep +0 -0
- package/claude/skills/sd-impl/references/impl-md-template.md +0 -87
- package/claude/skills/sd-impl/references/modes-and-failure.md +0 -65
- package/claude/skills/sd-plan/SKILL.md +0 -130
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -14
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/api/user.ts +0 -13
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/components/Input.tsx +0 -15
- package/claude/skills/sd-plan/evals/fixtures/already-implemented/src/pages/UserList.tsx +0 -29
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/.specs/260503143025/REQ-001-/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/270/264/352/270/211/355/221/234/354/213/234/spec.md +0 -17
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/components/Input.tsx +0 -6
- package/claude/skills/sd-plan/evals/fixtures/basic-greenfield/src/pages/.gitkeep +0 -0
- package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/DEMO-001-/352/261/260/353/236/230/354/262/230/demo.md +0 -26
- package/claude/skills/sd-plan/evals/fixtures/demo-built/.specs/260503143025/REQ-001-/352/261/260/353/236/230/354/262/230/353/252/251/353/241/235/355/231/224/353/251/264/spec.md +0 -15
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/components/Input.tsx +0 -25
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/data/mock-customer.ts +0 -16
- package/claude/skills/sd-plan/evals/fixtures/demo-built/src/pages/CustomerList.tsx +0 -25
- package/claude/skills/sd-plan/evals/golden.jsonl +0 -3
- package/claude/skills/sd-plan/references/plan-md-template.md +0 -138
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260122_/352/263/240/352/260/235/354/202/254_/354/236/205/352/263/240/354/247/200/354/213/234/354/204/234/352/260/234/354/204/240/354/232/224/354/262/255.eml +0 -20
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260205_/352/263/240/352/260/235/354/202/254_/354/266/234/352/263/240/355/231/224/353/251/264/352/264/200/353/240/250.eml +0 -17
- package/claude/skills/sd-spec/evals/fixtures/bulk-multi-source/.docs/20260301_/352/263/240/352/260/235/354/202/254_/352/266/214/355/225/234/354/262/264/352/263/204.eml +0 -18
- package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs/20260317_/352/263/240/352/260/235/354/202/254_/352/270/264/352/270/211/354/262/230/353/246/254/353/260/251/354/271/250.eml +0 -17
- package/claude/skills/sd-spec/evals/fixtures/conflict-detection/.docs//355/232/214/354/235/230/353/214/200/353/263/270_20260320.txt +0 -13
- package/claude/skills/sd-spec/evals/fixtures/direct-simple/.gitkeep +0 -0
- package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/REQ-001-test/spec.md +0 -19
- package/claude/skills/sd-spec/evals/fixtures/spec-md-input/.specs/260101120000/overview.md +0 -18
- package/claude/skills/sd-spec/evals/golden.jsonl +0 -4
- package/claude/skills/sd-spec/references/overview-md-template.md +0 -89
- package/claude/skills/sd-spec/references/raw-input-handling.md +0 -96
- package/claude/skills/sd-verify/SKILL.md +0 -96
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/impl.md +0 -20
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/plan.md +0 -14
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/.specs/260503143025/REQ-001-/355/225/240/354/235/270/352/263/204/354/202/260/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.test.ts +0 -11
- package/claude/skills/sd-verify/evals/fixtures/all-satisfied/src/lib/discount.ts +0 -7
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/impl.md +0 -21
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/plan.md +0 -21
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/.specs/260503143025/REQ-001-/354/202/254/354/232/251/354/236/220/353/252/251/353/241/235/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/partial-mismatch/src/pages/UserList.tsx +0 -19
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/impl.md +0 -19
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/plan.md +0 -14
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/.specs/260503143025/REQ-001-/352/270/210/354/225/241/352/262/200/354/246/235/spec.md +0 -12
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.test.ts +0 -10
- package/claude/skills/sd-verify/evals/fixtures/tdd-only/src/lib/validate-amount.ts +0 -7
- package/claude/skills/sd-verify/evals/golden.jsonl +0 -3
- package/claude/skills/sd-verify/references/verify-md-template.md +0 -99
- /package/claude/skills/{sd-demo/evals/fixtures/basic-single-req/src/pages → sd-wip/evals/fixtures/empty}/.gitkeep +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# 거래처 관리 요구 분석서
|
|
2
|
+
|
|
3
|
+
## 1. 개요
|
|
4
|
+
|
|
5
|
+
### 1.1 핵심 목적 [확정: 2026-05-14]
|
|
6
|
+
|
|
7
|
+
거래처 정보 조회·검색.
|
|
8
|
+
|
|
9
|
+
### 1.2 주요 목표 [확정: 2026-05-14]
|
|
10
|
+
|
|
11
|
+
- 거래처 목록 조회·검색
|
|
12
|
+
|
|
13
|
+
### 1.3 최종 사용자/이해관계자 [확정: 2026-05-14]
|
|
14
|
+
|
|
15
|
+
- 영업 담당자: 거래처 정보를 조회하는 사람
|
|
16
|
+
|
|
17
|
+
### 1.4 환경/장치 [확정: 2026-05-14]
|
|
18
|
+
|
|
19
|
+
PC — Windows 11, Chrome 최신, 1920 x 1080
|
|
20
|
+
|
|
21
|
+
## 2. 업무 프로세스
|
|
22
|
+
|
|
23
|
+
### 2.1 거래처 조회 [확정: 2026-05-14]
|
|
24
|
+
|
|
25
|
+
영업 담당자가 거래처 목록을 검색·조회한다.
|
|
26
|
+
|
|
27
|
+
관련 섹션: [화면.거래처 목록]
|
|
28
|
+
|
|
29
|
+
## 3. 기타 요구사항
|
|
30
|
+
|
|
31
|
+
없음.
|
|
32
|
+
|
|
33
|
+
## 4. 화면
|
|
34
|
+
|
|
35
|
+
| § | 분류 | 화면 | 유형 | 장치 |
|
|
36
|
+
| --- | -------- | ----------- | ------ | ---- |
|
|
37
|
+
| 4.1 | 기준정보 | 거래처 목록 | 마스터 | PC |
|
|
38
|
+
|
|
39
|
+
### 4.1 거래처 목록 (PC) [확정: 2026-05-14]
|
|
40
|
+
|
|
41
|
+
Actor: 영업 담당자
|
|
42
|
+
관련 섹션: [프로세스.거래처 조회]
|
|
43
|
+
|
|
44
|
+
기능 개요:
|
|
45
|
+
|
|
46
|
+
- 거래처 목록 표시
|
|
47
|
+
- 거래처명·사업자번호로 검색
|
|
48
|
+
|
|
49
|
+
와이어프레임:
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
┌──────────────────────────────────────────────────┐
|
|
53
|
+
│ 검색어: [_______________] [조회] │
|
|
54
|
+
├────┬───────────┬──────────────┬──────────────────┤
|
|
55
|
+
│ # │ 거래처명 │ 사업자번호 │ 연락처 │
|
|
56
|
+
├────┼───────────┼──────────────┼──────────────────┤
|
|
57
|
+
│ 1 │ ABC상사 │ 123-45-67890 │ 02-1234-5678 │
|
|
58
|
+
│ 2 │ XYZ유통 │ 234-56-78901 │ 02-2345-6789 │
|
|
59
|
+
└────┴───────────┴──────────────┴──────────────────┘
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
항목:
|
|
63
|
+
|
|
64
|
+
| 항목 | 타입 | 비고 |
|
|
65
|
+
| ---------- | ------ | ------------------ |
|
|
66
|
+
| 거래처명 | 문자열 | 필수 |
|
|
67
|
+
| 사업자번호 | 문자열 | 10자리 하이픈 포함 |
|
|
68
|
+
| 연락처 | 문자열 | 선택 |
|
|
69
|
+
|
|
70
|
+
동작:
|
|
71
|
+
|
|
72
|
+
- [조회] 클릭 → 검색어로 필터된 목록 갱신.
|
|
73
|
+
|
|
74
|
+
## 5. 자동 처리
|
|
75
|
+
|
|
76
|
+
없음.
|
|
77
|
+
|
|
78
|
+
## 6. 공통 정의
|
|
79
|
+
|
|
80
|
+
없음.
|
|
81
|
+
|
|
82
|
+
## 7. 도메인 모델
|
|
83
|
+
|
|
84
|
+
### 7.1 거래처 [확정: 2026-05-14]
|
|
85
|
+
|
|
86
|
+
- id: 식별자
|
|
87
|
+
- 거래처명: 문자열, 필수
|
|
88
|
+
- 사업자번호: 문자열, 10자리 하이픈 포함
|
|
89
|
+
- 연락처: 문자열, 선택
|
|
90
|
+
|
|
91
|
+
## 8. 외부 인터페이스
|
|
92
|
+
|
|
93
|
+
없음.
|
|
94
|
+
|
|
95
|
+
## 9. 본문 외 결정사항
|
|
96
|
+
|
|
97
|
+
없음.
|
|
98
|
+
|
|
99
|
+
## 10. 변경 이력
|
|
100
|
+
|
|
101
|
+
- 2026-05-14: 초안 작성
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
거래처 도메인 모델 placeholder (eval fixture 더미)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
거래처 목록 화면 placeholder (eval fixture 더미)
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
{"id": "
|
|
2
|
-
{"id": "
|
|
3
|
-
{"id": "with-test-file-001", "input": "/sd-impl REQ-001 구현해줘", "rubric": [".specs/260503143025/REQ-001-할인계산/impl.md 파일이 생성되었는가?", "src/lib/ 디렉토리에 'discount' 키워드가 포함된 파일이 1개 이상 새로 생성되었는가? (구현 파일)", "src/lib/ 또는 그 하위에 파일명에 'test' 또는 'spec' 키워드가 포함된 파일이 1개 이상 새로 생성되었는가? (TDD 모드 - 테스트 파일 필수)", "impl.md 본문에 '모드: TDD' 또는 'TDD' 키워드가 포함되어 있는가? (TDD 모드 적용 기록)", "에이전트의 마지막 텍스트 응답에 'REQ-' 또는 'R1' 형태의 ID 매핑이 1개 이상 포함되어 있고, '구현'/'추가'/'변경' 같은 단어가 함께 등장하는가?"], "fixture": "with-test-file"}
|
|
1
|
+
{"id": "case-new", "input": "/sd-impl .specs/260514120000_거래처/spec.md 의 §4.1 화면을 구현해줘", "rubric": ["events 에 '.specs/260514120000_거래처/spec.md' 경로가 포함된 Read 도구 호출이 1회 이상 있는가?", "샌드박스 종료 시 트리에 fixture 초기 상태에 없던 새 파일 또는 fixture 초기 내용과 달라진 파일이 .specs/ 하위를 제외하고 1개 이상 존재하는가?", "마지막 에이전트 응답 텍스트에 'dev 서버' 문자열이 포함되었는가?"], "fixture": "case-new"}
|
|
2
|
+
{"id": "case-update", "input": "/sd-impl .specs/260514120000_거래처/spec.md 의 §4.1 화면을 구현해줘", "rubric": ["events 에 '.specs/260514120000_거래처/spec.md' 경로가 포함된 Read 도구 호출이 1회 이상 있는가?", "샌드박스 종료 시 트리에 fixture 초기 상태에 없던 새 파일 또는 fixture 초기 내용과 달라진 파일이 .specs/ 하위를 제외하고 1개 이상 존재하는가?", "마지막 에이전트 응답 텍스트에 'dev 서버' 문자열이 포함되었는가?", "fixture 의 'src/거래처/거래처-모델.txt' 와 'src/거래처/거래처-목록.txt' 파일이 손실되지 않고 보존되었는가?"], "fixture": "case-update"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sd-skill
|
|
3
|
-
description:
|
|
3
|
+
description: 사용자가 정의한 작업 도메인을 SKILL.md + references/scripts 묶음으로 생성·수정한다. Use when 새 스킬을 작성하거나 기존 스킬을 수정할 때.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# 스킬 작성
|
|
7
7
|
|
|
8
8
|
## 워크플로
|
|
9
9
|
|
|
10
|
-
1. 의도 정의 - 다음을 파악한다.
|
|
10
|
+
1. 의도 정의 - 다음을 파악한다. **멀티질문 X — 항목 1건씩 합의** (sd-base-rules "결정거리 1건씩 질문" 적용):
|
|
11
11
|
- 이 스킬이 다루는 작업/도메인은 무엇인가?
|
|
12
12
|
- 구체적으로 어떤 유즈케이스를 커버해야 하는가?
|
|
13
13
|
- 실행 가능 스크립트가 필요한가? 지침만으로 충분한가?
|
|
@@ -17,6 +17,7 @@ description: 스킬을 작성하거나 기존 스킬을 수정하는 스킬. Use
|
|
|
17
17
|
- 채점 기준이 될 케이스들: `evals/golden.jsonl`
|
|
18
18
|
- 케이스 시작 시점의 워크스페이스 초기 상태: `evals/fixtures/<name>/`
|
|
19
19
|
- 상세: [references/eval-authoring.md](references/eval-authoring.md)
|
|
20
|
+
- **주의**: 타 스킬 eval 확인 및 답습 금지, 이 상세지침만을 따를것
|
|
20
21
|
|
|
21
22
|
3. 스킬 작성 - 다음을 작성하라:
|
|
22
23
|
- 간결하고 명확한 지침이 담긴 SKILL.md
|
|
@@ -42,7 +43,6 @@ description: 스킬을 작성하거나 기존 스킬을 수정하는 스킬. Use
|
|
|
42
43
|
|
|
43
44
|
```
|
|
44
45
|
.claude/
|
|
45
|
-
├── simplysm.json # tmpdir 오버라이드 (선택)
|
|
46
46
|
└── skills/
|
|
47
47
|
└── <skill-name>/
|
|
48
48
|
├── SKILL.md # 스킬 본문 (필수)
|
|
@@ -3,4 +3,3 @@
|
|
|
3
3
|
{"id": "modify-rule-add-001", "input": "/sd-skill review 스킬에 응답을 항상 한국어로 하라는 강제 조건을 추가해줘", "rubric": [".claude/skills/review/SKILL.md 파일이 여전히 존재하는가?", "수정 후 SKILL.md 의 frontmatter 'name' 값이 'review' 로 유지되어 있는가?", "기존 워크플로 항목 표현 3개('변경사항 파악', '영향 범위 분석', '피드백 작성') 가 SKILL.md 본문에 모두 그대로 남아있는가?", "한국어 응답을 강제하는 새 지시 문장이 SKILL.md 본문에 추가되었는가? (본문에 '한국어' 키워드를 포함하는 강제 어조의 문장 1개 이상)"], "fixture": "with-existing-review"}
|
|
4
4
|
{"id": "modify-add-script-001", "input": "/sd-skill review 스킬에 'git diff origin/main...HEAD' 로 변경 파일 목록과 diff 본문을 자동으로 가져오는 스크립트를 추가하고, SKILL.md 워크플로에서 그 스크립트를 사용하도록 갱신해줘", "rubric": [".claude/skills/review/SKILL.md 파일이 여전히 존재하고 frontmatter 의 'name' 값이 'review' 로 유지되는가?", "기존 워크플로 항목 표현 3개('변경사항 파악', '영향 범위 분석', '피드백 작성') 가 SKILL.md 본문에 모두 그대로 남아있는가?", ".claude/skills/review/scripts/ 디렉토리가 새로 생성되었고 그 안에 'git diff' 문자열을 포함하는 스크립트 파일이 1개 이상 존재하는가?", "수정된 SKILL.md 본문에서 새로 추가한 스크립트 파일을 사용/실행하라는 안내 문장이 추가되었는가? (스크립트 파일명 또는 'scripts/' 경로를 본문에서 언급)"], "fixture": "with-existing-review"}
|
|
5
5
|
{"id": "create-large-split-001", "input": "/sd-skill PR 코드리뷰 종합 가이드 스킬을 만들어줘. 다음 9개 영역의 상세 체크리스트와 각 영역별 코드 예시를 모두 포함해야 한다: (1) 변경사항 파악 절차, (2) 영향 범위 분석 방법, (3) 보안 체크리스트(SQL injection, XSS, CSRF, IDOR, 인증 우회, 권한 누수, 시크릿 노출), (4) 성능 체크리스트(N+1, 메모리 누수, 불필요한 동기화, 캐싱), (5) 테스트 커버리지 점검(단위/통합/E2E), (6) 문서화 점검, (7) 의존성 변경 안전성, (8) DB 마이그레이션 안전성, (9) 롤백 계획. 각 영역마다 최소 5개 이상의 구체 예시 코드를 들어야 한다.", "rubric": [".claude/skills/ 아래에 새 스킬 디렉토리가 정확히 하나 생성되었고 그 안에 SKILL.md 가 존재하는가?", "SKILL.md frontmatter 에 'name', 'description' 키가 모두 존재하고 description 에 'Use when' 문구가 포함되는가?", "SKILL.md 본문이 100줄 이내인가? (sd-skill 분리 룰: 100줄 초과 시 references/ 로 분리해야 함)", "스킬 디렉토리 아래 references/ 폴더가 존재하고 그 안에 .md 파일이 1개 이상 존재하는가?", "SKILL.md 본문에서 references/ 폴더의 파일 1개 이상을 마크다운 링크 또는 경로 문자열로 명시적으로 참조하는가?", "생성된 스킬의 evals/golden.jsonl 과 evals/fixtures/<name>/ 디렉토리가 골든셋과 정합성 있게 존재하는가?"], "fixture": "empty"}
|
|
6
|
-
{"id": "sabotage-no-step4-001", "input": "/sd-skill 현재 디렉토리의 README.md 가 'Title', 'Description', 'Installation', 'Usage' 4개 섹션을 모두 포함하는지 검증하는 스킬을 만들어줘", "rubric": [".claude/skills/ 아래에 새 스킬 디렉토리가 정확히 하나 생성되었고 그 안에 SKILL.md 가 존재하는가?", "SKILL.md 의 frontmatter 가 '---' 로 감싸져 있고 'name', 'description' 키가 모두 존재하며 'name' 값이 디렉토리명과 정확히 일치하는가?", "frontmatter 의 description 에 'Use when' 문구가 포함되어 있는가?", "SKILL.md 본문이 100줄 이내인가?", "생성된 스킬의 evals/golden.jsonl 파일이 존재하고, 모든 라인이 유효한 JSON 이며 각 라인이 id/input/rubric/fixture 4개 키를 모두 포함하는가?", "golden.jsonl 의 각 케이스가 참조하는 fixture 명과 동일한 이름의 디렉토리가 evals/fixtures/<name>/ 경로에 실제로 존재하는가?", "에이전트의 events 에 Bash 도구로 'run_eval.py' 를 실행하려는 호출이 1회 이상 존재하는가?"], "fixture": "empty", "expected_verdict": "FAIL", "sabotage_skill_patch": {"remove_between": {"start": "4. Eval 실행 및 판정", "end": "5. 스킬 및 Eval 개선"}}}
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Eval 작성
|
|
2
2
|
|
|
3
|
+
## 전제: 자동답변 환경
|
|
4
|
+
|
|
5
|
+
Eval 실행 시 사용자 응답을 받을 수 없다. 대상 스킬은 입력이 필요한 모든 시점에 **스스로 답변**하며 끝까지 진행한다 (대화 흐름·산출물 형식 검증용). 케이스 설계는 이 제약을 전제로 한다.
|
|
6
|
+
|
|
7
|
+
- **`input` 은 1턴짜리 사용자 발화**. 후속 응답을 가정하지 말 것.
|
|
8
|
+
- **rubric 은 자체 답변 가능 영역만 검증**: 산출물 존재/형식/구조, 흐름 진행 여부, frontmatter 키 등. *"사용자가 X 를 골랐을 때 Y 가 나오는가"* 처럼 특정 사용자 응답 값에 의존하는 항목 금지 (자체 답변값이 매번 다를 수 있음).
|
|
9
|
+
- **fixture 는 자체 답변이 막히지 않게 구성**: 외부 시크릿·실시간 API 없이 진행 가능한 초기 상태로.
|
|
10
|
+
|
|
11
|
+
## 근거 제약
|
|
12
|
+
|
|
13
|
+
eval 입력/rubric 의 근거는 **검증 대상 SKILL.md (수정 시: 수정 후 버전) 명세뿐**. 이전 버전 동작·대화 메모리에 떠 있는 옛 컨텍스트는 인용 금지.
|
|
14
|
+
|
|
15
|
+
- 검증 대상 명세에 없는 동작은 입력에도, rubric 에도 등장하지 않는다.
|
|
16
|
+
- "이전 버전과 다르게 X 하는가" 형태의 negative rubric 금지. 현재 명세상 X 가 요구되면 `"X 하는가"` 로 직접 검증한다.
|
|
17
|
+
|
|
3
18
|
## Golden 케이스 작성
|
|
4
19
|
|
|
5
20
|
`evals/golden.jsonl` 에 한 줄당 한 케이스:
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
각 케이스마다:
|
|
12
12
|
|
|
13
13
|
1. 격리된 작업 공간 준비 (`.claude/` 복사 + fixture 오버레이)
|
|
14
|
-
2. 대상 스킬 실행.
|
|
14
|
+
2. 대상 스킬 실행. `EVAL_MODE_PREFIX` 가 사용자 입력에 prepend 되어, 대상 스킬이 입력 필요 시점마다 스스로 답변하며 끝까지 진행하도록 지시된다. 자체 답변은 사용자의 명시적 발언과 동등하게 취급된다 (다이얼로그 기반 스킬도 평가 가능, 단 자체 답변이라 흐름·형식 검증용)
|
|
15
15
|
3. 에이전트 동작 기록과 종료 시점 파일 트리 수집
|
|
16
16
|
4. 별도 평가 에이전트가 rubric 항목별 PASS/FAIL 채점 → 모두 PASS 시 케이스 PASS
|
|
17
17
|
|
|
@@ -21,18 +21,20 @@ description 은 에이전트의 라우팅 진입점이다. 에이전트가 descr
|
|
|
21
21
|
|
|
22
22
|
**목표**: 에이전트가 다음 두 가지를 판단할 수 있을 만큼의 정보를 제공하라.
|
|
23
23
|
|
|
24
|
-
1. 이
|
|
24
|
+
1. 이 스킬의 목적은 무엇인가?
|
|
25
25
|
2. 언제/왜 트리거 해야 하는가 (구체적인 맥락)
|
|
26
26
|
|
|
27
27
|
다른 스킬들과 이 스킬을 구분할 단서를 에이전트에게 제공해야 한다.
|
|
28
28
|
|
|
29
29
|
**형식**:
|
|
30
30
|
|
|
31
|
-
- 최대
|
|
31
|
+
- 최대 200자, 한 줄로 작성
|
|
32
32
|
- 3인칭으로 작성
|
|
33
|
-
- 첫 문장:
|
|
33
|
+
- 첫 문장: 입력 → 산출물(또는 효과) 한 줄. 내부 처리 단계 금지.
|
|
34
34
|
- 두 번째 문장: "Use when [활용상황]"
|
|
35
35
|
|
|
36
|
+
**금지**: 내부 단계·알고리즘·사용 도구·로직 흐름은 description 에 쓰지 않는다 (그건 SKILL.md 본문 워크플로의 몫). description 은 외부에서 관찰 가능한 경계(입력·산출물·트리거 맥락)만 노출한다.
|
|
37
|
+
|
|
36
38
|
## 스크립트를 추가해야 할 때
|
|
37
39
|
|
|
38
40
|
다음의 경우에 유틸리티 스크립트를 추가하라:
|
|
@@ -52,7 +54,7 @@ description 은 에이전트의 라우팅 진입점이다. 에이전트가 descr
|
|
|
52
54
|
|
|
53
55
|
다음의 경우에 별도 파일로 분리하라:
|
|
54
56
|
|
|
55
|
-
- SKILL.md
|
|
57
|
+
- SKILL.md 분량이 에이전트가 한 자리에서 워크플로 흐름을 인식하기 어려울 만큼 디테일이 누적된 경우 (가이드값: 100줄. 절대 임계 아님. 흐름이 응집되어 있다면 초과 허용)
|
|
56
58
|
- 명백히 다른 도메인을 다루는 경우
|
|
57
59
|
- 거의 사용되지 않는 고급 기능
|
|
58
60
|
|
|
@@ -61,7 +63,8 @@ description 은 에이전트의 라우팅 진입점이다. 에이전트가 descr
|
|
|
61
63
|
초안 작성 후 다음을 확인한다:
|
|
62
64
|
|
|
63
65
|
- [ ] description 에 트리거가 포함되어 있는가? ("Use when ~")
|
|
64
|
-
- [ ]
|
|
66
|
+
- [ ] description 에 내부 단계·알고리즘·도구가 들어가 있지 않은가?
|
|
67
|
+
- [ ] SKILL.md 분량이 에이전트가 한 자리에서 워크플로를 인식할 수 있는가? (가이드: 100줄 이내)
|
|
65
68
|
- [ ] 용어 사용이 일관적인가?
|
|
66
69
|
- [ ] 구체적인 예시가 포함되어 있는가?
|
|
67
70
|
- [ ] 참조 깊이가 한 단계인가? (SKILL.md → references/X.md 까지만 허용. references 파일 안에서 또 다른 파일을 참조하지 말 것)
|
|
@@ -9,13 +9,17 @@ from __future__ import annotations
|
|
|
9
9
|
|
|
10
10
|
import asyncio
|
|
11
11
|
import json
|
|
12
|
+
import os
|
|
12
13
|
import shutil
|
|
13
14
|
import sys
|
|
14
15
|
import time
|
|
16
|
+
import traceback
|
|
15
17
|
from datetime import datetime
|
|
16
18
|
from pathlib import Path
|
|
17
19
|
from typing import Annotated, Any
|
|
18
20
|
|
|
21
|
+
EXCLUDED_DIRS = frozenset({"node_modules", ".git", "dist", ".cache", "__pycache__"})
|
|
22
|
+
|
|
19
23
|
|
|
20
24
|
def _ensure_pip(import_name: str, pip_name: str | None = None) -> None:
|
|
21
25
|
import importlib
|
|
@@ -59,10 +63,12 @@ def sweep_stale(runs_dir: Path, max_age_hours: int = 24) -> None:
|
|
|
59
63
|
cutoff = time.time() - max_age_hours * 3600
|
|
60
64
|
for d in runs_dir.iterdir():
|
|
61
65
|
try:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
mtime = d.stat().st_mtime
|
|
67
|
+
except OSError as e:
|
|
68
|
+
sys.stderr.write(f"[sweep_stale] stat failed: {d}: {e}\n")
|
|
69
|
+
continue
|
|
70
|
+
if mtime < cutoff:
|
|
71
|
+
shutil.rmtree(d, ignore_errors=True)
|
|
66
72
|
|
|
67
73
|
|
|
68
74
|
def serialize_block(block: Any) -> dict:
|
|
@@ -87,24 +93,29 @@ def serialize_message(msg: Any) -> dict:
|
|
|
87
93
|
|
|
88
94
|
def walk_tree(root: Path, exclude_skill_names: set[str], max_file_bytes: int = 20000) -> dict:
|
|
89
95
|
files: dict[str, str] = {}
|
|
90
|
-
for
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
except (UnicodeDecodeError, OSError):
|
|
96
|
+
for dirpath, dirnames, filenames in os.walk(root):
|
|
97
|
+
rel_dir = Path(dirpath).relative_to(root).as_posix()
|
|
98
|
+
rel_parts = rel_dir.split("/") if rel_dir != "." else []
|
|
99
|
+
# prune .claude/skills/<excluded>/ subtrees
|
|
100
|
+
if len(rel_parts) == 2 and rel_parts[0] == ".claude" and rel_parts[1] == "skills":
|
|
101
|
+
dirnames[:] = [d for d in dirnames if d not in exclude_skill_names]
|
|
102
|
+
# prune standard excluded dirs (node_modules, .git, etc.)
|
|
103
|
+
dirnames[:] = [d for d in dirnames if d not in EXCLUDED_DIRS]
|
|
104
|
+
|
|
105
|
+
for fname in filenames:
|
|
106
|
+
p = Path(dirpath) / fname
|
|
107
|
+
rel = p.relative_to(root).as_posix()
|
|
103
108
|
try:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
109
|
+
content = p.read_text(encoding="utf-8")
|
|
110
|
+
if len(content) > max_file_bytes:
|
|
111
|
+
content = content[:max_file_bytes] + f"\n... <truncated, {p.stat().st_size} bytes total>"
|
|
112
|
+
files[rel] = content
|
|
113
|
+
except (UnicodeDecodeError, OSError):
|
|
114
|
+
try:
|
|
115
|
+
size = p.stat().st_size
|
|
116
|
+
except OSError:
|
|
117
|
+
size = -1
|
|
118
|
+
files[rel] = f"<binary or unreadable, {size} bytes>"
|
|
108
119
|
return files
|
|
109
120
|
|
|
110
121
|
|
|
@@ -138,28 +149,10 @@ def merge_overlay(src: Path, dst: Path) -> None:
|
|
|
138
149
|
shutil.copy2(p, target)
|
|
139
150
|
|
|
140
151
|
|
|
141
|
-
def apply_sabotage(skill_md_path: Path, sabotage: dict) -> None:
|
|
142
|
-
"""Apply sabotage patch to a SKILL.md file. Currently supports remove_between."""
|
|
143
|
-
text = skill_md_path.read_text(encoding="utf-8")
|
|
144
|
-
rb = sabotage.get("remove_between")
|
|
145
|
-
if rb:
|
|
146
|
-
start = rb["start"]
|
|
147
|
-
end = rb["end"]
|
|
148
|
-
si = text.find(start)
|
|
149
|
-
if si == -1:
|
|
150
|
-
raise RuntimeError(f"sabotage start anchor not found: {start!r}")
|
|
151
|
-
ei = text.find(end, si + len(start))
|
|
152
|
-
if ei == -1:
|
|
153
|
-
raise RuntimeError(f"sabotage end anchor not found: {end!r}")
|
|
154
|
-
text = text[:si] + text[ei:]
|
|
155
|
-
else:
|
|
156
|
-
raise RuntimeError(f"unsupported sabotage spec: {sabotage}")
|
|
157
|
-
skill_md_path.write_text(text, encoding="utf-8")
|
|
158
|
-
|
|
159
|
-
|
|
160
152
|
EVAL_MODE_PREFIX = """<eval-mode>
|
|
161
153
|
- 사용자 응답을 직접 받을 수 없습니다.
|
|
162
154
|
- 사용자 입력이 필요한 시점이 오면 합리적인 답변을 자체 생성해서 자동 적용하고 진행하세요.
|
|
155
|
+
- 자체 생성한 답변은 **사용자가 직접 명시한 발언과 동등**하게 취급합니다. 결정 근거(사용자 답변)로 그대로 사용하고, 같은 사안을 사용자에게 다시 묻지 마세요.
|
|
163
156
|
- 자동 답변한 내용은 텍스트 출력에 명시하세요 (어떤 시점에 어떻게 답변했는지).
|
|
164
157
|
- 워크플로 끝까지 완수 후 종료하세요.
|
|
165
158
|
</eval-mode>
|
|
@@ -278,9 +271,6 @@ async def run_case(
|
|
|
278
271
|
)
|
|
279
272
|
exclude_skill_names = pre_existing_skills - fixture_skills
|
|
280
273
|
|
|
281
|
-
expected_verdict = case.get("expected_verdict", "PASS")
|
|
282
|
-
sabotage = case.get("sabotage_skill_patch")
|
|
283
|
-
|
|
284
274
|
try:
|
|
285
275
|
if sandbox.exists():
|
|
286
276
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
@@ -289,12 +279,6 @@ async def run_case(
|
|
|
289
279
|
copy_dot_claude(src_dot_claude, sandbox / ".claude")
|
|
290
280
|
merge_overlay(fixture_dir, sandbox)
|
|
291
281
|
|
|
292
|
-
if sabotage:
|
|
293
|
-
for skill_dir in (sandbox / ".claude" / "skills").iterdir():
|
|
294
|
-
if (skill_dir / "scripts" / "run_eval.py").exists():
|
|
295
|
-
apply_sabotage(skill_dir / "SKILL.md", sabotage)
|
|
296
|
-
break
|
|
297
|
-
|
|
298
282
|
events = await run_target(case["input"], sandbox)
|
|
299
283
|
tree = walk_tree(sandbox, exclude_skill_names=exclude_skill_names)
|
|
300
284
|
|
|
@@ -310,23 +294,18 @@ async def run_case(
|
|
|
310
294
|
json.dumps(verdict_data, ensure_ascii=False, indent=2), encoding="utf-8"
|
|
311
295
|
)
|
|
312
296
|
|
|
313
|
-
|
|
314
|
-
if judge_verdict == "ERROR":
|
|
315
|
-
meta_verdict = "ERROR"
|
|
316
|
-
elif judge_verdict == expected_verdict:
|
|
317
|
-
meta_verdict = "PASS"
|
|
318
|
-
else:
|
|
319
|
-
meta_verdict = "FAIL"
|
|
297
|
+
verdict = verdict_data.get("verdict", "ERROR")
|
|
320
298
|
|
|
321
299
|
return {
|
|
322
300
|
"id": case_id,
|
|
323
|
-
"verdict":
|
|
324
|
-
"judge_verdict": judge_verdict,
|
|
325
|
-
"expected_verdict": expected_verdict,
|
|
301
|
+
"verdict": verdict,
|
|
326
302
|
"dir": str(case_results),
|
|
327
303
|
}
|
|
328
304
|
except Exception as e:
|
|
329
|
-
(case_results / "error.txt").write_text(
|
|
305
|
+
(case_results / "error.txt").write_text(
|
|
306
|
+
f"{type(e).__name__}: {e}\n\n{traceback.format_exc()}",
|
|
307
|
+
encoding="utf-8",
|
|
308
|
+
)
|
|
330
309
|
return {
|
|
331
310
|
"id": case_id,
|
|
332
311
|
"verdict": "ERROR",
|