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.
Files changed (530) hide show
  1. {project_init-0.3.0/templates/base/dot_claude → project_init-0.5.0/.claude}/hooks/dag_workflow.py +72 -13
  2. {project_init-0.3.0 → project_init-0.5.0}/.claude/hooks/workflow_state_reminder.sh +1 -1
  3. {project_init-0.3.0/templates/base/dot_claude → project_init-0.5.0/.claude}/scripts/monitor_pr.sh +23 -5
  4. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/INDEX.md +1 -0
  5. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/README.md +3 -0
  6. project_init-0.5.0/.claude/skills/add_command/SKILL.md +70 -0
  7. {project_init-0.3.0/templates/codex/dot_agents → project_init-0.5.0/.claude}/skills/add_hook/SKILL.md +19 -7
  8. project_init-0.5.0/.claude/skills/live_test/SKILL.md +248 -0
  9. project_init-0.5.0/.claude/skills/wiki/SKILL.md +69 -0
  10. project_init-0.5.0/.claude-plugin/marketplace.json +19 -0
  11. project_init-0.5.0/.github/workflows/ci.yml +278 -0
  12. project_init-0.5.0/.github/workflows/docs.yml +75 -0
  13. {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/release.yml +6 -1
  14. project_init-0.5.0/.github/workflows/third-party-updates.yml +38 -0
  15. {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/validate-pr.yml +29 -0
  16. {project_init-0.3.0 → project_init-0.5.0}/.gitignore +10 -0
  17. project_init-0.5.0/.gitleaks.toml +16 -0
  18. {project_init-0.3.0 → project_init-0.5.0}/CLAUDE.md +2 -1
  19. project_init-0.5.0/PKG-INFO +424 -0
  20. project_init-0.5.0/README.md +393 -0
  21. {project_init-0.3.0 → project_init-0.5.0}/docs/README.md +1 -1
  22. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-003-github-native-workflow.md +1 -1
  23. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-004-obsidian-docs-integration.md +3 -3
  24. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-005-github-pr-board-workflow.md +1 -1
  25. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-007-security-enforcement-layers.md +8 -0
  26. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-011-pypi-trusted-publishing.md +6 -1
  27. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-012-prod-safety-guard.md +11 -0
  28. project_init-0.5.0/docs/adr/adr-013-distribution-governance-model.md +134 -0
  29. project_init-0.5.0/docs/adr/adr-014-environment-promotion-chains.md +25 -0
  30. project_init-0.5.0/docs/adr/adr-015-env-deploy-model.md +112 -0
  31. project_init-0.5.0/docs/adr/adr-016-model-agnostic-switching.md +140 -0
  32. project_init-0.5.0/docs/adr/adr-017-per-surface-config-generator.md +149 -0
  33. project_init-0.5.0/docs/adr/adr-018-ai-governance-overlay.md +130 -0
  34. project_init-0.5.0/docs/adr/adr-019-local-observability-overlay.md +152 -0
  35. project_init-0.5.0/docs/adr/adr-020-memory-backend-decomposition.md +87 -0
  36. project_init-0.5.0/docs/adr/adr-021-quality-vs-lifecycle-tier-boundary.md +165 -0
  37. project_init-0.5.0/docs/adr/adr-022-toolchain-gate-map.md +116 -0
  38. project_init-0.5.0/docs/adr/adr-023-wizard-explanation-standard.md +75 -0
  39. project_init-0.5.0/docs/adr/adr-024-memory-tier-model.md +110 -0
  40. project_init-0.5.0/docs/adr/adr-025-agentic-os-root-layer.md +152 -0
  41. project_init-0.5.0/docs/adr/adr-026-tier3-rag-engine-cocoindex.md +103 -0
  42. project_init-0.5.0/docs/development/agentic-os-root-layer.md +155 -0
  43. project_init-0.5.0/docs/development/enforcement-classification.md +48 -0
  44. project_init-0.5.0/docs/development/enterprise-github-support-matrix.md +214 -0
  45. project_init-0.5.0/docs/development/measurement-methodology.md +169 -0
  46. project_init-0.5.0/docs/development/memory-descriptor.md +87 -0
  47. project_init-0.5.0/docs/development/mobile-remote-access.md +89 -0
  48. project_init-0.5.0/docs/development/non-cli-surface-matrix.md +150 -0
  49. project_init-0.5.0/docs/guides/org-fork-lifecycle.md +94 -0
  50. {project_init-0.3.0 → project_init-0.5.0}/docs/guides/using-project-init.md +3 -4
  51. project_init-0.5.0/docs/research/model-agnostic-switching.md +479 -0
  52. {project_init-0.3.0 → project_init-0.5.0}/install.sh +22 -5
  53. project_init-0.5.0/mkdocs.yml +62 -0
  54. project_init-0.5.0/plugins/project-init-lifecycle/.claude-plugin/plugin.json +19 -0
  55. project_init-0.5.0/plugins/project-init-lifecycle/hooks/_py.sh +30 -0
  56. project_init-0.5.0/plugins/project-init-lifecycle/hooks/_usage_log.sh +74 -0
  57. {project_init-0.3.0/.claude → project_init-0.5.0/plugins/project-init-lifecycle}/hooks/dag_workflow.py +72 -13
  58. project_init-0.5.0/plugins/project-init-lifecycle/hooks/github_command_guard.sh +18 -0
  59. project_init-0.5.0/plugins/project-init-lifecycle/hooks/hooks.json +29 -0
  60. {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
  61. {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/plugins/project-init-lifecycle}/skills/audit/SKILL.md +3 -2
  62. {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
  63. {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
  64. {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
  65. {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
  66. project_init-0.5.0/plugins/project-init-workflow/hooks/_py.sh +30 -0
  67. project_init-0.5.0/plugins/project-init-workflow/hooks/_usage_log.sh +74 -0
  68. {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/hooks/hooks.json +5 -17
  69. {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
  70. {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
  71. {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/hooks/prod_guard.py +107 -15
  72. {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/hooks/session_setup.sh +21 -2
  73. {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
  74. {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
  75. {project_init-0.3.0/templates/codex/dot_agents → project_init-0.5.0/plugins/project-init-workflow}/skills/review/SKILL.md +1 -1
  76. {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/plugins/project-init-workflow}/skills/status/SKILL.md +1 -1
  77. {project_init-0.3.0 → project_init-0.5.0}/pyproject.toml +1 -1
  78. project_init-0.5.0/src/project_init/__init__.py +8 -0
  79. project_init-0.5.0/src/project_init/__main__.py +2032 -0
  80. project_init-0.5.0/src/project_init/capabilities.py +253 -0
  81. project_init-0.5.0/src/project_init/governance.py +126 -0
  82. project_init-0.5.0/src/project_init/mcps.py +81 -0
  83. project_init-0.5.0/src/project_init/migration_notes.py +91 -0
  84. project_init-0.5.0/src/project_init/scaffold.py +785 -0
  85. project_init-0.5.0/src/project_init/surfaces.py +307 -0
  86. project_init-0.5.0/src/project_init/upgrade.py +1463 -0
  87. {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
  88. {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
  89. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/amp}/dot_agents/skills/audit/SKILL.md +3 -2
  90. {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
  91. {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
  92. project_init-0.5.0/templates/amp/dot_agents/skills/plan/SKILL.md +40 -0
  93. {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
  94. {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/amp/dot_agents}/skills/review/SKILL.md +1 -1
  95. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/start_task/SKILL.md +1 -1
  96. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/amp}/dot_agents/skills/status/SKILL.md +1 -1
  97. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/add_command/SKILL.md +12 -1
  98. {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
  99. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/audit/SKILL.md +3 -2
  100. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/create_issue/SKILL.md +5 -2
  101. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/antigravity}/dot_agents/skills/github_workflow/SKILL.md +10 -1
  102. project_init-0.5.0/templates/antigravity/dot_agents/skills/plan/SKILL.md +40 -0
  103. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/request_review/SKILL.md +3 -3
  104. {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/antigravity/dot_agents}/skills/review/SKILL.md +1 -1
  105. {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
  106. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/antigravity}/dot_agents/skills/status/SKILL.md +1 -1
  107. {project_init-0.3.0/templates/obsidian → project_init-0.5.0/templates/auto}/dot_claude/scripts/lint_memory.sh +44 -0
  108. project_init-0.5.0/templates/base/AGENTS.md.tmpl +62 -0
  109. {project_init-0.3.0 → project_init-0.5.0}/templates/base/CLAUDE.md.tmpl +1 -1
  110. {project_init-0.3.0 → project_init-0.5.0}/templates/base/CONTRIBUTING.md.tmpl +9 -5
  111. project_init-0.5.0/templates/base/Dockerfile.tmpl +56 -0
  112. project_init-0.5.0/templates/base/compose.yaml.tmpl +38 -0
  113. project_init-0.5.0/templates/base/deploy/environments.yaml.tmpl +23 -0
  114. 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
  115. 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
  116. {project_init-0.3.0 → project_init-0.5.0}/templates/base/docs/index.md.tmpl +2 -1
  117. 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
  118. 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
  119. project_init-0.5.0/templates/base/dot_claude/agents/README.md +53 -0
  120. project_init-0.5.0/templates/base/dot_claude/agents/code-reviewer.md +17 -0
  121. project_init-0.5.0/templates/base/dot_claude/agents/explore.md +14 -0
  122. project_init-0.5.0/templates/base/dot_claude/config.yaml.tmpl +57 -0
  123. 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
  124. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/adr/adr-002-mcp-choices.md.tmpl +6 -4
  125. project_init-0.5.0/templates/base/dot_claude/docs/guides/cloud-integration.md.tmpl +51 -0
  126. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/guides/developer-onboarding.md +13 -2
  127. project_init-0.5.0/templates/base/dot_claude/docs/guides/environments.md +60 -0
  128. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/hooks/README.md +1 -1
  129. project_init-0.5.0/templates/base/dot_claude/hooks/_py.sh +30 -0
  130. project_init-0.5.0/templates/base/dot_claude/hooks/agent_guard_adapter.py.tmpl +150 -0
  131. {project_init-0.3.0/templates/fallback → project_init-0.5.0/templates/base}/dot_claude/hooks/prod_guard.py +107 -15
  132. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/project-init.md.tmpl +19 -15
  133. 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
  134. 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
  135. project_init-0.5.0/templates/base/dot_claude/scripts/gen_code_map.py.tmpl +107 -0
  136. project_init-0.5.0/templates/base/dot_claude/scripts/gh_host.sh +70 -0
  137. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/scripts/install_hooks.sh +7 -2
  138. project_init-0.5.0/templates/base/dot_claude/scripts/setup_env_protection.sh.tmpl +131 -0
  139. project_init-0.5.0/templates/base/dot_claude/scripts/whats_deployed.sh.tmpl +54 -0
  140. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/settings.json.tmpl +17 -11
  141. project_init-0.5.0/templates/base/dot_claude/skills/README.md.tmpl +17 -0
  142. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/skills/plan/SKILL.md.tmpl +1 -1
  143. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_devcontainer/devcontainer.json.tmpl +3 -3
  144. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_devcontainer/post-create.sh.tmpl +2 -2
  145. project_init-0.5.0/templates/base/dot_dockerignore.tmpl +24 -0
  146. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_env.example.tmpl +2 -3
  147. project_init-0.5.0/templates/base/dot_gitattributes +4 -0
  148. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/hooks/commit-msg +1 -1
  149. 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
  150. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/workflows/ci.yml.tmpl +133 -9
  151. project_init-0.5.0/templates/base/dot_github/workflows/deploy.yml.tmpl +94 -0
  152. project_init-0.5.0/templates/base/dot_github/workflows/infra.yml.tmpl +72 -0
  153. project_init-0.5.0/templates/base/dot_github/workflows/registry-publish.yml.tmpl +46 -0
  154. project_init-0.5.0/templates/base/dot_github/workflows/release.yml.tmpl +132 -0
  155. project_init-0.5.0/templates/base/dot_gitignore.tmpl +60 -0
  156. project_init-0.5.0/templates/base/infra/README.md.tmpl +21 -0
  157. project_init-0.5.0/templates/base/infra/backend.tf.tmpl +24 -0
  158. project_init-0.5.0/templates/base/infra/dot_gitignore.tmpl +8 -0
  159. project_init-0.5.0/templates/base/infra/dot_pre-commit-config.yaml.tmpl +13 -0
  160. project_init-0.5.0/templates/base/infra/main.tf.tmpl +4 -0
  161. project_init-0.5.0/templates/base/infra/outputs.tf.tmpl +5 -0
  162. project_init-0.5.0/templates/base/infra/variables.tf.tmpl +6 -0
  163. project_init-0.5.0/templates/base/infra/versions.tf.tmpl +14 -0
  164. {project_init-0.3.0 → project_init-0.5.0}/templates/base/justfile.tmpl +22 -4
  165. {project_init-0.3.0 → project_init-0.5.0}/templates/base/mkdocs.yml.tmpl +3 -3
  166. project_init-0.3.0/templates/base/renovate.json → project_init-0.5.0/templates/base/renovate.json.tmpl +2 -2
  167. project_init-0.5.0/templates/base/typedoc.json.tmpl +14 -0
  168. {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
  169. project_init-0.5.0/templates/codex/dot_agents/skills/add_hook/SKILL.md +132 -0
  170. {project_init-0.3.0/templates/fallback/dot_claude → project_init-0.5.0/templates/codex/dot_agents}/skills/audit/SKILL.md +3 -2
  171. {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
  172. {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
  173. project_init-0.5.0/templates/codex/dot_agents/skills/plan/SKILL.md +40 -0
  174. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/request_review/SKILL.md +3 -3
  175. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/review/SKILL.md +1 -1
  176. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/start_task/SKILL.md +1 -1
  177. {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/codex/dot_agents}/skills/status/SKILL.md +1 -1
  178. {project_init-0.3.0 → project_init-0.5.0}/templates/codex/dot_codex/hooks.json.tmpl +1 -1
  179. project_init-0.5.0/templates/fallback/dot_claude/hooks/_usage_log.sh +74 -0
  180. {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
  181. {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
  182. {project_init-0.3.0 → project_init-0.5.0}/templates/fallback/dot_claude/hooks/session_setup.sh +21 -2
  183. 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
  184. project_init-0.5.0/templates/fallback/dot_claude/skills/add_adr/SKILL.md +33 -0
  185. project_init-0.5.0/templates/fallback/dot_claude/skills/add_command/SKILL.md +74 -0
  186. project_init-0.5.0/templates/fallback/dot_claude/skills/add_hook/SKILL.md +132 -0
  187. project_init-0.5.0/templates/fallback/dot_claude/skills/review/SKILL.md +17 -0
  188. project_init-0.5.0/templates/fallback/dot_claude/skills/save_memory/SKILL.md +17 -0
  189. project_init-0.5.0/templates/fallback/dot_claude/skills/session_summary/SKILL.md +35 -0
  190. project_init-0.5.0/templates/fallback/dot_claude/skills/status/SKILL.md +15 -0
  191. project_init-0.5.0/templates/governance/dot_claude/governance/AI_USAGE_POLICY.md +71 -0
  192. project_init-0.5.0/templates/governance/dot_claude/governance/NIST_RMF_CROSSWALK.md +40 -0
  193. project_init-0.5.0/templates/governance/dot_claude/governance/README.md +49 -0
  194. project_init-0.5.0/templates/governance/dot_claude/governance/ai-code-provenance.md +48 -0
  195. project_init-0.5.0/templates/governance/dot_claude/governance/ai-declarations.md +33 -0
  196. project_init-0.5.0/templates/governance/dot_claude/governance/approved-tools.md +53 -0
  197. project_init-0.5.0/templates/governance/dot_claude/governance/config.example.json +4 -0
  198. project_init-0.5.0/templates/governance/dot_claude/governance/data-handling.md +46 -0
  199. project_init-0.5.0/templates/governance/dot_claude/governance/examples/SYSTEM_CARD.example.md +71 -0
  200. project_init-0.5.0/templates/governance/dot_claude/governance/examples/SYSTEM_CARD.template.md +76 -0
  201. project_init-0.5.0/templates/governance/dot_claude/scripts/governance_gate.py +193 -0
  202. project_init-0.5.0/templates/governance/dot_claude/scripts/governance_gate.sh +15 -0
  203. {project_init-0.3.0 → project_init-0.5.0}/templates/graphify/dot_claude/scripts/setup_graphify.sh +1 -1
  204. project_init-0.5.0/templates/junie/dot_junie/skills/add_adr/SKILL.md +33 -0
  205. project_init-0.5.0/templates/junie/dot_junie/skills/add_command/SKILL.md +74 -0
  206. project_init-0.5.0/templates/junie/dot_junie/skills/add_hook/SKILL.md +132 -0
  207. project_init-0.5.0/templates/junie/dot_junie/skills/audit/SKILL.md +147 -0
  208. project_init-0.5.0/templates/junie/dot_junie/skills/create_issue/SKILL.md +62 -0
  209. project_init-0.5.0/templates/junie/dot_junie/skills/github_workflow/SKILL.md +89 -0
  210. project_init-0.5.0/templates/junie/dot_junie/skills/plan/SKILL.md +40 -0
  211. project_init-0.5.0/templates/junie/dot_junie/skills/request_review/SKILL.md +19 -0
  212. project_init-0.5.0/templates/junie/dot_junie/skills/review/SKILL.md +17 -0
  213. project_init-0.5.0/templates/junie/dot_junie/skills/save_memory/SKILL.md +17 -0
  214. project_init-0.5.0/templates/junie/dot_junie/skills/session_summary/SKILL.md +35 -0
  215. project_init-0.5.0/templates/junie/dot_junie/skills/start_task/SKILL.md +48 -0
  216. project_init-0.5.0/templates/junie/dot_junie/skills/status/SKILL.md +15 -0
  217. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/docs/guides/issue-metadata.md +2 -1
  218. {project_init-0.3.0/plugins/project-init-workflow → project_init-0.5.0/templates/lifecycle/dot_claude}/hooks/dag_workflow.py +72 -13
  219. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/create_issue.sh +47 -22
  220. project_init-0.5.0/templates/lifecycle/dot_claude/scripts/create_nojira_pr.sh +3 -0
  221. project_init-0.5.0/templates/lifecycle/dot_claude/scripts/finish_pr.sh +3 -0
  222. {project_init-0.3.0/.claude → project_init-0.5.0/templates/lifecycle/dot_claude}/scripts/monitor_pr.sh +93 -34
  223. project_init-0.5.0/templates/lifecycle/dot_claude/scripts/promote_review.sh +3 -0
  224. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/push_branch.sh +2 -2
  225. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/push_wiki.sh +5 -1
  226. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/setup_github.sh +84 -12
  227. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_claude/scripts/start_issue.sh +41 -2
  228. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/copilot-instructions.md.tmpl +2 -1
  229. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/workflows/board-automation.yml +13 -3
  230. project_init-0.5.0/templates/lifecycle/dot_github/workflows/project-init-upgrade.yml.tmpl +78 -0
  231. 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
  232. project_init-0.5.0/templates/lifecycle_fallback/dot_claude/hooks/github_command_guard.sh +18 -0
  233. {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
  234. project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/audit/SKILL.md +147 -0
  235. project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/create_issue/SKILL.md +62 -0
  236. project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/github_workflow/SKILL.md +89 -0
  237. project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/request_review/SKILL.md +19 -0
  238. project_init-0.5.0/templates/lifecycle_fallback/dot_claude/skills/start_task/SKILL.md +48 -0
  239. project_init-0.5.0/templates/multi_model/dot_claude/docs/guides/using-multi-model.md +175 -0
  240. project_init-0.5.0/templates/multi_model/dot_claude/multi-model/README.md +49 -0
  241. project_init-0.5.0/templates/multi_model/dot_claude/multi-model/config.json +53 -0
  242. project_init-0.5.0/templates/multi_model/dot_claude/multi-model/dot_env.example +25 -0
  243. project_init-0.5.0/templates/multi_model/dot_claude/scripts/models.sh +126 -0
  244. project_init-0.5.0/templates/multi_model/dot_claude/scripts/setup_models.sh +238 -0
  245. project_init-0.5.0/templates/observability/dot_claude/docs/guides/upgrading-observability.md +62 -0
  246. project_init-0.5.0/templates/observability/dot_claude/docs/guides/using-observability.md +88 -0
  247. project_init-0.5.0/templates/observability/dot_claude/observability/.keep +9 -0
  248. project_init-0.5.0/templates/observability/dot_claude/observability/README.md +47 -0
  249. project_init-0.5.0/templates/observability/dot_claude/observability/dot_gitignore +4 -0
  250. project_init-0.5.0/templates/observability/dot_claude/observability/usage_report.py +543 -0
  251. project_init-0.5.0/templates/observability/dot_claude/scripts/observability.sh +52 -0
  252. {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
  253. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/docs/guides/using-memory.md +3 -3
  254. project_init-0.5.0/templates/presets/auto.toml +20 -0
  255. project_init-0.5.0/templates/presets/core.toml +18 -0
  256. project_init-0.5.0/templates/presets/governed.toml +14 -0
  257. {project_init-0.3.0 → project_init-0.5.0}/templates/presets/obsidian-graphify.toml +3 -1
  258. {project_init-0.3.0 → project_init-0.5.0}/templates/presets/obsidian-only.toml +3 -1
  259. project_init-0.5.0/templates/rag/dot_claude/docs/guides/using-rag.md +73 -0
  260. project_init-0.5.0/templates/rag/dot_claude/rules/rag.md +32 -0
  261. project_init-0.5.0/templates/rag/dot_claude/scripts/setup_rag.sh +107 -0
  262. project_init-0.5.0/tests/contracts/test_agent_overlays.py +387 -0
  263. project_init-0.5.0/tests/contracts/test_agents_canonical.py +227 -0
  264. project_init-0.5.0/tests/contracts/test_benchmark_cost_latency.py +107 -0
  265. project_init-0.5.0/tests/contracts/test_benchmark_harness.py +298 -0
  266. project_init-0.5.0/tests/contracts/test_benchmark_report.py +160 -0
  267. project_init-0.5.0/tests/contracts/test_benchmark_scoring.py +174 -0
  268. project_init-0.5.0/tests/contracts/test_capabilities.py +110 -0
  269. project_init-0.5.0/tests/contracts/test_cross_stack_examples.py +114 -0
  270. project_init-0.5.0/tests/contracts/test_deploy_overlay.py +145 -0
  271. project_init-0.5.0/tests/contracts/test_docs_renovate.py +226 -0
  272. project_init-0.5.0/tests/contracts/test_enforcement.py +67 -0
  273. project_init-0.5.0/tests/contracts/test_enterprise_host.py +128 -0
  274. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_env_tooling.py +9 -4
  275. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_governance.py +23 -1
  276. project_init-0.5.0/tests/contracts/test_governance_overlay.py +250 -0
  277. project_init-0.5.0/tests/contracts/test_governance_product.py +311 -0
  278. project_init-0.5.0/tests/contracts/test_hook_portability.py +108 -0
  279. project_init-0.5.0/tests/contracts/test_iac_overlay.py +99 -0
  280. project_init-0.5.0/tests/contracts/test_integration_seam.py +44 -0
  281. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_integrity.py +3 -2
  282. project_init-0.5.0/tests/contracts/test_interpreter_portability.py +196 -0
  283. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_justfile.py +12 -4
  284. project_init-0.5.0/tests/contracts/test_library_release.py +56 -0
  285. project_init-0.5.0/tests/contracts/test_lifecycle_byte_identity.py +105 -0
  286. project_init-0.5.0/tests/contracts/test_lifecycle_none.py +304 -0
  287. project_init-0.5.0/tests/contracts/test_marketplace_source.py +96 -0
  288. project_init-0.5.0/tests/contracts/test_memory_byte_identity.py +107 -0
  289. project_init-0.5.0/tests/contracts/test_memory_none.py +195 -0
  290. project_init-0.5.0/tests/contracts/test_multi_model_overlay.py +180 -0
  291. project_init-0.5.0/tests/contracts/test_no_bytecode_leak.py +45 -0
  292. project_init-0.5.0/tests/contracts/test_no_egress.py +98 -0
  293. project_init-0.5.0/tests/contracts/test_observability_overlay.py +135 -0
  294. project_init-0.5.0/tests/contracts/test_observability_report.py +266 -0
  295. project_init-0.5.0/tests/contracts/test_observability_self_log.py +220 -0
  296. project_init-0.5.0/tests/contracts/test_parity_bundle.py +107 -0
  297. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_plugin_marketplace.py +83 -50
  298. project_init-0.5.0/tests/contracts/test_portability_hardening.py +98 -0
  299. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_prod_guard.py +74 -4
  300. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_quality_toolchain.py +8 -8
  301. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_release_engineering.py +27 -1
  302. project_init-0.5.0/tests/contracts/test_repo_validate_pr.py +89 -0
  303. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_scaffold_graphify.py +3 -7
  304. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_scaffold_obsidian.py +57 -3
  305. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_skill_index.py +7 -8
  306. project_init-0.5.0/tests/contracts/test_subagent_specs.py +36 -0
  307. project_init-0.5.0/tests/contracts/test_surface_emission.py +119 -0
  308. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_templates.py +175 -16
  309. project_init-0.5.0/tests/contracts/test_third_party_pin_contract.py +34 -0
  310. project_init-0.5.0/tests/contracts/test_upgrade_pr_workflow.py +73 -0
  311. project_init-0.5.0/tests/contracts/test_variable_contract.py +102 -0
  312. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_wiki_skill.py +14 -6
  313. project_init-0.5.0/tests/contracts/test_wizard_explanations.py +93 -0
  314. project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-graphify__no_plugin.json +121 -0
  315. project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-graphify__plugin.json +102 -0
  316. project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-only__no_plugin.json +118 -0
  317. project_init-0.5.0/tests/fixtures/lifecycle_baseline/obsidian-only__plugin.json +99 -0
  318. project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-graphify__no_plugin.json +121 -0
  319. project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-graphify__plugin.json +102 -0
  320. project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-only__no_plugin.json +118 -0
  321. project_init-0.5.0/tests/fixtures/memory_baseline/obsidian-only__plugin.json +99 -0
  322. project_init-0.5.0/tests/helpers.py +172 -0
  323. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_cli.py +121 -4
  324. project_init-0.5.0/tests/integration/test_code_map.py +140 -0
  325. project_init-0.5.0/tests/integration/test_combination_matrix.py +144 -0
  326. project_init-0.5.0/tests/integration/test_consent.py +146 -0
  327. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_dag_workflow.py +241 -31
  328. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_hooks_and_safety.py +25 -0
  329. project_init-0.5.0/tests/integration/test_install_script.py +59 -0
  330. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_issue_metadata_workflow.py +92 -13
  331. project_init-0.5.0/tests/integration/test_json_output.py +89 -0
  332. project_init-0.5.0/tests/integration/test_lifecycle.py +126 -0
  333. project_init-0.5.0/tests/integration/test_memory_backends.py +173 -0
  334. project_init-0.5.0/tests/integration/test_memory_descriptor.py +195 -0
  335. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_memory_starters.py +82 -6
  336. project_init-0.5.0/tests/integration/test_observability.py +98 -0
  337. project_init-0.5.0/tests/integration/test_org_lifecycle.py +67 -0
  338. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_overwrite_protection.py +102 -5
  339. project_init-0.5.0/tests/integration/test_rag_seam.py +192 -0
  340. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_readme_examples.py +38 -0
  341. project_init-0.5.0/tests/integration/test_upgrade.py +1039 -0
  342. project_init-0.5.0/tests/unit/test_interactive_prompts.py +73 -0
  343. {project_init-0.3.0 → project_init-0.5.0}/tests/unit/test_mcps.py +40 -39
  344. project_init-0.5.0/tests/unit/test_migration_notes.py +48 -0
  345. project_init-0.5.0/tests/unit/test_presets.py +54 -0
  346. project_init-0.5.0/tests/unit/test_presets_inheritance.py +131 -0
  347. project_init-0.5.0/tests/unit/test_profile.py +136 -0
  348. project_init-0.5.0/tests/unit/test_render_nesting.py +76 -0
  349. project_init-0.5.0/tests/unit/test_scaffold_inputs.py +128 -0
  350. project_init-0.5.0/tests/unit/test_shell_portability.py +178 -0
  351. project_init-0.5.0/tests/unit/test_surfaces.py +158 -0
  352. project_init-0.5.0/tests/unit/test_third_party_updates.py +109 -0
  353. project_init-0.5.0/tests/unit/test_version_span.py +59 -0
  354. project_init-0.5.0/tools/benchmark/README.md +131 -0
  355. project_init-0.5.0/tools/benchmark/harness.py +465 -0
  356. project_init-0.5.0/tools/benchmark/latency.py +66 -0
  357. project_init-0.5.0/tools/benchmark/model_prices.json +39 -0
  358. project_init-0.5.0/tools/benchmark/prices.py +71 -0
  359. project_init-0.5.0/tools/benchmark/record.py +96 -0
  360. project_init-0.5.0/tools/benchmark/report.py +305 -0
  361. project_init-0.5.0/tools/benchmark/scoring.py +135 -0
  362. project_init-0.5.0/tools/benchmark/tasks/feat.toml +17 -0
  363. project_init-0.5.0/tools/benchmark/tasks/fix.toml +44 -0
  364. project_init-0.5.0/tools/benchmark/tasks/noop.toml +10 -0
  365. project_init-0.5.0/tools/benchmark/tasks/qa.toml +16 -0
  366. project_init-0.5.0/tools/benchmark/transcript.py +124 -0
  367. project_init-0.5.0/tools/check_third_party_updates.py +183 -0
  368. project_init-0.5.0/tools/pinned_third_party.toml +18 -0
  369. project_init-0.5.0/tools/propose_third_party_bumps.sh +117 -0
  370. project_init-0.5.0/tools/sync_plugin.py +185 -0
  371. {project_init-0.3.0 → project_init-0.5.0}/uv.lock +1 -1
  372. project_init-0.3.0/.claude/skills/add_command/SKILL.md +0 -59
  373. project_init-0.3.0/.claude/skills/add_hook/SKILL.md +0 -108
  374. project_init-0.3.0/.claude/skills/wiki/SKILL.md +0 -84
  375. project_init-0.3.0/.claude-plugin/marketplace.json +0 -14
  376. project_init-0.3.0/.github/workflows/ci.yml +0 -99
  377. project_init-0.3.0/.github/workflows/docs.yml +0 -35
  378. project_init-0.3.0/GEMINI.md +0 -9
  379. project_init-0.3.0/PKG-INFO +0 -342
  380. project_init-0.3.0/README.md +0 -311
  381. project_init-0.3.0/mkdocs.yml +0 -32
  382. project_init-0.3.0/plugins/project-init-workflow/hooks/github_command_guard.sh +0 -11
  383. project_init-0.3.0/src/project_init/__init__.py +0 -4
  384. project_init-0.3.0/src/project_init/__main__.py +0 -662
  385. project_init-0.3.0/src/project_init/mcps.py +0 -57
  386. project_init-0.3.0/src/project_init/scaffold.py +0 -374
  387. project_init-0.3.0/src/project_init/upgrade.py +0 -569
  388. project_init-0.3.0/templates/base/AGENTS.md.tmpl +0 -50
  389. project_init-0.3.0/templates/base/GEMINI.md.tmpl +0 -16
  390. project_init-0.3.0/templates/base/dot_claude/agents/README.md +0 -30
  391. project_init-0.3.0/templates/base/dot_claude/config.yaml.tmpl +0 -31
  392. project_init-0.3.0/templates/base/dot_claude/hooks/agent_guard_adapter.py.tmpl +0 -64
  393. project_init-0.3.0/templates/base/dot_claude/scripts/create_nojira_pr.sh +0 -3
  394. project_init-0.3.0/templates/base/dot_claude/scripts/finish_pr.sh +0 -3
  395. project_init-0.3.0/templates/base/dot_claude/scripts/promote_review.sh +0 -3
  396. project_init-0.3.0/templates/base/dot_claude/skills/README.md +0 -12
  397. project_init-0.3.0/templates/base/dot_github/workflows/docs.yml.tmpl +0 -98
  398. project_init-0.3.0/templates/base/dot_gitignore.tmpl +0 -41
  399. project_init-0.3.0/templates/base/typedoc.json.tmpl +0 -14
  400. project_init-0.3.0/templates/fallback/dot_claude/hooks/github_command_guard.sh +0 -11
  401. project_init-0.3.0/templates/gemini/dot_claude/scripts/setup_gemini.sh.tmpl +0 -16
  402. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/add_adr.toml +0 -5
  403. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/add_command.toml +0 -5
  404. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/add_hook.toml +0 -5
  405. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/audit.toml +0 -5
  406. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/create_issue.toml +0 -5
  407. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/github_workflow.toml +0 -5
  408. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/request_review.toml +0 -5
  409. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/review.toml +0 -5
  410. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/save_memory.toml +0 -5
  411. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/session_summary.toml +0 -5
  412. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/start_task.toml +0 -5
  413. project_init-0.3.0/templates/gemini/dot_gemini-extension/commands/status.toml +0 -5
  414. project_init-0.3.0/templates/gemini/dot_gemini-extension/gemini-extension.json.tmpl +0 -6
  415. project_init-0.3.0/templates/gemini/dot_gemini-extension/hooks/hooks.json.tmpl +0 -18
  416. project_init-0.3.0/tests/contracts/test_agent_overlays.py +0 -177
  417. project_init-0.3.0/tests/contracts/test_agents_canonical.py +0 -94
  418. project_init-0.3.0/tests/helpers.py +0 -84
  419. project_init-0.3.0/tests/integration/test_upgrade.py +0 -457
  420. project_init-0.3.0/tests/unit/test_presets.py +0 -30
  421. project_init-0.3.0/tests/unit/test_render_nesting.py +0 -35
  422. project_init-0.3.0/tools/sync_plugin.py +0 -144
  423. {project_init-0.3.0 → project_init-0.5.0}/.claude/hooks/github_command_guard.sh +0 -0
  424. {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/create_nojira_pr.sh +0 -0
  425. {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/finish_pr.sh +0 -0
  426. {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/promote_review.sh +0 -0
  427. {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/push_branch.sh +0 -0
  428. {project_init-0.3.0 → project_init-0.5.0}/.claude/scripts/push_wiki.sh +0 -0
  429. {project_init-0.3.0 → project_init-0.5.0}/.claude/settings.json +0 -0
  430. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/github_workflow/SKILL.md +0 -0
  431. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/session_summary/SKILL.md +0 -0
  432. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/start_task/SKILL.md +0 -0
  433. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/architecture.md +0 -0
  434. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/implementation-guide.md +0 -0
  435. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/preset-guide.md +0 -0
  436. {project_init-0.3.0 → project_init-0.5.0}/.claude/skills/wiki/templates/scaffolder-logic.md +0 -0
  437. {project_init-0.3.0 → project_init-0.5.0}/.gitattributes +0 -0
  438. {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  439. {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/chore.yml +0 -0
  440. {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/docs.yml +0 -0
  441. {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  442. {project_init-0.3.0 → project_init-0.5.0}/.github/ISSUE_TEMPLATE/test.yml +0 -0
  443. {project_init-0.3.0 → project_init-0.5.0}/.github/copilot-instructions.md +0 -0
  444. {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/board-automation.yml +0 -0
  445. {project_init-0.3.0 → project_init-0.5.0}/.github/workflows/review-status.yml +0 -0
  446. {project_init-0.3.0 → project_init-0.5.0}/AGENTS.md +0 -0
  447. {project_init-0.3.0 → project_init-0.5.0}/LICENSE +0 -0
  448. {project_init-0.3.0 → project_init-0.5.0}/cliff.toml +0 -0
  449. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-001-scaffolder-design.md +0 -0
  450. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-002-dotglob-template-convention.md +0 -0
  451. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-006-conventional-commit-titles.md +0 -0
  452. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-008-distribution-channel.md +0 -0
  453. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-009-graphify-memory-preset.md +0 -0
  454. {project_init-0.3.0 → project_init-0.5.0}/docs/adr/adr-010-plugin-marketplace-dual-ship.md +0 -0
  455. {project_init-0.3.0 → project_init-0.5.0}/docs/development/build-reproducibility.md +0 -0
  456. {project_init-0.3.0 → project_init-0.5.0}/docs/development/contributing.md +0 -0
  457. {project_init-0.3.0 → project_init-0.5.0}/docs/development/template-system.md +0 -0
  458. {project_init-0.3.0 → project_init-0.5.0}/docs/development/testing.md +0 -0
  459. {project_init-0.3.0 → project_init-0.5.0}/justfile +0 -0
  460. {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/.claude-plugin/plugin.json +0 -0
  461. {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/skills/add_adr/SKILL.md +0 -0
  462. {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/skills/save_memory/SKILL.md +0 -0
  463. {project_init-0.3.0 → project_init-0.5.0}/plugins/project-init-workflow/skills/session_summary/SKILL.md +0 -0
  464. {project_init-0.3.0 → project_init-0.5.0}/renovate.json +0 -0
  465. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/add_adr/SKILL.md +0 -0
  466. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/save_memory/SKILL.md +0 -0
  467. {project_init-0.3.0/templates/codex → project_init-0.5.0/templates/amp}/dot_agents/skills/session_summary/SKILL.md +0 -0
  468. {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
  469. {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
  470. {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
  471. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/MEMORY.md.tmpl +0 -0
  472. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/README.md +0 -0
  473. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/SCHEMA.md +0 -0
  474. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/feedback_conventions.md +0 -0
  475. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/project_context.md.tmpl +0 -0
  476. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/auto}/dot_claude/memory/user_role.md +0 -0
  477. {project_init-0.3.0 → project_init-0.5.0}/templates/base/LICENSE.tmpl +0 -0
  478. {project_init-0.3.0 → project_init-0.5.0}/templates/base/SECURITY.md.tmpl +0 -0
  479. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/adr/adr-template.md +0 -0
  480. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/development/conventions.md.tmpl +0 -0
  481. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/development/testing.md +0 -0
  482. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/docs/guides/secrets.md +0 -0
  483. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/rules/go.md +0 -0
  484. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/rules/node.md +0 -0
  485. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_claude/rules/python.md +0 -0
  486. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/CODEOWNERS.tmpl +0 -0
  487. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_github/hooks/pre-commit +0 -0
  488. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_golangci.yml.tmpl +0 -0
  489. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_vscode/extensions.json.tmpl +0 -0
  490. {project_init-0.3.0 → project_init-0.5.0}/templates/base/dot_vscode/settings.json.tmpl +0 -0
  491. {project_init-0.3.0 → project_init-0.5.0}/templates/base/eslint.config.mjs.tmpl +0 -0
  492. {project_init-0.3.0 → project_init-0.5.0}/templates/base/mise.toml.tmpl +0 -0
  493. {project_init-0.3.0 → project_init-0.5.0}/templates/base/ruff.toml.tmpl +0 -0
  494. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/add_adr/SKILL.md +0 -0
  495. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/save_memory/SKILL.md +0 -0
  496. {project_init-0.3.0/templates/gemini → project_init-0.5.0/templates/codex}/dot_agents/skills/session_summary/SKILL.md +0 -0
  497. {project_init-0.3.0 → project_init-0.5.0}/templates/graphify/dot_claude/docs/guides/using-graphify.md +0 -0
  498. {project_init-0.3.0 → project_init-0.5.0}/templates/graphify/dot_claude/rules/graphify.md +0 -0
  499. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/bug.yml +0 -0
  500. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/chore.yml +0 -0
  501. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/config.yml +0 -0
  502. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/docs.yml +0 -0
  503. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/feature.yml +0 -0
  504. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/ISSUE_TEMPLATE/test.yml +0 -0
  505. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/pull_request_template.md +0 -0
  506. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/workflows/issue-validation.yml +0 -0
  507. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/lifecycle}/dot_github/workflows/review-status.yml +0 -0
  508. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/README.md +0 -0
  509. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/decisions/README.md +0 -0
  510. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/decisions/adr-000-project-setup.md.tmpl +0 -0
  511. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/design/README.md +0 -0
  512. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/README.md +0 -0
  513. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/app.json +0 -0
  514. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/community-plugins.json +0 -0
  515. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/dot_obsidian/core-plugins.json +0 -0
  516. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/knowledge/README.md +0 -0
  517. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/log.md +0 -0
  518. {project_init-0.3.0/templates/base → project_init-0.5.0/templates/obsidian}/dot_claude/vault/sessions/README.md +0 -0
  519. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/decision.md +0 -0
  520. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/design-note.md +0 -0
  521. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/knowledge-note.md +0 -0
  522. {project_init-0.3.0 → project_init-0.5.0}/templates/obsidian/dot_claude/vault/templates/session-note.md +0 -0
  523. {project_init-0.3.0 → project_init-0.5.0}/tests/__init__.py +0 -0
  524. {project_init-0.3.0 → project_init-0.5.0}/tests/conftest.py +0 -0
  525. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_renovate.py +0 -0
  526. {project_init-0.3.0 → project_init-0.5.0}/tests/contracts/test_session_bootstrap.py +0 -0
  527. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_quality_gate_lint.py +0 -0
  528. {project_init-0.3.0 → project_init-0.5.0}/tests/integration/test_session_cold_start.py +0 -0
  529. {project_init-0.3.0 → project_init-0.5.0}/tests/smoke/test_packaging.py +0 -0
  530. {project_init-0.3.0 → project_init-0.5.0}/tests/unit/test_command_variables.py +0 -0
@@ -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
- {decision: block, reason: ...} if disallowed.
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+(?:\S+\s+)?(?:origin\s+)?(?:main|master)\b"),
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
- re.compile(r"\bgh\s+api\s+repos/[^/\s]+/[^/\s]+/pulls/\d+/merge\b"),
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
- return (Path(".claude/scripts") / m.group(1)).exists()
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 {"decision": "block", "reason": reason}
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 if own_ok else 0 # prereqs satisfied = transition allowed
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 force and branch in ("main", "master"):
384
- sys.stderr.write("push: refusing to force-push main/master\n")
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
- rc = cmd_push(None, 3)
459
- if rc != 0:
460
- return rc
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
- monitor_args = [".claude/scripts/monitor_pr.sh", str(pr_number), "--merge"]
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]
@@ -68,5 +68,5 @@ context = (
68
68
  f"{state_block}"
69
69
  )
70
70
 
71
- print(json.dumps({"additionalContext": context}))
71
+ print(json.dumps({"hookSpecificOutput": {"hookEventName": "UserPromptSubmit", "additionalContext": context}}))
72
72
  '
@@ -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
- print(sum(1 for c in data if c.get('name') != 'review/decision' and c.get('state') in ('PENDING', 'IN_PROGRESS', 'EXPECTED')))
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" -eq 0 ] && { sleep 10; continue; }
154
- PENDING=$(_count_pending "$CHECKS")
155
- [ "$PENDING" -eq 0 ] && break
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
- > **Claude Code specific**: this skill manages Claude Code configuration
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 slash commands expand
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 tracking events
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 with {"decision":"block","reason":"..."} = block (PreToolUse)
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({'decision':'block','reason':sys.argv[1]}))" \
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.