project-init 0.5.2__tar.gz → 0.6.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 (534) hide show
  1. {project_init-0.5.2/templates/lifecycle/dot_claude → project_init-0.6.0/.claude}/hooks/dag_workflow.py +72 -4
  2. {project_init-0.5.2 → project_init-0.6.0}/.github/workflows/ci.yml +25 -17
  3. {project_init-0.5.2 → project_init-0.6.0}/.github/workflows/docs.yml +4 -4
  4. {project_init-0.5.2 → project_init-0.6.0}/.github/workflows/release.yml +7 -7
  5. {project_init-0.5.2/templates/lifecycle/dot_github → project_init-0.6.0/.github}/workflows/review-status.yml +5 -1
  6. {project_init-0.5.2 → project_init-0.6.0}/.github/workflows/third-party-updates.yml +2 -2
  7. {project_init-0.5.2 → project_init-0.6.0}/CITATION.cff +1 -1
  8. {project_init-0.5.2 → project_init-0.6.0}/CLAUDE.md +13 -3
  9. {project_init-0.5.2 → project_init-0.6.0}/PKG-INFO +4 -8
  10. {project_init-0.5.2 → project_init-0.6.0}/README.md +3 -3
  11. project_init-0.6.0/docs/reviews/2026-07-project-review.md +249 -0
  12. {project_init-0.5.2 → project_init-0.6.0}/justfile +1 -1
  13. {project_init-0.5.2/plugins/project-init-workflow → project_init-0.6.0/plugins/project-init-lifecycle}/hooks/_py.sh +2 -2
  14. {project_init-0.5.2/.claude → project_init-0.6.0/plugins/project-init-lifecycle}/hooks/dag_workflow.py +72 -4
  15. {project_init-0.5.2/templates/lifecycle_fallback/dot_claude → project_init-0.6.0/plugins/project-init-lifecycle}/hooks/github_command_guard.sh +1 -1
  16. {project_init-0.5.2/templates/lifecycle_fallback/dot_claude → project_init-0.6.0/plugins/project-init-lifecycle}/hooks/workflow_state_reminder.sh +24 -4
  17. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/.claude-plugin/plugin.json +1 -1
  18. {project_init-0.5.2/plugins/project-init-lifecycle → project_init-0.6.0/plugins/project-init-workflow}/hooks/_py.sh +2 -2
  19. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/hooks/hooks.json +6 -0
  20. project_init-0.6.0/plugins/project-init-workflow/hooks/package_guard.py +370 -0
  21. project_init-0.6.0/plugins/project-init-workflow/hooks/post_edit_lint.sh +111 -0
  22. {project_init-0.5.2/templates/fallback/dot_claude → project_init-0.6.0/plugins/project-init-workflow}/hooks/pre_commit_gate.sh +35 -30
  23. {project_init-0.5.2/templates/base/dot_claude → project_init-0.6.0/plugins/project-init-workflow}/hooks/prod_guard.py +10 -1
  24. {project_init-0.5.2/templates/fallback/dot_claude → project_init-0.6.0/plugins/project-init-workflow}/hooks/session_setup.sh +14 -8
  25. project_init-0.6.0/plugins/project-init-workflow/skills/report_upstream_issue/SKILL.md +114 -0
  26. {project_init-0.5.2 → project_init-0.6.0}/pyproject.toml +9 -4
  27. {project_init-0.5.2 → project_init-0.6.0}/renovate.json +2 -2
  28. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/__init__.py +2 -2
  29. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/__main__.py +26 -10
  30. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/capabilities.py +10 -6
  31. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/concerns.py +5 -1
  32. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/mcps.py +12 -0
  33. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/migration_notes.py +23 -7
  34. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/scaffold.py +170 -54
  35. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/surfaces.py +0 -9
  36. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/upgrade.py +63 -12
  37. project_init-0.6.0/templates/amp/dot_agents/skills/report_upstream_issue/SKILL.md +114 -0
  38. project_init-0.6.0/templates/antigravity/dot_agents/skills/report_upstream_issue/SKILL.md +114 -0
  39. {project_init-0.5.2 → project_init-0.6.0}/templates/auto/dot_claude/scripts/lint_memory.sh +23 -11
  40. {project_init-0.5.2 → project_init-0.6.0}/templates/base/AGENTS.md.tmpl +4 -3
  41. {project_init-0.5.2 → project_init-0.6.0}/templates/base/Dockerfile.tmpl +26 -1
  42. project_init-0.6.0/templates/base/bunfig.toml.tmpl +14 -0
  43. project_init-0.6.0/templates/base/clippy.toml.tmpl +5 -0
  44. project_init-0.6.0/templates/base/deny.toml.tmpl +40 -0
  45. project_init-0.6.0/templates/base/dot_cargo/config.toml.tmpl +7 -0
  46. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/config.yaml.tmpl +1 -1
  47. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/hooks/_py.sh +2 -2
  48. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/hooks/agent_guard_adapter.py.tmpl +21 -9
  49. project_init-0.6.0/templates/base/dot_claude/hooks/package_guard.py +370 -0
  50. {project_init-0.5.2/plugins/project-init-workflow → project_init-0.6.0/templates/base/dot_claude}/hooks/prod_guard.py +10 -1
  51. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/project-init.md.tmpl +2 -1
  52. project_init-0.6.0/templates/base/dot_claude/rules/go.md +37 -0
  53. project_init-0.6.0/templates/base/dot_claude/rules/node.md +40 -0
  54. project_init-0.6.0/templates/base/dot_claude/rules/python.md +57 -0
  55. project_init-0.6.0/templates/base/dot_claude/rules/rust.md +50 -0
  56. project_init-0.6.0/templates/base/dot_claude/rules/typescript.md +31 -0
  57. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/scripts/gh_host.sh +7 -4
  58. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/settings.json.tmpl +6 -0
  59. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/skills/README.md.tmpl +2 -1
  60. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_devcontainer/devcontainer.json.tmpl +4 -1
  61. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_env.example.tmpl +1 -1
  62. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/hooks/commit-msg +1 -1
  63. project_init-0.6.0/templates/base/dot_github/workflows/ci.yml.tmpl +704 -0
  64. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/workflows/deploy.yml.tmpl +12 -0
  65. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/workflows/registry-publish.yml.tmpl +18 -0
  66. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/workflows/release.yml.tmpl +72 -5
  67. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_gitignore.tmpl +7 -2
  68. project_init-0.6.0/templates/base/dot_gitleaks.toml +17 -0
  69. project_init-0.6.0/templates/base/dot_golangci.yml.tmpl +43 -0
  70. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_vscode/extensions.json.tmpl +2 -1
  71. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_vscode/settings.json.tmpl +4 -1
  72. project_init-0.6.0/templates/base/eslint.config.mjs.tmpl +52 -0
  73. project_init-0.6.0/templates/base/justfile.tmpl +296 -0
  74. {project_init-0.5.2 → project_init-0.6.0}/templates/base/mise.toml.tmpl +2 -1
  75. project_init-0.6.0/templates/base/mypy.ini.tmpl +19 -0
  76. project_init-0.6.0/templates/base/ruff.toml.tmpl +50 -0
  77. project_init-0.6.0/templates/base/rustfmt.toml.tmpl +4 -0
  78. project_init-0.6.0/templates/base/tsconfig.base.json.tmpl +19 -0
  79. project_init-0.6.0/templates/base/tsconfig.json.tmpl +6 -0
  80. project_init-0.6.0/templates/codex/dot_agents/skills/report_upstream_issue/SKILL.md +114 -0
  81. project_init-0.6.0/templates/fallback/dot_claude/hooks/post_edit_lint.sh +111 -0
  82. {project_init-0.5.2/plugins/project-init-workflow → project_init-0.6.0/templates/fallback/dot_claude}/hooks/pre_commit_gate.sh +35 -30
  83. {project_init-0.5.2/plugins/project-init-workflow → project_init-0.6.0/templates/fallback/dot_claude}/hooks/session_setup.sh +14 -8
  84. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/INDEX.md.tmpl +1 -0
  85. project_init-0.6.0/templates/fallback/dot_claude/skills/report_upstream_issue/SKILL.md +114 -0
  86. project_init-0.6.0/templates/junie/dot_junie/skills/report_upstream_issue/SKILL.md +114 -0
  87. {project_init-0.5.2/plugins/project-init-lifecycle → project_init-0.6.0/templates/lifecycle/dot_claude}/hooks/dag_workflow.py +72 -4
  88. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/create_issue.sh +137 -105
  89. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/monitor_pr.sh +57 -15
  90. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/setup_github.sh +78 -52
  91. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/start_issue.sh +23 -21
  92. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/copilot-instructions.md.tmpl +1 -1
  93. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/workflows/board-automation.yml +44 -30
  94. project_init-0.6.0/templates/lifecycle/dot_github/workflows/issue-validation.yml +121 -0
  95. {project_init-0.5.2/plugins/project-init-lifecycle → project_init-0.6.0/templates/lifecycle_fallback/dot_claude}/hooks/github_command_guard.sh +1 -1
  96. {project_init-0.5.2/plugins/project-init-lifecycle → project_init-0.6.0/templates/lifecycle_fallback/dot_claude}/hooks/workflow_state_reminder.sh +24 -4
  97. {project_init-0.5.2 → project_init-0.6.0}/templates/multi_model/dot_claude/scripts/models.sh +44 -15
  98. {project_init-0.5.2 → project_init-0.6.0}/templates/multi_model/dot_claude/scripts/setup_models.sh +34 -17
  99. project_init-0.6.0/templates/observability/dot_claude/scripts/observability.sh +60 -0
  100. {project_init-0.5.2 → project_init-0.6.0}/templates/rag/dot_claude/scripts/setup_rag.sh +2 -2
  101. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_cross_stack_examples.py +3 -3
  102. project_init-0.6.0/tests/contracts/test_dockerfile_lint.py +96 -0
  103. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_emission_hardening.py +7 -8
  104. project_init-0.6.0/tests/contracts/test_fuzzing.py +81 -0
  105. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_governance.py +10 -4
  106. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_hook_portability.py +15 -0
  107. project_init-0.6.0/tests/contracts/test_image_scan.py +79 -0
  108. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_justfile.py +61 -5
  109. project_init-0.6.0/tests/contracts/test_justfile_combinations.py +59 -0
  110. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_library_release.py +6 -1
  111. project_init-0.6.0/tests/contracts/test_license_scan.py +105 -0
  112. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_lifecycle_byte_identity.py +82 -1
  113. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_memory_byte_identity.py +75 -1
  114. project_init-0.6.0/tests/contracts/test_package_guard.py +247 -0
  115. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_parity_bundle.py +5 -3
  116. project_init-0.6.0/tests/contracts/test_post_edit_lint_typecheck.py +64 -0
  117. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_prod_guard.py +6 -0
  118. project_init-0.6.0/tests/contracts/test_provenance.py +88 -0
  119. project_init-0.6.0/tests/contracts/test_quality_toolchain.py +531 -0
  120. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_release_engineering.py +6 -2
  121. project_init-0.6.0/tests/contracts/test_sbom.py +100 -0
  122. project_init-0.6.0/tests/contracts/test_scorecard.py +69 -0
  123. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_templates.py +38 -0
  124. {project_init-0.5.2/tests/fixtures/memory_baseline → project_init-0.6.0/tests/fixtures/lifecycle_baseline}/obsidian-graphify__no_plugin.json +6 -6
  125. {project_init-0.5.2/tests/fixtures/memory_baseline → project_init-0.6.0/tests/fixtures/lifecycle_baseline}/obsidian-graphify__plugin.json +4 -4
  126. {project_init-0.5.2 → project_init-0.6.0}/tests/fixtures/lifecycle_baseline/obsidian-only__no_plugin.json +6 -6
  127. {project_init-0.5.2 → project_init-0.6.0}/tests/fixtures/lifecycle_baseline/obsidian-only__plugin.json +4 -4
  128. {project_init-0.5.2/tests/fixtures/lifecycle_baseline → project_init-0.6.0/tests/fixtures/memory_baseline}/obsidian-graphify__no_plugin.json +6 -6
  129. {project_init-0.5.2/tests/fixtures/lifecycle_baseline → project_init-0.6.0/tests/fixtures/memory_baseline}/obsidian-graphify__plugin.json +4 -4
  130. {project_init-0.5.2 → project_init-0.6.0}/tests/fixtures/memory_baseline/obsidian-only__no_plugin.json +6 -6
  131. {project_init-0.5.2 → project_init-0.6.0}/tests/fixtures/memory_baseline/obsidian-only__plugin.json +4 -4
  132. {project_init-0.5.2 → project_init-0.6.0}/tests/helpers.py +1 -0
  133. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_cli.py +36 -6
  134. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_dag_workflow.py +58 -0
  135. project_init-0.6.0/tests/integration/test_gitignore_scaffold.py +77 -0
  136. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_issue_metadata_workflow.py +38 -2
  137. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_overwrite_protection.py +124 -0
  138. project_init-0.6.0/tests/integration/test_report_upstream_issue_skill.py +91 -0
  139. project_init-0.6.0/tests/integration/test_upgrade_edges.py +87 -0
  140. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_third_party_updates.py +16 -0
  141. {project_init-0.5.2 → project_init-0.6.0}/tools/check_third_party_updates.py +20 -18
  142. {project_init-0.5.2 → project_init-0.6.0}/tools/sync_plugin.py +69 -3
  143. {project_init-0.5.2 → project_init-0.6.0}/uv.lock +14 -8
  144. project_init-0.5.2/plugins/project-init-workflow/hooks/post_edit_lint.sh +0 -68
  145. project_init-0.5.2/templates/base/dot_claude/rules/go.md +0 -14
  146. project_init-0.5.2/templates/base/dot_claude/rules/node.md +0 -17
  147. project_init-0.5.2/templates/base/dot_claude/rules/python.md +0 -25
  148. project_init-0.5.2/templates/base/dot_github/workflows/ci.yml.tmpl +0 -328
  149. project_init-0.5.2/templates/base/dot_golangci.yml.tmpl +0 -20
  150. project_init-0.5.2/templates/base/eslint.config.mjs.tmpl +0 -29
  151. project_init-0.5.2/templates/base/justfile.tmpl +0 -113
  152. project_init-0.5.2/templates/base/ruff.toml.tmpl +0 -31
  153. project_init-0.5.2/templates/fallback/dot_claude/hooks/post_edit_lint.sh +0 -68
  154. project_init-0.5.2/templates/lifecycle/dot_github/workflows/issue-validation.yml +0 -72
  155. project_init-0.5.2/templates/observability/dot_claude/scripts/observability.sh +0 -52
  156. project_init-0.5.2/tests/contracts/test_quality_toolchain.py +0 -204
  157. {project_init-0.5.2 → project_init-0.6.0}/.claude/hooks/github_command_guard.sh +0 -0
  158. {project_init-0.5.2 → project_init-0.6.0}/.claude/hooks/workflow_state_reminder.sh +0 -0
  159. {project_init-0.5.2 → project_init-0.6.0}/.claude/scripts/create_nojira_pr.sh +0 -0
  160. {project_init-0.5.2 → project_init-0.6.0}/.claude/scripts/finish_pr.sh +0 -0
  161. {project_init-0.5.2 → project_init-0.6.0}/.claude/scripts/monitor_pr.sh +0 -0
  162. {project_init-0.5.2 → project_init-0.6.0}/.claude/scripts/promote_review.sh +0 -0
  163. {project_init-0.5.2 → project_init-0.6.0}/.claude/scripts/push_branch.sh +0 -0
  164. {project_init-0.5.2 → project_init-0.6.0}/.claude/scripts/push_wiki.sh +0 -0
  165. {project_init-0.5.2 → project_init-0.6.0}/.claude/settings.json +0 -0
  166. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/INDEX.md +0 -0
  167. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/README.md +0 -0
  168. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/add_command/SKILL.md +0 -0
  169. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/add_hook/SKILL.md +0 -0
  170. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/github_workflow/SKILL.md +0 -0
  171. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/live_test/SKILL.md +0 -0
  172. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/session_summary/SKILL.md +0 -0
  173. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/start_task/SKILL.md +0 -0
  174. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/wiki/SKILL.md +0 -0
  175. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/wiki/templates/architecture.md +0 -0
  176. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/wiki/templates/implementation-guide.md +0 -0
  177. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/wiki/templates/preset-guide.md +0 -0
  178. {project_init-0.5.2 → project_init-0.6.0}/.claude/skills/wiki/templates/scaffolder-logic.md +0 -0
  179. {project_init-0.5.2 → project_init-0.6.0}/.claude-plugin/marketplace.json +0 -0
  180. {project_init-0.5.2 → project_init-0.6.0}/.gitattributes +0 -0
  181. {project_init-0.5.2 → project_init-0.6.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  182. {project_init-0.5.2 → project_init-0.6.0}/.github/ISSUE_TEMPLATE/chore.yml +0 -0
  183. {project_init-0.5.2 → project_init-0.6.0}/.github/ISSUE_TEMPLATE/docs.yml +0 -0
  184. {project_init-0.5.2 → project_init-0.6.0}/.github/ISSUE_TEMPLATE/feature.yml +0 -0
  185. {project_init-0.5.2 → project_init-0.6.0}/.github/ISSUE_TEMPLATE/test.yml +0 -0
  186. {project_init-0.5.2 → project_init-0.6.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  187. {project_init-0.5.2 → project_init-0.6.0}/.github/copilot-instructions.md +0 -0
  188. {project_init-0.5.2 → project_init-0.6.0}/.github/workflows/board-automation.yml +0 -0
  189. {project_init-0.5.2 → project_init-0.6.0}/.github/workflows/validate-pr.yml +0 -0
  190. {project_init-0.5.2 → project_init-0.6.0}/.gitignore +0 -0
  191. {project_init-0.5.2 → project_init-0.6.0}/.gitleaks.toml +0 -0
  192. {project_init-0.5.2 → project_init-0.6.0}/AGENTS.md +0 -0
  193. {project_init-0.5.2 → project_init-0.6.0}/CONTRIBUTING.md +0 -0
  194. {project_init-0.5.2 → project_init-0.6.0}/LICENSE +0 -0
  195. {project_init-0.5.2 → project_init-0.6.0}/cliff.toml +0 -0
  196. {project_init-0.5.2 → project_init-0.6.0}/docs/README.md +0 -0
  197. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-001-scaffolder-design.md +0 -0
  198. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-002-dotglob-template-convention.md +0 -0
  199. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-003-github-native-workflow.md +0 -0
  200. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-004-obsidian-docs-integration.md +0 -0
  201. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-005-github-pr-board-workflow.md +0 -0
  202. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-006-conventional-commit-titles.md +0 -0
  203. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-007-security-enforcement-layers.md +0 -0
  204. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-008-distribution-channel.md +0 -0
  205. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-009-graphify-memory-preset.md +0 -0
  206. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-010-plugin-marketplace-dual-ship.md +0 -0
  207. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-011-pypi-trusted-publishing.md +0 -0
  208. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-012-prod-safety-guard.md +0 -0
  209. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-013-distribution-governance-model.md +0 -0
  210. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-014-environment-promotion-chains.md +0 -0
  211. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-015-env-deploy-model.md +0 -0
  212. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-016-model-agnostic-switching.md +0 -0
  213. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-017-per-surface-config-generator.md +0 -0
  214. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-018-ai-governance-overlay.md +0 -0
  215. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-019-local-observability-overlay.md +0 -0
  216. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-020-memory-backend-decomposition.md +0 -0
  217. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-021-quality-vs-lifecycle-tier-boundary.md +0 -0
  218. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-022-toolchain-gate-map.md +0 -0
  219. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-023-wizard-explanation-standard.md +0 -0
  220. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-024-memory-tier-model.md +0 -0
  221. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-025-agentic-os-root-layer.md +0 -0
  222. {project_init-0.5.2 → project_init-0.6.0}/docs/adr/adr-026-tier3-rag-engine-cocoindex.md +0 -0
  223. {project_init-0.5.2 → project_init-0.6.0}/docs/development/agentic-os-root-layer.md +0 -0
  224. {project_init-0.5.2 → project_init-0.6.0}/docs/development/build-reproducibility.md +0 -0
  225. {project_init-0.5.2 → project_init-0.6.0}/docs/development/contributing.md +0 -0
  226. {project_init-0.5.2 → project_init-0.6.0}/docs/development/enforcement-classification.md +0 -0
  227. {project_init-0.5.2 → project_init-0.6.0}/docs/development/enterprise-github-support-matrix.md +0 -0
  228. {project_init-0.5.2 → project_init-0.6.0}/docs/development/measurement-methodology.md +0 -0
  229. {project_init-0.5.2 → project_init-0.6.0}/docs/development/memory-descriptor.md +0 -0
  230. {project_init-0.5.2 → project_init-0.6.0}/docs/development/mobile-remote-access.md +0 -0
  231. {project_init-0.5.2 → project_init-0.6.0}/docs/development/non-cli-surface-matrix.md +0 -0
  232. {project_init-0.5.2 → project_init-0.6.0}/docs/development/template-system.md +0 -0
  233. {project_init-0.5.2 → project_init-0.6.0}/docs/development/testing.md +0 -0
  234. {project_init-0.5.2 → project_init-0.6.0}/docs/guides/org-fork-lifecycle.md +0 -0
  235. {project_init-0.5.2 → project_init-0.6.0}/docs/guides/using-project-init.md +0 -0
  236. {project_init-0.5.2 → project_init-0.6.0}/docs/positioning.md +0 -0
  237. {project_init-0.5.2 → project_init-0.6.0}/docs/research/model-agnostic-switching.md +0 -0
  238. {project_init-0.5.2 → project_init-0.6.0}/install.sh +0 -0
  239. {project_init-0.5.2 → project_init-0.6.0}/mkdocs.yml +0 -0
  240. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/.claude-plugin/plugin.json +0 -0
  241. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/hooks/_usage_log.sh +0 -0
  242. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/hooks/hooks.json +0 -0
  243. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/skills/audit/SKILL.md +0 -0
  244. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/skills/create_issue/SKILL.md +0 -0
  245. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/skills/github_workflow/SKILL.md +0 -0
  246. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/skills/request_review/SKILL.md +0 -0
  247. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-lifecycle/skills/start_task/SKILL.md +0 -0
  248. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/hooks/_usage_log.sh +0 -0
  249. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/skills/add_adr/SKILL.md +0 -0
  250. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/skills/add_command/SKILL.md +0 -0
  251. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/skills/add_hook/SKILL.md +0 -0
  252. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/skills/review/SKILL.md +0 -0
  253. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/skills/save_memory/SKILL.md +0 -0
  254. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/skills/session_summary/SKILL.md +0 -0
  255. {project_init-0.5.2 → project_init-0.6.0}/plugins/project-init-workflow/skills/status/SKILL.md +0 -0
  256. {project_init-0.5.2 → project_init-0.6.0}/src/project_init/governance.py +0 -0
  257. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/add_adr/SKILL.md +0 -0
  258. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/add_command/SKILL.md +0 -0
  259. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/add_hook/SKILL.md +0 -0
  260. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/audit/SKILL.md.tmpl +0 -0
  261. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/create_issue/SKILL.md.tmpl +0 -0
  262. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/github_workflow/SKILL.md.tmpl +0 -0
  263. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/plan/SKILL.md +0 -0
  264. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/request_review/SKILL.md.tmpl +0 -0
  265. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/review/SKILL.md +0 -0
  266. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/save_memory/SKILL.md +0 -0
  267. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/session_summary/SKILL.md +0 -0
  268. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/start_task/SKILL.md.tmpl +0 -0
  269. {project_init-0.5.2 → project_init-0.6.0}/templates/amp/dot_agents/skills/status/SKILL.md +0 -0
  270. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/add_adr/SKILL.md +0 -0
  271. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/add_command/SKILL.md +0 -0
  272. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/add_hook/SKILL.md +0 -0
  273. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/audit/SKILL.md.tmpl +0 -0
  274. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/create_issue/SKILL.md.tmpl +0 -0
  275. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/github_workflow/SKILL.md.tmpl +0 -0
  276. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/plan/SKILL.md +0 -0
  277. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/request_review/SKILL.md.tmpl +0 -0
  278. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/review/SKILL.md +0 -0
  279. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/save_memory/SKILL.md +0 -0
  280. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/session_summary/SKILL.md +0 -0
  281. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/start_task/SKILL.md.tmpl +0 -0
  282. {project_init-0.5.2 → project_init-0.6.0}/templates/antigravity/dot_agents/skills/status/SKILL.md +0 -0
  283. {project_init-0.5.2 → project_init-0.6.0}/templates/auto/dot_claude/memory/MEMORY.md.tmpl +0 -0
  284. {project_init-0.5.2 → project_init-0.6.0}/templates/auto/dot_claude/memory/README.md +0 -0
  285. {project_init-0.5.2 → project_init-0.6.0}/templates/auto/dot_claude/memory/SCHEMA.md +0 -0
  286. {project_init-0.5.2 → project_init-0.6.0}/templates/auto/dot_claude/memory/feedback_conventions.md +0 -0
  287. {project_init-0.5.2 → project_init-0.6.0}/templates/auto/dot_claude/memory/project_context.md.tmpl +0 -0
  288. {project_init-0.5.2 → project_init-0.6.0}/templates/auto/dot_claude/memory/user_role.md +0 -0
  289. {project_init-0.5.2 → project_init-0.6.0}/templates/base/CLAUDE.md.tmpl +0 -0
  290. {project_init-0.5.2 → project_init-0.6.0}/templates/base/CONTRIBUTING.md.tmpl +0 -0
  291. {project_init-0.5.2 → project_init-0.6.0}/templates/base/LICENSE.tmpl +0 -0
  292. {project_init-0.5.2 → project_init-0.6.0}/templates/base/SECURITY.md.tmpl +0 -0
  293. {project_init-0.5.2 → project_init-0.6.0}/templates/base/compose.yaml.tmpl +0 -0
  294. {project_init-0.5.2 → project_init-0.6.0}/templates/base/deploy/environments.yaml.tmpl +0 -0
  295. {project_init-0.5.2 → project_init-0.6.0}/templates/base/docs/explanation/index.md.tmpl +0 -0
  296. {project_init-0.5.2 → project_init-0.6.0}/templates/base/docs/how-to/index.md.tmpl +0 -0
  297. {project_init-0.5.2 → project_init-0.6.0}/templates/base/docs/index.md.tmpl +0 -0
  298. {project_init-0.5.2 → project_init-0.6.0}/templates/base/docs/reference/index.md.tmpl +0 -0
  299. {project_init-0.5.2 → project_init-0.6.0}/templates/base/docs/tutorials/index.md.tmpl +0 -0
  300. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/agents/README.md +0 -0
  301. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/agents/code-reviewer.md +0 -0
  302. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/agents/explore.md +0 -0
  303. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/README.md.tmpl +0 -0
  304. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/adr/adr-002-mcp-choices.md.tmpl +0 -0
  305. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/adr/adr-template.md +0 -0
  306. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/development/conventions.md.tmpl +0 -0
  307. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/development/testing.md +0 -0
  308. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/guides/cloud-integration.md.tmpl +0 -0
  309. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/guides/developer-onboarding.md +0 -0
  310. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/guides/environments.md +0 -0
  311. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/docs/guides/secrets.md +0 -0
  312. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/hooks/README.md +0 -0
  313. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/rules/hooks.md.tmpl +0 -0
  314. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/scripts/README.md.tmpl +0 -0
  315. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/scripts/gen_code_map.py.tmpl +0 -0
  316. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/scripts/install_hooks.sh +0 -0
  317. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/scripts/setup_env_protection.sh.tmpl +0 -0
  318. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/scripts/whats_deployed.sh.tmpl +0 -0
  319. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_claude/skills/plan/SKILL.md.tmpl +0 -0
  320. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_devcontainer/post-create.sh.tmpl +0 -0
  321. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_dockerignore.tmpl +0 -0
  322. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_gitattributes +0 -0
  323. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/CODEOWNERS.tmpl +0 -0
  324. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/hooks/pre-commit +0 -0
  325. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/hooks/pre-push.tmpl +0 -0
  326. {project_init-0.5.2 → project_init-0.6.0}/templates/base/dot_github/workflows/infra.yml.tmpl +0 -0
  327. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/README.md.tmpl +0 -0
  328. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/backend.tf.tmpl +0 -0
  329. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/dot_gitignore.tmpl +0 -0
  330. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/dot_pre-commit-config.yaml.tmpl +0 -0
  331. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/main.tf.tmpl +0 -0
  332. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/outputs.tf.tmpl +0 -0
  333. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/variables.tf.tmpl +0 -0
  334. {project_init-0.5.2 → project_init-0.6.0}/templates/base/infra/versions.tf.tmpl +0 -0
  335. {project_init-0.5.2 → project_init-0.6.0}/templates/base/mkdocs.yml.tmpl +0 -0
  336. {project_init-0.5.2 → project_init-0.6.0}/templates/base/renovate.json.tmpl +0 -0
  337. {project_init-0.5.2 → project_init-0.6.0}/templates/base/typedoc.json.tmpl +0 -0
  338. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/add_adr/SKILL.md +0 -0
  339. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/add_command/SKILL.md +0 -0
  340. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/add_hook/SKILL.md +0 -0
  341. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/audit/SKILL.md.tmpl +0 -0
  342. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/create_issue/SKILL.md.tmpl +0 -0
  343. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/github_workflow/SKILL.md.tmpl +0 -0
  344. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/plan/SKILL.md +0 -0
  345. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/request_review/SKILL.md.tmpl +0 -0
  346. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/review/SKILL.md +0 -0
  347. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/save_memory/SKILL.md +0 -0
  348. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/session_summary/SKILL.md +0 -0
  349. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/start_task/SKILL.md.tmpl +0 -0
  350. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_agents/skills/status/SKILL.md +0 -0
  351. {project_init-0.5.2 → project_init-0.6.0}/templates/codex/dot_codex/hooks.json.tmpl +0 -0
  352. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/hooks/_usage_log.sh +0 -0
  353. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/add_adr/SKILL.md +0 -0
  354. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/add_command/SKILL.md +0 -0
  355. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/add_hook/SKILL.md +0 -0
  356. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/review/SKILL.md +0 -0
  357. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/save_memory/SKILL.md +0 -0
  358. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/session_summary/SKILL.md +0 -0
  359. {project_init-0.5.2 → project_init-0.6.0}/templates/fallback/dot_claude/skills/status/SKILL.md +0 -0
  360. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/AI_USAGE_POLICY.md +0 -0
  361. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/NIST_RMF_CROSSWALK.md +0 -0
  362. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/README.md +0 -0
  363. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/ai-code-provenance.md +0 -0
  364. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/ai-declarations.md +0 -0
  365. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/approved-tools.md +0 -0
  366. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/config.example.json +0 -0
  367. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/data-handling.md +0 -0
  368. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/examples/SYSTEM_CARD.example.md +0 -0
  369. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/governance/examples/SYSTEM_CARD.template.md +0 -0
  370. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/scripts/governance_gate.py +0 -0
  371. {project_init-0.5.2 → project_init-0.6.0}/templates/governance/dot_claude/scripts/governance_gate.sh +0 -0
  372. {project_init-0.5.2 → project_init-0.6.0}/templates/graphify/dot_claude/docs/guides/using-graphify.md +0 -0
  373. {project_init-0.5.2 → project_init-0.6.0}/templates/graphify/dot_claude/rules/graphify.md +0 -0
  374. {project_init-0.5.2 → project_init-0.6.0}/templates/graphify/dot_claude/scripts/setup_graphify.sh +0 -0
  375. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/add_adr/SKILL.md +0 -0
  376. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/add_command/SKILL.md +0 -0
  377. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/add_hook/SKILL.md +0 -0
  378. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/audit/SKILL.md.tmpl +0 -0
  379. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/create_issue/SKILL.md.tmpl +0 -0
  380. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/github_workflow/SKILL.md.tmpl +0 -0
  381. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/plan/SKILL.md +0 -0
  382. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/request_review/SKILL.md.tmpl +0 -0
  383. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/review/SKILL.md +0 -0
  384. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/save_memory/SKILL.md +0 -0
  385. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/session_summary/SKILL.md +0 -0
  386. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/start_task/SKILL.md.tmpl +0 -0
  387. {project_init-0.5.2 → project_init-0.6.0}/templates/junie/dot_junie/skills/status/SKILL.md +0 -0
  388. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/docs/guides/issue-metadata.md +0 -0
  389. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/create_nojira_pr.sh +0 -0
  390. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/finish_pr.sh +0 -0
  391. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/promote_review.sh +0 -0
  392. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/push_branch.sh +0 -0
  393. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_claude/scripts/push_wiki.sh +0 -0
  394. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/ISSUE_TEMPLATE/bug.yml +0 -0
  395. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/ISSUE_TEMPLATE/chore.yml +0 -0
  396. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/ISSUE_TEMPLATE/config.yml +0 -0
  397. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/ISSUE_TEMPLATE/docs.yml +0 -0
  398. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/ISSUE_TEMPLATE/feature.yml +0 -0
  399. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/ISSUE_TEMPLATE/test.yml +0 -0
  400. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/pull_request_template.md +0 -0
  401. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/workflows/project-init-upgrade.yml.tmpl +0 -0
  402. {project_init-0.5.2/.github → project_init-0.6.0/templates/lifecycle/dot_github}/workflows/review-status.yml +0 -0
  403. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle/dot_github/workflows/validate-pr.yml.tmpl +0 -0
  404. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle_fallback/dot_claude/skills/audit/SKILL.md +0 -0
  405. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle_fallback/dot_claude/skills/create_issue/SKILL.md +0 -0
  406. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle_fallback/dot_claude/skills/github_workflow/SKILL.md +0 -0
  407. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle_fallback/dot_claude/skills/request_review/SKILL.md +0 -0
  408. {project_init-0.5.2 → project_init-0.6.0}/templates/lifecycle_fallback/dot_claude/skills/start_task/SKILL.md +0 -0
  409. {project_init-0.5.2 → project_init-0.6.0}/templates/multi_model/dot_claude/docs/guides/using-multi-model.md +0 -0
  410. {project_init-0.5.2 → project_init-0.6.0}/templates/multi_model/dot_claude/multi-model/README.md +0 -0
  411. {project_init-0.5.2 → project_init-0.6.0}/templates/multi_model/dot_claude/multi-model/config.json +0 -0
  412. {project_init-0.5.2 → project_init-0.6.0}/templates/multi_model/dot_claude/multi-model/dot_env.example +0 -0
  413. {project_init-0.5.2 → project_init-0.6.0}/templates/observability/dot_claude/docs/guides/upgrading-observability.md +0 -0
  414. {project_init-0.5.2 → project_init-0.6.0}/templates/observability/dot_claude/docs/guides/using-observability.md +0 -0
  415. {project_init-0.5.2 → project_init-0.6.0}/templates/observability/dot_claude/observability/.keep +0 -0
  416. {project_init-0.5.2 → project_init-0.6.0}/templates/observability/dot_claude/observability/README.md +0 -0
  417. {project_init-0.5.2 → project_init-0.6.0}/templates/observability/dot_claude/observability/dot_gitignore +0 -0
  418. {project_init-0.5.2 → project_init-0.6.0}/templates/observability/dot_claude/observability/usage_report.py +0 -0
  419. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/docs/adr/adr-001-memory-stack.md.tmpl +0 -0
  420. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/docs/guides/using-memory.md +0 -0
  421. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/README.md +0 -0
  422. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/decisions/README.md +0 -0
  423. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/decisions/adr-000-project-setup.md.tmpl +0 -0
  424. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/design/README.md +0 -0
  425. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/dot_obsidian/README.md +0 -0
  426. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/dot_obsidian/app.json +0 -0
  427. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/dot_obsidian/community-plugins.json +0 -0
  428. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/dot_obsidian/core-plugins.json +0 -0
  429. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/knowledge/README.md +0 -0
  430. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/log.md +0 -0
  431. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/sessions/README.md +0 -0
  432. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/templates/decision.md +0 -0
  433. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/templates/design-note.md +0 -0
  434. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/templates/knowledge-note.md +0 -0
  435. {project_init-0.5.2 → project_init-0.6.0}/templates/obsidian/dot_claude/vault/templates/session-note.md +0 -0
  436. {project_init-0.5.2 → project_init-0.6.0}/templates/presets/auto.toml +0 -0
  437. {project_init-0.5.2 → project_init-0.6.0}/templates/presets/core.toml +0 -0
  438. {project_init-0.5.2 → project_init-0.6.0}/templates/presets/governed.toml +0 -0
  439. {project_init-0.5.2 → project_init-0.6.0}/templates/presets/obsidian-graphify.toml +0 -0
  440. {project_init-0.5.2 → project_init-0.6.0}/templates/presets/obsidian-only.toml +0 -0
  441. {project_init-0.5.2 → project_init-0.6.0}/templates/rag/dot_claude/docs/guides/using-rag.md +0 -0
  442. {project_init-0.5.2 → project_init-0.6.0}/templates/rag/dot_claude/rules/rag.md +0 -0
  443. {project_init-0.5.2 → project_init-0.6.0}/tests/__init__.py +0 -0
  444. {project_init-0.5.2 → project_init-0.6.0}/tests/conftest.py +0 -0
  445. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_agent_overlays.py +0 -0
  446. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_agents_canonical.py +0 -0
  447. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_benchmark_cost_latency.py +0 -0
  448. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_benchmark_harness.py +0 -0
  449. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_benchmark_report.py +0 -0
  450. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_benchmark_scoring.py +0 -0
  451. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_capabilities.py +0 -0
  452. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_deploy_overlay.py +0 -0
  453. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_docs_renovate.py +0 -0
  454. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_enforcement.py +0 -0
  455. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_enterprise_host.py +0 -0
  456. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_env_tooling.py +0 -0
  457. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_governance_overlay.py +0 -0
  458. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_governance_product.py +0 -0
  459. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_iac_overlay.py +0 -0
  460. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_integration_seam.py +0 -0
  461. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_integrity.py +0 -0
  462. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_interpreter_portability.py +0 -0
  463. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_lifecycle_none.py +0 -0
  464. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_marketplace_source.py +0 -0
  465. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_memory_none.py +0 -0
  466. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_multi_model_overlay.py +0 -0
  467. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_no_bytecode_leak.py +0 -0
  468. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_no_egress.py +0 -0
  469. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_observability_overlay.py +0 -0
  470. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_observability_report.py +0 -0
  471. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_observability_self_log.py +0 -0
  472. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_plugin_marketplace.py +0 -0
  473. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_portability_hardening.py +0 -0
  474. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_renovate.py +0 -0
  475. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_repo_validate_pr.py +0 -0
  476. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_scaffold_graphify.py +0 -0
  477. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_scaffold_obsidian.py +0 -0
  478. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_session_bootstrap.py +0 -0
  479. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_skill_index.py +0 -0
  480. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_subagent_specs.py +0 -0
  481. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_surface_emission.py +0 -0
  482. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_third_party_pin_contract.py +0 -0
  483. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_upgrade_pr_workflow.py +0 -0
  484. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_variable_contract.py +0 -0
  485. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_wiki_skill.py +0 -0
  486. {project_init-0.5.2 → project_init-0.6.0}/tests/contracts/test_wizard_explanations.py +0 -0
  487. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_code_map.py +0 -0
  488. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_combination_matrix.py +0 -0
  489. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_compose_interop.py +0 -0
  490. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_concern_add_remove.py +0 -0
  491. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_concern_skill_gating.py +0 -0
  492. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_consent.py +0 -0
  493. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_hooks_and_safety.py +0 -0
  494. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_install_script.py +0 -0
  495. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_json_output.py +0 -0
  496. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_lifecycle.py +0 -0
  497. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_memory_backends.py +0 -0
  498. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_memory_descriptor.py +0 -0
  499. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_memory_starters.py +0 -0
  500. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_observability.py +0 -0
  501. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_org_lifecycle.py +0 -0
  502. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_quality_gate_lint.py +0 -0
  503. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_rag_seam.py +0 -0
  504. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_readme_examples.py +0 -0
  505. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_session_cold_start.py +0 -0
  506. {project_init-0.5.2 → project_init-0.6.0}/tests/integration/test_upgrade.py +0 -0
  507. {project_init-0.5.2 → project_init-0.6.0}/tests/smoke/test_packaging.py +0 -0
  508. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_command_variables.py +0 -0
  509. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_interactive_prompts.py +0 -0
  510. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_mcps.py +0 -0
  511. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_migration_notes.py +0 -0
  512. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_presets.py +0 -0
  513. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_presets_inheritance.py +0 -0
  514. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_profile.py +0 -0
  515. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_render_nesting.py +0 -0
  516. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_scaffold_inputs.py +0 -0
  517. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_shell_portability.py +0 -0
  518. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_surfaces.py +0 -0
  519. {project_init-0.5.2 → project_init-0.6.0}/tests/unit/test_version_span.py +0 -0
  520. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/README.md +0 -0
  521. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/harness.py +0 -0
  522. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/latency.py +0 -0
  523. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/model_prices.json +0 -0
  524. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/prices.py +0 -0
  525. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/record.py +0 -0
  526. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/report.py +0 -0
  527. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/scoring.py +0 -0
  528. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/tasks/feat.toml +0 -0
  529. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/tasks/fix.toml +0 -0
  530. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/tasks/noop.toml +0 -0
  531. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/tasks/qa.toml +0 -0
  532. {project_init-0.5.2 → project_init-0.6.0}/tools/benchmark/transcript.py +0 -0
  533. {project_init-0.5.2 → project_init-0.6.0}/tools/pinned_third_party.toml +0 -0
  534. {project_init-0.5.2 → project_init-0.6.0}/tools/propose_third_party_bumps.sh +0 -0
@@ -42,8 +42,6 @@ import sys
42
42
  import time
43
43
  from pathlib import Path
44
44
 
45
- CACHE_PATH = Path(".claude/.workflow-state.json")
46
-
47
45
  GRAPH: dict[str, list[str]] = {
48
46
  "issue.created": [],
49
47
  "branch.created": [],
@@ -253,6 +251,17 @@ COMMAND_RULES: list[tuple[re.Pattern[str], str | None, str]] = [
253
251
  "pr.merged",
254
252
  "Use .claude/scripts/monitor_pr.sh <pr> --merge instead of `gh api .../merge` so CI and review gates are honored.",
255
253
  ),
254
+ (
255
+ # GraphQL merges bypass the REST-path rule above (2026-07 review): a
256
+ # `gh api graphql` mutation can merge or enable auto-merge without ever
257
+ # naming `/pulls/N/merge`. Block the mutation fields themselves.
258
+ re.compile(
259
+ r"\bgh\s+api\b[^&;]*\bgraphql\b[^&;]*"
260
+ r"(?:mergePullRequest|enablePullRequestAutoMerge)"
261
+ ),
262
+ "pr.merged",
263
+ "Use .claude/scripts/monitor_pr.sh <pr> --merge instead of a `gh api graphql` merge mutation so CI and review gates are honored.",
264
+ ),
256
265
  (
257
266
  re.compile(r"\bgh\s+pr\s+merge\b"),
258
267
  "pr.merged",
@@ -291,12 +300,64 @@ _HEREDOC_RE = re.compile(
291
300
  re.DOTALL,
292
301
  )
293
302
 
303
+ # Git global options that sit BETWEEN `git` and the subcommand (`git -C dir
304
+ # push`, `git -c k=v push`). Left unnormalized they defeat every `git push`
305
+ # rule, including the direct-push-to-main block (2026-07 review). Options that
306
+ # consume a value are listed with their value; boolean options stand alone.
307
+ _GIT_GLOBAL_OPT = (
308
+ r"(?:"
309
+ r"-C[ \t]+\S+" # -C <path>
310
+ r"|-c[ \t]+\S+" # -c <name=value>
311
+ r"|--git-dir(?:=\S+|[ \t]+\S+)"
312
+ r"|--work-tree(?:=\S+|[ \t]+\S+)"
313
+ r"|--namespace(?:=\S+|[ \t]+\S+)"
314
+ r"|--config-env(?:=\S+|[ \t]+\S+)"
315
+ r"|--exec-path(?:=\S+)?"
316
+ r"|--no-pager|--paginate|-p|-P|--bare"
317
+ r"|--no-replace-objects|--literal-pathspecs|--no-optional-locks|--icase-pathspecs"
318
+ r")"
319
+ )
320
+ _GIT_NORMALIZE_RE = re.compile(r"\bgit((?:[ \t]+" + _GIT_GLOBAL_OPT + r")+)[ \t]+")
321
+
322
+ # An interpreter receiving a heredoc executes its body, so a guarded command
323
+ # hidden in `bash <<'EOF' … EOF` must still be scanned (2026-07 review). The
324
+ # negative lookbehind lets `/bin/bash` match while sparing `rebash`.
325
+ _INTERP = r"(?:bash|sh|zsh|dash|ksh|python3?|python2|eval|source)"
326
+ _INTERP_INTRO_RE = re.compile(r"(?<![\w.-])" + _INTERP + r"\b")
327
+ _PIPE_INTERP_RE = re.compile(r"^\s*\|\s*(?:sudo[ \t]+)?(?<![\w.-])" + _INTERP + r"\b")
328
+
329
+
330
+ def _normalize_git_globals(cmd: str) -> str:
331
+ """Rewrite ``git <global-opts> <subcommand>`` to ``git <subcommand>`` for
332
+ matching, so interposed ``-C``/``-c``/``--git-dir`` flags can't smuggle a
333
+ push past the rules (2026-07 review)."""
334
+ return _GIT_NORMALIZE_RE.sub("git ", cmd)
335
+
294
336
 
295
337
  def _strip_heredocs(cmd: str) -> str:
296
338
  """Remove heredoc body text so pattern rules don't fire on body content."""
297
339
  return _HEREDOC_RE.sub("", cmd)
298
340
 
299
341
 
342
+ def _executing_heredoc_bodies(cmd: str) -> str:
343
+ """Concatenate heredoc bodies that WILL run — those fed to an interpreter
344
+ directly (``bash <<EOF``) or via a pipe (``cat <<EOF … | bash``).
345
+
346
+ ``_strip_heredocs`` removes every body to spare prose (a commit message or
347
+ ``gh pr comment --body-file - <<EOF`` mentioning "git push main"), but that
348
+ also hid genuinely-executing bodies. Re-surfacing only the interpreter-fed
349
+ ones keeps prose exempt while closing the execution bypass (2026-07 review).
350
+ """
351
+ bodies = []
352
+ for m in _HEREDOC_RE.finditer(cmd):
353
+ line_start = cmd.rfind("\n", 0, m.start()) + 1
354
+ intro = cmd[line_start : m.start()]
355
+ after = cmd[m.end() : m.end() + 60]
356
+ if _INTERP_INTRO_RE.search(intro) or _PIPE_INTERP_RE.match(after):
357
+ bodies.append(m.group(0))
358
+ return "\n".join(bodies)
359
+
360
+
300
361
  # Free-text flag values carry arbitrary prose (commit messages, issue/PR comment
301
362
  # and release bodies, titles) that must not be scanned for command patterns — a
302
363
  # `--body` mentioning the literal "git push main" is data, not an invocation.
@@ -358,8 +419,15 @@ def guard(payload: dict) -> dict | None:
358
419
 
359
420
  # Strip heredoc bodies and free-text flag values so pattern rules don't fire
360
421
  # on prose content (e.g. `gh issue create --body "$(cat <<'EOF'\n...git
361
- # push...\nEOF\n)"`, or `gh pr comment --body "...git push main..."`).
362
- cmd_scan = _strip_text_flag_values(_strip_heredocs(cmd))
422
+ # push...\nEOF\n)"`, or `gh pr comment --body "...git push main..."`), then
423
+ # normalize interposed git global options so `git -C dir push` is matched
424
+ # like `git push` (2026-07 review).
425
+ cmd_scan = _normalize_git_globals(_strip_text_flag_values(_strip_heredocs(cmd)))
426
+ # A heredoc fed to an interpreter DOES execute its body — scan those too, so
427
+ # `bash <<'EOF' … git push … EOF` is not a bypass (2026-07 review).
428
+ exec_bodies = _executing_heredoc_bodies(cmd)
429
+ if exec_bodies:
430
+ cmd_scan += "\n" + _normalize_git_globals(_strip_text_flag_values(exec_bodies))
363
431
 
364
432
  for pattern, target, message in COMMAND_RULES:
365
433
  if not pattern.search(cmd_scan):
@@ -14,10 +14,10 @@ jobs:
14
14
  name: Lint and test
15
15
  runs-on: ubuntu-24.04
16
16
  steps:
17
- - uses: actions/checkout@v6
17
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
18
18
 
19
19
  - name: Install uv
20
- uses: astral-sh/setup-uv@v8.1.0
20
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
21
21
  with:
22
22
  version: "0.11.7"
23
23
  enable-cache: true
@@ -25,24 +25,32 @@ jobs:
25
25
  python-version: "3.12"
26
26
 
27
27
  - name: Sync dev dependencies
28
- run: uv sync --extra dev --locked
28
+ run: uv sync --group dev --locked
29
29
 
30
30
  - name: Lint (ruff)
31
31
  run: uv run ruff check .
32
32
 
33
33
  - name: Tests (pytest) — parallel mode
34
- # Falls back to single-threaded if xdist not available
35
- run: uv run pytest -n auto --tb=short -q 2>/dev/null || uv run pytest --tb=short -q
34
+ # Use xdist when importable, else single-threaded decided by an
35
+ # explicit capability check, not `|| retry`, so a genuinely failing
36
+ # suite is not run twice with its first-pass stderr hidden (2026-07
37
+ # review).
38
+ run: |
39
+ if uv run python -c "import xdist" 2>/dev/null; then
40
+ uv run pytest -n auto --tb=short -q
41
+ else
42
+ uv run pytest --tb=short -q
43
+ fi
36
44
 
37
45
  wheel-smoke:
38
46
  name: Wheel smoke test
39
47
  runs-on: ubuntu-24.04
40
48
  needs: lint-and-test
41
49
  steps:
42
- - uses: actions/checkout@v6
50
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
43
51
 
44
52
  - name: Install uv
45
- uses: astral-sh/setup-uv@v8.1.0
53
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
46
54
  with:
47
55
  version: "0.11.7"
48
56
  enable-cache: true
@@ -89,12 +97,12 @@ jobs:
89
97
  name: Secret scan (gitleaks)
90
98
  runs-on: ubuntu-24.04
91
99
  steps:
92
- - uses: actions/checkout@v6
100
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
93
101
  with:
94
102
  # Full history so leaked commits are caught, not just the latest diff
95
103
  fetch-depth: 0
96
104
 
97
- - uses: gitleaks/gitleaks-action@v3
105
+ - uses: gitleaks/gitleaks-action@e0c47f4f8be36e29cdc102c57e68cb5cbf0e8d1e # v3
98
106
  env:
99
107
  GITHUB_TOKEN: ${{ github.token }}
100
108
 
@@ -104,10 +112,10 @@ jobs:
104
112
  name: ShellCheck (scaffolded scripts)
105
113
  runs-on: ubuntu-24.04
106
114
  steps:
107
- - uses: actions/checkout@v6
115
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
108
116
 
109
117
  - name: Install uv
110
- uses: astral-sh/setup-uv@v8.1.0
118
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
111
119
  with:
112
120
  version: "0.11.7"
113
121
  enable-cache: true
@@ -146,8 +154,8 @@ jobs:
146
154
  outputs:
147
155
  shell: ${{ steps.filter.outputs.shell }}
148
156
  steps:
149
- - uses: actions/checkout@v6
150
- - uses: dorny/paths-filter@v3
157
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
158
+ - uses: dorny/paths-filter@d1c1ffe0248fe513906c8e24db8ea791d46f8590 # v3
151
159
  id: filter
152
160
  with:
153
161
  filters: |
@@ -170,10 +178,10 @@ jobs:
170
178
  if: needs.changes.outputs.shell == 'true'
171
179
  runs-on: macos-latest
172
180
  steps:
173
- - uses: actions/checkout@v6
181
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
174
182
 
175
183
  - name: Install uv
176
- uses: astral-sh/setup-uv@v8.1.0
184
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
177
185
  with:
178
186
  version: "0.11.7"
179
187
  python-version: "3.12"
@@ -228,10 +236,10 @@ jobs:
228
236
  run:
229
237
  shell: bash # GitHub's "bash" on Windows is Git Bash — the supported path
230
238
  steps:
231
- - uses: actions/checkout@v6
239
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
232
240
 
233
241
  - name: Install uv
234
- uses: astral-sh/setup-uv@v8.1.0
242
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
235
243
  with:
236
244
  version: "0.11.7"
237
245
  python-version: "3.12"
@@ -35,10 +35,10 @@ jobs:
35
35
  name: Build site
36
36
  runs-on: ubuntu-24.04
37
37
  steps:
38
- - uses: actions/checkout@v6
38
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
39
39
 
40
40
  - name: Install uv
41
- uses: astral-sh/setup-uv@v8.1.0
41
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
42
42
  with:
43
43
  version: "0.11.7"
44
44
  enable-cache: true
@@ -54,7 +54,7 @@ jobs:
54
54
  run: uv run mkdocs build --strict
55
55
 
56
56
  - name: Upload Pages artifact
57
- uses: actions/upload-pages-artifact@v3
57
+ uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
58
58
  with:
59
59
  path: site
60
60
 
@@ -72,4 +72,4 @@ jobs:
72
72
  steps:
73
73
  - name: Deploy to GitHub Pages
74
74
  id: deployment
75
- uses: actions/deploy-pages@v4
75
+ uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4
@@ -18,13 +18,13 @@ jobs:
18
18
  release:
19
19
  runs-on: ubuntu-24.04
20
20
  steps:
21
- - uses: actions/checkout@v6
21
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
22
22
  with:
23
23
  # Full history — git-cliff needs prior tags to scope --latest.
24
24
  fetch-depth: 0
25
25
 
26
26
  - name: Install uv
27
- uses: astral-sh/setup-uv@v8.1.0
27
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
28
28
  with:
29
29
  version: "0.11.7"
30
30
 
@@ -40,7 +40,7 @@ jobs:
40
40
  run: uv build
41
41
 
42
42
  - name: Generate changelog (latest tag)
43
- uses: orhun/git-cliff-action@v4
43
+ uses: orhun/git-cliff-action@f50e11560dce63f7c33227798f90b924471a88b5 # v4
44
44
  with:
45
45
  config: cliff.toml
46
46
  args: --latest
@@ -48,7 +48,7 @@ jobs:
48
48
  OUTPUT: RELEASE_NOTES.md
49
49
 
50
50
  - name: Create GitHub Release
51
- uses: softprops/action-gh-release@v3
51
+ uses: softprops/action-gh-release@718ea10b132b3b2eba29c1007bb80653f286566b # v3
52
52
  with:
53
53
  # Only the build artifacts — an unscoped glob also picks up the
54
54
  # tracked dist/.gitignore and uploads it as a stray
@@ -72,10 +72,10 @@ jobs:
72
72
  contents: read
73
73
  id-token: write
74
74
  steps:
75
- - uses: actions/checkout@v6
75
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
76
76
 
77
77
  - name: Install uv
78
- uses: astral-sh/setup-uv@v8.1.0
78
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
79
79
  with:
80
80
  version: "0.11.7"
81
81
 
@@ -83,4 +83,4 @@ jobs:
83
83
  run: uv build
84
84
 
85
85
  - name: Publish to PyPI
86
- uses: pypa/gh-action-pypi-publish@release/v1
86
+ uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
@@ -31,6 +31,10 @@ jobs:
31
31
  PR_NUMBER: ${{ github.event.pull_request.number }}
32
32
  SHA: ${{ github.event.pull_request.head.sha }}
33
33
  REPO: ${{ github.repository }}
34
+ # Route the event value through env, not inline ${{ }} in the script —
35
+ # keeps the whole workflow to one untrusted-input discipline (2026-07
36
+ # review). GitHub-generated URL, so risk is low; consistency matters.
37
+ REVIEW_URL: ${{ github.event.review.html_url }}
34
38
  run: |
35
39
  DECISION=$(gh pr view "$PR_NUMBER" --repo "$REPO" --json reviewDecision -q '.reviewDecision // ""')
36
40
  case "$DECISION" in
@@ -45,4 +49,4 @@ jobs:
45
49
  --field state="$STATE" \
46
50
  --field description="$DESCRIPTION" \
47
51
  --field context="review/decision" \
48
- --field target_url="${{ github.event.review.html_url }}"
52
+ --field target_url="$REVIEW_URL"
@@ -17,10 +17,10 @@ jobs:
17
17
  name: Check pinned third-party tools
18
18
  runs-on: ubuntu-24.04
19
19
  steps:
20
- - uses: actions/checkout@v6
20
+ - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
21
21
 
22
22
  - name: Install uv
23
- uses: astral-sh/setup-uv@v8.1.0
23
+ uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
24
24
  with:
25
25
  version: "0.11.7"
26
26
  python-version: "3.12"
@@ -9,4 +9,4 @@ authors:
9
9
  repository-code: https://github.com/VytCepas/project-init
10
10
  url: https://vytcepas.github.io/project-init/
11
11
  license: Apache-2.0
12
- version: 0.5.2
12
+ version: 0.6.0
@@ -16,13 +16,23 @@ Before doing any GitHub issue, branch, push, PR, review, CI, or merge work, read
16
16
  ├── pyproject.toml # uv-managed; core dep = rich; dev = ruff + pytest
17
17
  ├── install.sh # user-facing bootstrap (curl | bash)
18
18
  ├── src/project_init/ # wizard CLI + scaffold engine
19
+ ├── plugins/ # synced plugin payloads (tools/sync_plugin.py; ADR-010)
20
+ ├── tools/ # sync_plugin.py, third-party update checker, benchmark
19
21
  ├── templates/
20
22
  │ ├── base/ # always copied into target projects
23
+ │ ├── auto/ # always-on emitted artifacts (agent memory files)
21
24
  │ ├── fallback/ # shared hooks/skills — rendered only with --no-plugin (ADR-010)
22
- │ ├── obsidian/ # overlay for both Obsidian-* presets
23
- │ ├── graphify/ # overlay for Obsidian+Graphify preset
25
+ │ ├── lifecycle/ # GitHub lifecycle enforcement (default; --lifecycle none opts out)
26
+ │ ├── lifecycle_fallback/ # lifecycle guard hooks + skills for --no-plugin
27
+ │ ├── obsidian/ # vault overlay for both Obsidian-* presets
28
+ │ ├── graphify/ # Graphify overlay (implies obsidian)
29
+ │ ├── rag/ # tier-3 RAG memory overlay
30
+ │ ├── multi_model/ # CCR model-switching overlay (--multi-model)
31
+ │ ├── governance/ # AI governance overlay (--governance)
32
+ │ ├── observability/ # transcript metrics overlay (--observability)
33
+ │ ├── codex/ antigravity/ amp/ junie/ # per-surface wiring overlays (--agents)
24
34
  │ └── presets/ # toml preset definitions
25
- └── tests/ # focused pytest modules by behavior area
35
+ └── tests/ # focused pytest modules by behavior area (unit/contract/integration/smoke)
26
36
  ```
27
37
 
28
38
  Template naming convention: directories stored as `dot_claude/`, `dot_gitignore` etc. The scaffolder renames them to `.claude/`, `.gitignore` on copy. This keeps templates visible in GitHub and avoids this repo being auto-loaded as a Claude Code config for itself.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: project-init
3
- Version: 0.5.2
3
+ Version: 0.6.0
4
4
  Summary: Scaffolder for agentic-development infrastructure inside any project
5
5
  Project-URL: Repository, https://github.com/VytCepas/project-init
6
6
  Project-URL: Documentation, https://vytcepas.github.io/project-init/
@@ -21,10 +21,6 @@ Classifier: Programming Language :: Python :: 3.13
21
21
  Classifier: Topic :: Software Development :: Code Generators
22
22
  Requires-Python: >=3.11
23
23
  Requires-Dist: rich>=13.7
24
- Provides-Extra: dev
25
- Requires-Dist: pytest-xdist>=3.0; extra == 'dev'
26
- Requires-Dist: pytest>=8.0; extra == 'dev'
27
- Requires-Dist: ruff>=0.4; extra == 'dev'
28
24
  Provides-Extra: docs
29
25
  Requires-Dist: mkdocs-material>=9.7.6; extra == 'docs'
30
26
  Description-Content-Type: text/markdown
@@ -206,7 +202,7 @@ uvx --from ~/.local/share/project-init project-init . \
206
202
  The wizard asks (interactive mode only):
207
203
 
208
204
  - Project name / description
209
- - Language (Python/Node/Go/none) — drives `lint_command`, `format_command`, `test_command`
205
+ - Language (Python/Node/Go/Rust/none) — drives `lint_command`, `format_command`, `test_command`
210
206
  - Delivery model (`--delivery library|service|prototype`) — how the project ships, driving its env/CI/release bundle (ADR-015). `service` adds the container **parity bundle** (Dockerfile + `compose.yaml` + devcontainer + `just up`/`build`) and unlocks the deploy overlay; `library` adds a tag-triggered release workflow (publish **disabled** until you wire the registry); `prototype` (default) adds nothing env-specific. `service` requires a language.
211
207
  - Deploy overlay (`--deploy none|cloud-run|fly|k8s|registry|custom`) — opt-in, **service only**. Container targets scaffold a build-once-**by-digest** `deploy.yml` (GitHub Environments: staging auto-deploys, production is **gated**) + a declarative `deploy/environments.yaml`, plus `setup_env_protection.sh` (server-side prod gate, tiered by profile) and `whats_deployed.sh`. `none` (default) = your platform (Vercel/Render/Fly/…) owns deploy.
212
208
  - Infrastructure-as-Code (`--iac none|opentofu`) — opt-in OpenTofu/HCL skeleton under `infra/` + a plan-on-PR workflow (apply is **manual / environment-gated**, never apply-on-merge). Emits structure only — no resources or credentials.
@@ -242,7 +238,7 @@ baseline branch protection (require CI green, require PR review, block
242
238
  force-push) — unprotected default branches undermine the workflow
243
239
  enforcement everything else sets up.
244
240
 
245
- Your answers are recorded in `.claude/config.yaml`. On the **first** scaffold into a project that already has files, your existing files are never clobbered: when a generated file (e.g. a hand-written `CLAUDE.md`) would differ, the new render is written alongside as a `<file>.new` sibling for you to merge, and the run prints which files were preserved. On a **re-run** (config already present) it refreshes the files project-init manages and never overwrites your `memory/` or `vault/` notes. With `--strict`, templates are rendered and validated in a temporary directory first, then the validated scaffold files are merged into the target; strict mode is not a whole-directory replacement.
241
+ Your answers are recorded in `.claude/config.yaml`. On the **first** scaffold into a project that already has files, your existing files are never clobbered: when a generated file (e.g. a hand-written `CLAUDE.md`) would differ, the new render is written alongside as a `<file>.new` sibling for you to merge, and the run prints which files were preserved. On a **re-run** (config already present) it refreshes the files project-init manages and never overwrites your `memory/` or `vault/` notes — and a managed file you have **edited** since the last scaffold (detected via the recorded content hashes) is protected the same way: your file stays, the fresh render lands as a `<file>.new` sibling. With `--strict`, templates are rendered and validated in a temporary directory first, then the validated scaffold files are merged into the target; strict mode is not a whole-directory replacement.
246
242
 
247
243
  ### Remote and web agent sessions
248
244
 
@@ -481,7 +477,7 @@ project-init/
481
477
 
482
478
  ## Status
483
479
 
484
- Actively developed and published to [PyPI](https://pypi.org/project/project-init/) (current release: v0.5.1). Contributions welcome — track and propose work in [GitHub Issues](https://github.com/VytCepas/project-init/issues), and use [GitHub Discussions](https://github.com/VytCepas/project-init/discussions) for questions, ideas, and feedback. Forks and pull requests are encouraged.
480
+ Actively developed and published to [PyPI](https://pypi.org/project/project-init/) (current release: v0.6.0). Contributions welcome — track and propose work in [GitHub Issues](https://github.com/VytCepas/project-init/issues), and use [GitHub Discussions](https://github.com/VytCepas/project-init/discussions) for questions, ideas, and feedback. Forks and pull requests are encouraged.
485
481
 
486
482
  ## License
487
483
 
@@ -175,7 +175,7 @@ uvx --from ~/.local/share/project-init project-init . \
175
175
  The wizard asks (interactive mode only):
176
176
 
177
177
  - Project name / description
178
- - Language (Python/Node/Go/none) — drives `lint_command`, `format_command`, `test_command`
178
+ - Language (Python/Node/Go/Rust/none) — drives `lint_command`, `format_command`, `test_command`
179
179
  - Delivery model (`--delivery library|service|prototype`) — how the project ships, driving its env/CI/release bundle (ADR-015). `service` adds the container **parity bundle** (Dockerfile + `compose.yaml` + devcontainer + `just up`/`build`) and unlocks the deploy overlay; `library` adds a tag-triggered release workflow (publish **disabled** until you wire the registry); `prototype` (default) adds nothing env-specific. `service` requires a language.
180
180
  - Deploy overlay (`--deploy none|cloud-run|fly|k8s|registry|custom`) — opt-in, **service only**. Container targets scaffold a build-once-**by-digest** `deploy.yml` (GitHub Environments: staging auto-deploys, production is **gated**) + a declarative `deploy/environments.yaml`, plus `setup_env_protection.sh` (server-side prod gate, tiered by profile) and `whats_deployed.sh`. `none` (default) = your platform (Vercel/Render/Fly/…) owns deploy.
181
181
  - Infrastructure-as-Code (`--iac none|opentofu`) — opt-in OpenTofu/HCL skeleton under `infra/` + a plan-on-PR workflow (apply is **manual / environment-gated**, never apply-on-merge). Emits structure only — no resources or credentials.
@@ -211,7 +211,7 @@ baseline branch protection (require CI green, require PR review, block
211
211
  force-push) — unprotected default branches undermine the workflow
212
212
  enforcement everything else sets up.
213
213
 
214
- Your answers are recorded in `.claude/config.yaml`. On the **first** scaffold into a project that already has files, your existing files are never clobbered: when a generated file (e.g. a hand-written `CLAUDE.md`) would differ, the new render is written alongside as a `<file>.new` sibling for you to merge, and the run prints which files were preserved. On a **re-run** (config already present) it refreshes the files project-init manages and never overwrites your `memory/` or `vault/` notes. With `--strict`, templates are rendered and validated in a temporary directory first, then the validated scaffold files are merged into the target; strict mode is not a whole-directory replacement.
214
+ Your answers are recorded in `.claude/config.yaml`. On the **first** scaffold into a project that already has files, your existing files are never clobbered: when a generated file (e.g. a hand-written `CLAUDE.md`) would differ, the new render is written alongside as a `<file>.new` sibling for you to merge, and the run prints which files were preserved. On a **re-run** (config already present) it refreshes the files project-init manages and never overwrites your `memory/` or `vault/` notes — and a managed file you have **edited** since the last scaffold (detected via the recorded content hashes) is protected the same way: your file stays, the fresh render lands as a `<file>.new` sibling. With `--strict`, templates are rendered and validated in a temporary directory first, then the validated scaffold files are merged into the target; strict mode is not a whole-directory replacement.
215
215
 
216
216
  ### Remote and web agent sessions
217
217
 
@@ -450,7 +450,7 @@ project-init/
450
450
 
451
451
  ## Status
452
452
 
453
- Actively developed and published to [PyPI](https://pypi.org/project/project-init/) (current release: v0.5.1). Contributions welcome — track and propose work in [GitHub Issues](https://github.com/VytCepas/project-init/issues), and use [GitHub Discussions](https://github.com/VytCepas/project-init/discussions) for questions, ideas, and feedback. Forks and pull requests are encouraged.
453
+ Actively developed and published to [PyPI](https://pypi.org/project/project-init/) (current release: v0.6.0). Contributions welcome — track and propose work in [GitHub Issues](https://github.com/VytCepas/project-init/issues), and use [GitHub Discussions](https://github.com/VytCepas/project-init/discussions) for questions, ideas, and feedback. Forks and pull requests are encouraged.
454
454
 
455
455
  ## License
456
456