project-init 0.3.0__tar.gz → 0.5.0__tar.gz
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.
- {project_init-0.3.0/templates/base/dot_claude → project_init-0.5.0/.claude}/hooks/dag_workflow.py +72 -13
- {project_init-0.3.0 → project_init-0.5.0}/.claude/hooks/workflow_state_reminder.sh +1 -1
- {project_init-0.3.0/templates/base/dot_claude → project_init-0.5.0/.claude}/scripts/monitor_pr.sh +23 -5
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/INDEX.md +1 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/README.md +3 -0
- project_init-0.5.0/.claude/skills/add_command/SKILL.md +70 -0
- {project_init-0.3.0/templates/codex/dot_agents → project_init-0.5.0/.claude}/skills/add_hook/SKILL.md +19 -7
- project_init-0.5.0/.claude/skills/live_test/SKILL.md +248 -0
- project_init-0.5.0/.claude/skills/wiki/SKILL.md +69 -0
- project_init-0.5.0/.claude-plugin/marketplace.json +19 -0
- project_init-0.5.0/.github/workflows/ci.yml +278 -0
- project_init-0.5.0/.github/workflows/docs.yml +75 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/release.yml +6 -1
- project_init-0.5.0/.github/workflows/third-party-updates.yml +38 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/validate-pr.yml +29 -0
- {project_init-0.3.0 → project_init-0.5.0}/.gitignore +10 -0
- project_init-0.5.0/.gitleaks.toml +16 -0
- {project_init-0.3.0 → project_init-0.5.0}/CLAUDE.md +2 -1
- project_init-0.5.0/PKG-INFO +424 -0
- project_init-0.5.0/README.md +393 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/README.md +1 -1
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-003-github-native-workflow.md +1 -1
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-004-obsidian-docs-integration.md +3 -3
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-005-github-pr-board-workflow.md +1 -1
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-007-security-enforcement-layers.md +8 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-011-pypi-trusted-publishing.md +6 -1
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-012-prod-safety-guard.md +11 -0
- project_init-0.5.0/docs/adr/adr-013-distribution-governance-model.md +134 -0
- project_init-0.5.0/docs/adr/adr-014-environment-promotion-chains.md +25 -0
- project_init-0.5.0/docs/adr/adr-015-env-deploy-model.md +112 -0
- project_init-0.5.0/docs/adr/adr-016-model-agnostic-switching.md +140 -0
- project_init-0.5.0/docs/adr/adr-017-per-surface-config-generator.md +149 -0
- project_init-0.5.0/docs/adr/adr-018-ai-governance-overlay.md +130 -0
- project_init-0.5.0/docs/adr/adr-019-local-observability-overlay.md +152 -0
- project_init-0.5.0/docs/adr/adr-020-memory-backend-decomposition.md +87 -0
- project_init-0.5.0/docs/adr/adr-021-quality-vs-lifecycle-tier-boundary.md +165 -0
- project_init-0.5.0/docs/adr/adr-022-toolchain-gate-map.md +116 -0
- project_init-0.5.0/docs/adr/adr-023-wizard-explanation-standard.md +75 -0
- project_init-0.5.0/docs/adr/adr-024-memory-tier-model.md +110 -0
- project_init-0.5.0/docs/adr/adr-025-agentic-os-root-layer.md +152 -0
- project_init-0.5.0/docs/adr/adr-026-tier3-rag-engine-cocoindex.md +103 -0
- project_init-0.5.0/docs/development/agentic-os-root-layer.md +155 -0
- project_init-0.5.0/docs/development/enforcement-classification.md +48 -0
- project_init-0.5.0/docs/development/enterprise-github-support-matrix.md +214 -0
- project_init-0.5.0/docs/development/measurement-methodology.md +169 -0
- project_init-0.5.0/docs/development/memory-descriptor.md +87 -0
- project_init-0.5.0/docs/development/mobile-remote-access.md +89 -0
- project_init-0.5.0/docs/development/non-cli-surface-matrix.md +150 -0
- project_init-0.5.0/docs/guides/org-fork-lifecycle.md +94 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/guides/using-project-init.md +3 -4
- project_init-0.5.0/docs/research/model-agnostic-switching.md +479 -0
- {project_init-0.3.0 → project_init-0.5.0}/install.sh +22 -5
- project_init-0.5.0/mkdocs.yml +62 -0
- project_init-0.5.0/plugins/project-init-lifecycle/.claude-plugin/plugin.json +19 -0
- project_init-0.5.0/plugins/project-init-lifecycle/hooks/_py.sh +30 -0
- project_init-0.5.0/plugins/project-init-lifecycle/hooks/_usage_log.sh +74 -0
- {project_init-0.3.0/.claude → project_init-0.5.0/plugins/project-init-lifecycle}/hooks/dag_workflow.py +72 -13
- project_init-0.5.0/plugins/project-init-lifecycle/hooks/github_command_guard.sh +18 -0
- project_init-0.5.0/plugins/project-init-lifecycle/hooks/hooks.json +29 -0
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/plugins/project-init-lifecycle}/hooks/workflow_state_reminder.sh +12 -3
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/plugins/project-init-lifecycle}/skills/audit/SKILL.md +3 -2
- {project_init-0.3.0/templates/gemini/dot_agents → project_init-0.5.0/plugins/project-init-lifecycle}/skills/create_issue/SKILL.md +5 -2
- {project_init-0.3.0/templates/codex/dot_agents → project_init-0.5.0/plugins/project-init-lifecycle}/skills/github_workflow/SKILL.md +10 -1
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/plugins/project-init-lifecycle}/skills/request_review/SKILL.md +3 -3
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/plugins/project-init-lifecycle}/skills/start_task/SKILL.md +1 -1
- project_init-0.5.0/plugins/project-init-workflow/hooks/_py.sh +30 -0
- project_init-0.5.0/plugins/project-init-workflow/hooks/_usage_log.sh +74 -0
- {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/hooks/hooks.json +5 -17
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/plugins/project-init-workflow}/hooks/post_edit_lint.sh +13 -3
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/plugins/project-init-workflow}/hooks/pre_commit_gate.sh +20 -5
- {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/hooks/prod_guard.py +107 -15
- {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/hooks/session_setup.sh +21 -2
- {project_init-0.3.0/templates/gemini/dot_agents → project_init-0.5.0/plugins/project-init-workflow}/skills/add_command/SKILL.md +12 -1
- {project_init-0.3.0/templates/gemini/dot_agents → project_init-0.5.0/plugins/project-init-workflow}/skills/add_hook/SKILL.md +25 -5
- {project_init-0.3.0/templates/codex/dot_agents → project_init-0.5.0/plugins/project-init-workflow}/skills/review/SKILL.md +1 -1
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/plugins/project-init-workflow}/skills/status/SKILL.md +1 -1
- {project_init-0.3.0 → project_init-0.5.0}/pyproject.toml +1 -1
- project_init-0.5.0/src/project_init/__init__.py +8 -0
- project_init-0.5.0/src/project_init/__main__.py +2032 -0
- project_init-0.5.0/src/project_init/capabilities.py +253 -0
- project_init-0.5.0/src/project_init/governance.py +126 -0
- project_init-0.5.0/src/project_init/mcps.py +81 -0
- project_init-0.5.0/src/project_init/migration_notes.py +91 -0
- project_init-0.5.0/src/project_init/scaffold.py +785 -0
- project_init-0.5.0/src/project_init/surfaces.py +307 -0
- project_init-0.5.0/src/project_init/upgrade.py +1463 -0
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/amp/dot_agents}/skills/add_command/SKILL.md +12 -1
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/amp/dot_agents}/skills/add_hook/SKILL.md +25 -5
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/amp}/dot_agents/skills/audit/SKILL.md +3 -2
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/amp/dot_agents}/skills/create_issue/SKILL.md +5 -2
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/amp/dot_agents}/skills/github_workflow/SKILL.md +10 -1
- project_init-0.5.0/templates/amp/dot_agents/skills/plan/SKILL.md +40 -0
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/amp/dot_agents}/skills/request_review/SKILL.md +3 -3
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/amp/dot_agents}/skills/review/SKILL.md +1 -1
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/start_task/SKILL.md +1 -1
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/amp}/dot_agents/skills/status/SKILL.md +1 -1
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/add_command/SKILL.md +12 -1
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/antigravity/dot_agents}/skills/add_hook/SKILL.md +25 -5
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/audit/SKILL.md +3 -2
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/create_issue/SKILL.md +5 -2
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/antigravity}/dot_agents/skills/github_workflow/SKILL.md +10 -1
- project_init-0.5.0/templates/antigravity/dot_agents/skills/plan/SKILL.md +40 -0
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/request_review/SKILL.md +3 -3
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/antigravity/dot_agents}/skills/review/SKILL.md +1 -1
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/antigravity/dot_agents}/skills/start_task/SKILL.md +1 -1
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/status/SKILL.md +1 -1
- {project_init-0.3.0/templates/obsidian → project_init-0.5.0/templates/auto}/dot_claude/scripts/lint_memory.sh +44 -0
- project_init-0.5.0/templates/base/AGENTS.md.tmpl +62 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/CLAUDE.md.tmpl +1 -1
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/CONTRIBUTING.md.tmpl +9 -5
- project_init-0.5.0/templates/base/Dockerfile.tmpl +56 -0
- project_init-0.5.0/templates/base/compose.yaml.tmpl +38 -0
- project_init-0.5.0/templates/base/deploy/environments.yaml.tmpl +23 -0
- project_init-0.3.0/templates/base/docs/explanation/index.md → project_init-0.5.0/templates/base/docs/explanation/index.md.tmpl +2 -1
- project_init-0.3.0/templates/base/docs/how-to/index.md → project_init-0.5.0/templates/base/docs/how-to/index.md.tmpl +2 -1
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/docs/index.md.tmpl +2 -1
- project_init-0.3.0/templates/base/docs/reference/index.md → project_init-0.5.0/templates/base/docs/reference/index.md.tmpl +2 -1
- project_init-0.3.0/templates/base/docs/tutorials/index.md → project_init-0.5.0/templates/base/docs/tutorials/index.md.tmpl +2 -1
- project_init-0.5.0/templates/base/dot_claude/agents/README.md +53 -0
- project_init-0.5.0/templates/base/dot_claude/agents/code-reviewer.md +17 -0
- project_init-0.5.0/templates/base/dot_claude/agents/explore.md +14 -0
- project_init-0.5.0/templates/base/dot_claude/config.yaml.tmpl +57 -0
- project_init-0.3.0/templates/base/dot_claude/docs/README.md → project_init-0.5.0/templates/base/dot_claude/docs/README.md.tmpl +4 -4
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/adr/adr-002-mcp-choices.md.tmpl +6 -4
- project_init-0.5.0/templates/base/dot_claude/docs/guides/cloud-integration.md.tmpl +51 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/guides/developer-onboarding.md +13 -2
- project_init-0.5.0/templates/base/dot_claude/docs/guides/environments.md +60 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/hooks/README.md +1 -1
- project_init-0.5.0/templates/base/dot_claude/hooks/_py.sh +30 -0
- project_init-0.5.0/templates/base/dot_claude/hooks/agent_guard_adapter.py.tmpl +150 -0
- {project_init-0.3.0/templates/fallback → project_init-0.5.0/templates/base}/dot_claude/hooks/prod_guard.py +107 -15
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/project-init.md.tmpl +19 -15
- project_init-0.3.0/templates/base/dot_claude/rules/hooks.md → project_init-0.5.0/templates/base/dot_claude/rules/hooks.md.tmpl +7 -6
- project_init-0.3.0/templates/base/dot_claude/scripts/README.md → project_init-0.5.0/templates/base/dot_claude/scripts/README.md.tmpl +2 -2
- project_init-0.5.0/templates/base/dot_claude/scripts/gen_code_map.py.tmpl +107 -0
- project_init-0.5.0/templates/base/dot_claude/scripts/gh_host.sh +70 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/scripts/install_hooks.sh +7 -2
- project_init-0.5.0/templates/base/dot_claude/scripts/setup_env_protection.sh.tmpl +131 -0
- project_init-0.5.0/templates/base/dot_claude/scripts/whats_deployed.sh.tmpl +54 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/settings.json.tmpl +17 -11
- project_init-0.5.0/templates/base/dot_claude/skills/README.md.tmpl +17 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/skills/plan/SKILL.md.tmpl +1 -1
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_devcontainer/devcontainer.json.tmpl +3 -3
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_devcontainer/post-create.sh.tmpl +2 -2
- project_init-0.5.0/templates/base/dot_dockerignore.tmpl +24 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_env.example.tmpl +2 -3
- project_init-0.5.0/templates/base/dot_gitattributes +4 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/hooks/commit-msg +1 -1
- project_init-0.3.0/templates/base/dot_github/hooks/pre-push → project_init-0.5.0/templates/base/dot_github/hooks/pre-push.tmpl +14 -8
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/workflows/ci.yml.tmpl +133 -9
- project_init-0.5.0/templates/base/dot_github/workflows/deploy.yml.tmpl +94 -0
- project_init-0.5.0/templates/base/dot_github/workflows/infra.yml.tmpl +72 -0
- project_init-0.5.0/templates/base/dot_github/workflows/registry-publish.yml.tmpl +46 -0
- project_init-0.5.0/templates/base/dot_github/workflows/release.yml.tmpl +132 -0
- project_init-0.5.0/templates/base/dot_gitignore.tmpl +60 -0
- project_init-0.5.0/templates/base/infra/README.md.tmpl +21 -0
- project_init-0.5.0/templates/base/infra/backend.tf.tmpl +24 -0
- project_init-0.5.0/templates/base/infra/dot_gitignore.tmpl +8 -0
- project_init-0.5.0/templates/base/infra/dot_pre-commit-config.yaml.tmpl +13 -0
- project_init-0.5.0/templates/base/infra/main.tf.tmpl +4 -0
- project_init-0.5.0/templates/base/infra/outputs.tf.tmpl +5 -0
- project_init-0.5.0/templates/base/infra/variables.tf.tmpl +6 -0
- project_init-0.5.0/templates/base/infra/versions.tf.tmpl +14 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/justfile.tmpl +22 -4
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/mkdocs.yml.tmpl +3 -3
- project_init-0.3.0/templates/base/renovate.json → project_init-0.5.0/templates/base/renovate.json.tmpl +2 -2
- project_init-0.5.0/templates/base/typedoc.json.tmpl +14 -0
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/codex/dot_agents}/skills/add_command/SKILL.md +12 -1
- project_init-0.5.0/templates/codex/dot_agents/skills/add_hook/SKILL.md +132 -0
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/codex/dot_agents}/skills/audit/SKILL.md +3 -2
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/codex/dot_agents}/skills/create_issue/SKILL.md +5 -2
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/codex/dot_agents}/skills/github_workflow/SKILL.md +10 -1
- project_init-0.5.0/templates/codex/dot_agents/skills/plan/SKILL.md +40 -0
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/request_review/SKILL.md +3 -3
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/review/SKILL.md +1 -1
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/start_task/SKILL.md +1 -1
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/codex/dot_agents}/skills/status/SKILL.md +1 -1
- {project_init-0.3.0 → project_init-0.5.0}/templates/codex/dot_codex/hooks.json.tmpl +1 -1
- project_init-0.5.0/templates/fallback/dot_claude/hooks/_usage_log.sh +74 -0
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/fallback/dot_claude}/hooks/post_edit_lint.sh +13 -3
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/fallback/dot_claude}/hooks/pre_commit_gate.sh +20 -5
- {project_init-0.3.0 → project_init-0.5.0}/templates/fallback/dot_claude/hooks/session_setup.sh +21 -2
- project_init-0.3.0/templates/fallback/dot_claude/skills/INDEX.md → project_init-0.5.0/templates/fallback/dot_claude/skills/INDEX.md.tmpl +6 -6
- project_init-0.5.0/templates/fallback/dot_claude/skills/add_adr/SKILL.md +33 -0
- project_init-0.5.0/templates/fallback/dot_claude/skills/add_command/SKILL.md +74 -0
- project_init-0.5.0/templates/fallback/dot_claude/skills/add_hook/SKILL.md +132 -0
- project_init-0.5.0/templates/fallback/dot_claude/skills/review/SKILL.md +17 -0
- project_init-0.5.0/templates/fallback/dot_claude/skills/save_memory/SKILL.md +17 -0
- project_init-0.5.0/templates/fallback/dot_claude/skills/session_summary/SKILL.md +35 -0
- project_init-0.5.0/templates/fallback/dot_claude/skills/status/SKILL.md +15 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/AI_USAGE_POLICY.md +71 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/NIST_RMF_CROSSWALK.md +40 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/README.md +49 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/ai-code-provenance.md +48 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/ai-declarations.md +33 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/approved-tools.md +53 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/config.example.json +4 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/data-handling.md +46 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/examples/SYSTEM_CARD.example.md +71 -0
- project_init-0.5.0/templates/governance/dot_claude/governance/examples/SYSTEM_CARD.template.md +76 -0
- project_init-0.5.0/templates/governance/dot_claude/scripts/governance_gate.py +193 -0
- project_init-0.5.0/templates/governance/dot_claude/scripts/governance_gate.sh +15 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/graphify/dot_claude/scripts/setup_graphify.sh +1 -1
- project_init-0.5.0/templates/junie/dot_junie/skills/add_adr/SKILL.md +33 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/add_command/SKILL.md +74 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/add_hook/SKILL.md +132 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/audit/SKILL.md +147 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/create_issue/SKILL.md +62 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/github_workflow/SKILL.md +89 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/plan/SKILL.md +40 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/request_review/SKILL.md +19 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/review/SKILL.md +17 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/save_memory/SKILL.md +17 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/session_summary/SKILL.md +35 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/start_task/SKILL.md +48 -0
- project_init-0.5.0/templates/junie/dot_junie/skills/status/SKILL.md +15 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/docs/guides/issue-metadata.md +2 -1
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/lifecycle/dot_claude}/hooks/dag_workflow.py +72 -13
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/create_issue.sh +47 -22
- project_init-0.5.0/templates/lifecycle/dot_claude/scripts/create_nojira_pr.sh +3 -0
- project_init-0.5.0/templates/lifecycle/dot_claude/scripts/finish_pr.sh +3 -0
- {project_init-0.3.0/.claude → project_init-0.5.0/templates/lifecycle/dot_claude}/scripts/monitor_pr.sh +93 -34
- project_init-0.5.0/templates/lifecycle/dot_claude/scripts/promote_review.sh +3 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/push_branch.sh +2 -2
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/push_wiki.sh +5 -1
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/setup_github.sh +84 -12
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/start_issue.sh +41 -2
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/copilot-instructions.md.tmpl +2 -1
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/workflows/board-automation.yml +13 -3
- project_init-0.5.0/templates/lifecycle/dot_github/workflows/project-init-upgrade.yml.tmpl +78 -0
- project_init-0.3.0/templates/base/dot_github/workflows/validate-pr.yml → project_init-0.5.0/templates/lifecycle/dot_github/workflows/validate-pr.yml.tmpl +3 -1
- project_init-0.5.0/templates/lifecycle_fallback/dot_claude/hooks/github_command_guard.sh +18 -0
- {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/lifecycle_fallback/dot_claude}/hooks/workflow_state_reminder.sh +12 -3
- project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/audit/SKILL.md +147 -0
- project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/create_issue/SKILL.md +62 -0
- project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/github_workflow/SKILL.md +89 -0
- project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/request_review/SKILL.md +19 -0
- project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/start_task/SKILL.md +48 -0
- project_init-0.5.0/templates/multi_model/dot_claude/docs/guides/using-multi-model.md +175 -0
- project_init-0.5.0/templates/multi_model/dot_claude/multi-model/README.md +49 -0
- project_init-0.5.0/templates/multi_model/dot_claude/multi-model/config.json +53 -0
- project_init-0.5.0/templates/multi_model/dot_claude/multi-model/dot_env.example +25 -0
- project_init-0.5.0/templates/multi_model/dot_claude/scripts/models.sh +126 -0
- project_init-0.5.0/templates/multi_model/dot_claude/scripts/setup_models.sh +238 -0
- project_init-0.5.0/templates/observability/dot_claude/docs/guides/upgrading-observability.md +62 -0
- project_init-0.5.0/templates/observability/dot_claude/docs/guides/using-observability.md +88 -0
- project_init-0.5.0/templates/observability/dot_claude/observability/.keep +9 -0
- project_init-0.5.0/templates/observability/dot_claude/observability/README.md +47 -0
- project_init-0.5.0/templates/observability/dot_claude/observability/dot_gitignore +4 -0
- project_init-0.5.0/templates/observability/dot_claude/observability/usage_report.py +543 -0
- project_init-0.5.0/templates/observability/dot_claude/scripts/observability.sh +52 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/docs/adr/adr-001-memory-stack.md.tmpl +1 -1
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/docs/guides/using-memory.md +3 -3
- project_init-0.5.0/templates/presets/auto.toml +20 -0
- project_init-0.5.0/templates/presets/core.toml +18 -0
- project_init-0.5.0/templates/presets/governed.toml +14 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/presets/obsidian-graphify.toml +3 -1
- {project_init-0.3.0 → project_init-0.5.0}/templates/presets/obsidian-only.toml +3 -1
- project_init-0.5.0/templates/rag/dot_claude/docs/guides/using-rag.md +73 -0
- project_init-0.5.0/templates/rag/dot_claude/rules/rag.md +32 -0
- project_init-0.5.0/templates/rag/dot_claude/scripts/setup_rag.sh +107 -0
- project_init-0.5.0/tests/contracts/test_agent_overlays.py +387 -0
- project_init-0.5.0/tests/contracts/test_agents_canonical.py +227 -0
- project_init-0.5.0/tests/contracts/test_benchmark_cost_latency.py +107 -0
- project_init-0.5.0/tests/contracts/test_benchmark_harness.py +298 -0
- project_init-0.5.0/tests/contracts/test_benchmark_report.py +160 -0
- project_init-0.5.0/tests/contracts/test_benchmark_scoring.py +174 -0
- project_init-0.5.0/tests/contracts/test_capabilities.py +110 -0
- project_init-0.5.0/tests/contracts/test_cross_stack_examples.py +114 -0
- project_init-0.5.0/tests/contracts/test_deploy_overlay.py +145 -0
- project_init-0.5.0/tests/contracts/test_docs_renovate.py +226 -0
- project_init-0.5.0/tests/contracts/test_enforcement.py +67 -0
- project_init-0.5.0/tests/contracts/test_enterprise_host.py +128 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_env_tooling.py +9 -4
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_governance.py +23 -1
- project_init-0.5.0/tests/contracts/test_governance_overlay.py +250 -0
- project_init-0.5.0/tests/contracts/test_governance_product.py +311 -0
- project_init-0.5.0/tests/contracts/test_hook_portability.py +108 -0
- project_init-0.5.0/tests/contracts/test_iac_overlay.py +99 -0
- project_init-0.5.0/tests/contracts/test_integration_seam.py +44 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_integrity.py +3 -2
- project_init-0.5.0/tests/contracts/test_interpreter_portability.py +196 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_justfile.py +12 -4
- project_init-0.5.0/tests/contracts/test_library_release.py +56 -0
- project_init-0.5.0/tests/contracts/test_lifecycle_byte_identity.py +105 -0
- project_init-0.5.0/tests/contracts/test_lifecycle_none.py +304 -0
- project_init-0.5.0/tests/contracts/test_marketplace_source.py +96 -0
- project_init-0.5.0/tests/contracts/test_memory_byte_identity.py +107 -0
- project_init-0.5.0/tests/contracts/test_memory_none.py +195 -0
- project_init-0.5.0/tests/contracts/test_multi_model_overlay.py +180 -0
- project_init-0.5.0/tests/contracts/test_no_bytecode_leak.py +45 -0
- project_init-0.5.0/tests/contracts/test_no_egress.py +98 -0
- project_init-0.5.0/tests/contracts/test_observability_overlay.py +135 -0
- project_init-0.5.0/tests/contracts/test_observability_report.py +266 -0
- project_init-0.5.0/tests/contracts/test_observability_self_log.py +220 -0
- project_init-0.5.0/tests/contracts/test_parity_bundle.py +107 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_plugin_marketplace.py +83 -50
- project_init-0.5.0/tests/contracts/test_portability_hardening.py +98 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_prod_guard.py +74 -4
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_quality_toolchain.py +8 -8
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_release_engineering.py +27 -1
- project_init-0.5.0/tests/contracts/test_repo_validate_pr.py +89 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_scaffold_graphify.py +3 -7
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_scaffold_obsidian.py +57 -3
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_skill_index.py +7 -8
- project_init-0.5.0/tests/contracts/test_subagent_specs.py +36 -0
- project_init-0.5.0/tests/contracts/test_surface_emission.py +119 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_templates.py +175 -16
- project_init-0.5.0/tests/contracts/test_third_party_pin_contract.py +34 -0
- project_init-0.5.0/tests/contracts/test_upgrade_pr_workflow.py +73 -0
- project_init-0.5.0/tests/contracts/test_variable_contract.py +102 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_wiki_skill.py +14 -6
- project_init-0.5.0/tests/contracts/test_wizard_explanations.py +93 -0
- project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-graphify__no_plugin.json +121 -0
- project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-graphify__plugin.json +102 -0
- project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-only__no_plugin.json +118 -0
- project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-only__plugin.json +99 -0
- project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-graphify__no_plugin.json +121 -0
- project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-graphify__plugin.json +102 -0
- project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-only__no_plugin.json +118 -0
- project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-only__plugin.json +99 -0
- project_init-0.5.0/tests/helpers.py +172 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_cli.py +121 -4
- project_init-0.5.0/tests/integration/test_code_map.py +140 -0
- project_init-0.5.0/tests/integration/test_combination_matrix.py +144 -0
- project_init-0.5.0/tests/integration/test_consent.py +146 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_dag_workflow.py +241 -31
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_hooks_and_safety.py +25 -0
- project_init-0.5.0/tests/integration/test_install_script.py +59 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_issue_metadata_workflow.py +92 -13
- project_init-0.5.0/tests/integration/test_json_output.py +89 -0
- project_init-0.5.0/tests/integration/test_lifecycle.py +126 -0
- project_init-0.5.0/tests/integration/test_memory_backends.py +173 -0
- project_init-0.5.0/tests/integration/test_memory_descriptor.py +195 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_memory_starters.py +82 -6
- project_init-0.5.0/tests/integration/test_observability.py +98 -0
- project_init-0.5.0/tests/integration/test_org_lifecycle.py +67 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_overwrite_protection.py +102 -5
- project_init-0.5.0/tests/integration/test_rag_seam.py +192 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_readme_examples.py +38 -0
- project_init-0.5.0/tests/integration/test_upgrade.py +1039 -0
- project_init-0.5.0/tests/unit/test_interactive_prompts.py +73 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/unit/test_mcps.py +40 -39
- project_init-0.5.0/tests/unit/test_migration_notes.py +48 -0
- project_init-0.5.0/tests/unit/test_presets.py +54 -0
- project_init-0.5.0/tests/unit/test_presets_inheritance.py +131 -0
- project_init-0.5.0/tests/unit/test_profile.py +136 -0
- project_init-0.5.0/tests/unit/test_render_nesting.py +76 -0
- project_init-0.5.0/tests/unit/test_scaffold_inputs.py +128 -0
- project_init-0.5.0/tests/unit/test_shell_portability.py +178 -0
- project_init-0.5.0/tests/unit/test_surfaces.py +158 -0
- project_init-0.5.0/tests/unit/test_third_party_updates.py +109 -0
- project_init-0.5.0/tests/unit/test_version_span.py +59 -0
- project_init-0.5.0/tools/benchmark/README.md +131 -0
- project_init-0.5.0/tools/benchmark/harness.py +465 -0
- project_init-0.5.0/tools/benchmark/latency.py +66 -0
- project_init-0.5.0/tools/benchmark/model_prices.json +39 -0
- project_init-0.5.0/tools/benchmark/prices.py +71 -0
- project_init-0.5.0/tools/benchmark/record.py +96 -0
- project_init-0.5.0/tools/benchmark/report.py +305 -0
- project_init-0.5.0/tools/benchmark/scoring.py +135 -0
- project_init-0.5.0/tools/benchmark/tasks/feat.toml +17 -0
- project_init-0.5.0/tools/benchmark/tasks/fix.toml +44 -0
- project_init-0.5.0/tools/benchmark/tasks/noop.toml +10 -0
- project_init-0.5.0/tools/benchmark/tasks/qa.toml +16 -0
- project_init-0.5.0/tools/benchmark/transcript.py +124 -0
- project_init-0.5.0/tools/check_third_party_updates.py +183 -0
- project_init-0.5.0/tools/pinned_third_party.toml +18 -0
- project_init-0.5.0/tools/propose_third_party_bumps.sh +117 -0
- project_init-0.5.0/tools/sync_plugin.py +185 -0
- {project_init-0.3.0 → project_init-0.5.0}/uv.lock +1 -1
- project_init-0.3.0/.claude/skills/add_command/SKILL.md +0 -59
- project_init-0.3.0/.claude/skills/add_hook/SKILL.md +0 -108
- project_init-0.3.0/.claude/skills/wiki/SKILL.md +0 -84
- project_init-0.3.0/.claude-plugin/marketplace.json +0 -14
- project_init-0.3.0/.github/workflows/ci.yml +0 -99
- project_init-0.3.0/.github/workflows/docs.yml +0 -35
- project_init-0.3.0/GEMINI.md +0 -9
- project_init-0.3.0/PKG-INFO +0 -342
- project_init-0.3.0/README.md +0 -311
- project_init-0.3.0/mkdocs.yml +0 -32
- project_init-0.3.0/plugins/project-init-workflow/hooks/github_command_guard.sh +0 -11
- project_init-0.3.0/src/project_init/__init__.py +0 -4
- project_init-0.3.0/src/project_init/__main__.py +0 -662
- project_init-0.3.0/src/project_init/mcps.py +0 -57
- project_init-0.3.0/src/project_init/scaffold.py +0 -374
- project_init-0.3.0/src/project_init/upgrade.py +0 -569
- project_init-0.3.0/templates/base/AGENTS.md.tmpl +0 -50
- project_init-0.3.0/templates/base/GEMINI.md.tmpl +0 -16
- project_init-0.3.0/templates/base/dot_claude/agents/README.md +0 -30
- project_init-0.3.0/templates/base/dot_claude/config.yaml.tmpl +0 -31
- project_init-0.3.0/templates/base/dot_claude/hooks/agent_guard_adapter.py.tmpl +0 -64
- project_init-0.3.0/templates/base/dot_claude/scripts/create_nojira_pr.sh +0 -3
- project_init-0.3.0/templates/base/dot_claude/scripts/finish_pr.sh +0 -3
- project_init-0.3.0/templates/base/dot_claude/scripts/promote_review.sh +0 -3
- project_init-0.3.0/templates/base/dot_claude/skills/README.md +0 -12
- project_init-0.3.0/templates/base/dot_github/workflows/docs.yml.tmpl +0 -98
- project_init-0.3.0/templates/base/dot_gitignore.tmpl +0 -41
- project_init-0.3.0/templates/base/typedoc.json.tmpl +0 -14
- project_init-0.3.0/templates/fallback/dot_claude/hooks/github_command_guard.sh +0 -11
- project_init-0.3.0/templates/gemini/dot_claude/scripts/setup_gemini.sh.tmpl +0 -16
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/add_adr.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/add_command.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/add_hook.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/audit.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/create_issue.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/github_workflow.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/request_review.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/review.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/save_memory.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/session_summary.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/start_task.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/status.toml +0 -5
- project_init-0.3.0/templates/gemini/dot_gemini-extension/gemini-extension.json.tmpl +0 -6
- project_init-0.3.0/templates/gemini/dot_gemini-extension/hooks/hooks.json.tmpl +0 -18
- project_init-0.3.0/tests/contracts/test_agent_overlays.py +0 -177
- project_init-0.3.0/tests/contracts/test_agents_canonical.py +0 -94
- project_init-0.3.0/tests/helpers.py +0 -84
- project_init-0.3.0/tests/integration/test_upgrade.py +0 -457
- project_init-0.3.0/tests/unit/test_presets.py +0 -30
- project_init-0.3.0/tests/unit/test_render_nesting.py +0 -35
- project_init-0.3.0/tools/sync_plugin.py +0 -144
- {project_init-0.3.0 → project_init-0.5.0}/.claude/hooks/github_command_guard.sh +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/create_nojira_pr.sh +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/finish_pr.sh +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/promote_review.sh +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/push_branch.sh +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/push_wiki.sh +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/settings.json +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/github_workflow/SKILL.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/session_summary/SKILL.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/start_task/SKILL.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/architecture.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/implementation-guide.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/preset-guide.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/scaffolder-logic.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.gitattributes +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/chore.yml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/docs.yml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/test.yml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/copilot-instructions.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/board-automation.yml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/review-status.yml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/AGENTS.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/LICENSE +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/cliff.toml +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-001-scaffolder-design.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-002-dotglob-template-convention.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-006-conventional-commit-titles.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-008-distribution-channel.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-009-graphify-memory-preset.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-010-plugin-marketplace-dual-ship.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/development/build-reproducibility.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/development/contributing.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/development/template-system.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/docs/development/testing.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/justfile +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/.claude-plugin/plugin.json +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/skills/add_adr/SKILL.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/skills/save_memory/SKILL.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/skills/session_summary/SKILL.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/renovate.json +0 -0
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/add_adr/SKILL.md +0 -0
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/save_memory/SKILL.md +0 -0
- {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/session_summary/SKILL.md +0 -0
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/antigravity/dot_agents}/skills/add_adr/SKILL.md +0 -0
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/antigravity/dot_agents}/skills/save_memory/SKILL.md +0 -0
- {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/antigravity/dot_agents}/skills/session_summary/SKILL.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/MEMORY.md.tmpl +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/README.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/SCHEMA.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/feedback_conventions.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/project_context.md.tmpl +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/user_role.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/LICENSE.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/SECURITY.md.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/adr/adr-template.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/development/conventions.md.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/development/testing.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/guides/secrets.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/rules/go.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/rules/node.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/rules/python.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/CODEOWNERS.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/hooks/pre-commit +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_golangci.yml.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_vscode/extensions.json.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_vscode/settings.json.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/eslint.config.mjs.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/mise.toml.tmpl +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/base/ruff.toml.tmpl +0 -0
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/add_adr/SKILL.md +0 -0
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/save_memory/SKILL.md +0 -0
- {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/session_summary/SKILL.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/graphify/dot_claude/docs/guides/using-graphify.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/graphify/dot_claude/rules/graphify.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/bug.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/chore.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/config.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/docs.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/feature.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/test.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/pull_request_template.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/workflows/issue-validation.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/workflows/review-status.yml +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/README.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/decisions/README.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/decisions/adr-000-project-setup.md.tmpl +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/design/README.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/README.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/app.json +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/community-plugins.json +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/core-plugins.json +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/knowledge/README.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/log.md +0 -0
- {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/sessions/README.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/decision.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/design-note.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/knowledge-note.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/session-note.md +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/__init__.py +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/conftest.py +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_renovate.py +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_session_bootstrap.py +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_quality_gate_lint.py +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_session_cold_start.py +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/smoke/test_packaging.py +0 -0
- {project_init-0.3.0 → project_init-0.5.0}/tests/unit/test_command_variables.py +0 -0
{project_init-0.3.0/templates/base/dot_claude → project_init-0.5.0/.claude}/hooks/dag_workflow.py
RENAMED
|
@@ -5,8 +5,9 @@ Subcommands:
|
|
|
5
5
|
check <node> exit 0 if every prerequisite of <node> is satisfied,
|
|
6
6
|
exit 2 otherwise (with reason on stdout).
|
|
7
7
|
guard read PreToolUse hook input JSON from stdin, map the
|
|
8
|
-
Bash command to a target node, emit
|
|
9
|
-
|
|
8
|
+
Bash command to a target node, emit a PreToolUse
|
|
9
|
+
hookSpecificOutput with permissionDecision: deny if
|
|
10
|
+
disallowed (the documented Claude Code schema).
|
|
10
11
|
nodes list every DAG node and its prerequisites.
|
|
11
12
|
push [<branch>] [N] push current (or named) branch with retry + remote-SHA
|
|
12
13
|
verification (handles transient GitHub 5xx).
|
|
@@ -239,12 +240,16 @@ def prereqs_satisfied(node: str, _seen: set[str] | None = None) -> tuple[bool, s
|
|
|
239
240
|
# DAG validation; otherwise, prereqs of target_node are appended to the reason.
|
|
240
241
|
COMMAND_RULES: list[tuple[re.Pattern[str], str | None, str]] = [
|
|
241
242
|
(
|
|
242
|
-
re.compile(r"git\s+push\s
|
|
243
|
+
re.compile(r"git\s+push\b[^|;&\n]*?[\s:]['\"]?(?:refs/heads/)?(?:main|master)(?![\w./-])"),
|
|
243
244
|
None,
|
|
244
245
|
"Direct pushes to main/master are blocked. Open a feature branch and PR.",
|
|
245
246
|
),
|
|
246
247
|
(
|
|
247
|
-
|
|
248
|
+
# `[^&;]*?` allows flags between `gh api` and the endpoint (a real merge
|
|
249
|
+
# needs `--method PUT`/`-X PUT`, often written before the path). `|` is NOT
|
|
250
|
+
# excluded: a pipe inside a quoted flag (e.g. `--jq '.a|.b'`) must not let a
|
|
251
|
+
# merge slip past the guard — only `;`/`&` end the command segment (PI-198).
|
|
252
|
+
re.compile(r"\bgh\s+api\b[^&;]*?repos/[^/\s]+/[^/\s]+/pulls/\d+/merge\b"),
|
|
248
253
|
"pr.merged",
|
|
249
254
|
"Use .claude/scripts/monitor_pr.sh <pr> --merge instead of `gh api .../merge` so CI and review gates are honored.",
|
|
250
255
|
),
|
|
@@ -300,7 +305,19 @@ def _redirect_target_exists(reason: str) -> bool:
|
|
|
300
305
|
m = re.search(r"\.claude/scripts/([\w.-]+)", reason)
|
|
301
306
|
if not m:
|
|
302
307
|
return True
|
|
303
|
-
|
|
308
|
+
# Resolve the PROJECT's wrapper-scripts dir, never the process CWD (#429).
|
|
309
|
+
# Prefer $CLAUDE_PROJECT_DIR — Claude Code sets it on every hook invocation,
|
|
310
|
+
# including the default plugin mode where this file lives under the plugin
|
|
311
|
+
# root, not the project (#447 review). Otherwise — the codex/cursor/
|
|
312
|
+
# antigravity adapter path, which runs the project's own .claude/hooks/ copy
|
|
313
|
+
# and sets no such var — anchor on this file's location (.claude/hooks ->
|
|
314
|
+
# .claude/scripts). Mirrors prod_guard.py's project-root resolution.
|
|
315
|
+
project_dir = os.environ.get("CLAUDE_PROJECT_DIR")
|
|
316
|
+
if project_dir:
|
|
317
|
+
scripts_dir = Path(project_dir) / ".claude" / "scripts"
|
|
318
|
+
else:
|
|
319
|
+
scripts_dir = Path(__file__).resolve().parent.parent / "scripts"
|
|
320
|
+
return (scripts_dir / m.group(1)).exists()
|
|
304
321
|
|
|
305
322
|
|
|
306
323
|
def guard(payload: dict) -> dict | None:
|
|
@@ -325,7 +342,13 @@ def guard(payload: dict) -> dict | None:
|
|
|
325
342
|
ok, why = prereqs_satisfied(target)
|
|
326
343
|
if not ok:
|
|
327
344
|
reason = f"{message}\n\nDAG prerequisite for {target} not met: {why}."
|
|
328
|
-
return {
|
|
345
|
+
return {
|
|
346
|
+
"hookSpecificOutput": {
|
|
347
|
+
"hookEventName": "PreToolUse",
|
|
348
|
+
"permissionDecision": "deny",
|
|
349
|
+
"permissionDecisionReason": reason,
|
|
350
|
+
}
|
|
351
|
+
}
|
|
329
352
|
return None
|
|
330
353
|
|
|
331
354
|
|
|
@@ -339,7 +362,7 @@ def cmd_check(node: str) -> int:
|
|
|
339
362
|
own_ok, own_reason = CHECKS[node]()
|
|
340
363
|
marker = "OK" if own_ok else "REACHABLE (state not yet satisfied)"
|
|
341
364
|
sys.stdout.write(f"{marker}: {node} — {own_reason}\n")
|
|
342
|
-
return 0
|
|
365
|
+
return 0 # prereqs satisfied = transition allowed (own check is advisory)
|
|
343
366
|
sys.stdout.write(f"BLOCKED: cannot reach {node}: {reason}\n")
|
|
344
367
|
return 2
|
|
345
368
|
|
|
@@ -380,8 +403,12 @@ def cmd_push(branch: str | None, max_retries: int, *, force: bool = False) -> in
|
|
|
380
403
|
if not branch:
|
|
381
404
|
sys.stderr.write("push: no current branch\n")
|
|
382
405
|
return 1
|
|
383
|
-
if
|
|
384
|
-
|
|
406
|
+
if branch in ("main", "master"):
|
|
407
|
+
# Refuse main/master for ANY push, not only force-pushes — otherwise
|
|
408
|
+
# running push_branch.sh while on main bypasses the direct-push guard,
|
|
409
|
+
# since the internal `git push` subprocess is invisible to the
|
|
410
|
+
# PreToolUse hook (PI-202).
|
|
411
|
+
sys.stderr.write("push: refusing to push main/master directly — open a feature branch + PR\n")
|
|
385
412
|
return 1
|
|
386
413
|
|
|
387
414
|
code, sha_out = _git(["rev-parse", branch])
|
|
@@ -455,18 +482,49 @@ def cmd_promote(pr_number: int | None) -> int:
|
|
|
455
482
|
|
|
456
483
|
def cmd_finish(pr_number: int | None, review_cycle: int | None) -> int:
|
|
457
484
|
"""Push, promote, then hand off to monitor_pr.sh for CI/review/merge."""
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
485
|
+
# Resolve the PR BEFORE pushing so we push that PR's head branch, never
|
|
486
|
+
# whatever happens to be checked out. Pushing the current branch first let
|
|
487
|
+
# a concurrent branch switch make `finish` push an unrelated branch (PI-458).
|
|
461
488
|
if pr_number is None:
|
|
462
489
|
pr_number = _detect_pr_number()
|
|
463
490
|
if pr_number is None:
|
|
464
491
|
sys.stderr.write("finish: no PR found for current branch.\n")
|
|
465
492
|
return 1
|
|
493
|
+
code, head = _gh(
|
|
494
|
+
["pr", "view", str(pr_number), "--json", "headRefName", "-q", ".headRefName"]
|
|
495
|
+
)
|
|
496
|
+
head = head.strip()
|
|
497
|
+
if code != 0 or not head:
|
|
498
|
+
sys.stderr.write(
|
|
499
|
+
f"finish: cannot resolve head branch for PR #{pr_number} — refusing to push.\n"
|
|
500
|
+
)
|
|
501
|
+
return 1
|
|
502
|
+
current = _current_branch()
|
|
503
|
+
if current is None:
|
|
504
|
+
sys.stderr.write(
|
|
505
|
+
f"finish: no current branch (detached HEAD or not a git repo) — check out "
|
|
506
|
+
f"PR #{pr_number}'s head '{head}' and re-run.\n"
|
|
507
|
+
)
|
|
508
|
+
return 1
|
|
509
|
+
if current != head:
|
|
510
|
+
sys.stderr.write(
|
|
511
|
+
f"finish: checked-out branch '{current}' is not PR #{pr_number}'s head "
|
|
512
|
+
f"'{head}'. Check out '{head}' and re-run — refusing to push the wrong branch.\n"
|
|
513
|
+
)
|
|
514
|
+
return 1
|
|
515
|
+
rc = cmd_push(head, 3)
|
|
516
|
+
if rc != 0:
|
|
517
|
+
return rc
|
|
466
518
|
rc = cmd_promote(pr_number)
|
|
467
519
|
if rc != 0:
|
|
468
520
|
return rc
|
|
469
|
-
|
|
521
|
+
# Invoke via an explicit `bash` on an absolute path instead of exec'ing the
|
|
522
|
+
# .sh directly (PI-361): that avoids depending on the script's executable
|
|
523
|
+
# bit or shebang resolution (fragile on native Windows / Git Bash) and on
|
|
524
|
+
# the current working directory. cmd_finish always runs from the scaffolded
|
|
525
|
+
# .claude/hooks/ copy, so ../scripts/monitor_pr.sh resolves in every mode.
|
|
526
|
+
script = Path(__file__).resolve().parent.parent / "scripts" / "monitor_pr.sh"
|
|
527
|
+
monitor_args = ["bash", str(script), str(pr_number), "--merge"]
|
|
470
528
|
if review_cycle is not None:
|
|
471
529
|
monitor_args += ["--review-cycle", str(review_cycle)]
|
|
472
530
|
return subprocess.run(monitor_args).returncode
|
|
@@ -538,6 +596,7 @@ def cmd_create_pr_nojira(
|
|
|
538
596
|
# Conventional Commits, no scope = no linked issue (ADR-006)
|
|
539
597
|
pr_title = f"{type_}: {title}"
|
|
540
598
|
pr_body = "No linked issue (nojira)."
|
|
599
|
+
# Single trunk: with no explicit --base, gh targets the repo default branch.
|
|
541
600
|
args = ["pr", "create", "--draft", "--title", pr_title, "--body", pr_body]
|
|
542
601
|
if base:
|
|
543
602
|
args += ["--base", base]
|
{project_init-0.3.0/templates/base/dot_claude → project_init-0.5.0/.claude}/scripts/monitor_pr.sh
RENAMED
|
@@ -63,7 +63,11 @@ import json, sys
|
|
|
63
63
|
data = json.load(sys.stdin)
|
|
64
64
|
# Exclude review/decision; it is a derived commit status that only appears
|
|
65
65
|
# after a review event. We detect review state directly via reviewDecision.
|
|
66
|
-
|
|
66
|
+
# Gate on gh's authoritative 'bucket' rollup (pass/fail/pending/skipping/
|
|
67
|
+
# cancel), not a hand-rolled state allowlist: just-queued Actions report
|
|
68
|
+
# state=QUEUED (and WAITING/REQUESTED for env-gated jobs), all bucket=pending.
|
|
69
|
+
# An allowlist that omitted those let the CI-wait break before CI ran (#428).
|
|
70
|
+
print(sum(1 for c in data if c.get('name') != 'review/decision' and c.get('bucket') == 'pending'))
|
|
67
71
|
"
|
|
68
72
|
}
|
|
69
73
|
|
|
@@ -146,14 +150,28 @@ _has_review_activity() {
|
|
|
146
150
|
# --- Wait for all CI checks (excludes review/decision commit status) ---
|
|
147
151
|
# Guard: if checks haven't registered yet (empty list), keep polling.
|
|
148
152
|
# An empty list is indistinguishable from "all done" without this guard,
|
|
149
|
-
# which caused premature merges before CI even started.
|
|
153
|
+
# which caused premature merges before CI even started. Bounded by CI_TIMEOUT
|
|
154
|
+
# so a required check that never registers can't hang the script — and any
|
|
155
|
+
# autonomous caller — forever; fail closed on timeout (PI-186/PI-203).
|
|
156
|
+
CI_TIMEOUT=900
|
|
157
|
+
CI_ELAPSED=0
|
|
150
158
|
while true; do
|
|
151
159
|
CHECKS=$(gh pr checks "$PR_NUMBER" --json name,state,bucket 2>/dev/null) || CHECKS="[]"
|
|
152
160
|
CHECK_COUNT=$(echo "$CHECKS" | python3 -c "import json,sys; print(len(json.load(sys.stdin)))")
|
|
153
|
-
[ "$CHECK_COUNT" -
|
|
154
|
-
|
|
155
|
-
|
|
161
|
+
if [ "$CHECK_COUNT" -gt 0 ] && [ "$(_count_pending "$CHECKS")" -eq 0 ]; then
|
|
162
|
+
break
|
|
163
|
+
fi
|
|
164
|
+
if [ "$CI_ELAPSED" -ge "$CI_TIMEOUT" ]; then
|
|
165
|
+
echo "PR #$PR_NUMBER: CI did not settle within ${CI_TIMEOUT}s. Still pending:"
|
|
166
|
+
echo "$CHECKS" | python3 -c "import json,sys
|
|
167
|
+
for c in json.load(sys.stdin):
|
|
168
|
+
if c.get('name') != 'review/decision' and c.get('bucket') == 'pending':
|
|
169
|
+
print(' -', c.get('name'))" 2>/dev/null || true
|
|
170
|
+
echo "Re-run once the check registers, or investigate why it never started."
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
156
173
|
sleep 10
|
|
174
|
+
CI_ELAPSED=$((CI_ELAPSED + 10))
|
|
157
175
|
done
|
|
158
176
|
|
|
159
177
|
FAIL_CODE=0
|
|
@@ -11,6 +11,7 @@ Load the relevant skill file when the trigger applies. Do not load all skills at
|
|
|
11
11
|
| Summarize the session | `.claude/skills/session_summary/SKILL.md` |
|
|
12
12
|
| Add a hook | `.claude/skills/add_hook/SKILL.md` |
|
|
13
13
|
| Add a slash command | `.claude/skills/add_command/SKILL.md` |
|
|
14
|
+
| Live E2E test the scaffolder (build+install wheel, scaffold real projects, use them) | `.claude/skills/live_test/SKILL.md` (user-only: `/live_test`) |
|
|
14
15
|
|
|
15
16
|
## Note for this repo
|
|
16
17
|
|
|
@@ -6,8 +6,11 @@ Project-local Claude Code skills. Each skill is a directory `.claude/skills/<nam
|
|
|
6
6
|
|---|---|
|
|
7
7
|
| `session_summary` | End of session — summarize work and save to vault |
|
|
8
8
|
| `start_task` | Before any non-trivial task — create a GitHub Issue |
|
|
9
|
+
| `github_workflow` | Any push, PR, review-response, or merge action |
|
|
10
|
+
| `wiki` | Publish or update GitHub Wiki pages |
|
|
9
11
|
| `add_hook` | When you need a new deterministic hook (safety, lint, logging) |
|
|
10
12
|
| `add_command` | When you need a new slash command for a recurring workflow |
|
|
13
|
+
| `live_test` | User-only `/live_test` — live E2E: build+install the wheel, scaffold real projects, and use them to surface bugs pytest can't |
|
|
11
14
|
|
|
12
15
|
See `INDEX.md` for a trigger-based lookup table.
|
|
13
16
|
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: add_command
|
|
3
|
+
description: Creates a new slash command (skill) that users can invoke with /name. Use when asked to add a command, automate a repeatable workflow step, or expose a task as a /name shortcut.
|
|
4
|
+
when_to_use: Use when the user says "add a /command", "make a shortcut for X", or "I want to run this with a slash command".
|
|
5
|
+
argument-hint: "<command-name> <what it does>"
|
|
6
|
+
allowed-tools: Write
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Create a skill
|
|
10
|
+
|
|
11
|
+
Slash commands in this project live in `.claude/skills/<name>/SKILL.md`. Each skill is a markdown file with YAML frontmatter.
|
|
12
|
+
|
|
13
|
+
## Step 0 — Confirm the current schema (best-effort)
|
|
14
|
+
|
|
15
|
+
The frontmatter fields below are a snapshot and can lag Claude Code releases.
|
|
16
|
+
**If** a docs-lookup tool is available to you — the Context7 MCP, or WebFetch
|
|
17
|
+
when it's permitted — confirm the field name / value against the current
|
|
18
|
+
reference (<https://docs.claude.com/en/docs/claude-code/slash-commands>) before
|
|
19
|
+
relying on it. This skill's `allowed-tools` does not grant those tools, so skip
|
|
20
|
+
this step cleanly whenever the tool is unavailable, unapproved, egress is
|
|
21
|
+
disabled (`--no-egress` / air-gapped), or the lookup fails — fall back to the
|
|
22
|
+
embedded reference below. Don't request extra permissions and never block on it.
|
|
23
|
+
|
|
24
|
+
## Step 1 — Create the file
|
|
25
|
+
|
|
26
|
+
Create `.claude/skills/<name>/SKILL.md` where `<name>` is the command name (lowercase, hyphen-separated).
|
|
27
|
+
|
|
28
|
+
## Step 2 — Write the frontmatter
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
---
|
|
32
|
+
name: <name>
|
|
33
|
+
description: <What it does and when to use it. Third person. Include trigger keywords.>
|
|
34
|
+
when_to_use: <Extra trigger context — action phrases the user might say.>
|
|
35
|
+
argument-hint: "<expected arguments>"
|
|
36
|
+
allowed-tools: Bash Read Write # tools pre-approved while this skill is active
|
|
37
|
+
model: <model-id> # optional override — provider-specific (e.g. sonnet/opus on Claude)
|
|
38
|
+
effort: medium # low | medium | high | xhigh | max
|
|
39
|
+
disable-model-invocation: true # true = user-only; Claude won't auto-invoke
|
|
40
|
+
user-invocable: false # false = Claude-only background knowledge
|
|
41
|
+
context: fork # fork = runs in isolated subagent
|
|
42
|
+
---
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Not all fields are required — only include what changes the default behaviour.
|
|
46
|
+
|
|
47
|
+
## Step 3 — Write the body
|
|
48
|
+
|
|
49
|
+
```markdown
|
|
50
|
+
Run this command to <what it does>.
|
|
51
|
+
|
|
52
|
+
## Steps
|
|
53
|
+
|
|
54
|
+
1. <step one — prefer shell commands over prose>
|
|
55
|
+
2. <step two>
|
|
56
|
+
|
|
57
|
+
## Rules
|
|
58
|
+
|
|
59
|
+
- <constraint if any>
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**`$ARGUMENTS`** expands to the full argument string. Use `$1`, `$2` for positional args.
|
|
63
|
+
|
|
64
|
+
## Guidelines
|
|
65
|
+
|
|
66
|
+
- **Name**: lowercase, hyphen-separated, max 64 chars
|
|
67
|
+
- **Description quality is load-bearing**: if Claude doesn't trigger it automatically, the description is too vague — add keywords users would naturally say
|
|
68
|
+
- **No file reads in the body**: embed what the agent needs inline; don't say "read X first"
|
|
69
|
+
- **Side-effect commands**: set `disable-model-invocation: true` so only the user can invoke them
|
|
70
|
+
- **Background conventions**: set `user-invocable: false` so Claude loads them automatically
|
|
@@ -6,9 +6,16 @@ argument-hint: "<hook-name> <event> <description>"
|
|
|
6
6
|
allowed-tools: Read Write Bash
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
> (settings.json wiring). Other agents do not consume what it produces.
|
|
9
|
+
## Step 0 — Confirm the current schema (best-effort)
|
|
11
10
|
|
|
11
|
+
The event names and output schema below are a snapshot and can lag Claude Code
|
|
12
|
+
releases. **If** a docs-lookup tool is available to you — the Context7 MCP, or
|
|
13
|
+
WebFetch when it's permitted — confirm the event name / output field against the
|
|
14
|
+
current reference (<https://docs.claude.com/en/docs/claude-code/hooks>) before
|
|
15
|
+
relying on it. This skill's `allowed-tools` does not grant those tools, so skip
|
|
16
|
+
this step cleanly whenever the tool is unavailable, unapproved, egress is
|
|
17
|
+
disabled (`--no-egress` / air-gapped), or the lookup fails — fall back to the
|
|
18
|
+
embedded reference below. Don't request extra permissions and never block on it.
|
|
12
19
|
|
|
13
20
|
## Step 1 — Choose an event
|
|
14
21
|
|
|
@@ -18,20 +25,24 @@ Pick the event that matches when the hook should fire:
|
|
|
18
25
|
- `PreToolUse` — before a tool runs; output block JSON to block it
|
|
19
26
|
- `PostToolUse` — after a tool runs; cannot block, can log or validate
|
|
20
27
|
- `PostToolBatch` — after a batch of parallel tool calls completes
|
|
28
|
+
- `PostToolUseFailure` — after a tool fails
|
|
21
29
|
- `PermissionRequest` — when Claude asks for permission; can auto-approve
|
|
30
|
+
- `PermissionDenied` — when permission is denied; can request a retry
|
|
22
31
|
|
|
23
32
|
**Session lifecycle:**
|
|
24
33
|
- `SessionStart` — when a session begins
|
|
34
|
+
- `SessionEnd` — when a session closes
|
|
35
|
+
- `PreCompact` — before context compaction (can block)
|
|
25
36
|
- `Stop` — when Claude stops generating (end of turn)
|
|
26
37
|
- `StopFailure` — when a turn fails
|
|
27
38
|
|
|
28
39
|
**User input:**
|
|
29
40
|
- `UserPromptSubmit` — when the user submits a prompt
|
|
30
|
-
- `UserPromptExpansion` — when
|
|
41
|
+
- `UserPromptExpansion` — when a typed command expands into a prompt (can block)
|
|
31
42
|
|
|
32
|
-
**Agent/task events:**
|
|
43
|
+
**Agent / task events:**
|
|
33
44
|
- `SubagentStart` / `SubagentStop` — subagent lifecycle
|
|
34
|
-
- `TaskCreated` / `TaskCompleted` — task
|
|
45
|
+
- `TaskCreated` / `TaskCompleted` — task lifecycle (via `TaskCreate` / completion)
|
|
35
46
|
|
|
36
47
|
**File/config events:**
|
|
37
48
|
- `FileChanged`, `CwdChanged`, `ConfigChange`
|
|
@@ -46,7 +57,8 @@ Create `.claude/hooks/<name>.sh`:
|
|
|
46
57
|
INPUT=$(cat)
|
|
47
58
|
|
|
48
59
|
# exit 0 = allow (or no-op for non-blocking events)
|
|
49
|
-
# stdout JSON
|
|
60
|
+
# PreToolUse block: stdout JSON {"hookSpecificOutput":{"hookEventName":
|
|
61
|
+
# "PreToolUse","permissionDecision":"deny","permissionDecisionReason":"..."}}
|
|
50
62
|
# stdout JSON with {"additionalContext":"..."} = inject context
|
|
51
63
|
# Always exit 0 — exit 1 means hook error, not a block
|
|
52
64
|
|
|
@@ -63,7 +75,7 @@ print((data.get('tool_input', {}) or {}).get('command', '') or '')
|
|
|
63
75
|
[ -z "$CMD" ] && exit 0
|
|
64
76
|
|
|
65
77
|
if echo "$CMD" | grep -qE 'git push.*(main|master)'; then
|
|
66
|
-
python3 -c "import json,sys; print(json.dumps({'
|
|
78
|
+
python3 -c "import json,sys; print(json.dumps({'hookSpecificOutput':{'hookEventName':'PreToolUse','permissionDecision':'deny','permissionDecisionReason':sys.argv[1]}}))" \
|
|
67
79
|
"Direct push to main is not allowed. Use a branch and PR."
|
|
68
80
|
exit 0
|
|
69
81
|
fi
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: live_test
|
|
3
|
+
description: Live E2E of the scaffolder — build+install the wheel, scaffold real mini-projects, and *use* them to surface bugs the pytest suite can't. Drives the real install path, exercises hooks/guards in the correct mode, walks the local git/PR lifecycle against a stubbed gh, and writes a severity-ranked REPORT.md.
|
|
4
|
+
when_to_use: Use when the user says "/live_test", "run the live E2E", "live-test the scaffolder", or wants to validate that scaffolded projects actually work end-to-end (not just that pytest passes).
|
|
5
|
+
argument-hint: "[--matrix=1,2,3] [--keep]"
|
|
6
|
+
allowed-tools: Bash Read Write Glob Grep
|
|
7
|
+
disable-model-invocation: true
|
|
8
|
+
effort: high
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
Run a live end-to-end test of the **project-init scaffolder**. Deterministic pytest
|
|
12
|
+
coverage (`tests/smoke/test_packaging.py`, the `wheel-smoke` CI job, ~70 contract tests)
|
|
13
|
+
already proves files land with the right exec bits. This command tests what those can't:
|
|
14
|
+
whether a **scaffolded project actually works in real use** — do its hooks fire, do
|
|
15
|
+
lifecycle scripts run, does `just ci` pass, would an agent landing in the project find
|
|
16
|
+
coherent instructions. It captures the manual 0.4.0 "external live test" (which found 13
|
|
17
|
+
real bugs, epics #440–444) as a repeatable procedure.
|
|
18
|
+
|
|
19
|
+
It builds the wheel once, installs it into a throwaway venv, scaffolds a representative
|
|
20
|
+
matrix of mini-projects, fans out **one isolated subagent per project** to exercise four
|
|
21
|
+
depths, and aggregates a timestamped severity-ranked `REPORT.md`. **No GitHub side effects,
|
|
22
|
+
no auto-issue-filing, no merge path.**
|
|
23
|
+
|
|
24
|
+
## Execution model (with fallback)
|
|
25
|
+
|
|
26
|
+
The default is a **parallel one-subagent-per-project fan-out** (general-purpose or Explore
|
|
27
|
+
subagent). If the subagent/Task tool is unavailable or refused, **fall back to a serial
|
|
28
|
+
single-agent loop** that runs the same per-project steps and writes the same `result.json`
|
|
29
|
+
files. The fan-out is an optimization, not a hard dependency.
|
|
30
|
+
|
|
31
|
+
Claude (the orchestrator) runs Steps 1–3 centrally, fans out Step 4, then runs Steps 5–6
|
|
32
|
+
after the barrier.
|
|
33
|
+
|
|
34
|
+
## Steps
|
|
35
|
+
|
|
36
|
+
Define the run root up front and print it before any fan-out:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
RUNID="${1:-$(date +%s 2>/dev/null || echo run)}" # arg wins; never rely on a clock for correctness
|
|
40
|
+
RUN="${SCRATCHPAD:-$(mktemp -d)}/live-test-$RUNID"
|
|
41
|
+
mkdir -p "$RUN"/{build,logs}
|
|
42
|
+
echo "RUN=$RUN"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 1. Build once, isolated
|
|
46
|
+
|
|
47
|
+
From the repo root, gate on `uv` (mirror `has_uv_and_can_build()` in `tests/helpers.py`;
|
|
48
|
+
if `uv` is absent, print a clear skip message and stop — nothing else can run).
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
command -v uv >/dev/null || { echo "SKIP: uv not installed — cannot build wheel"; exit 0; }
|
|
52
|
+
uv build --wheel -o "$RUN/build" # single FRESH wheel — never dist/*.whl (can be stale)
|
|
53
|
+
uv venv "$RUN/venv"
|
|
54
|
+
uv pip install --python "$RUN/venv" "$RUN"/build/*.whl
|
|
55
|
+
PI="$RUN/venv/bin/project-init" # resolved installed binary
|
|
56
|
+
"$PI" --version
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. Build the stateful local GitHub stub
|
|
60
|
+
|
|
61
|
+
Create `"$RUN/stub-bin/gh"` — a **stateful** stub that logs every argv to a per-project log
|
|
62
|
+
and returns canned responses for every shape the *exercised* lifecycle scripts use. Clear
|
|
63
|
+
`GH_TOKEN`/`GITHUB_*` and prepend the stub dir to `PATH` so `gh` can **never** reach the real
|
|
64
|
+
API. Each subagent asserts `command -v gh` resolves to the stub before running anything.
|
|
65
|
+
|
|
66
|
+
**The stub command→response table is the source of truth — embed it, don't leave it to future
|
|
67
|
+
diligence.** Enumerated from `create_issue.sh`, `start_issue.sh`, `push_branch.sh` /
|
|
68
|
+
`promote_review.sh` (both shim to `dag_workflow.py`). The merge/monitor path (`monitor_pr.sh`,
|
|
69
|
+
`gh pr checks` / `gh pr merge` / `gh api .../pulls/.../comments`) is **intentionally out of
|
|
70
|
+
scope** (see Step 4 lifecycle), so its `gh` shapes are deliberately absent from this table:
|
|
71
|
+
|
|
72
|
+
| `gh` invocation | Canned response (stdout) |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `gh repo view --json owner -q .owner.login` | `livetest-owner` |
|
|
75
|
+
| `gh repo view --json name -q .name` | `<project>` |
|
|
76
|
+
| `gh repo view --json nameWithOwner ...` | `livetest-owner/<project>` |
|
|
77
|
+
| `gh repo view --json url -q .url` | `https://example.invalid/livetest-owner/<project>` |
|
|
78
|
+
| `gh label list --search <n> --json name -q '.[].name'` | empty (label absent → caller creates it) |
|
|
79
|
+
| `gh label create <n> ...` | exit 0, no output |
|
|
80
|
+
| `gh issue create ...` | `https://example.invalid/.../issues/101` |
|
|
81
|
+
| `gh issue view <n> --json title -q '.title'` | `Stubbed issue` |
|
|
82
|
+
| `gh api .../issues/<n> --jq '.node_id'` | `I_stubnode101` |
|
|
83
|
+
| `gh api graphql -f query=...` | `{"data":{}}` (project-board mutations no-op) |
|
|
84
|
+
| `gh pr create ...` | `https://example.invalid/.../pull/202` |
|
|
85
|
+
| `gh pr view <n> --json isDraft -q .isDraft` | `true` |
|
|
86
|
+
| `gh pr view <n> --json headRefName -q .headRefName` | the current branch name |
|
|
87
|
+
| `gh pr view <n> --json url -q .url` | `https://example.invalid/.../pull/202` |
|
|
88
|
+
| `gh pr view --json number,state` | `{"number":202,"state":"OPEN"}` (PR auto-detect, `check_pr_opened`) |
|
|
89
|
+
| `gh pr view --json number -q .number` | `202` (bare PR-number auto-detect, e.g. `promote_review.sh`) |
|
|
90
|
+
| `gh pr view --json number,reviewDecision` | `{"number":202,"reviewDecision":""}` |
|
|
91
|
+
| `gh pr ready <n>` | exit 0, no output |
|
|
92
|
+
| anything else | log argv, exit 0, empty stdout |
|
|
93
|
+
|
|
94
|
+
A reference generator for the stub (the skill writes this file, then `chmod +x`):
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
mkdir -p "$RUN/stub-bin" # the redirect below needs this dir to exist
|
|
98
|
+
cat > "$RUN/stub-bin/gh" <<'STUB'
|
|
99
|
+
#!/usr/bin/env bash
|
|
100
|
+
echo "gh $*" >> "${GH_STUB_LOG:-/dev/null}"
|
|
101
|
+
proj="${GH_STUB_PROJECT:-proj}"; branch="$(git branch --show-current 2>/dev/null || echo main)"
|
|
102
|
+
case "$*" in
|
|
103
|
+
"repo view --json owner"*) echo "livetest-owner" ;;
|
|
104
|
+
"repo view --json name"*) echo "$proj" ;;
|
|
105
|
+
"repo view --json nameWithOwner"*) echo "livetest-owner/$proj" ;;
|
|
106
|
+
"repo view --json url"*) echo "https://example.invalid/livetest-owner/$proj" ;;
|
|
107
|
+
"label list"*) : ;; # empty → caller creates
|
|
108
|
+
"label create"*) : ;;
|
|
109
|
+
"issue create"*) echo "https://example.invalid/livetest-owner/$proj/issues/101" ;;
|
|
110
|
+
"issue view"*"title"*) echo "Stubbed issue" ;;
|
|
111
|
+
"api graphql"*) echo '{"data":{}}' ;;
|
|
112
|
+
"api"*"node_id"*) echo "I_stubnode101" ;;
|
|
113
|
+
"pr create"*) echo "https://example.invalid/livetest-owner/$proj/pull/202" ;;
|
|
114
|
+
"pr view"*"isDraft"*) echo "true" ;;
|
|
115
|
+
"pr view"*"headRefName"*) echo "$branch" ;;
|
|
116
|
+
"pr view"*"number,state"*) echo '{"number":202,"state":"OPEN"}' ;; # check_pr_opened / PR auto-detect
|
|
117
|
+
"pr view"*"reviewDecision"*) echo '{"number":202,"reviewDecision":""}' ;;
|
|
118
|
+
"pr view"*"url"*) echo "https://example.invalid/livetest-owner/$proj/pull/202" ;;
|
|
119
|
+
"pr view"*"number"*) echo "202" ;; # bare --json number -q .number (promote_review auto-detect); after the number,state/reviewDecision cases so they win first
|
|
120
|
+
"pr ready"*) : ;;
|
|
121
|
+
*) : ;;
|
|
122
|
+
esac
|
|
123
|
+
STUB
|
|
124
|
+
chmod +x "$RUN/stub-bin/gh"
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Per subagent: `export GH_STUB_LOG="$RUN/<proj>/gh.log" GH_STUB_PROJECT="<proj>"`,
|
|
128
|
+
`export PATH="$RUN/stub-bin:$PATH"`, `unset GH_TOKEN GITHUB_TOKEN GITHUB_ACTIONS`.
|
|
129
|
+
|
|
130
|
+
**Validation boundary:** plugin-mode hook execution validates the **repo plugin payload**
|
|
131
|
+
(`plugins/project-init-workflow/hooks/*` from the source checkout); the installed wheel
|
|
132
|
+
validates **scaffolder/template installation**. Keep these distinct in findings so a
|
|
133
|
+
plugin-source drift isn't reported as a wheel-install failure.
|
|
134
|
+
|
|
135
|
+
### 3. Scaffold the matrix (default ~5, representative — each hits a distinct path)
|
|
136
|
+
|
|
137
|
+
All non-interactive, `--non-interactive --strict --name <n> --description <d>`. `--matrix=`
|
|
138
|
+
selects a subset by number.
|
|
139
|
+
|
|
140
|
+
1. `--preset obsidian-only --language python` (**plugin mode** — designate this the
|
|
141
|
+
plugin-mode hook-resolution project; see depth 2)
|
|
142
|
+
2. `--preset obsidian-graphify --language node --no-plugin`
|
|
143
|
+
3. `--preset governed --language python --governance --observability`
|
|
144
|
+
4. `--preset obsidian-only --language go --delivery service --deploy cloud-run --iac opentofu`
|
|
145
|
+
5. `--preset obsidian-only --language python --agents claude,codex,cursor,antigravity --multi-model --mcps context7 --browser`
|
|
146
|
+
|
|
147
|
+
**+ 1 interactive smoke:** drive the *full* wizard prompt sequence via piped stdin (the real
|
|
148
|
+
sequence in `main()` / the interactive gather path — **not** the leaf helpers in
|
|
149
|
+
`test_interactive_prompts.py`, which don't cover the full flow). Feed Enter-defaults; a
|
|
150
|
+
prompt-order mismatch is a **finding**, not a crash.
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
"$PI" --non-interactive --strict --preset obsidian-only --language python \
|
|
154
|
+
--name lt1 --description "live-test project 1" "$RUN/proj1"
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### 4. Fan out — one isolated subagent per mini-project
|
|
158
|
+
|
|
159
|
+
Each subagent gets: its project dir, its own `PATH` with the stub `gh` + per-project
|
|
160
|
+
`GH_STUB_LOG`, its own **local bare remote**, and **must write `"$RUN/<proj>/result.json"`**.
|
|
161
|
+
It first asserts `command -v gh` resolves to the stub. **Wrap every external command in an
|
|
162
|
+
explicit `timeout`**; a timeout is a finding with captured stdout/stderr paths.
|
|
163
|
+
|
|
164
|
+
**Shared per-project git bootstrap — run ONCE before both the gate and lifecycle depths,
|
|
165
|
+
idempotently:** `git init`, an initial `main` commit, `git init --bare "$RUN/<proj>.git"`
|
|
166
|
+
added as `origin`. Both `just scan` (needs a repo + staged content) and the lifecycle walk
|
|
167
|
+
reuse this single bootstrap. `push_branch.sh`'s real `git push -u origin` then succeeds
|
|
168
|
+
offline against the bare remote.
|
|
169
|
+
|
|
170
|
+
`result.json` schema (fixed):
|
|
171
|
+
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"project": "proj1",
|
|
175
|
+
"depths": {
|
|
176
|
+
"gates": {"status": "pass|fail|skipped", "note": ""},
|
|
177
|
+
"hooks": {"status": "pass|fail|skipped", "note": ""},
|
|
178
|
+
"lifecycle": {"status": "pass|fail|skipped", "note": ""},
|
|
179
|
+
"read": {"status": "pass|fail|skipped", "note": ""}
|
|
180
|
+
},
|
|
181
|
+
"findings": [
|
|
182
|
+
{"severity": "P1|P2|P3", "what": "", "repro": "", "suspected_file": "", "fix_sketch": ""}
|
|
183
|
+
]
|
|
184
|
+
}
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
The four depths:
|
|
188
|
+
|
|
189
|
+
- **Run scaffolded gates.** `cd` in; **preflight each tool** (`just`, `uv`/`bun`/`go`/
|
|
190
|
+
`golangci-lint`, `gitleaks`). A missing tool ⇒ `status:skipped` "not exercised: missing X",
|
|
191
|
+
**distinct from fail**. Then `just ci` (lint+test). For `just scan`: reuse the bootstrap
|
|
192
|
+
repo and stage a harmless file first (the recipe runs `gitleaks git --pre-commit --staged`,
|
|
193
|
+
meaningless without a repo + staged content); no-git/no-staged ⇒ skipped, not fail.
|
|
194
|
+
`just ci` for node/go *may* fetch deps — allowed (matches a real user); a **network failure
|
|
195
|
+
is reported distinctly**, not as scaffold breakage.
|
|
196
|
+
- **Exercise hooks & guards — in the correct mode:**
|
|
197
|
+
- *Plugin-mode project (#1):* the **event-wired** guard hooks
|
|
198
|
+
(`github_command_guard.sh`, `pre_commit_gate.sh`, `session_setup.sh`,
|
|
199
|
+
`workflow_state_reminder.sh`, `post_edit_lint.sh`) are supplied by the **plugin payload**
|
|
200
|
+
— invoke `plugins/project-init-workflow/hooks/*` with `CLAUDE_PLUGIN_ROOT` +
|
|
201
|
+
`CLAUDE_PROJECT_DIR` set. Note: the scaffolded project still carries a **reduced** local
|
|
202
|
+
`.claude/hooks/` (`dag_workflow.py`, `prod_guard.py`, `_py.sh`) because the lifecycle
|
|
203
|
+
scripts shim to `../hooks/dag_workflow.py` and `enabledPlugins` lists
|
|
204
|
+
`project-init-workflow@project-init` — the same hook *set* fires in both modes
|
|
205
|
+
(`capabilities.py`), plugin mode just sources the wired ones from the plugin. Specifically
|
|
206
|
+
verify scripts-dir/redirect resolution honors `$CLAUDE_PROJECT_DIR` — **the exact 0.4.0
|
|
207
|
+
P1.** First-class depth.
|
|
208
|
+
- *`--no-plugin` project (#2):* invoke the scaffolded `.claude/hooks/*`.
|
|
209
|
+
- Feed banned commands and confirm **block**; feed allowed and confirm **pass**; run
|
|
210
|
+
`pre_commit_gate.sh` with stdin JSON.
|
|
211
|
+
- **Walk the git/PR lifecycle (fully local, scoped).** Reuse the bootstrap repo + bare
|
|
212
|
+
`origin`, run `install_hooks.sh`, make a commit (commit-msg + pre-commit fire), then run
|
|
213
|
+
`create_issue.sh`, `start_issue.sh`, `push_branch.sh`, `promote_review.sh` against the stub.
|
|
214
|
+
**Skip `finish_pr.sh`** — it chains into `dag_workflow.py finish` → `monitor_pr.sh --merge`,
|
|
215
|
+
which carries CI/review/merge assumptions a stub can't honestly satisfy; note the merge path
|
|
216
|
+
as "not exercised by design".
|
|
217
|
+
- **Read-as-an-agent sanity.** Read `AGENTS.md`/`CLAUDE.md`/`settings.json`/per-surface
|
|
218
|
+
configs; judge whether instructions are coherent and non-contradictory.
|
|
219
|
+
|
|
220
|
+
### 5. Aggregate & report
|
|
221
|
+
|
|
222
|
+
After *all* subagents finish, read every `result.json` and write one timestamped
|
|
223
|
+
`"$RUN/REPORT.md"`: a summary table (project × depth × pass/fail/skipped) + severity-ranked
|
|
224
|
+
findings (what / repro / suspected file / fix sketch). **No auto-filing of GitHub issues.**
|
|
225
|
+
|
|
226
|
+
### 6. Cleanup
|
|
227
|
+
|
|
228
|
+
**Always preserve `REPORT.md`.** Before deleting any *passing* project dir, copy its
|
|
229
|
+
per-project logs (subagent stdout/stderr, `gh.log`, timeout artifacts) into
|
|
230
|
+
`"$RUN/logs/<project>/"` so audit trails survive even for clean passes. Then delete only the
|
|
231
|
+
*passing* project dirs; preserve any failing project dir whole. `--keep` preserves everything.
|
|
232
|
+
Print all preserved paths.
|
|
233
|
+
|
|
234
|
+
## Rules
|
|
235
|
+
|
|
236
|
+
- **No network/GitHub side effects.** `gh` is stubbed; `GH_TOKEN`/`GITHUB_*` cleared; the only
|
|
237
|
+
remote is a local bare repo. Never run the real merge path.
|
|
238
|
+
- **`skipped` ≠ `fail`.** A missing host tool (`just`, `go`, `gitleaks`, `golangci-lint`) is a
|
|
239
|
+
skip with a reason, never a failure.
|
|
240
|
+
- **Single fresh wheel** from an isolated `-o` build dir — never `dist/*.whl`.
|
|
241
|
+
- **Timeout-wrap every external command;** a timeout is a finding.
|
|
242
|
+
- **Mode-aware hooks:** plugin project → repo plugin payload; `--no-plugin` project →
|
|
243
|
+
scaffolded `.claude/hooks/*`. Don't cross-report.
|
|
244
|
+
- **Deterministic-clock-free:** never depend on `date`/`Date.now()` for correctness; the runid
|
|
245
|
+
is a label, passed in or best-effort.
|
|
246
|
+
- This skill is **source-only** — it lives under this repo's `.claude/skills/`, is **not** in
|
|
247
|
+
`templates/fallback/` and **not** part of `tools/sync_plugin.py`. It tests the scaffolder; it
|
|
248
|
+
is not shipped into scaffolded output.
|