@attalabs/vinaya 0.4.3 → 0.4.5
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/aeg-root/enforcement.md +1 -1
- package/aeg-root/state-machine.md +1 -1
- package/dist/checks/bin/check-branch-topology.js +55 -33
- package/dist/checks/bin/check-brief-shape.js +61 -34
- package/dist/checks/bin/check-closes-n.js +55 -33
- package/dist/checks/bin/check-coherence.js +55 -33
- package/dist/checks/bin/check-dead-branch-push.js +55 -33
- package/dist/checks/bin/check-dispatch-readiness.js +55 -33
- package/dist/checks/bin/check-doc-coverage-push.js +232 -36
- package/dist/checks/bin/check-doc-coverage.js +232 -36
- package/dist/checks/bin/check-first-push-dispatch.js +55 -33
- package/dist/checks/bin/check-issue-assignment.js +55 -33
- package/dist/checks/bin/check-no-disk-state.js +55 -33
- package/dist/checks/bin/check-reader-resolvable-prose.js +55 -33
- package/dist/checks/bin/check-registry-gates.js +55 -33
- package/dist/checks/bin/check-review-gate.js +233 -38
- package/dist/checks/bin/check-single-plan-pr.js +55 -33
- package/dist/checks/bin/check-test-plan.js +55 -33
- package/dist/index.js +138 -42
- package/package.json +1 -1
- package/studio-standalone/.worktrees/fix/bump-0.4.4/.vinaya/projects.md +63 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/aeg-manual-flow.md +216 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/brief-developer.md +140 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/developer-reviewer.md +106 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/planner-brief.md +130 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/reviewer-archivist.md +96 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/contracts/tranche-archivist-planner.md +116 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/coordination.md +293 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/documentation-coherence.md +65 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/enforcement.md +161 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/glossary.md +36 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/process.md +371 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/reviewer-prompt.md +68 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/archivist.md +167 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/brief-author.md +108 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/developer.md +429 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/planner.md +285 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/principal.md +107 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/reviewer.md +130 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/security.md +121 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/roles/tranche-archivist.md +257 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/skills/aeg/SKILL.md +90 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/skills/aeg-roles/SKILL.md +58 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/skills/brief-authoring/SKILL.md +497 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/state-machine.md +656 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/templates/brief-template.md +103 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/templates/issue-rationale-template.md +35 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/templates/pr-report-template.md +68 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranche-model.md +306 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/bump-0.4.4/vinaya.config.json +36 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/.vinaya/projects.md +63 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/aeg-manual-flow.md +216 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/brief-developer.md +140 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/developer-reviewer.md +106 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/planner-brief.md +130 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/reviewer-archivist.md +96 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/contracts/tranche-archivist-planner.md +116 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/coordination.md +293 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/documentation-coherence.md +65 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/enforcement.md +161 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/glossary.md +36 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/process.md +371 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/reviewer-prompt.md +68 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/archivist.md +167 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/brief-author.md +108 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/developer.md +429 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/planner.md +285 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/principal.md +107 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/reviewer.md +130 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/security.md +121 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/roles/tranche-archivist.md +257 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/skills/aeg/SKILL.md +90 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/skills/aeg-roles/SKILL.md +58 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/skills/brief-authoring/SKILL.md +497 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/state-machine.md +656 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/templates/brief-template.md +103 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/templates/issue-rationale-template.md +35 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/templates/pr-report-template.md +68 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranche-model.md +306 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/check-lifecycle-phase/vinaya.config.json +36 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/.vinaya/projects.md +63 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/aeg-manual-flow.md +216 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/brief-developer.md +140 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/developer-reviewer.md +106 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/planner-brief.md +130 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/reviewer-archivist.md +96 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/contracts/tranche-archivist-planner.md +116 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/coordination.md +293 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/documentation-coherence.md +65 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/enforcement.md +161 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/glossary.md +36 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/process.md +371 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/reviewer-prompt.md +68 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/archivist.md +167 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/brief-author.md +108 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/developer.md +429 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/planner.md +285 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/principal.md +107 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/reviewer.md +130 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/security.md +121 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/roles/tranche-archivist.md +257 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/aeg/SKILL.md +90 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/aeg-roles/SKILL.md +58 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/skills/brief-authoring/SKILL.md +497 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/state-machine.md +656 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/brief-template.md +103 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/issue-rationale-template.md +35 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/templates/pr-report-template.md +68 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranche-model.md +306 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/fix/vinaya-cli-noconsole/vinaya.config.json +36 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/.vinaya/projects.md +63 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/aeg-manual-flow.md +216 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/archivist-tranche-archivist.md +92 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/brief-developer.md +140 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/developer-reviewer.md +106 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/planner-brief.md +130 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/reviewer-archivist.md +96 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/contracts/tranche-archivist-planner.md +116 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/coordination.md +293 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/documentation-coherence.md +65 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/enforcement.md +161 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/glossary.md +36 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/process.md +371 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/reviewer-prompt.md +68 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/archivist.md +167 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/brief-author.md +108 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/developer.md +429 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/planner.md +285 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/principal.md +107 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/reviewer.md +130 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/security.md +121 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/roles/tranche-archivist.md +257 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/aeg/SKILL.md +90 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/aeg-roles/SKILL.md +58 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/skills/brief-authoring/SKILL.md +497 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/state-machine.md +656 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/brief-template.md +103 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/issue-rationale-template.md +35 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/templates/pr-report-template.md +68 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranche-model.md +306 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-coherence-v1.md +55 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-coherence-v1.tokens.md +13 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-consolidation.md +28 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-hardening.md +80 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-ui-v2.md +168 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-governance-ui-v2.tokens.md +18 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-studio-cleanup.md +37 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-ui-v1.md +176 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/aeg-ui-v1.tokens.md +17 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-agents-v2.md +35 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-agents-v2.tokens.md +11 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/herald-onto-engine.md +99 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/aeg-root/tranches/completed/vada-agents-v2.md +220 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/apps/vinaya/cli/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/node_modules/@attalabs/vinaya/tests/fixtures/checks/vinaya.config.json +9 -0
- package/studio-standalone/.worktrees/task/vinaya-adopter-ci-hotfix-v1/1/vinaya.config.json +36 -0
- package/studio-standalone/_node_modules/@atta/vinaya-cli/aeg-root/enforcement.md +1 -1
- package/studio-standalone/_node_modules/@atta/vinaya-cli/aeg-root/state-machine.md +1 -1
- package/studio-standalone/_node_modules/@attalabs/vinaya/aeg-root/enforcement.md +1 -1
- package/studio-standalone/_node_modules/@attalabs/vinaya/aeg-root/state-machine.md +1 -1
- package/studio-standalone/apps/vinaya/cli/aeg-root/enforcement.md +1 -1
- package/studio-standalone/apps/vinaya/cli/aeg-root/state-machine.md +1 -1
- package/studio-standalone/apps/vinaya/web/.next/BUILD_ID +1 -1
- package/studio-standalone/apps/vinaya/web/.next/build-manifest.json +3 -3
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/cli/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/config/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/cli/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/harness/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(standalone)/state-machine/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(with-sidebar)/[...slug]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/(with-sidebar)/reference/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/docs/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/install/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/roadmap/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/archive/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/brief/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/develop/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/overview/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/plan/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/quick/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/review/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/security/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/start/wrap-up/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/state-machine/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/the-harness/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/(site)/the-studio/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.html +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/api/coherence/route.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/backlog/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/docs/[...slug]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/docs/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/tranches/[slug]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/[name]/tranches/[slug]/tasks/[taskId]/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/projects/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/app/studio/tranches/page.js.nft.json +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/chunks/ssr/[root-of-the-server]__0kqmrho._.js +1 -1
- package/studio-standalone/apps/vinaya/web/.next/server/chunks/ssr/[root-of-the-server]__1dxaovd._.js +2 -2
- package/studio-standalone/apps/vinaya/web/.next/server/middleware-build-manifest.js +3 -3
- package/studio-standalone/apps/vinaya/web/.next/server/pages/500.html +1 -1
- /package/studio-standalone/apps/vinaya/web/.next/static/{Afs41Lu9uNQ-T6uC-tm4_ → LixrFgIixvAYndTclqOnR}/_buildManifest.js +0 -0
- /package/studio-standalone/apps/vinaya/web/.next/static/{Afs41Lu9uNQ-T6uC-tm4_ → LixrFgIixvAYndTclqOnR}/_clientMiddlewareManifest.js +0 -0
- /package/studio-standalone/apps/vinaya/web/.next/static/{Afs41Lu9uNQ-T6uC-tm4_ → LixrFgIixvAYndTclqOnR}/_ssgManifest.js +0 -0
|
@@ -1448,12 +1448,16 @@ function isCodeFile(p) {
|
|
|
1448
1448
|
var WAIVER_LABEL = label("waiver-docs");
|
|
1449
1449
|
var WAIVER_LABEL_REVIEW = label("waiver-review");
|
|
1450
1450
|
var PRINCIPAL_ALLOWLIST = ["daniboomerang"];
|
|
1451
|
+
function isPrincipal(login, principalAllowlist) {
|
|
1452
|
+
if (login === null)
|
|
1453
|
+
return false;
|
|
1454
|
+
const normalized = login.toLowerCase();
|
|
1455
|
+
return principalAllowlist.some((p) => p.toLowerCase() === normalized);
|
|
1456
|
+
}
|
|
1451
1457
|
function isWaiverLabelActorVerified(opts) {
|
|
1452
1458
|
if (!opts.labels.includes(opts.label))
|
|
1453
1459
|
return false;
|
|
1454
|
-
|
|
1455
|
-
return false;
|
|
1456
|
-
return opts.principalAllowlist.includes(opts.labelActor);
|
|
1460
|
+
return isPrincipal(opts.labelActor, opts.principalAllowlist);
|
|
1457
1461
|
}
|
|
1458
1462
|
|
|
1459
1463
|
// ../../../packages/aeg-core/src/doc-owners.ts
|
|
@@ -1641,6 +1645,27 @@ function overrideActive(opts) {
|
|
|
1641
1645
|
// ../../../packages/aeg-core/src/premise-check.ts
|
|
1642
1646
|
var ASSERTION_KINDS = new Set(["contains", "absent", "sha256"]);
|
|
1643
1647
|
|
|
1648
|
+
// ../../../packages/aeg-core/src/test-plan-section.ts
|
|
1649
|
+
var HEADING_FORM_RE = /^#{1,4}[ \t]*(?:\d+[a-z]?\.[ \t]*)?\*{0,2}Test Plan\*{0,2}[ \t]*$/im;
|
|
1650
|
+
var INLINE_FORM_RE = /^[ \t]*\*{0,2}Test Plan:?\*{0,2}/im;
|
|
1651
|
+
var NEXT_SECTION_RE = /\n(?:#{1,3}[ \t]|\*\*[A-Z][^*\n]*:\*\*)/;
|
|
1652
|
+
function locateTestPlanSection(body) {
|
|
1653
|
+
const region = anchoredRegion(body, "TEST-PLAN");
|
|
1654
|
+
if (region !== null)
|
|
1655
|
+
return { found: true, section: region };
|
|
1656
|
+
const headingMatch = HEADING_FORM_RE.exec(body);
|
|
1657
|
+
const match = headingMatch ?? INLINE_FORM_RE.exec(body);
|
|
1658
|
+
if (!match || match.index === undefined)
|
|
1659
|
+
return { found: false };
|
|
1660
|
+
const sectionBody = body.slice(match.index);
|
|
1661
|
+
const firstLineEnd = sectionBody.indexOf(`
|
|
1662
|
+
`);
|
|
1663
|
+
const searchFrom = firstLineEnd === -1 ? sectionBody.length : firstLineEnd + 1;
|
|
1664
|
+
const nextMatch = sectionBody.slice(searchFrom).match(NEXT_SECTION_RE);
|
|
1665
|
+
const sectionEnd = nextMatch ? searchFrom + (nextMatch.index ?? 0) : sectionBody.length;
|
|
1666
|
+
return { found: true, section: sectionBody.slice(0, sectionEnd) };
|
|
1667
|
+
}
|
|
1668
|
+
|
|
1644
1669
|
// ../../../packages/aeg-core/src/brief-validation.ts
|
|
1645
1670
|
function headerRegion(prBody) {
|
|
1646
1671
|
const m = prBody.match(/^##\s/m);
|
|
@@ -1679,10 +1704,15 @@ function checkTierField(prBody, readTier) {
|
|
|
1679
1704
|
};
|
|
1680
1705
|
}
|
|
1681
1706
|
var TEST_PLAN_UNIT_TESTS_ONLY_RE = /(?:\*\*)?Test Plan(?:\*\*)?\s*:\s*(?:\*\*)?\s*unit-tests-only/i;
|
|
1707
|
+
function testPlanRegion(prBody) {
|
|
1708
|
+
const located = locateTestPlanSection(prBody);
|
|
1709
|
+
return located.found ? located.section : prBody;
|
|
1710
|
+
}
|
|
1682
1711
|
function checkTestPlan(prBody) {
|
|
1683
|
-
|
|
1712
|
+
const region = testPlanRegion(prBody);
|
|
1713
|
+
if (TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
|
|
1684
1714
|
return { status: "pass", errors: [] };
|
|
1685
|
-
if (/\*\*\[(?:agent|principal)\]\*\*/.test(
|
|
1715
|
+
if (/\*\*\[(?:agent|principal)\]\*\*/.test(region))
|
|
1686
1716
|
return { status: "pass", errors: [] };
|
|
1687
1717
|
return {
|
|
1688
1718
|
status: "fail",
|
|
@@ -1692,9 +1722,10 @@ function checkTestPlan(prBody) {
|
|
|
1692
1722
|
};
|
|
1693
1723
|
}
|
|
1694
1724
|
function checkTestPlanExclusivity(prBody) {
|
|
1695
|
-
|
|
1725
|
+
const region = testPlanRegion(prBody);
|
|
1726
|
+
if (!TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
|
|
1696
1727
|
return { status: "pass", errors: [] };
|
|
1697
|
-
if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(
|
|
1728
|
+
if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(region)) {
|
|
1698
1729
|
return {
|
|
1699
1730
|
status: "fail",
|
|
1700
1731
|
errors: [
|
|
@@ -1705,8 +1736,9 @@ function checkTestPlanExclusivity(prBody) {
|
|
|
1705
1736
|
return { status: "pass", errors: [] };
|
|
1706
1737
|
}
|
|
1707
1738
|
function checkPrincipalPlaceholder(prBody) {
|
|
1739
|
+
const region = testPlanRegion(prBody);
|
|
1708
1740
|
const lineRe = /^-\s*\[[ xX]\]\s*\*{2}\[principal\]\*{2}(.*)$/gim;
|
|
1709
|
-
for (const m of
|
|
1741
|
+
for (const m of region.matchAll(lineRe)) {
|
|
1710
1742
|
const content = m[1] ?? "";
|
|
1711
1743
|
if (/^\s*None\b/i.test(content)) {
|
|
1712
1744
|
return {
|
|
@@ -1785,6 +1817,15 @@ function checkClosesN(prBody) {
|
|
|
1785
1817
|
errors: ["brief-validation Closes #N: no `Closes #<N>` (or Fixes/Resolves) reference found in the PR body."]
|
|
1786
1818
|
};
|
|
1787
1819
|
}
|
|
1820
|
+
var BRIEF_SHAPE_MARKERS = [checkSurfaceMap, checkDocUpdateList, checkStopConditions, checkAutonomyClause];
|
|
1821
|
+
var TASK_BRANCH_PATTERN = /^task\/[^/]+\/[^/]+$/;
|
|
1822
|
+
function isTaskBranch(branch) {
|
|
1823
|
+
return TASK_BRANCH_PATTERN.test(branch);
|
|
1824
|
+
}
|
|
1825
|
+
function isBriefShaped(prBody) {
|
|
1826
|
+
const stripped = stripCode(prBody);
|
|
1827
|
+
return BRIEF_SHAPE_MARKERS.filter((check) => check(stripped).status === "pass").length >= 2;
|
|
1828
|
+
}
|
|
1788
1829
|
function checkBriefSections(prBody, readTier, options = {}) {
|
|
1789
1830
|
const { requireClosesN = true } = options;
|
|
1790
1831
|
const results = [
|
|
@@ -2154,11 +2195,12 @@ function isReviewGateExemptBranch(branch) {
|
|
|
2154
2195
|
return branch.startsWith("plan/");
|
|
2155
2196
|
}
|
|
2156
2197
|
function checkReviewGate(input) {
|
|
2198
|
+
const principalAllowlist = input.principalAllowlist ?? PRINCIPAL_ALLOWLIST;
|
|
2157
2199
|
const waived = isWaiverLabelActorVerified({
|
|
2158
2200
|
label: WAIVER_LABEL_REVIEW,
|
|
2159
2201
|
labels: input.labels,
|
|
2160
2202
|
labelActor: input.waiverLabelActor,
|
|
2161
|
-
principalAllowlist
|
|
2203
|
+
principalAllowlist
|
|
2162
2204
|
});
|
|
2163
2205
|
if (waived) {
|
|
2164
2206
|
return {
|
|
@@ -2167,8 +2209,8 @@ function checkReviewGate(input) {
|
|
|
2167
2209
|
waived: true
|
|
2168
2210
|
};
|
|
2169
2211
|
}
|
|
2170
|
-
const verified = input.comments.filter((c) => c.author
|
|
2171
|
-
const ignoredCount = input.comments.filter((c) => (c.author
|
|
2212
|
+
const verified = input.comments.filter((c) => isPrincipal(c.author, principalAllowlist));
|
|
2213
|
+
const ignoredCount = input.comments.filter((c) => !isPrincipal(c.author, principalAllowlist) && c.body.includes("VERDICT")).length;
|
|
2172
2214
|
const verifiedBodies = verified.map((c) => c.body);
|
|
2173
2215
|
const codeReview = extractCodeReviewVerdict(verifiedBodies);
|
|
2174
2216
|
const security = extractSecurityReviewVerdict(verifiedBodies);
|
|
@@ -2721,28 +2763,8 @@ function decideIssueAssignment(input) {
|
|
|
2721
2763
|
reason: `First push of \`${branch}\` — assigning Issue #${issue} to @${login} (the authenticated pusher).`
|
|
2722
2764
|
};
|
|
2723
2765
|
}
|
|
2724
|
-
// ../../../packages/aeg-core/src/test-plan-section.ts
|
|
2725
|
-
var HEADING_FORM_RE = /^#{1,4}[ \t]*(?:\d+[a-z]?\.[ \t]*)?\*{0,2}Test Plan\*{0,2}[ \t]*$/im;
|
|
2726
|
-
var INLINE_FORM_RE = /^[ \t]*\*{0,2}Test Plan:?\*{0,2}/im;
|
|
2727
|
-
var NEXT_SECTION_RE = /\n(?:#{1,3}[ \t]|\*\*[A-Z][^*\n]*:\*\*)/;
|
|
2728
|
-
function locateTestPlanSection(body) {
|
|
2729
|
-
const region = anchoredRegion(body, "TEST-PLAN");
|
|
2730
|
-
if (region !== null)
|
|
2731
|
-
return { found: true, section: region };
|
|
2732
|
-
const headingMatch = HEADING_FORM_RE.exec(body);
|
|
2733
|
-
const match = headingMatch ?? INLINE_FORM_RE.exec(body);
|
|
2734
|
-
if (!match || match.index === undefined)
|
|
2735
|
-
return { found: false };
|
|
2736
|
-
const sectionBody = body.slice(match.index);
|
|
2737
|
-
const firstLineEnd = sectionBody.indexOf(`
|
|
2738
|
-
`);
|
|
2739
|
-
const searchFrom = firstLineEnd === -1 ? sectionBody.length : firstLineEnd + 1;
|
|
2740
|
-
const nextMatch = sectionBody.slice(searchFrom).match(NEXT_SECTION_RE);
|
|
2741
|
-
const sectionEnd = nextMatch ? searchFrom + (nextMatch.index ?? 0) : sectionBody.length;
|
|
2742
|
-
return { found: true, section: sectionBody.slice(0, sectionEnd) };
|
|
2743
|
-
}
|
|
2744
2766
|
// ../../../packages/aeg-core/src/test-plan-gate.ts
|
|
2745
|
-
var
|
|
2767
|
+
var TASK_BRANCH_PATTERN2 = /^task\/[^/]+\/[^/]+$/;
|
|
2746
2768
|
function evaluateTestPlanGate(body, branch) {
|
|
2747
2769
|
if (!body) {
|
|
2748
2770
|
return {
|
|
@@ -2755,7 +2777,7 @@ function evaluateTestPlanGate(body, branch) {
|
|
|
2755
2777
|
}
|
|
2756
2778
|
const located = locateTestPlanSection(body);
|
|
2757
2779
|
if (!located.found) {
|
|
2758
|
-
if (
|
|
2780
|
+
if (TASK_BRANCH_PATTERN2.test(branch)) {
|
|
2759
2781
|
return {
|
|
2760
2782
|
verdict: "fail",
|
|
2761
2783
|
messages: [
|
package/dist/index.js
CHANGED
|
@@ -532,6 +532,27 @@ function parsePremiseBlock(prBody) {
|
|
|
532
532
|
return assertions;
|
|
533
533
|
}
|
|
534
534
|
|
|
535
|
+
// ../../../packages/aeg-core/src/test-plan-section.ts
|
|
536
|
+
var HEADING_FORM_RE = /^#{1,4}[ \t]*(?:\d+[a-z]?\.[ \t]*)?\*{0,2}Test Plan\*{0,2}[ \t]*$/im;
|
|
537
|
+
var INLINE_FORM_RE = /^[ \t]*\*{0,2}Test Plan:?\*{0,2}/im;
|
|
538
|
+
var NEXT_SECTION_RE = /\n(?:#{1,3}[ \t]|\*\*[A-Z][^*\n]*:\*\*)/;
|
|
539
|
+
function locateTestPlanSection(body) {
|
|
540
|
+
const region = anchoredRegion(body, "TEST-PLAN");
|
|
541
|
+
if (region !== null)
|
|
542
|
+
return { found: true, section: region };
|
|
543
|
+
const headingMatch = HEADING_FORM_RE.exec(body);
|
|
544
|
+
const match = headingMatch ?? INLINE_FORM_RE.exec(body);
|
|
545
|
+
if (!match || match.index === undefined)
|
|
546
|
+
return { found: false };
|
|
547
|
+
const sectionBody = body.slice(match.index);
|
|
548
|
+
const firstLineEnd = sectionBody.indexOf(`
|
|
549
|
+
`);
|
|
550
|
+
const searchFrom = firstLineEnd === -1 ? sectionBody.length : firstLineEnd + 1;
|
|
551
|
+
const nextMatch = sectionBody.slice(searchFrom).match(NEXT_SECTION_RE);
|
|
552
|
+
const sectionEnd = nextMatch ? searchFrom + (nextMatch.index ?? 0) : sectionBody.length;
|
|
553
|
+
return { found: true, section: sectionBody.slice(0, sectionEnd) };
|
|
554
|
+
}
|
|
555
|
+
|
|
535
556
|
// ../../../packages/aeg-core/src/brief-validation.ts
|
|
536
557
|
function headerRegion(prBody) {
|
|
537
558
|
const m = prBody.match(/^##\s/m);
|
|
@@ -570,10 +591,15 @@ function checkTierField(prBody, readTier) {
|
|
|
570
591
|
};
|
|
571
592
|
}
|
|
572
593
|
var TEST_PLAN_UNIT_TESTS_ONLY_RE = /(?:\*\*)?Test Plan(?:\*\*)?\s*:\s*(?:\*\*)?\s*unit-tests-only/i;
|
|
594
|
+
function testPlanRegion(prBody) {
|
|
595
|
+
const located = locateTestPlanSection(prBody);
|
|
596
|
+
return located.found ? located.section : prBody;
|
|
597
|
+
}
|
|
573
598
|
function checkTestPlan(prBody) {
|
|
574
|
-
|
|
599
|
+
const region = testPlanRegion(prBody);
|
|
600
|
+
if (TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
|
|
575
601
|
return { status: "pass", errors: [] };
|
|
576
|
-
if (/\*\*\[(?:agent|principal)\]\*\*/.test(
|
|
602
|
+
if (/\*\*\[(?:agent|principal)\]\*\*/.test(region))
|
|
577
603
|
return { status: "pass", errors: [] };
|
|
578
604
|
return {
|
|
579
605
|
status: "fail",
|
|
@@ -583,9 +609,10 @@ function checkTestPlan(prBody) {
|
|
|
583
609
|
};
|
|
584
610
|
}
|
|
585
611
|
function checkTestPlanExclusivity(prBody) {
|
|
586
|
-
|
|
612
|
+
const region = testPlanRegion(prBody);
|
|
613
|
+
if (!TEST_PLAN_UNIT_TESTS_ONLY_RE.test(region))
|
|
587
614
|
return { status: "pass", errors: [] };
|
|
588
|
-
if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(
|
|
615
|
+
if (/^-\s*\[[ xX]\]\s*\*{2}\[(?:agent|principal)\]\*{2}/im.test(region)) {
|
|
589
616
|
return {
|
|
590
617
|
status: "fail",
|
|
591
618
|
errors: [
|
|
@@ -596,8 +623,9 @@ function checkTestPlanExclusivity(prBody) {
|
|
|
596
623
|
return { status: "pass", errors: [] };
|
|
597
624
|
}
|
|
598
625
|
function checkPrincipalPlaceholder(prBody) {
|
|
626
|
+
const region = testPlanRegion(prBody);
|
|
599
627
|
const lineRe = /^-\s*\[[ xX]\]\s*\*{2}\[principal\]\*{2}(.*)$/gim;
|
|
600
|
-
for (const m of
|
|
628
|
+
for (const m of region.matchAll(lineRe)) {
|
|
601
629
|
const content = m[1] ?? "";
|
|
602
630
|
if (/^\s*None\b/i.test(content)) {
|
|
603
631
|
return {
|
|
@@ -1219,6 +1247,9 @@ function printJson(data) {
|
|
|
1219
1247
|
function realDeps2() {
|
|
1220
1248
|
return { detectRepo: detectGitRepo };
|
|
1221
1249
|
}
|
|
1250
|
+
function defaultSleep(ms) {
|
|
1251
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1252
|
+
}
|
|
1222
1253
|
var COMMAND_TIMEOUT_MS = 20000;
|
|
1223
1254
|
var DEAD_BRANCH_LABEL = label("dead-branch-push");
|
|
1224
1255
|
var DEAD_BRANCH_MARKER = `<!-- ${DEAD_BRANCH_LABEL} -->`;
|
|
@@ -1364,6 +1395,18 @@ function fetchAssociatedMergedPrs(sha, repoFlag) {
|
|
|
1364
1395
|
const prs = JSON.parse(out);
|
|
1365
1396
|
return prs.filter((pr) => pr.merged_at !== null).map((pr) => pr.number);
|
|
1366
1397
|
}
|
|
1398
|
+
var DIRECT_PUSH_POLL_ATTEMPTS = 6;
|
|
1399
|
+
var DIRECT_PUSH_POLL_DELAY_MS = 20000;
|
|
1400
|
+
async function pollAssociatedMergedPrs(sha, repoFlag, fetch, attempts, delayMs, sleep) {
|
|
1401
|
+
for (let attempt = 1;attempt <= attempts; attempt++) {
|
|
1402
|
+
const prs = fetch(sha, repoFlag);
|
|
1403
|
+
if (prs.length > 0)
|
|
1404
|
+
return prs;
|
|
1405
|
+
if (attempt < attempts)
|
|
1406
|
+
await sleep(delayMs);
|
|
1407
|
+
}
|
|
1408
|
+
return [];
|
|
1409
|
+
}
|
|
1367
1410
|
function incidentAlreadyOpen(sha, repoFlag) {
|
|
1368
1411
|
const out = sh2([
|
|
1369
1412
|
"gh",
|
|
@@ -1412,11 +1455,11 @@ function openDirectPushIncident(sha, repoFlag) {
|
|
|
1412
1455
|
DIRECT_PUSH_LABEL
|
|
1413
1456
|
]);
|
|
1414
1457
|
}
|
|
1415
|
-
function runDirectMainPushCheck(sha, repoFlag) {
|
|
1416
|
-
const associatedMergedPrNumbers =
|
|
1458
|
+
async function runDirectMainPushCheck(sha, repoFlag, deps) {
|
|
1459
|
+
const associatedMergedPrNumbers = await pollAssociatedMergedPrs(sha, repoFlag, deps.fetchAssociatedMergedPrs ?? fetchAssociatedMergedPrs, deps.pollAttempts ?? DIRECT_PUSH_POLL_ATTEMPTS, deps.pollDelayMs ?? DIRECT_PUSH_POLL_DELAY_MS, deps.sleep ?? defaultSleep);
|
|
1417
1460
|
const result = checkDirectMainPush({ sha, associatedMergedPrNumbers });
|
|
1418
1461
|
if (result.verdict === "direct-push") {
|
|
1419
|
-
openDirectPushIncident(sha, repoFlag);
|
|
1462
|
+
(deps.openDirectPushIncident ?? openDirectPushIncident)(sha, repoFlag);
|
|
1420
1463
|
return { verdict: "direct-push" };
|
|
1421
1464
|
}
|
|
1422
1465
|
return { verdict: "legitimate", mergedPrNumber: result.mergedPrNumber };
|
|
@@ -1452,7 +1495,7 @@ async function runAudit(args, deps) {
|
|
|
1452
1495
|
const repoFlag = `${repo.owner}/${repo.repo}`;
|
|
1453
1496
|
const sha = parseSha(args) ?? sh2(["git", "rev-parse", "HEAD"]);
|
|
1454
1497
|
const deadBranch = only === "direct-push" ? { scanned: 0, findings: [] } : runDeadBranchAudit(repoFlag);
|
|
1455
|
-
const directPush = only === "dead-branches" ? null : runDirectMainPushCheck(sha, repoFlag);
|
|
1498
|
+
const directPush = only === "dead-branches" ? null : await runDirectMainPushCheck(sha, repoFlag, deps);
|
|
1456
1499
|
const failed = directPush?.verdict === "direct-push";
|
|
1457
1500
|
if (jsonOutput) {
|
|
1458
1501
|
printJson({
|
|
@@ -1531,7 +1574,10 @@ function coreCheckRegistry() {
|
|
|
1531
1574
|
run: bin("check-brief-shape"),
|
|
1532
1575
|
scope: "diff",
|
|
1533
1576
|
timeoutMs: 15000,
|
|
1534
|
-
env: {
|
|
1577
|
+
env: {
|
|
1578
|
+
PR_BODY: { optional: true },
|
|
1579
|
+
BRANCH: { optional: true }
|
|
1580
|
+
}
|
|
1535
1581
|
},
|
|
1536
1582
|
{
|
|
1537
1583
|
name: "doc-coverage",
|
|
@@ -1543,7 +1589,10 @@ function coreCheckRegistry() {
|
|
|
1543
1589
|
PR_BODY: { optional: true },
|
|
1544
1590
|
PR_BODY_FILE: { optional: true },
|
|
1545
1591
|
PR_LABELS: { optional: true },
|
|
1546
|
-
WAIVER_LABEL_ACTOR: { optional: true }
|
|
1592
|
+
WAIVER_LABEL_ACTOR: { optional: true },
|
|
1593
|
+
GITHUB_REPOSITORY: { optional: true },
|
|
1594
|
+
GITHUB_TOKEN: { optional: true },
|
|
1595
|
+
GH_TOKEN: { optional: true }
|
|
1547
1596
|
}
|
|
1548
1597
|
},
|
|
1549
1598
|
{
|
|
@@ -1575,6 +1624,7 @@ function coreCheckRegistry() {
|
|
|
1575
1624
|
run: bin("check-closes-n"),
|
|
1576
1625
|
scope: "diff",
|
|
1577
1626
|
timeoutMs: 15000,
|
|
1627
|
+
requiresOpenPr: true,
|
|
1578
1628
|
env: {
|
|
1579
1629
|
BRANCH: { optional: true },
|
|
1580
1630
|
PR_BODY: { optional: true },
|
|
@@ -1600,6 +1650,7 @@ function coreCheckRegistry() {
|
|
|
1600
1650
|
run: bin("check-test-plan"),
|
|
1601
1651
|
scope: "diff",
|
|
1602
1652
|
timeoutMs: 15000,
|
|
1653
|
+
requiresOpenPr: true,
|
|
1603
1654
|
env: {
|
|
1604
1655
|
PR_BODY: { optional: true },
|
|
1605
1656
|
BRANCH: { optional: true }
|
|
@@ -1631,6 +1682,7 @@ function coreCheckRegistry() {
|
|
|
1631
1682
|
env: {
|
|
1632
1683
|
BRANCH: { optional: true },
|
|
1633
1684
|
PR_NUMBER: { optional: true },
|
|
1685
|
+
GITHUB_REPOSITORY: { optional: true },
|
|
1634
1686
|
GITHUB_TOKEN: { optional: true },
|
|
1635
1687
|
GH_TOKEN: { optional: true }
|
|
1636
1688
|
}
|
|
@@ -1681,7 +1733,10 @@ function coreCheckRegistry() {
|
|
|
1681
1733
|
PR_BODY: { optional: true },
|
|
1682
1734
|
PR_BODY_FILE: { optional: true },
|
|
1683
1735
|
PR_LABELS: { optional: true },
|
|
1684
|
-
WAIVER_LABEL_ACTOR: { optional: true }
|
|
1736
|
+
WAIVER_LABEL_ACTOR: { optional: true },
|
|
1737
|
+
GITHUB_REPOSITORY: { optional: true },
|
|
1738
|
+
GITHUB_TOKEN: { optional: true },
|
|
1739
|
+
GH_TOKEN: { optional: true }
|
|
1685
1740
|
}
|
|
1686
1741
|
},
|
|
1687
1742
|
{
|
|
@@ -1760,6 +1815,8 @@ function isCheckError(value) {
|
|
|
1760
1815
|
return v.schema === CHECK_SCHEMA_VERSION && typeof v.check === "string" && (v.severity === "error" || v.severity === "warning") && typeof v.message === "string" && typeof v.agent_recovery_prompt === "string";
|
|
1761
1816
|
}
|
|
1762
1817
|
function shouldSkip(spec, opts) {
|
|
1818
|
+
if (opts.localOnly && spec.requiresOpenPr)
|
|
1819
|
+
return true;
|
|
1763
1820
|
if (spec.scope !== "diff")
|
|
1764
1821
|
return false;
|
|
1765
1822
|
if (!opts.diffOnly)
|
|
@@ -2020,7 +2077,8 @@ var CheckEntrySchema = z.object({
|
|
|
2020
2077
|
include: z.array(z.string()).optional(),
|
|
2021
2078
|
args: z.array(z.string()).optional(),
|
|
2022
2079
|
timeoutMs: z.number().optional(),
|
|
2023
|
-
env: z.record(z.string(), EnvEntrySchema).optional()
|
|
2080
|
+
env: z.record(z.string(), EnvEntrySchema).optional(),
|
|
2081
|
+
requiresOpenPr: z.boolean().optional()
|
|
2024
2082
|
}).superRefine((entry2, ctx) => {
|
|
2025
2083
|
if (!entry2.env)
|
|
2026
2084
|
return;
|
|
@@ -2127,7 +2185,8 @@ var VinayaConfigSchema = z.object({
|
|
|
2127
2185
|
}).optional(),
|
|
2128
2186
|
checks: z.record(z.string(), CheckEntrySchema).optional(),
|
|
2129
2187
|
briefSchema: BriefSchemaSchema.optional(),
|
|
2130
|
-
managed: ManagedManifestSchema.optional()
|
|
2188
|
+
managed: ManagedManifestSchema.optional(),
|
|
2189
|
+
principals: z.array(z.string()).min(1).optional()
|
|
2131
2190
|
});
|
|
2132
2191
|
var GLOBAL_VINAYA_HOME = join4(homedir(), ".vinaya");
|
|
2133
2192
|
var GLOBAL_CONFIG_PATH = join4(GLOBAL_VINAYA_HOME, "config.json");
|
|
@@ -2155,11 +2214,22 @@ function configPath() {
|
|
|
2155
2214
|
function globalChecksIgnoredWarning(path) {
|
|
2156
2215
|
return `${path}: "checks" registration in the global config is ignored — checks may only be registered from a repo-local vinaya.config.json.`;
|
|
2157
2216
|
}
|
|
2158
|
-
function
|
|
2159
|
-
|
|
2217
|
+
function globalPrincipalsIgnoredWarning(path) {
|
|
2218
|
+
return `${path}: "principals" in the global config is ignored — principals may only be declared from a repo-local vinaya.config.json.`;
|
|
2219
|
+
}
|
|
2220
|
+
function stripGlobalOnlyKeys(config, path) {
|
|
2221
|
+
if (path !== GLOBAL_CONFIG_PATH)
|
|
2160
2222
|
return config;
|
|
2161
|
-
|
|
2162
|
-
|
|
2223
|
+
let result = config;
|
|
2224
|
+
if (result.checks && Object.keys(result.checks).length > 0) {
|
|
2225
|
+
console.error(`⚠ ${globalChecksIgnoredWarning(path)}`);
|
|
2226
|
+
result = { ...result, checks: undefined };
|
|
2227
|
+
}
|
|
2228
|
+
if (result.principals && result.principals.length > 0) {
|
|
2229
|
+
console.error(`⚠ ${globalPrincipalsIgnoredWarning(path)}`);
|
|
2230
|
+
result = { ...result, principals: undefined };
|
|
2231
|
+
}
|
|
2232
|
+
return result;
|
|
2163
2233
|
}
|
|
2164
2234
|
function loadConfigChecked() {
|
|
2165
2235
|
const path = configPath();
|
|
@@ -2176,7 +2246,7 @@ function loadConfigChecked() {
|
|
|
2176
2246
|
const detail = parsed.error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`).join("; ");
|
|
2177
2247
|
return { ok: false, path, error: detail };
|
|
2178
2248
|
}
|
|
2179
|
-
return { ok: true, config:
|
|
2249
|
+
return { ok: true, config: stripGlobalOnlyKeys(parsed.data, path) };
|
|
2180
2250
|
}
|
|
2181
2251
|
|
|
2182
2252
|
// src/commands/check.ts
|
|
@@ -2301,6 +2371,7 @@ function printClassificationWarnings(configChecks) {
|
|
|
2301
2371
|
async function checkCommand(args) {
|
|
2302
2372
|
const jsonOutput = args.includes("--json");
|
|
2303
2373
|
const diffOnly = args.includes("--diff-only");
|
|
2374
|
+
const localOnly = args.includes("--local");
|
|
2304
2375
|
const requestedParallel = parseParallel(args);
|
|
2305
2376
|
const allRequested = args.includes("--all");
|
|
2306
2377
|
const planRequested = args.includes("--plan");
|
|
@@ -2318,7 +2389,7 @@ async function checkCommand(args) {
|
|
|
2318
2389
|
process.exit(result.failures.length > 0 ? 1 : 0);
|
|
2319
2390
|
}
|
|
2320
2391
|
if (!allRequested && !requestedName) {
|
|
2321
|
-
console.error("Usage: vinaya check <name> | --all | --plan [--json] [--diff-only] [--parallel[=n]]");
|
|
2392
|
+
console.error("Usage: vinaya check <name> | --all | --plan [--json] [--diff-only] [--local] [--parallel[=n]]");
|
|
2322
2393
|
process.exit(2);
|
|
2323
2394
|
}
|
|
2324
2395
|
const { specs: customSpecs, errorOutcome, checks: configChecks } = customSpecsFromConfig();
|
|
@@ -2333,7 +2404,8 @@ async function checkCommand(args) {
|
|
|
2333
2404
|
parallel: requestedParallel ?? defaultParallelism(),
|
|
2334
2405
|
diffOnly,
|
|
2335
2406
|
changedFiles: changed,
|
|
2336
|
-
defaultTimeoutMs: 30000
|
|
2407
|
+
defaultTimeoutMs: 30000,
|
|
2408
|
+
localOnly
|
|
2337
2409
|
}) : [];
|
|
2338
2410
|
const allOutcomes = errorOutcome ? [...outcomes, errorOutcome] : outcomes;
|
|
2339
2411
|
for (const o of allOutcomes) {
|
|
@@ -2566,8 +2638,9 @@ async function demoBreakCommand(args) {
|
|
|
2566
2638
|
}
|
|
2567
2639
|
|
|
2568
2640
|
// src/commands/doctor.ts
|
|
2641
|
+
import { execFileSync as execFileSync6 } from "node:child_process";
|
|
2569
2642
|
import { existsSync as existsSync8, readFileSync as readFileSync6, statSync } from "node:fs";
|
|
2570
|
-
import { join as join8 } from "node:path";
|
|
2643
|
+
import { isAbsolute as isAbsolute2, join as join8 } from "node:path";
|
|
2571
2644
|
|
|
2572
2645
|
// src/lib/artifacts.ts
|
|
2573
2646
|
import { readFileSync as readFileSync3 } from "node:fs";
|
|
@@ -2608,7 +2681,7 @@ name: Vinaya Checks
|
|
|
2608
2681
|
|
|
2609
2682
|
on:
|
|
2610
2683
|
pull_request:
|
|
2611
|
-
types: [opened, synchronize, reopened]
|
|
2684
|
+
types: [opened, synchronize, reopened, edited]
|
|
2612
2685
|
|
|
2613
2686
|
jobs:
|
|
2614
2687
|
vinaya-checks:
|
|
@@ -2629,6 +2702,11 @@ jobs:
|
|
|
2629
2702
|
env:
|
|
2630
2703
|
GH_TOKEN: \${{ secrets.GITHUB_TOKEN }}
|
|
2631
2704
|
PR_NUMBER: \${{ github.event.pull_request.number }}
|
|
2705
|
+
# PR_BODY is what makes test-plan/closes-n EVALUATE: neither check
|
|
2706
|
+
# fetches the body itself (both read \`process.env.PR_BODY\` only) —
|
|
2707
|
+
# without it they read "no body — nothing to check" and pass
|
|
2708
|
+
# vacuously regardless of the PR's real content, on every run.
|
|
2709
|
+
PR_BODY: \${{ github.event.pull_request.body }}
|
|
2632
2710
|
BRANCH: \${{ github.head_ref }}
|
|
2633
2711
|
run: npx --yes @attalabs/vinaya check --all --diff-only
|
|
2634
2712
|
`;
|
|
@@ -2676,7 +2754,7 @@ jobs:
|
|
|
2676
2754
|
# the gate is green regardless of review state.
|
|
2677
2755
|
PR_NUMBER: \${{ github.event.pull_request.number }}
|
|
2678
2756
|
BRANCH: \${{ github.head_ref }}
|
|
2679
|
-
run: npx --yes @attalabs/vinaya check
|
|
2757
|
+
run: npx --yes @attalabs/vinaya check review-gate
|
|
2680
2758
|
`;
|
|
2681
2759
|
}
|
|
2682
2760
|
function reviewVerdictWorkflow() {
|
|
@@ -2861,11 +2939,11 @@ function ownVersion() {
|
|
|
2861
2939
|
function preCommitBody() {
|
|
2862
2940
|
return `# Vinaya commit-time gate. Runs the deterministic checks over your staged
|
|
2863
2941
|
# diff before the commit lands.
|
|
2864
|
-
npx --yes @attalabs/vinaya@${ownVersion()} check --all --diff-only || exit 1`;
|
|
2942
|
+
npx --yes @attalabs/vinaya@${ownVersion()} check --all --diff-only --local || exit 1`;
|
|
2865
2943
|
}
|
|
2866
2944
|
function prePushBody() {
|
|
2867
2945
|
return `# Vinaya pre-push gate. Runs branch/dispatch checks before the push leaves.
|
|
2868
|
-
npx --yes @attalabs/vinaya@${ownVersion()} check --all || exit 1`;
|
|
2946
|
+
npx --yes @attalabs/vinaya@${ownVersion()} check --all --local || exit 1`;
|
|
2869
2947
|
}
|
|
2870
2948
|
function doctrinePointer() {
|
|
2871
2949
|
const doctrineRoot = join6(packageRoot(import.meta.url), "aeg-root");
|
|
@@ -3446,6 +3524,19 @@ function labelForPath(path) {
|
|
|
3446
3524
|
return "doctrine-pointer";
|
|
3447
3525
|
return "workflows";
|
|
3448
3526
|
}
|
|
3527
|
+
function resolveManagedBlockPath(repoRoot, opPath) {
|
|
3528
|
+
if (!opPath.startsWith(".git/"))
|
|
3529
|
+
return join8(repoRoot, opPath);
|
|
3530
|
+
try {
|
|
3531
|
+
const commonDir = execFileSync6("git", ["-C", repoRoot, "rev-parse", "--git-common-dir"], {
|
|
3532
|
+
encoding: "utf8"
|
|
3533
|
+
}).trim();
|
|
3534
|
+
const gitDir = isAbsolute2(commonDir) ? commonDir : join8(repoRoot, commonDir);
|
|
3535
|
+
return join8(gitDir, opPath.slice(".git/".length));
|
|
3536
|
+
} catch {
|
|
3537
|
+
return join8(repoRoot, opPath);
|
|
3538
|
+
}
|
|
3539
|
+
}
|
|
3449
3540
|
function diagnoseInstall(repoRoot, ctx, manifest) {
|
|
3450
3541
|
const findings = [];
|
|
3451
3542
|
let hasDrift = false;
|
|
@@ -3479,7 +3570,7 @@ function diagnoseInstall(repoRoot, ctx, manifest) {
|
|
|
3479
3570
|
}
|
|
3480
3571
|
} else if (op.kind === "managed-block") {
|
|
3481
3572
|
const check = "hooks";
|
|
3482
|
-
const abs2 =
|
|
3573
|
+
const abs2 = resolveManagedBlockPath(repoRoot, op.path);
|
|
3483
3574
|
const owned = ownedBlocks.has(blockKey(op.path, op.marker));
|
|
3484
3575
|
if (!existsSync8(abs2)) {
|
|
3485
3576
|
findings.push(owned ? error(check, `${op.path} is missing — likely a fresh clone (raw git hooks aren't tracked by git). Run \`vinaya upgrade\` to restore it.`) : info(check, `${op.path} is not installed.`));
|
|
@@ -4030,7 +4121,7 @@ async function initProductCommand(args) {
|
|
|
4030
4121
|
}
|
|
4031
4122
|
|
|
4032
4123
|
// src/commands/issue.ts
|
|
4033
|
-
import { execFileSync as
|
|
4124
|
+
import { execFileSync as execFileSync7 } from "node:child_process";
|
|
4034
4125
|
|
|
4035
4126
|
// src/lib/forge-write.ts
|
|
4036
4127
|
import { mkdtempSync, rmSync as rmSync3, writeFileSync as writeFileSync6 } from "node:fs";
|
|
@@ -4243,7 +4334,7 @@ function locateBodyOrRefuse(ghArgs, retryCommand) {
|
|
|
4243
4334
|
function fetchForgeLabels(issueRef) {
|
|
4244
4335
|
let out;
|
|
4245
4336
|
try {
|
|
4246
|
-
out =
|
|
4337
|
+
out = execFileSync7("gh", ["issue", "view", issueRef, "--json", "labels"], {
|
|
4247
4338
|
encoding: "utf8",
|
|
4248
4339
|
stdio: ["ignore", "pipe", "pipe"]
|
|
4249
4340
|
});
|
|
@@ -4271,7 +4362,7 @@ function reportPass(json, command) {
|
|
|
4271
4362
|
function runGhWrite(ghCmd, ghArgs, bodyResult, json) {
|
|
4272
4363
|
const { finalArgs, cleanup: cleanup2 } = resolveShippableArgs(ghArgs, bodyResult);
|
|
4273
4364
|
try {
|
|
4274
|
-
const out =
|
|
4365
|
+
const out = execFileSync7("gh", [...ghCmd, ...finalArgs], { encoding: "utf8", stdio: ["ignore", "pipe", "inherit"] });
|
|
4275
4366
|
const url = out.trim();
|
|
4276
4367
|
if (json)
|
|
4277
4368
|
printJson({ validated: true, written: true, url });
|
|
@@ -4375,12 +4466,12 @@ ${registration}
|
|
|
4375
4466
|
}
|
|
4376
4467
|
|
|
4377
4468
|
// src/commands/pr.ts
|
|
4378
|
-
import { execFileSync as
|
|
4469
|
+
import { execFileSync as execFileSync8 } from "node:child_process";
|
|
4379
4470
|
var RETRY_CREATE2 = "vinaya pr create --validate-only …";
|
|
4380
4471
|
var RETRY_EDIT2 = "vinaya pr edit <n> --validate-only …";
|
|
4381
4472
|
function git2(args) {
|
|
4382
4473
|
try {
|
|
4383
|
-
return
|
|
4474
|
+
return execFileSync8("git", args, { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
4384
4475
|
} catch {
|
|
4385
4476
|
return "";
|
|
4386
4477
|
}
|
|
@@ -4414,7 +4505,7 @@ function reportPass2(json, command) {
|
|
|
4414
4505
|
function runGhWrite2(ghCmd, ghArgs, bodyResult, json) {
|
|
4415
4506
|
const { finalArgs, cleanup: cleanup2 } = resolveShippableArgs(ghArgs, bodyResult);
|
|
4416
4507
|
try {
|
|
4417
|
-
const out =
|
|
4508
|
+
const out = execFileSync8("gh", [...ghCmd, ...finalArgs], { encoding: "utf8", stdio: ["ignore", "pipe", "inherit"] });
|
|
4418
4509
|
const url = out.trim();
|
|
4419
4510
|
if (json)
|
|
4420
4511
|
printJson({ validated: true, written: true, url });
|
|
@@ -4428,7 +4519,7 @@ function runGhWrite2(ghCmd, ghArgs, bodyResult, json) {
|
|
|
4428
4519
|
function fetchPrForgeContext(prRef) {
|
|
4429
4520
|
let viewOut;
|
|
4430
4521
|
try {
|
|
4431
|
-
viewOut =
|
|
4522
|
+
viewOut = execFileSync8("gh", ["pr", "view", prRef, "--json", "headRefName,files"], {
|
|
4432
4523
|
encoding: "utf8",
|
|
4433
4524
|
stdio: ["ignore", "pipe", "pipe"]
|
|
4434
4525
|
});
|
|
@@ -4524,7 +4615,7 @@ function prEditCommand(args) {
|
|
|
4524
4615
|
}
|
|
4525
4616
|
|
|
4526
4617
|
// src/commands/quickstart.ts
|
|
4527
|
-
import { execFileSync as
|
|
4618
|
+
import { execFileSync as execFileSync9 } from "node:child_process";
|
|
4528
4619
|
import { existsSync as existsSync14, readFileSync as readFileSync13 } from "node:fs";
|
|
4529
4620
|
import { join as join15 } from "node:path";
|
|
4530
4621
|
|
|
@@ -4718,7 +4809,7 @@ function realDeps6() {
|
|
|
4718
4809
|
};
|
|
4719
4810
|
}
|
|
4720
4811
|
function execGit(repoRoot, args) {
|
|
4721
|
-
return
|
|
4812
|
+
return execFileSync9("git", args, { cwd: repoRoot, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim();
|
|
4722
4813
|
}
|
|
4723
4814
|
function errorDetail(err) {
|
|
4724
4815
|
const stderr = err.stderr;
|
|
@@ -5174,12 +5265,12 @@ async function upgradeCommand(args) {
|
|
|
5174
5265
|
}
|
|
5175
5266
|
|
|
5176
5267
|
// src/commands/waiver.ts
|
|
5177
|
-
import { execFileSync as
|
|
5268
|
+
import { execFileSync as execFileSync10 } from "node:child_process";
|
|
5178
5269
|
function labelFor(kind) {
|
|
5179
5270
|
return kind === "docs" ? WAIVER_LABEL : WAIVER_LABEL_REVIEW;
|
|
5180
5271
|
}
|
|
5181
5272
|
function gh(args) {
|
|
5182
|
-
return
|
|
5273
|
+
return execFileSync10("gh", args, { encoding: "utf8", stdio: ["ignore", "pipe", "pipe"], env: process.env }).trim();
|
|
5183
5274
|
}
|
|
5184
5275
|
function detectPrNumber() {
|
|
5185
5276
|
try {
|
|
@@ -5279,8 +5370,8 @@ Reason: ${reason}`];
|
|
|
5279
5370
|
}
|
|
5280
5371
|
process.stdout.write(`Applying \`${label2}\` to PR #${prNumber} under your authenticated \`gh\` identity — vinaya never fabricates an actor.
|
|
5281
5372
|
`);
|
|
5282
|
-
|
|
5283
|
-
|
|
5373
|
+
execFileSync10("gh", editArgs, { stdio: "inherit", env: process.env });
|
|
5374
|
+
execFileSync10("gh", commentArgs, { stdio: "inherit", env: process.env });
|
|
5284
5375
|
process.stdout.write(`
|
|
5285
5376
|
✓ Label applied and reason posted as a PR comment.
|
|
5286
5377
|
`);
|
|
@@ -5337,6 +5428,10 @@ var COMMANDS = [
|
|
|
5337
5428
|
{ flag: "--all", description: "Run every registered check instead of one named check" },
|
|
5338
5429
|
{ flag: "--json", description: "Enveloped JSON output (schema: 1)" },
|
|
5339
5430
|
{ flag: "--diff-only", description: "Scope diff-declared checks to changed files" },
|
|
5431
|
+
{
|
|
5432
|
+
flag: "--local",
|
|
5433
|
+
description: "Skip every requiresOpenPr check (closes-n, test-plan) — set by the generated hooks, never by CI"
|
|
5434
|
+
},
|
|
5340
5435
|
{ flag: "--parallel[=n]", description: "Concurrency cap (default: cpu-derived)" },
|
|
5341
5436
|
{
|
|
5342
5437
|
flag: "--plan",
|
|
@@ -5345,7 +5440,8 @@ var COMMANDS = [
|
|
|
5345
5440
|
],
|
|
5346
5441
|
details: [
|
|
5347
5442
|
"Each spawned check's child process sees only a fixed baseline (`PATH`, `LANG`, `HOME`, `HTTPS_PROXY`, `HTTP_PROXY`, `NO_PROXY`, `TMPDIR`) plus whatever its `CheckSpec['env']` declaration explicitly forwards — never the full parent environment. A required (`true`) or unsatisfied `anyOf` declaration missing from the caller's environment synthesizes a `CheckError` before the check ever spawns. Declare `env` (a core check's own registration, or `vinaya.config.json`'s `checks.<name>.env` for a custom one) for any check that reads `process.env`/`Bun.env`/`Deno.env` directly — `vinaya doctor` carries the permanent diagnostic for one that doesn't.",
|
|
5348
|
-
"`--plan` composes with `--json`. It requires zero env vars and never prints an env value — only how each one resolves (passthrough, optional, literal, or anyOf). A `FAIL_CLOSED` entry (a bare key with no namespace matching no core check) always renders inline rather than being dropped, and exits non-zero. `--plan` previews what the next minor's execution will enforce — `vinaya check` itself still runs the flat, unvalidated registry this release."
|
|
5443
|
+
"`--plan` composes with `--json`. It requires zero env vars and never prints an env value — only how each one resolves (passthrough, optional, literal, or anyOf). A `FAIL_CLOSED` entry (a bare key with no namespace matching no core check) always renders inline rather than being dropped, and exits non-zero. `--plan` previews what the next minor's execution will enforce — `vinaya check` itself still runs the flat, unvalidated registry this release.",
|
|
5444
|
+
"`--local` exists because a `requiresOpenPr` check (the core `closes-n`/`test-plan`, or a custom check declaring the same field) can only evaluate for real once a pull request exists — the generated `pre-commit`/`pre-push` hooks pass it so the first commit on a fresh task branch is never asked to satisfy a PR-body field before a PR can possibly exist. CI's `vinaya-checks.yml` omits it, so these checks always run for real once a PR is open."
|
|
5349
5445
|
],
|
|
5350
5446
|
status: "shipped"
|
|
5351
5447
|
},
|
|
@@ -5459,7 +5555,7 @@ var COMMANDS = [
|
|
|
5459
5555
|
{ flag: "--json", description: "Enveloped JSON output" }
|
|
5460
5556
|
],
|
|
5461
5557
|
details: [
|
|
5462
|
-
"Dead-branch-push is never-red — a notification channel that flags (label + PR comment) any `task/*` branch whose tip commit lands after its own PR already resolved. Direct-main-push is a real pass/fail — it opens an incident Issue and exits 1 if a commit on `main` has no associated merged PR.",
|
|
5558
|
+
"Dead-branch-push is never-red — a notification channel that flags (label + PR comment) any `task/*` branch whose tip commit lands after its own PR already resolved. Direct-main-push is a real pass/fail — it polls the merge-association API for up to ~100s before deciding, then opens an incident Issue and exits 1 if a commit on `main` genuinely has no associated merged PR.",
|
|
5463
5559
|
"The same logic the generated `vinaya-archivist.yml` workflow's `daily-drift` and `direct-main-push-detection` jobs run on schedule / on every push to `main` — callable directly for a one-off run or local verification."
|
|
5464
5560
|
],
|
|
5465
5561
|
status: "shipped"
|
package/package.json
CHANGED