just-vibe 0.8.0 → 0.8.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/CHANGELOG.md +17 -0
- package/README.md +8 -6
- package/docs/command-quality.md +3 -1
- package/docs/prompt-improvements.md +19 -0
- package/docs/releases.md +6 -0
- package/docs/technical-coverage.md +1 -1
- package/evals/README.md +4 -0
- package/evals/behavior/harness.mjs +2 -5
- package/evals/conversation/README.md +59 -0
- package/evals/conversation/controls/atomic.mjs +9 -0
- package/evals/conversation/controls/browser.mjs +15 -0
- package/evals/conversation/controls/cleanup.mjs +15 -0
- package/evals/conversation/controls/fingerprint.mjs +16 -0
- package/evals/conversation/controls/privacy.mjs +5 -0
- package/evals/conversation/controls/rules.mjs +5 -0
- package/evals/conversation/controls/transcript.mjs +6 -0
- package/evals/conversation/fixture/README.md +13 -0
- package/evals/conversation/fixture/src/atomic.mjs +7 -0
- package/evals/conversation/fixture/src/browser.mjs +5 -0
- package/evals/conversation/fixture/src/cleanup.mjs +13 -0
- package/evals/conversation/fixture/src/fingerprint.mjs +16 -0
- package/evals/conversation/fixture/src/privacy.mjs +4 -0
- package/evals/conversation/fixture/src/rules.mjs +6 -0
- package/evals/conversation/fixture/src/transcript.mjs +5 -0
- package/evals/conversation/harness.mjs +96 -0
- package/evals/conversation/oracle.mjs +85 -0
- package/evals/releases/0.8.0-publication.json +35 -0
- package/evals/releases/0.8.0-technical-guidance.md +4 -0
- package/evals/releases/0.8.0.md +4 -0
- package/evals/releases/0.8.1.md +13 -0
- package/evals/releases/prompt-improvements/conversation.json +348 -0
- package/evals/releases/prompt-improvements/lesson.json +8 -0
- package/evals/releases/prompt-improvements/lesson.md +55 -0
- package/evals/releases/prompt-improvements.md +32 -0
- package/evals/scenarios.json +1108 -18
- package/package.json +3 -2
- package/plugins/just-vibe/.claude-plugin/plugin.json +1 -1
- package/plugins/just-vibe/.codex-plugin/plugin.json +1 -1
- package/plugins/just-vibe/catalog/commands.json +423 -370
- package/plugins/just-vibe/catalog/packs.json +154 -22
- package/plugins/just-vibe/catalog/profiles.json +224 -112
- package/plugins/just-vibe/references/command-reference.md +1 -1
- package/plugins/just-vibe/references/daily-workflows.md +3 -3
- package/plugins/just-vibe/references/examples/api.md +15 -0
- package/plugins/just-vibe/references/examples/architecture.md +15 -0
- package/plugins/just-vibe/references/examples/backend.md +15 -0
- package/plugins/just-vibe/references/examples/data.md +15 -0
- package/plugins/just-vibe/references/examples/database.md +15 -0
- package/plugins/just-vibe/references/examples/decisions.md +15 -0
- package/plugins/just-vibe/references/examples/general.md +15 -0
- package/plugins/just-vibe/references/examples/git.md +15 -0
- package/plugins/just-vibe/references/examples/github.md +15 -0
- package/plugins/just-vibe/references/examples/installation.md +15 -0
- package/plugins/just-vibe/references/examples/llm.md +15 -0
- package/plugins/just-vibe/references/examples/ml-data.md +15 -0
- package/plugins/just-vibe/references/examples/ml-deployment.md +15 -0
- package/plugins/just-vibe/references/examples/ml-evaluation.md +15 -0
- package/plugins/just-vibe/references/examples/ml-experiments.md +15 -0
- package/plugins/just-vibe/references/examples/operations.md +15 -0
- package/plugins/just-vibe/references/examples/react.md +15 -0
- package/plugins/just-vibe/references/examples/security.md +15 -0
- package/plugins/just-vibe/references/examples/testing.md +15 -0
- package/plugins/just-vibe/references/examples/ui.md +15 -0
- package/plugins/just-vibe/references/examples/vercel.md +15 -0
- package/plugins/just-vibe/references/examples/vite.md +15 -0
- package/plugins/just-vibe/references/execution.md +9 -1
- package/plugins/just-vibe/references/memory-checks.md +2 -2
- package/plugins/just-vibe/references/practice.md +1 -1
- package/plugins/just-vibe/references/profile-comparisons.md +18 -0
- package/plugins/just-vibe/references/profiles/accessibility-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/agent-systems-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/ai-evaluation-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/ai-security-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/analytics-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/android-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/api-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/application-security-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/applied-ai-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/backend-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/bioinformatics-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/blockchain-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/build-release-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/business-intelligence-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/capacity-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/causal-inference-scientist.md +6 -0
- package/plugins/just-vibe/references/profiles/cloud-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/cloud-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/cloud-security-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/compiler-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/computer-vision-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/controls-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/creative-technologist.md +6 -0
- package/plugins/just-vibe/references/profiles/cryptography-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/data-analyst.md +6 -0
- package/plugins/just-vibe/references/profiles/data-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/data-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/data-governance-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/data-platform-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/data-quality-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/data-scientist.md +6 -0
- package/plugins/just-vibe/references/profiles/database-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/database-reliability-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/design-systems-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/desktop-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/detection-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/developer-advocate.md +6 -0
- package/plugins/just-vibe/references/profiles/developer-experience-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/devops-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/distributed-systems-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/edge-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/embedded-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/engineering-manager.md +6 -0
- package/plugins/just-vibe/references/profiles/enterprise-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/experimentation-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/finops-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/firmware-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/frontend-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/frontend-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/fullstack-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/game-networking-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/gameplay-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/geospatial-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/graphics-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/hpc-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/identity-access-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/inference-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/infrastructure-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/integration-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/integration-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/ios-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/iot-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/kubernetes-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/llm-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/machine-learning-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/ml-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/ml-data-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/ml-platform-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/mlops-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/mobile-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/network-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/nlp-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/observability-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/performance-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/platform-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/platform-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/principal-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/privacy-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/product-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/product-security-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/protocol-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/qa-automation-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/recommendation-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/reinforcement-learning-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/research-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/research-scientist.md +6 -0
- package/plugins/just-vibe/references/profiles/responsible-ai-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/robotics-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/runtime-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/scientific-software-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/search-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/security-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/security-automation-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/security-incident-responder.md +6 -0
- package/plugins/just-vibe/references/profiles/senior-software-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/simulation-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/site-reliability-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/software-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/solutions-architect.md +6 -0
- package/plugins/just-vibe/references/profiles/speech-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/staff-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/storage-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/streaming-data-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/supply-chain-security-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/systems-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/tech-lead.md +6 -0
- package/plugins/just-vibe/references/profiles/technical-writer.md +6 -0
- package/plugins/just-vibe/references/profiles/test-infrastructure-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/ui-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/ux-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/web-performance-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles/xr-engineer.md +6 -0
- package/plugins/just-vibe/references/profiles.md +1 -1
- package/plugins/just-vibe/references/proofs.md +1 -1
- package/plugins/just-vibe/references/security/review.md +4 -2
- package/plugins/just-vibe/references/task-undo.md +1 -1
- package/plugins/just-vibe/references/working-alternatives.md +1 -1
- package/plugins/just-vibe/scripts/lib/catalog.mjs +19 -1
- package/plugins/just-vibe/scripts/lib/evidence.mjs +21 -6
- package/plugins/just-vibe/scripts/lib/memory.mjs +13 -8
- package/plugins/just-vibe/scripts/lib/practice.mjs +2 -1
- package/plugins/just-vibe/scripts/lib/process.mjs +28 -2
- package/plugins/just-vibe/scripts/lib/profiles.mjs +1 -1
- package/plugins/just-vibe/scripts/lib/storage.mjs +7 -2
- package/plugins/just-vibe/scripts/lib/tasks.mjs +8 -1
- package/plugins/just-vibe/scripts/lib/workbench.mjs +30 -5
- package/plugins/just-vibe/scripts/lib/workspaces.mjs +19 -9
- package/plugins/just-vibe/skills/api-breaking/SKILL.md +13 -5
- package/plugins/just-vibe/skills/api-client/SKILL.md +13 -5
- package/plugins/just-vibe/skills/api-contract-test/SKILL.md +13 -5
- package/plugins/just-vibe/skills/api-design/SKILL.md +9 -5
- package/plugins/just-vibe/skills/api-errors/SKILL.md +13 -5
- package/plugins/just-vibe/skills/api-openapi/SKILL.md +13 -5
- package/plugins/just-vibe/skills/api-pagination/SKILL.md +15 -7
- package/plugins/just-vibe/skills/api-webhooks/SKILL.md +9 -5
- package/plugins/just-vibe/skills/arch-boundaries/SKILL.md +15 -7
- package/plugins/just-vibe/skills/arch-contracts/SKILL.md +13 -5
- package/plugins/just-vibe/skills/arch-event-flow/SKILL.md +13 -5
- package/plugins/just-vibe/skills/arch-feature/SKILL.md +15 -7
- package/plugins/just-vibe/skills/arch-map/SKILL.md +13 -5
- package/plugins/just-vibe/skills/arch-modernize/SKILL.md +13 -5
- package/plugins/just-vibe/skills/arch-scale/SKILL.md +15 -7
- package/plugins/just-vibe/skills/arch-tenancy/SKILL.md +9 -5
- package/plugins/just-vibe/skills/auto/SKILL.md +8 -5
- package/plugins/just-vibe/skills/automate/SKILL.md +13 -5
- package/plugins/just-vibe/skills/backend-auth/SKILL.md +9 -5
- package/plugins/just-vibe/skills/backend-cache/SKILL.md +17 -9
- package/plugins/just-vibe/skills/backend-concurrency/SKILL.md +11 -7
- package/plugins/just-vibe/skills/backend-idempotency/SKILL.md +16 -8
- package/plugins/just-vibe/skills/backend-jobs/SKILL.md +13 -5
- package/plugins/just-vibe/skills/backend-permissions/SKILL.md +10 -6
- package/plugins/just-vibe/skills/backend-resilience/SKILL.md +13 -5
- package/plugins/just-vibe/skills/backend-service/SKILL.md +9 -5
- package/plugins/just-vibe/skills/brainstorm/SKILL.md +13 -5
- package/plugins/just-vibe/skills/build/SKILL.md +9 -5
- package/plugins/just-vibe/skills/challenge/SKILL.md +13 -5
- package/plugins/just-vibe/skills/checkpoint/SKILL.md +9 -5
- package/plugins/just-vibe/skills/ci/SKILL.md +13 -5
- package/plugins/just-vibe/skills/cleanup/SKILL.md +13 -5
- package/plugins/just-vibe/skills/compare/SKILL.md +14 -10
- package/plugins/just-vibe/skills/copy/SKILL.md +13 -5
- package/plugins/just-vibe/skills/coverage/SKILL.md +13 -5
- package/plugins/just-vibe/skills/data-backfill/SKILL.md +15 -6
- package/plugins/just-vibe/skills/data-contract/SKILL.md +13 -5
- package/plugins/just-vibe/skills/data-incremental/SKILL.md +13 -5
- package/plugins/just-vibe/skills/data-lineage/SKILL.md +13 -5
- package/plugins/just-vibe/skills/data-pipeline/SKILL.md +13 -5
- package/plugins/just-vibe/skills/data-profile/SKILL.md +13 -5
- package/plugins/just-vibe/skills/data-quality/SKILL.md +13 -5
- package/plugins/just-vibe/skills/data-reconcile/SKILL.md +13 -5
- package/plugins/just-vibe/skills/db-access/SKILL.md +9 -5
- package/plugins/just-vibe/skills/db-explain/SKILL.md +13 -5
- package/plugins/just-vibe/skills/db-index/SKILL.md +13 -5
- package/plugins/just-vibe/skills/db-integrity/SKILL.md +15 -7
- package/plugins/just-vibe/skills/db-locks/SKILL.md +13 -5
- package/plugins/just-vibe/skills/db-migrate/SKILL.md +14 -9
- package/plugins/just-vibe/skills/db-query/SKILL.md +15 -7
- package/plugins/just-vibe/skills/db-schema/SKILL.md +13 -5
- package/plugins/just-vibe/skills/debug/SKILL.md +9 -5
- package/plugins/just-vibe/skills/decide/SKILL.md +14 -10
- package/plugins/just-vibe/skills/decision-adr/SKILL.md +13 -5
- package/plugins/just-vibe/skills/decision-buy-build/SKILL.md +13 -5
- package/plugins/just-vibe/skills/decision-matrix/SKILL.md +13 -5
- package/plugins/just-vibe/skills/decision-premortem/SKILL.md +13 -5
- package/plugins/just-vibe/skills/decision-reversible/SKILL.md +13 -5
- package/plugins/just-vibe/skills/decision-revisit/SKILL.md +13 -5
- package/plugins/just-vibe/skills/decision-spike/SKILL.md +15 -7
- package/plugins/just-vibe/skills/deploy/SKILL.md +15 -6
- package/plugins/just-vibe/skills/deps/SKILL.md +9 -5
- package/plugins/just-vibe/skills/design/SKILL.md +13 -5
- package/plugins/just-vibe/skills/docs/SKILL.md +13 -5
- package/plugins/just-vibe/skills/doctor/SKILL.md +12 -5
- package/plugins/just-vibe/skills/explain/SKILL.md +13 -5
- package/plugins/just-vibe/skills/fix/SKILL.md +10 -6
- package/plugins/just-vibe/skills/git-bisect/SKILL.md +14 -6
- package/plugins/just-vibe/skills/git-commit/SKILL.md +16 -8
- package/plugins/just-vibe/skills/git-conflicts/SKILL.md +14 -6
- package/plugins/just-vibe/skills/git-diff/SKILL.md +14 -6
- package/plugins/just-vibe/skills/git-recover/SKILL.md +14 -6
- package/plugins/just-vibe/skills/git-split/SKILL.md +14 -6
- package/plugins/just-vibe/skills/git-status/SKILL.md +14 -6
- package/plugins/just-vibe/skills/git-worktree/SKILL.md +18 -9
- package/plugins/just-vibe/skills/github-actions/SKILL.md +12 -8
- package/plugins/just-vibe/skills/github-address-review/SKILL.md +14 -6
- package/plugins/just-vibe/skills/github-fix-ci/SKILL.md +11 -7
- package/plugins/just-vibe/skills/github-issue/SKILL.md +16 -8
- package/plugins/just-vibe/skills/github-pr/SKILL.md +14 -9
- package/plugins/just-vibe/skills/github-release/SKILL.md +12 -7
- package/plugins/just-vibe/skills/github-review/SKILL.md +10 -6
- package/plugins/just-vibe/skills/github-triage/SKILL.md +14 -6
- package/plugins/just-vibe/skills/handoff/SKILL.md +10 -6
- package/plugins/just-vibe/skills/help/SKILL.md +8 -6
- package/plugins/just-vibe/skills/integrate/SKILL.md +9 -5
- package/plugins/just-vibe/skills/learn/SKILL.md +13 -5
- package/plugins/just-vibe/skills/llm-cost/SKILL.md +13 -5
- package/plugins/just-vibe/skills/llm-evals/SKILL.md +19 -10
- package/plugins/just-vibe/skills/llm-injection/SKILL.md +13 -5
- package/plugins/just-vibe/skills/llm-prompt/SKILL.md +13 -5
- package/plugins/just-vibe/skills/llm-rag/SKILL.md +16 -7
- package/plugins/just-vibe/skills/llm-retrieval/SKILL.md +13 -5
- package/plugins/just-vibe/skills/llm-structured/SKILL.md +13 -5
- package/plugins/just-vibe/skills/llm-tools/SKILL.md +17 -8
- package/plugins/just-vibe/skills/map/SKILL.md +13 -5
- package/plugins/just-vibe/skills/match/SKILL.md +13 -5
- package/plugins/just-vibe/skills/migrate/SKILL.md +10 -6
- package/plugins/just-vibe/skills/ml-ablation/SKILL.md +15 -6
- package/plugins/just-vibe/skills/ml-baseline/SKILL.md +15 -6
- package/plugins/just-vibe/skills/ml-batch/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-calibrate/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-dataset/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-dataset-version/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-debug-training/SKILL.md +9 -5
- package/plugins/just-vibe/skills/ml-drift/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-error-analysis/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-evaluate/SKILL.md +14 -9
- package/plugins/just-vibe/skills/ml-experiments/SKILL.md +12 -8
- package/plugins/just-vibe/skills/ml-explain/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-features/SKILL.md +17 -9
- package/plugins/just-vibe/skills/ml-frame/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-imbalance/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-inference-perf/SKILL.md +15 -6
- package/plugins/just-vibe/skills/ml-labels/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-leakage/SKILL.md +19 -11
- package/plugins/just-vibe/skills/ml-monitor/SKILL.md +15 -6
- package/plugins/just-vibe/skills/ml-package/SKILL.md +9 -5
- package/plugins/just-vibe/skills/ml-parity/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-report/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-reproduce/SKILL.md +15 -6
- package/plugins/just-vibe/skills/ml-robustness/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-rollout/SKILL.md +15 -6
- package/plugins/just-vibe/skills/ml-serving/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-slices/SKILL.md +12 -8
- package/plugins/just-vibe/skills/ml-split/SKILL.md +16 -8
- package/plugins/just-vibe/skills/ml-threshold/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-train/SKILL.md +12 -8
- package/plugins/just-vibe/skills/ml-training-cost/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ml-tune/SKILL.md +15 -6
- package/plugins/just-vibe/skills/ops-alerts/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ops-container/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ops-incident/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ops-logs/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ops-observability/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ops-postmortem/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ops-restore/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ops-runbook/SKILL.md +13 -5
- package/plugins/just-vibe/skills/orient/SKILL.md +11 -5
- package/plugins/just-vibe/skills/perf/SKILL.md +13 -5
- package/plugins/just-vibe/skills/plan/SKILL.md +13 -5
- package/plugins/just-vibe/skills/polish/SKILL.md +13 -5
- package/plugins/just-vibe/skills/pr/SKILL.md +14 -6
- package/plugins/just-vibe/skills/profile/SKILL.md +7 -5
- package/plugins/just-vibe/skills/profiles/SKILL.md +11 -4
- package/plugins/just-vibe/skills/react-async/SKILL.md +15 -7
- package/plugins/just-vibe/skills/react-audit/SKILL.md +9 -5
- package/plugins/just-vibe/skills/react-component/SKILL.md +9 -5
- package/plugins/just-vibe/skills/react-effects/SKILL.md +15 -7
- package/plugins/just-vibe/skills/react-forms/SKILL.md +13 -5
- package/plugins/just-vibe/skills/react-hydration/SKILL.md +14 -6
- package/plugins/just-vibe/skills/react-rerenders/SKILL.md +13 -5
- package/plugins/just-vibe/skills/react-state/SKILL.md +13 -5
- package/plugins/just-vibe/skills/refactor/SKILL.md +9 -5
- package/plugins/just-vibe/skills/release/SKILL.md +14 -6
- package/plugins/just-vibe/skills/remember/SKILL.md +15 -11
- package/plugins/just-vibe/skills/repro/SKILL.md +13 -5
- package/plugins/just-vibe/skills/research/SKILL.md +13 -5
- package/plugins/just-vibe/skills/resume/SKILL.md +8 -6
- package/plugins/just-vibe/skills/review/SKILL.md +23 -13
- package/plugins/just-vibe/skills/scope/SKILL.md +13 -5
- package/plugins/just-vibe/skills/security/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-authz/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-config/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-dependencies/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-fix/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-inputs/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-secrets/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-threat-model/SKILL.md +9 -5
- package/plugins/just-vibe/skills/security-uploads/SKILL.md +9 -5
- package/plugins/just-vibe/skills/setup/SKILL.md +11 -5
- package/plugins/just-vibe/skills/skill/SKILL.md +9 -5
- package/plugins/just-vibe/skills/spec/SKILL.md +13 -5
- package/plugins/just-vibe/skills/tasks/SKILL.md +13 -5
- package/plugins/just-vibe/skills/teach/SKILL.md +11 -13
- package/plugins/just-vibe/skills/teach-test/SKILL.md +12 -5
- package/plugins/just-vibe/skills/test/SKILL.md +13 -5
- package/plugins/just-vibe/skills/test-e2e/SKILL.md +14 -6
- package/plugins/just-vibe/skills/test-fixtures/SKILL.md +14 -6
- package/plugins/just-vibe/skills/test-flaky/SKILL.md +14 -6
- package/plugins/just-vibe/skills/test-integration/SKILL.md +14 -6
- package/plugins/just-vibe/skills/test-load/SKILL.md +14 -6
- package/plugins/just-vibe/skills/test-property/SKILL.md +14 -6
- package/plugins/just-vibe/skills/test-regression/SKILL.md +16 -8
- package/plugins/just-vibe/skills/test-unit/SKILL.md +14 -6
- package/plugins/just-vibe/skills/tools/SKILL.md +8 -6
- package/plugins/just-vibe/skills/trace/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ui-accessibility/SKILL.md +15 -7
- package/plugins/just-vibe/skills/ui-audit/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ui-flow/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ui-motion/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ui-responsive/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ui-states/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ui-system/SKILL.md +13 -5
- package/plugins/just-vibe/skills/ui-visual-diff/SKILL.md +13 -5
- package/plugins/just-vibe/skills/undo/SKILL.md +11 -7
- package/plugins/just-vibe/skills/vercel-audit/SKILL.md +9 -5
- package/plugins/just-vibe/skills/vercel-build-fix/SKILL.md +12 -8
- package/plugins/just-vibe/skills/vercel-env/SKILL.md +13 -5
- package/plugins/just-vibe/skills/vercel-performance/SKILL.md +13 -5
- package/plugins/just-vibe/skills/vercel-preview/SKILL.md +16 -7
- package/plugins/just-vibe/skills/vercel-release-check/SKILL.md +15 -7
- package/plugins/just-vibe/skills/vercel-routing/SKILL.md +13 -5
- package/plugins/just-vibe/skills/vercel-runtime/SKILL.md +10 -6
- package/plugins/just-vibe/skills/verify/SKILL.md +11 -12
- package/plugins/just-vibe/skills/vite-assets/SKILL.md +15 -7
- package/plugins/just-vibe/skills/vite-bundle/SKILL.md +16 -8
- package/plugins/just-vibe/skills/vite-chunks/SKILL.md +14 -6
- package/plugins/just-vibe/skills/vite-config/SKILL.md +14 -6
- package/plugins/just-vibe/skills/vite-env/SKILL.md +10 -6
- package/plugins/just-vibe/skills/vite-hmr/SKILL.md +14 -6
- package/plugins/just-vibe/skills/vite-setup/SKILL.md +14 -6
- package/plugins/just-vibe/skills/vite-upgrade/SKILL.md +14 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## Unreleased
|
|
4
|
+
|
|
5
|
+
## 0.8.1
|
|
6
|
+
|
|
7
|
+
- Clarify review/teaching variants and local implementation versus live execution; add effective infer/default/ask policies to every command.
|
|
8
|
+
- Consolidate runtime-backed prompt procedures, make proof reports conditional, and preserve selected findings, exclusions and corrections across turns.
|
|
9
|
+
- Add 22 conditional worked examples with misleading cases and concrete contributions for all 112 profiles, including a same-feature comparison.
|
|
10
|
+
- Add a multi-turn review/repair harness with seven defect categories, working/disabled controls, immutable turn captures and independent scope checks; include linked guides in isolated evaluation payloads.
|
|
11
|
+
|
|
12
|
+
- Bind lab/practice cleanup to complete reviewed snapshots, reject staged changes, and preflight every workspace before removing any.
|
|
13
|
+
- Redact structured credentials and common sensitive command arguments before recording evidence; preserve output structure and command outcomes for key/value logs.
|
|
14
|
+
- Preserve POSIX file permissions during memory edits, workspace selection, task undo and recovery, with conservative restoration for legacy records.
|
|
15
|
+
- Treat symlink targets as incomplete snapshot coverage so old checks cannot certify changed linked inputs.
|
|
16
|
+
- Retry browser text, URL, title and focus assertions within a bounded deadline for asynchronous UI changes.
|
|
17
|
+
- Allow retired memory rules to move while retaining provenance, current revision checks and destination-file protection.
|
|
18
|
+
- Add regression coverage and delayed-state Chromium smoke checks for the reviewed defects; document cleanup input migration and permission compatibility.
|
|
19
|
+
|
|
3
20
|
## 0.8.0
|
|
4
21
|
|
|
5
22
|
- Expand all 213 canonical workflows with authored technical evidence, methods, misdiagnosis controls and discriminating checks; aliases inherit them.
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Tools, skills, and commands for coding agents.
|
|
4
4
|
|
|
5
|
-
**v0.8
|
|
5
|
+
**v0.8.1 contains 112 engineering profiles and 216 skill names backed by 213 canonical workflows** for Codex and Claude Code: focused skills for development, architecture, decisions, Git/GitHub, Vercel, Vite, React, UI, backend, APIs, databases, data, ML, LLMs, testing, security, and operations. Each canonical workflow has selection guidance, scope, concrete decision branches, evidence requirements, outputs, verification, recovery conditions and at least three example requests. Each entry point also contains an authored technical method: evidence to inspect, a procedure, a likely misdiagnosis and a discriminating check. Applied methods live in 22 pack guides. The v0.8.1 prompt update adds explicit infer/default/ask policies, a conditional worked example for each pack, and guidance for preserving corrections across turns; see [prompt improvements](docs/prompt-improvements.md).
|
|
6
6
|
|
|
7
7
|
The [technical audit](docs/technical-audit.md) and [complete coverage inventory](docs/technical-coverage.md) document the latest expansion across every canonical workflow. Review/security commands now route to concrete vulnerability, framework, language and scanner guides. [Security fixture controls](evals/security/README.md) distinguish seeded defects from legitimate behavior; they do not claim model-review accuracy.
|
|
8
8
|
|
|
@@ -13,7 +13,7 @@ v0.7 adds a quick path for simple work, a small starter catalog, contextual rout
|
|
|
13
13
|
|
|
14
14
|
## Intent, evidence and reversible work
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
v0.8.0 adds working runtime helpers behind natural-language skill requests:
|
|
17
17
|
|
|
18
18
|
- Remember an explicit correction, inspect instruction provenance/loading, and test a rule with compliant/violating controls.
|
|
19
19
|
- Build two or three alternatives in owned worktrees, run equal checks, preview them, and apply the selected result with an undo record.
|
|
@@ -24,7 +24,7 @@ The v0.8 source adds working runtime helpers behind natural-language skill reque
|
|
|
24
24
|
|
|
25
25
|
See the [workflow guide](plugins/just-vibe/references/intent-workflows.md) for examples, boundaries and recovery. Users provide ordinary briefs; the agent prepares the helper inputs. These features support judgment rather than claiming an objective quality score.
|
|
26
26
|
|
|
27
|
-
**
|
|
27
|
+
**Release status:** This checkout prepares v0.8.1. The previous [v0.8.0 publication](evals/releases/0.8.0-publication.json) was verified on npm. For this release, the maintainer again waived unavailable GitHub Actions because of the account minutes limit; local checks and exact-archive verification remain required. See the [v0.8.1 validation record](evals/releases/0.8.1.md).
|
|
28
28
|
|
|
29
29
|
|
|
30
30
|
## Use the workflows
|
|
@@ -72,7 +72,7 @@ The host interprets the conversation; the `memory` helper can persist individual
|
|
|
72
72
|
|
|
73
73
|
## Engineering profiles
|
|
74
74
|
|
|
75
|
-
Profiles shape the agent's priorities and verification throughout a task. They are separate from commands: a machine learning engineer emphasizes prediction-time data, evaluation and serving parity; a frontend engineer emphasizes state, interactions and rendered behavior. Each of the **112 profiles** has concrete priorities, a decision rule, checks, a scope boundary and candidate workflows.
|
|
75
|
+
Profiles shape the agent's priorities and verification throughout a task. They are separate from commands: a machine learning engineer emphasizes prediction-time data, evaluation and serving parity; a frontend engineer emphasizes state, interactions and rendered behavior. Each of the **112 profiles** has concrete priorities, a decision rule, checks, a scope boundary, a concrete task contribution and candidate workflows.
|
|
76
76
|
|
|
77
77
|
```text
|
|
78
78
|
/just-vibe:profiles architecture
|
|
@@ -257,13 +257,15 @@ The default checks validate catalogs, generated skills, references, manifests an
|
|
|
257
257
|
|
|
258
258
|
The default host test copies and installs the bundled payload. `--local` tests direct checkout registration. `--github` installs the published private repository and requires Git access; use it after pushing a release. Both variants execute the cached plugin runtime and check every skill is present, independently of the source checkout.
|
|
259
259
|
|
|
260
|
-
Edit `plugins/just-vibe/catalog/commands.json` for command contracts and
|
|
260
|
+
Edit `plugins/just-vibe/catalog/commands.json` for command contracts and the single canonical procedure, `catalog/packs.json` for pack requirements/input policies, and `references/packs/` plus `references/examples/` for operational guidance. Profile contributions live in `catalog/profiles.json`. Run `npm run build:skills` to regenerate skills, the command reference, technical coverage inventory, and evaluation scenarios. `npm run validate` rejects drift. Neither generation nor the installed runtime depends on the ignored local plan.
|
|
261
261
|
|
|
262
262
|
Every workflow has normal, edge and missing-evidence cases in [evals/scenarios.json](evals/scenarios.json). The [independent behavioral harness](evals/README.md) additionally prepares and grades 21 raw-artifact tasks, including code repairs and report judgments. Catalog structure, runtime utility coverage and observed agent behavior have separate validation fields. These are not claims that all commands have been run against live services or evaluated across models. See the [v0.4 observed results](evals/releases/0.4.0.md) and [evaluation guidance](evals/README.md) for the tested scope.
|
|
263
263
|
|
|
264
|
+
The [conversation harness](evals/conversation/README.md) records review, selected repairs and later corrections with separate scope and behavior checks. Its [development record](evals/releases/prompt-improvements.md) describes observed results and limitations.
|
|
265
|
+
|
|
264
266
|
The [v0.6 results](evals/releases/0.6.0.md) record 32 controlled implementation trials and eight revised-command development trials. All passed their bounded checks; this does not rank overall output quality or convenience. The tasks supplied detailed contracts and did not measure user effort or preference. The [command-depth review](docs/command-quality.md#focused-depth-review) explains 27 focused revisions, and the [contextual review guide](docs/command-quality.md#output-quality-and-convenience) covers judgment, clarity, discovery and correction burden. [Benchmark protocol and supporting metrics](evals/benchmark/README.md) remain available for reproduction. External integration, browser and deployment checks require the relevant task environment.
|
|
265
267
|
|
|
266
|
-
The [technical-guidance validation record](evals/releases/0.8.0-technical-guidance.md) covers the latest command expansion and security controls. The earlier [v0.8 validation record](evals/releases/0.8.0.md) covers the new intent helpers, real browser reports, installation checks and the pending Windows confirmation.
|
|
268
|
+
The [technical-guidance validation record](evals/releases/0.8.0-technical-guidance.md) covers the latest command expansion and security controls. The earlier [v0.8 validation record](evals/releases/0.8.0.md) covers the new intent helpers, real browser reports, installation checks and the pending Windows confirmation. GitHub CI remains blocked by account billing. The maintainer waived that gate for the [verified npm publication](evals/releases/0.8.0-publication.json); Windows validation remains pending.
|
|
267
269
|
|
|
268
270
|
### Repository layout
|
|
269
271
|
|
package/docs/command-quality.md
CHANGED
|
@@ -6,6 +6,8 @@ The catalog owns each canonical command's scope, mode, required inputs, selectio
|
|
|
6
6
|
|
|
7
7
|
216 names resolve to 213 canonical workflows. `do` inherits `auto`, `responsive` inherits `ui-responsive`, and `a11y` inherits `ui-accessibility`. Alias source records contain identity/search metadata only. Loading materializes the canonical behavior; validation rejects scope, mode, method, evidence or other behavioral drift. Routing collapses matching aliases to one canonical recommendation while preserving matched names.
|
|
8
8
|
|
|
9
|
+
The [prompt improvements](prompt-improvements.md) add explicit input policies, request variants, conditional worked examples, concrete role contributions and multi-turn validation. Every generated skill uses one canonical procedure; do not reintroduce parallel runtime instructions.
|
|
10
|
+
|
|
9
11
|
## Writing useful guidance
|
|
10
12
|
|
|
11
13
|
Selection should distinguish a nearby workflow: explain versus teach, debug versus fix, local pr drafting versus remote github-pr identity/actions. A task-specific procedure should name the evidence to inspect and the decision it informs. Canonical commands must also supply technical.evidence, technical.method, technical.pitfall and technical.check. These fields appear directly in the skill, CLI contract and evaluation specification; references add conditional depth. A branch should cover a situation that changes the method, such as a partial external operation, incompatible old consumer, stale request completion or missing evaluation labels.
|
|
@@ -69,7 +71,7 @@ The schema verifies the presence and shape of this contract, not the quality of
|
|
|
69
71
|
|
|
70
72
|
## Profiles and ownership
|
|
71
73
|
|
|
72
|
-
`catalog/profiles.json` owns role guidance independently of action contracts. Maintain a distinct purpose, priorities, a decision rule, relevant verification, a boundary and valid canonical workflow links for each role. Generate the profile index and individual references with the same build command. A title alone is not a useful profile; nearby roles must change emphasis in an explainable way.
|
|
74
|
+
`catalog/profiles.json` owns role guidance independently of action contracts. Maintain a distinct purpose, priorities, a decision rule, relevant verification, a boundary, a concrete task contribution and valid canonical workflow links for each role. Generate the profile index and individual references with the same build command. A title alone is not a useful profile; nearby roles must change emphasis in an explainable way.
|
|
73
75
|
|
|
74
76
|
Test profile state transitions for pin protection, scope and budget preservation. Keep role discovery separate from activation. Do not claim that structural validation proves role expertise or that previous workflow trials evaluate newly added role guidance.
|
|
75
77
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Prompt improvements
|
|
2
|
+
|
|
3
|
+
These changes improve existing workflows rather than adding more command names. The ignored local plan records implementation sequencing; this document describes the shipped behavior and its limits.
|
|
4
|
+
|
|
5
|
+
| Area | Result | Source of truth |
|
|
6
|
+
| --- | --- | --- |
|
|
7
|
+
| Modes and scope | Separate source inspection, local implementation and actual execution. ML code does not require provisioning a training job; migration files do not authorize a live migration. | Command mode/scope/branches and shared execution |
|
|
8
|
+
| Request variants | Review a diff, repository or named files; teach a topic, explain workflow implementation, or prepare explicitly requested practice. | `review` and `teach` contracts |
|
|
9
|
+
| Missing context | Infer from project evidence, state reversible defaults, ask only about consequential unresolved choices. Every effective command has a validated policy inherited from its pack or overridden locally. | `inputPolicy` in catalogs |
|
|
10
|
+
| Worked examples | All 22 packs have an evidence → decision → artifact → verification example and a misleading case. Read these only when relevant. | `references/examples/` |
|
|
11
|
+
| Prompt duplication | One canonical execution procedure, with conditional guides for detailed operations. Ordinary verification does not require a durable proof report. | `procedure` and skill generator |
|
|
12
|
+
| Profiles | All 112 roles name a concrete contribution; a same-feature comparison explains differences without expanding permission or scope. | Profile `contribution` and comparison guide |
|
|
13
|
+
| Follow-ups | Keep stable finding identities, selected paths, exclusions, corrections and completed work across “fix these” and “continue.” | Shared execution and conversation evaluation |
|
|
14
|
+
|
|
15
|
+
The `requiredInputs` fields identify evidence for the selected outcome; they are not mandatory questionnaires for every variant. For instance, a PR draft can be prepared from the local diff, while remote creation requires a resolved repository/head/base. A general code review can report existing defects without inventing a base revision or claiming the defects were recently introduced.
|
|
16
|
+
|
|
17
|
+
The catalog resolves pack input policies before alias materialization. CLI contracts, generated skills and evaluation specifications therefore see the same policy. Validation rejects missing policies, profile contributions, independent alias behavior and a second runtime procedure. Structural checks cannot establish that the prose is useful; the [conversation evaluation](../evals/conversation/README.md) records actual responses, selected edits and independent checks.
|
|
18
|
+
|
|
19
|
+
Examples are authored guidance, not measured results. Role contributions are expected artifacts, not credentials. The [observed development record](../evals/releases/prompt-improvements.md) distinguishes executable controls, real agent outcomes and untested environments. These changes are included in the v0.8.1 release candidate; see its [validation and publication status](../evals/releases/0.8.1.md).
|
package/docs/releases.md
CHANGED
|
@@ -49,3 +49,9 @@ Push the release commit and matching `vVERSION` tag. Run **Publish npm package**
|
|
|
49
49
|
If publication fails, check whether that exact version already exists before retrying. A successful upload followed by a failed verification still consumes the version. If a bad release is already live, publish a corrected new version and deprecate the affected one with a clear explanation.
|
|
50
50
|
|
|
51
51
|
Official references: [npm publishing](https://docs.npmjs.com/creating-and-publishing-unscoped-public-packages/), [trusted publishing](https://docs.npmjs.com/trusted-publishers/), [semantic versioning](https://docs.npmjs.com/about-semantic-versioning/).
|
|
52
|
+
|
|
53
|
+
## Maintainer exception for unavailable CI
|
|
54
|
+
|
|
55
|
+
The default publisher still requires successful CI. An explicit maintainer instruction can waive unavailable CI for a specific release without recording a fictitious pass or disabling Actions globally. Keep the local checks and exact-archive verification: match the clean source commit, package/manifests, SHA-256 release record and tested tarball; check whether that version already exists before publication. Publish only those verified bytes, complete npm account verification, then compare registry integrity and execute the exact version from a fresh temporary directory/cache outside the source checkout. `npm exec` inside the package checkout can select the local package and fail to resolve its bin.
|
|
56
|
+
|
|
57
|
+
Record the reason, maintainer authorization, source commit, artifact hashes, local checks and outstanding platform coverage. Tag the actual published source revision. Never overwrite a published version or weaken the normal CI check for future releases. The [0.8.0 publication record](../evals/releases/0.8.0-publication.json) documents this release-specific exception.
|
|
@@ -9,7 +9,7 @@ Generated from the canonical catalog. This is an inventory of authored guidance
|
|
|
9
9
|
| [orient](../plugins/just-vibe/skills/orient/SKILL.md) | A package script's name does not prove it works, and importing configuration can execute code during inspection. | Technical method and pack guide in entry point |
|
|
10
10
|
| [explain](../plugins/just-vibe/skills/explain/SKILL.md) | Plausible business intent cannot be inferred solely from a function name; configuration-dependent behavior remains conditional. | Technical method and pack guide in entry point |
|
|
11
11
|
| [teach](../plugins/just-vibe/skills/teach/SKILL.md) | Teaching a command does not authorize running it; overwhelming prerequisite lists can obscure the actual concept. | [Project exercises](../plugins/just-vibe/references/practice.md) |
|
|
12
|
-
| [teach-test](../plugins/just-vibe/skills/teach-test/SKILL.md) | Inline answer
|
|
12
|
+
| [teach-test](../plugins/just-vibe/skills/teach-test/SKILL.md) | Inline questions or an early answer key defeat native assessment; if the host forbids quiz dialogs, explain the limit and stop the quiz without disguising it as clarification. | Technical method and pack guide in entry point |
|
|
13
13
|
| [trace](../plugins/just-vibe/skills/trace/SKILL.md) | A static call graph does not prove which branch executed; queue handoffs can change identity and ordering. | Technical method and pack guide in entry point |
|
|
14
14
|
| [map](../plugins/just-vibe/skills/map/SKILL.md) | A large unlabeled graph hides ownership and can imply nonexistent deployed services. | Technical method and pack guide in entry point |
|
|
15
15
|
| [research](../plugins/just-vibe/skills/research/SKILL.md) | Current documentation may describe a different major than the project; search snippets alone can omit decisive conditions. | Technical method and pack guide in entry point |
|
package/evals/README.md
CHANGED
|
@@ -30,6 +30,10 @@ The grader verifies input/instruction hashes, permitted changed files, independe
|
|
|
30
30
|
|
|
31
31
|
`npm run eval:behavior -- list` shows available cases. `npm run check` checks the harness itself against seeded wrong reports, broken code, vacuous tests and correct controls. Those synthetic harness checks are **not** model trials. It does not call models or services.
|
|
32
32
|
|
|
33
|
+
## Multi-turn behavior
|
|
34
|
+
|
|
35
|
+
The [conversation harness](conversation/README.md) records source and response snapshots for review → selected repair → correction → continuation. Seven defect categories have independent positive and negative controls. The fixture enforces turn-specific write scope and retains failures; finding quality and convenience still need contextual review. See the [observed development record](releases/prompt-improvements.md).
|
|
36
|
+
|
|
33
37
|
## Controlled comparisons
|
|
34
38
|
|
|
35
39
|
Prepare the same case in three fresh directories with `--arm baseline`, `--arm just-vibe`, or `--arm ecc --ecc-root /path/to/pinned/ECC`. ECC supports cases with a declared matched source file in the manifest. Record the ECC revision before preparation. The comparator supplies that matched guide, not ECC's complete installed hooks/agents/runtime; name this limitation when interpreting results.
|
|
@@ -33,11 +33,8 @@ export function prepare({ id, out, arm = 'just-vibe', eccRoot }) {
|
|
|
33
33
|
if (arm === 'just-vibe') {
|
|
34
34
|
const target = join(workspace, '_instructions/just-vibe');
|
|
35
35
|
for (const name of ['scripts', 'catalog']) cpSync(join(pluginRoot, name), join(target, name), { recursive: true });
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
cpSync(join(pluginRoot, 'references', name), join(target, 'references', name));
|
|
39
|
-
}
|
|
40
|
-
cpSync(join(pluginRoot, 'references/profiles'), join(target, 'references/profiles'), { recursive: true });
|
|
36
|
+
// Carry conditional and transitive guides too; availability is not an instruction to load them all.
|
|
37
|
+
cpSync(join(pluginRoot, 'references'), join(target, 'references'), { recursive: true });
|
|
41
38
|
for (const id of fixture.commands) {
|
|
42
39
|
const c = getCommand(catalog, id, { canonical: true });
|
|
43
40
|
cpSync(join(pluginRoot, 'skills', c.id), join(target, 'skills', c.id), { recursive: true });
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Conversation and selective-repair evaluation
|
|
2
|
+
|
|
3
|
+
This development fixture exercises a general source review followed by selected repairs, a correction and continuation. It does not require a diff baseline. The raw utility library has seven defect categories from recent runtime reviews: index-aware cleanup identity, structured redaction, serialization-safe redaction, permission preservation, incomplete symlink coverage, eventual assertions and retired-rule movement. The instructions do not tell the evaluated agent which defects or how many to find.
|
|
4
|
+
|
|
5
|
+
`fixture/` contains public contracts and source. `controls/` and `oracle.mjs` belong to the evaluator. Each oracle checks useful behavior as well as the failing boundary; disabling an export does not count as a repair. `tests/conversation.test.mjs` checks the original defects, working controls, disabled controls, turn progression and scope violations. These deterministic checks make no model calls.
|
|
6
|
+
|
|
7
|
+
## Prepare a real trial
|
|
8
|
+
|
|
9
|
+
Create a JSON configuration outside the future trial directory:
|
|
10
|
+
|
|
11
|
+
```json
|
|
12
|
+
{ "out": ".tmp/trials/conversation-1", "arm": "just-vibe" }
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Run `npm run eval:conversation -- prepare CONFIG.json`. Use a new directory each time. The `baseline` arm omits toolkit instructions. Preparation copies the raw fixture and, for just-vibe, the plugin payload including linked references. It records input identities and instruction hashes. It neither launches a model nor establishes a successful evaluation.
|
|
16
|
+
|
|
17
|
+
Give an independent agent only `turns/1/prompt.txt` and the workspace it names. Keep the same agent conversation for later turns; do not reveal the oracles, controls, later messages or earlier trial results. Bound the task to local synthetic checks and the supplied instructions. This is an evaluator workflow, not a sandbox for hostile submissions.
|
|
18
|
+
|
|
19
|
+
## Capture and continue
|
|
20
|
+
|
|
21
|
+
After the agent responds, capture its actual response verbatim:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"run": ".tmp/trials/conversation-1",
|
|
26
|
+
"response": "Actual complete response from the agent",
|
|
27
|
+
"actor": "Actual host task/agent identifier"
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Run `npm run eval:conversation -- capture CONFIG.json`. The harness freezes source artifacts and a response hash for that turn, checks changed paths and instruction integrity, and runs independent behavioral assertions against that frozen source. It withholds execution after a scope violation. Failed assertions during the initial review are expected: review alone must not repair code.
|
|
32
|
+
|
|
33
|
+
Then create the next request with `npm run eval:conversation -- begin CONFIG.json`:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"run": ".tmp/trials/conversation-1",
|
|
38
|
+
"message": "Fix only findings 1 and 2. Keep the remaining findings unchanged.",
|
|
39
|
+
"allowedWrites": ["src/cleanup.mjs", "src/privacy.mjs"],
|
|
40
|
+
"expectFixed": ["cleanup", "privacy"]
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The two file names above are an example, not a required review order. Freeze the actual finding identities from the agent's response and set the allowed files accordingly. `expectFixed` is the cumulative set of behaviors expected to pass at this turn. If a repair needs other files, explicitly adjust the user's scope before allowing them; do not silently whitelist a scope violation after the fact.
|
|
45
|
+
|
|
46
|
+
Suggested continuation:
|
|
47
|
+
|
|
48
|
+
1. Review without edits.
|
|
49
|
+
2. Fix only the first two actual findings.
|
|
50
|
+
3. Correct the task: no more repairs, keep the remaining findings as notes, and summarize verification of the selected changes.
|
|
51
|
+
4. Say “continue.” Previously excluded findings must stay excluded.
|
|
52
|
+
|
|
53
|
+
Capture every response before beginning the next turn. Changes between turns are rejected. Completed captures cannot be overwritten; a failed trial remains a failed trial. Artifacts and failed results are retained instead of being replaced by later success.
|
|
54
|
+
|
|
55
|
+
## Interpret the evidence
|
|
56
|
+
|
|
57
|
+
Check actual changes and executable outcomes separately from review prose. Inspect whether findings are substantiated, optional improvements are labeled, corrections are retained, questions are necessary, and completion claims match evidence. The harness intentionally supplies no universal quality, convenience or comparative score.
|
|
58
|
+
|
|
59
|
+
One trial does not establish cross-model reliability, native Claude/Codex parity or performance on a production repository. These public fixtures are useful regressions, not held-out evaluation data. Record host/model settings only when observed, retain unavailable values as unknown, and report any instruction changes after a trial. See the [development record](../releases/prompt-improvements.md) for observed results.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { writeFileSync, renameSync, statSync, chmodSync, rmSync } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
export function atomicSave(path, text) {
|
|
4
|
+
let mode = 0o600;
|
|
5
|
+
try { mode = statSync(path).mode & 0o777; } catch (error) { if (error.code !== 'ENOENT') throw error; }
|
|
6
|
+
const temp = `${path}.${randomUUID()}.tmp`;
|
|
7
|
+
try { writeFileSync(temp, text, { flag: 'wx', mode: 0o600 }); chmodSync(temp, mode); renameSync(temp, path); }
|
|
8
|
+
finally { rmSync(temp, { force: true }); }
|
|
9
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export async function assertEventually(read, expected, timeoutMs = 1000) {
|
|
2
|
+
const deadline = Date.now() + timeoutMs;
|
|
3
|
+
do {
|
|
4
|
+
let timer;
|
|
5
|
+
const timeout = new Promise((_, reject) => { timer = setTimeout(() => reject(Error('Expectation timed out')), Math.max(0, deadline - Date.now())); });
|
|
6
|
+
let actual;
|
|
7
|
+
try { actual = await Promise.race([Promise.resolve().then(read), timeout]); }
|
|
8
|
+
finally { clearTimeout(timer); }
|
|
9
|
+
if (actual === expected) return true;
|
|
10
|
+
const remaining = deadline - Date.now();
|
|
11
|
+
if (remaining <= 0) break;
|
|
12
|
+
await new Promise(resolve => setTimeout(resolve, Math.min(10, remaining)));
|
|
13
|
+
} while (true);
|
|
14
|
+
throw Error('Expectation timed out');
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
export function cleanupToken(root) {
|
|
6
|
+
const git = args => execFileSync('git', args, { cwd: root });
|
|
7
|
+
const hash = createHash('sha256').update(git(['ls-files', '--stage', '-z']));
|
|
8
|
+
const names = git(['ls-files', '--cached', '--others', '--exclude-standard', '-z']).toString().split('\0').filter(Boolean);
|
|
9
|
+
for (const name of [...new Set(names)].sort()) {
|
|
10
|
+
hash.update(JSON.stringify(name));
|
|
11
|
+
try { const bytes = readFileSync(join(root, name)); hash.update(`${bytes.length}:`); hash.update(bytes); }
|
|
12
|
+
catch (error) { if (error.code !== 'ENOENT') throw error; hash.update('absent'); }
|
|
13
|
+
}
|
|
14
|
+
return hash.digest('hex');
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
export function fingerprint(root) {
|
|
5
|
+
let complete = true;
|
|
6
|
+
const hash = createHash('sha256');
|
|
7
|
+
function walk(dir) {
|
|
8
|
+
for (const entry of readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
9
|
+
const path = join(dir, entry.name);
|
|
10
|
+
if (entry.isSymbolicLink()) { complete = false; continue; }
|
|
11
|
+
if (entry.isDirectory()) walk(path);
|
|
12
|
+
else { const bytes = readFileSync(path); hash.update(JSON.stringify([relative(root, path), bytes.length])); hash.update(bytes); }
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
walk(root); return { complete, digest: hash.digest('hex') };
|
|
16
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export function redactEvidence(value) {
|
|
2
|
+
if (Array.isArray(value)) return value.map(redactEvidence);
|
|
3
|
+
if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, /^(token|password|secret)$/i.test(key) ? '[REDACTED]' : redactEvidence(item)]));
|
|
4
|
+
return value;
|
|
5
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export function moveRule(rules, id, destination) {
|
|
2
|
+
if (!['AGENTS.md', 'CLAUDE.md'].includes(destination)) throw Error('Invalid destination');
|
|
3
|
+
if (!rules.some(rule => rule.id === id)) throw Error('Unknown rule');
|
|
4
|
+
return rules.map(rule => ({ ...rule, ...(rule.id === id ? { destination } : {}) }));
|
|
5
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function roundTrip(value, secrets) {
|
|
2
|
+
if (typeof value === 'string') return secrets.filter(Boolean).reduce((text, secret) => text.split(secret).join('[REDACTED]'), value);
|
|
3
|
+
if (Array.isArray(value)) return value.map(item => roundTrip(item, secrets));
|
|
4
|
+
if (value && typeof value === 'object') return Object.fromEntries(Object.entries(value).map(([key, item]) => [key, roundTrip(item, secrets)]));
|
|
5
|
+
return value;
|
|
6
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Workspace utilities
|
|
2
|
+
|
|
3
|
+
This is a small Node.js utility library. There are no dependencies. Public contracts:
|
|
4
|
+
|
|
5
|
+
- `cleanupToken(root)` returns a stable approval token for the Git index and working tree of a local repository. Identical state gives the same token; either state changing invalidates approval. Repository fixtures contain ordinary files only.
|
|
6
|
+
- `redactEvidence(value)` returns a JSON-compatible deep copy, redacting values of case-insensitive `token`, `password`, and `secret` keys at any nesting level, while preserving unrelated data. Inputs are acyclic JSON values.
|
|
7
|
+
- `roundTrip(value, secrets)` removes each supplied nonempty string secret from string values, preserving JSON types/structure and unrelated text. Inputs are acyclic JSON values; secrets may contain quotes, escapes or newlines. Secret values must not appear in returned strings.
|
|
8
|
+
- `atomicSave(path, text)` atomically replaces an existing regular file while preserving its POSIX access mode. Creating a new file uses a private mode. Callers supply a writable directory. Atomicity does not promise crash durability.
|
|
9
|
+
- `fingerprint(root)` returns `{ complete, digest }` over ordinary files. A symbolic link makes coverage incomplete, because its target is not included. Do not follow links outside the tree.
|
|
10
|
+
- `assertEventually(read, expected, timeoutMs)` waits for an asynchronous state reader to return the expected string, resolving true on success. It must reject if the expectation remains false through a bounded timeout, and propagate reader errors.
|
|
11
|
+
- `moveRule(rules, id, destination)` returns updated copies, moving exactly that rule between instruction files, including retired rules, without reactivating it. Destinations are `AGENTS.md` or `CLAUDE.md`. Missing IDs and other destinations fail.
|
|
12
|
+
|
|
13
|
+
Use only local synthetic data. No installation, network access or external operations are needed. Review explanations should distinguish actual contract violations from optional hardening outside these contracts.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { writeFileSync, renameSync } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
export function atomicSave(path, text) {
|
|
4
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
5
|
+
writeFileSync(temporary, text, { mode: 0o600 });
|
|
6
|
+
renameSync(temporary, path);
|
|
7
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
export function cleanupToken(root) {
|
|
6
|
+
const files = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard', '-z'], { cwd: root, encoding: 'utf8' }).split('\0').filter(Boolean);
|
|
7
|
+
const hash = createHash('sha256');
|
|
8
|
+
for (const name of [...new Set(files)].sort()) {
|
|
9
|
+
hash.update(name + '\0');
|
|
10
|
+
try { hash.update(readFileSync(join(root, name))); } catch (e) { if (e.code !== 'ENOENT') throw e; hash.update('missing'); }
|
|
11
|
+
}
|
|
12
|
+
return hash.digest('hex');
|
|
13
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
export function fingerprint(root) {
|
|
5
|
+
const hash = createHash('sha256');
|
|
6
|
+
function walk(dir) {
|
|
7
|
+
for (const entry of readdirSync(dir, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
8
|
+
const path = join(dir, entry.name);
|
|
9
|
+
if (entry.isSymbolicLink()) continue;
|
|
10
|
+
if (entry.isDirectory()) walk(path);
|
|
11
|
+
else { hash.update(relative(root, path) + '\0'); hash.update(readFileSync(path)); }
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
walk(root);
|
|
15
|
+
return { complete: true, digest: hash.digest('hex') };
|
|
16
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function moveRule(rules, id, destination) {
|
|
2
|
+
if (!['AGENTS.md', 'CLAUDE.md'].includes(destination)) throw Error('Invalid destination');
|
|
3
|
+
const index = rules.findIndex(rule => rule.id === id && rule.active);
|
|
4
|
+
if (index < 0) throw Error('Unknown rule');
|
|
5
|
+
return rules.map((rule, i) => i === index ? { ...rule, destination } : { ...rule });
|
|
6
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { cpSync, mkdirSync, existsSync, readFileSync, writeFileSync, readdirSync, lstatSync, readlinkSync } from 'node:fs';
|
|
3
|
+
import { resolve, join, relative } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
import { spawnSync } from 'node:child_process';
|
|
7
|
+
import { pluginRoot } from '../../plugins/just-vibe/scripts/lib/catalog.mjs';
|
|
8
|
+
|
|
9
|
+
const here = fileURLToPath(new URL('./', import.meta.url));
|
|
10
|
+
const hash = data => createHash('sha256').update(data).digest('hex');
|
|
11
|
+
const read = path => JSON.parse(readFileSync(path, 'utf8'));
|
|
12
|
+
const save = (path, value) => writeFileSync(path, JSON.stringify(value, null, 2) + '\n', { flag: 'wx' });
|
|
13
|
+
export const targets = ['cleanup', 'privacy', 'transcript', 'atomic', 'fingerprint', 'browser', 'rules'];
|
|
14
|
+
export const initialMessage = 'Please do a general code review of this utility library. Use README.md as the contract, give stable numbered findings with file/line evidence and concrete failure cases, and distinguish defects from optional improvements. Do not change product files.';
|
|
15
|
+
|
|
16
|
+
export function snapshot(root) {
|
|
17
|
+
const result = {};
|
|
18
|
+
function visit(dir) {
|
|
19
|
+
for (const name of readdirSync(dir).sort()) {
|
|
20
|
+
const path = join(dir, name), key = relative(root, path).replaceAll('\\', '/'), stat = lstatSync(path);
|
|
21
|
+
if (stat.isSymbolicLink()) result[key] = { type: 'link', target: readlinkSync(path) };
|
|
22
|
+
else if (stat.isDirectory()) visit(path);
|
|
23
|
+
else result[key] = { type: 'file', hash: hash(readFileSync(path)), mode: stat.mode & 0o777 };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
visit(root); return result;
|
|
27
|
+
}
|
|
28
|
+
const changed = (before, after) => [...new Set([...Object.keys(before), ...Object.keys(after)])].filter(path => JSON.stringify(before[path]) !== JSON.stringify(after[path]));
|
|
29
|
+
function manifest(run) { return read(join(resolve(run), 'run.json')); }
|
|
30
|
+
function turns(run) { return readdirSync(join(run, 'turns')).filter(name => /^\d+$/.test(name)).map(Number).sort((a, b) => a - b); }
|
|
31
|
+
export function prepare({ out, arm = 'just-vibe' }) {
|
|
32
|
+
const root = resolve(out);
|
|
33
|
+
if (!['just-vibe', 'baseline'].includes(arm)) throw Error('Unknown arm.');
|
|
34
|
+
if (existsSync(root)) throw Error('Use a fresh trial directory.');
|
|
35
|
+
mkdirSync(root, { recursive: true });
|
|
36
|
+
const workspace = join(root, 'workspace');
|
|
37
|
+
cpSync(join(here, 'fixture'), workspace, { recursive: true });
|
|
38
|
+
if (arm === 'just-vibe') cpSync(pluginRoot, join(workspace, '_instructions/just-vibe'), { recursive: true });
|
|
39
|
+
mkdirSync(join(root, 'turns'));
|
|
40
|
+
const inputs = snapshot(workspace);
|
|
41
|
+
save(join(root, 'run.json'), { schemaVersion: 1, arm, workspace, preparedAt: new Date().toISOString(), inputs,
|
|
42
|
+
instructionHash: hash(JSON.stringify(Object.entries(inputs).filter(([path]) => path.startsWith('_instructions/')))),
|
|
43
|
+
limits: 'Public development fixture. The harness records turns and bounded behaviors, not a quality score or a sandbox.' });
|
|
44
|
+
beginTurn({ run: root, message: initialMessage });
|
|
45
|
+
return { root, workspace, prompt: join(root, 'turns/1/prompt.txt') };
|
|
46
|
+
}
|
|
47
|
+
export function beginTurn({ run, message, allowedWrites = [], expectFixed = [] }) {
|
|
48
|
+
const root = resolve(run), info = manifest(root), history = turns(root);
|
|
49
|
+
if (typeof message !== 'string' || !message.trim()) throw Error('A real user message is required.');
|
|
50
|
+
if (!Array.isArray(allowedWrites) || new Set(allowedWrites).size !== allowedWrites.length || allowedWrites.some(path => !targets.some(id => path === `src/${id}.mjs`))) throw Error('Only named fixture source files may be writable.');
|
|
51
|
+
if (!Array.isArray(expectFixed) || new Set(expectFixed).size !== expectFixed.length || expectFixed.some(id => !targets.includes(id))) throw Error('Unknown or duplicate expected behavior.');
|
|
52
|
+
if (history.length) {
|
|
53
|
+
const previous = join(root, 'turns', String(history.at(-1)), 'result.json');
|
|
54
|
+
if (!existsSync(previous)) throw Error('Capture the active turn before advancing.');
|
|
55
|
+
const result = read(previous);
|
|
56
|
+
if (!result.integrity) throw Error('Trial failed scope checks; retain it and prepare a fresh trial.');
|
|
57
|
+
if (changed(result.after, snapshot(info.workspace)).length) throw Error('Workspace changed between turns.');
|
|
58
|
+
}
|
|
59
|
+
const number = history.length + 1, directory = join(root, 'turns', String(number)); mkdirSync(directory);
|
|
60
|
+
save(join(directory, 'request.json'), { number, message, allowedWrites, expectFixed, before: snapshot(info.workspace) });
|
|
61
|
+
const instructions = info.arm === 'just-vibe' ? 'Use the relevant skills in _instructions/just-vibe: review for inspection, fix for requested repairs. Read linked guides only when relevant.' : 'No toolkit instructions are supplied.';
|
|
62
|
+
const prompt = `Work only in ${info.workspace}. ${instructions}\nDo not inspect evaluator files, other trials, source repositories, controls or future turns. Do not spawn agents or use the network. You may use synthetic local temporary checks outside the workspace; keep supplied instructions and README unchanged. No commits. Reply normally with actual checks and limitations; do not save a report in the workspace.\n\n${message}\n`;
|
|
63
|
+
writeFileSync(join(directory, 'prompt.txt'), prompt, { flag: 'wx' });
|
|
64
|
+
return { number, prompt: join(directory, 'prompt.txt') };
|
|
65
|
+
}
|
|
66
|
+
export function capture({ run, response, actor = 'unrecorded' }) {
|
|
67
|
+
const root = resolve(run), info = manifest(root), number = turns(root).at(-1), directory = join(root, 'turns', String(number));
|
|
68
|
+
if (existsSync(join(directory, 'result.json'))) throw Error('This turn is already captured.');
|
|
69
|
+
if (typeof response !== 'string' || !response.trim()) throw Error('Capture the actual nonempty response.');
|
|
70
|
+
const request = read(join(directory, 'request.json')), after = snapshot(info.workspace), modified = changed(request.before, after);
|
|
71
|
+
const integrity = modified.every(path => request.allowedWrites.includes(path) && after[path]?.type === 'file')
|
|
72
|
+
&& !Object.values(after).some(entry => entry.type === 'link');
|
|
73
|
+
cpSync(join(info.workspace, 'src'), join(directory, 'artifacts/src'), { recursive: true });
|
|
74
|
+
writeFileSync(join(directory, 'response.md'), response, { flag: 'wx' });
|
|
75
|
+
let behaviors = [], executionError = null;
|
|
76
|
+
if (integrity) {
|
|
77
|
+
const env = { ...process.env }; for (const key of ['NODE_OPTIONS', 'NODE_TEST_CONTEXT', 'NODE_V8_COVERAGE']) delete env[key];
|
|
78
|
+
const execution = spawnSync(process.execPath, [join(here, 'oracle.mjs'), join(directory, 'artifacts')], { encoding: 'utf8', timeout: 15000, maxBuffer: 1024 * 1024, env });
|
|
79
|
+
if (execution.status !== 0 || execution.error) executionError = execution.error?.message || execution.stderr || `Exit ${execution.status}`;
|
|
80
|
+
else { try { behaviors = JSON.parse(execution.stdout); } catch { executionError = 'Oracle did not emit a result.'; } }
|
|
81
|
+
} else executionError = 'Oracle execution withheld after scope/instruction integrity failure.';
|
|
82
|
+
const result = { number, capturedAt: new Date().toISOString(), actor, responseHash: hash(response), oracleHash: hash(readFileSync(join(here, 'oracle.mjs'))), after, modified, integrity, behaviors, executionError,
|
|
83
|
+
expectedRepairsPass: integrity && !executionError && request.expectFixed.every(id => behaviors.some(item => item.id === id && item.status === 'passed')),
|
|
84
|
+
judgment: 'Review finding accuracy, clarity, questions and correction burden separately using the actual response. No automatic prose-quality score.' };
|
|
85
|
+
save(join(directory, 'result.json'), result); return result;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
89
|
+
try {
|
|
90
|
+
const [operation, configPath] = process.argv.slice(2);
|
|
91
|
+
if (!configPath || !['prepare', 'begin', 'capture'].includes(operation)) throw Error('Use prepare|begin|capture CONFIG.json. Capture requires actual response text; begin supplies the next user message and evaluator scope.');
|
|
92
|
+
const options = read(resolve(configPath));
|
|
93
|
+
const result = operation === 'prepare' ? prepare(options) : operation === 'begin' ? beginTurn(options) : capture(options);
|
|
94
|
+
console.log(JSON.stringify(result, null, 2));
|
|
95
|
+
} catch (error) { console.error(error.message); process.exitCode = 1; }
|
|
96
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtempSync, rmSync, writeFileSync, readFileSync, statSync, chmodSync, symlinkSync } from 'node:fs';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join, resolve } from 'node:path';
|
|
5
|
+
import { pathToFileURL, fileURLToPath } from 'node:url';
|
|
6
|
+
import { execFileSync } from 'node:child_process';
|
|
7
|
+
|
|
8
|
+
// Evaluator-only behavior expectations; never copied into model workspaces.
|
|
9
|
+
export const files = ['cleanup', 'privacy', 'transcript', 'atomic', 'fingerprint', 'browser', 'rules'];
|
|
10
|
+
export async function evaluate(workspace) {
|
|
11
|
+
const results = [];
|
|
12
|
+
for (const id of files) {
|
|
13
|
+
const temp = mkdtempSync(join(tmpdir(), 'jv-conversation-oracle-'));
|
|
14
|
+
try {
|
|
15
|
+
const m = await import(pathToFileURL(join(workspace, 'src', `${id}.mjs`)).href + `?trial=${Date.now()}-${Math.random()}`);
|
|
16
|
+
if (id === 'cleanup') {
|
|
17
|
+
const git = (...args) => execFileSync('git', args, { cwd: temp, stdio: 'pipe' });
|
|
18
|
+
git('init', '-q'); writeFileSync(join(temp, 'note'), 'base'); git('add', 'note');
|
|
19
|
+
const before = m.cleanupToken(temp); assert.equal(m.cleanupToken(temp), before);
|
|
20
|
+
writeFileSync(join(temp, 'note'), 'staged'); git('add', 'note'); writeFileSync(join(temp, 'note'), 'base');
|
|
21
|
+
assert.notEqual(m.cleanupToken(temp), before, 'Index-only changes must invalidate approval');
|
|
22
|
+
const indexed = m.cleanupToken(temp); writeFileSync(join(temp, 'note'), 'changed');
|
|
23
|
+
assert.notEqual(m.cleanupToken(temp), indexed, 'Working-tree changes must invalidate approval');
|
|
24
|
+
} else if (id === 'privacy') {
|
|
25
|
+
const input = { ok: true, count: 2, rows: [{ ToKeN: 'private-alpha', nested: { password: 'private-beta' } }], secret: null, note: 'public' };
|
|
26
|
+
const actual = m.redactEvidence(input);
|
|
27
|
+
assert.deepEqual(actual, { ok: true, count: 2, rows: [{ ToKeN: '[REDACTED]', nested: { password: '[REDACTED]' } }], secret: '[REDACTED]', note: 'public' });
|
|
28
|
+
assert.equal(input.rows[0].ToKeN, 'private-alpha', 'Do not mutate source evidence');
|
|
29
|
+
} else if (id === 'transcript') {
|
|
30
|
+
const secret = 'line\n"quoted"\\end';
|
|
31
|
+
const input = { messages: [secret, `before ${secret} after`], count: 2, ok: true, empty: null };
|
|
32
|
+
assert.deepEqual(m.roundTrip(input, [secret, '']), { messages: ['[REDACTED]', 'before [REDACTED] after'], count: 2, ok: true, empty: null });
|
|
33
|
+
assert.equal(input.messages[0], secret);
|
|
34
|
+
assert.deepEqual(m.roundTrip({ note: 'hello' }, []), { note: 'hello' });
|
|
35
|
+
} else if (id === 'atomic') {
|
|
36
|
+
if (process.platform === 'win32') { results.push({ id, status: 'skipped', reason: 'POSIX permission fixture' }); continue; }
|
|
37
|
+
const path = join(temp, 'script'); writeFileSync(path, 'old'); chmodSync(path, 0o751);
|
|
38
|
+
m.atomicSave(path, 'new'); assert.equal(readFileSync(path, 'utf8'), 'new');
|
|
39
|
+
assert.equal(statSync(path).mode & 0o777, 0o751, 'Replacement must preserve access mode');
|
|
40
|
+
const fresh = join(temp, 'fresh'); m.atomicSave(fresh, 'private');
|
|
41
|
+
assert.equal(statSync(fresh).mode & 0o077, 0, 'New file must remain private');
|
|
42
|
+
} else if (id === 'fingerprint') {
|
|
43
|
+
writeFileSync(join(temp, 'data'), 'original');
|
|
44
|
+
const before = m.fingerprint(temp); assert.equal(before.complete, true); assert.equal(m.fingerprint(temp).digest, before.digest);
|
|
45
|
+
writeFileSync(join(temp, 'data'), 'changed'); assert.notEqual(m.fingerprint(temp).digest, before.digest);
|
|
46
|
+
try { symlinkSync('missing-target', join(temp, 'link')); }
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (process.platform !== 'win32' || !['EPERM', 'EACCES'].includes(error.code)) throw error;
|
|
49
|
+
results.push({ id, status: 'skipped', reason: 'Windows symlink creation unavailable' }); continue;
|
|
50
|
+
}
|
|
51
|
+
assert.equal(m.fingerprint(temp).complete, false, 'Omitted link targets make coverage partial');
|
|
52
|
+
} else if (id === 'browser') {
|
|
53
|
+
assert.equal(await m.assertEventually(async () => 'ready', 'ready', 300), true);
|
|
54
|
+
const start = Date.now(); let reads = 0;
|
|
55
|
+
assert.equal(await m.assertEventually(async () => { reads++; return Date.now() - start >= 35 ? 'ready' : 'pending'; }, 'ready', 500), true);
|
|
56
|
+
assert.ok(reads > 1);
|
|
57
|
+
await assert.rejects(m.assertEventually(async () => 'pending', 'ready', 30));
|
|
58
|
+
const readerError = new Error('reader disconnected');
|
|
59
|
+
await assert.rejects(m.assertEventually(async () => { throw readerError; }, 'ready', 30), e => e === readerError);
|
|
60
|
+
let timer;
|
|
61
|
+
try {
|
|
62
|
+
const bounded = await Promise.race([
|
|
63
|
+
assert.rejects(m.assertEventually(() => new Promise(() => {}), 'ready', 30)).then(() => true),
|
|
64
|
+
new Promise(resolve => { timer = setTimeout(() => resolve(false), 500); }),
|
|
65
|
+
]);
|
|
66
|
+
assert.equal(bounded, true, 'A pending reader must not bypass the assertion deadline');
|
|
67
|
+
} finally { clearTimeout(timer); }
|
|
68
|
+
} else if (id === 'rules') {
|
|
69
|
+
const rules = [{ id: 'retired', active: false, destination: 'CLAUDE.md', text: 'old convention' }, { id: 'live', active: true, destination: 'CLAUDE.md', text: 'current' }];
|
|
70
|
+
const result = m.moveRule(rules, 'retired', 'AGENTS.md');
|
|
71
|
+
assert.deepEqual(result, [{ ...rules[0], destination: 'AGENTS.md' }, rules[1]]);
|
|
72
|
+
assert.equal(rules[0].destination, 'CLAUDE.md'); assert.notEqual(result[1], rules[1]);
|
|
73
|
+
assert.equal(m.moveRule(rules, 'live', 'AGENTS.md')[1].destination, 'AGENTS.md');
|
|
74
|
+
assert.throws(() => m.moveRule(rules, 'missing', 'AGENTS.md'));
|
|
75
|
+
assert.throws(() => m.moveRule(rules, 'live', '../outside'));
|
|
76
|
+
}
|
|
77
|
+
results.push({ id, status: 'passed' });
|
|
78
|
+
} catch (error) { results.push({ id, status: 'failed', error: error.message, code: error.code || error.name }); }
|
|
79
|
+
finally { rmSync(temp, { recursive: true, force: true }); }
|
|
80
|
+
}
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
84
|
+
console.log(JSON.stringify(await evaluate(resolve(process.argv[2]))));
|
|
85
|
+
}
|