agentbundle 0.17.1__tar.gz → 0.19.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 (161) hide show
  1. {agentbundle-0.17.1 → agentbundle-0.19.0}/PKG-INFO +4 -2
  2. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/adapter.toml +1 -1
  3. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/pack.schema.json +84 -48
  4. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/__init__.py +0 -1
  5. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/contract.py +1 -1
  6. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/lint_packs.py +4 -4
  7. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/main.py +4 -4
  8. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/self_host.py +5 -5
  9. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_claude_code.py +1 -1
  10. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_codex.py +1 -1
  11. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_copilot.py +1 -1
  12. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_cursor.py +1 -1
  13. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_gemini.py +1 -1
  14. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_kiro.py +1 -1
  15. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_kiro_alias.py +1 -1
  16. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_kiro_cli.py +1 -1
  17. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_kiro_ide.py +1 -1
  18. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_architect_design_reviewer_projection.py +1 -1
  19. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_contract.py +3 -3
  20. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_contract_scope.py +2 -2
  21. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_contract_v07.py +2 -2
  22. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_contract_v08.py +1 -1
  23. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_end_to_end_build.py +1 -1
  24. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_lint_agents_md_diataxis_block.py +7 -8
  25. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_lint_agents_md_legacy_block.py +2 -2
  26. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_lint_packs.py +4 -4
  27. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_pack_schema.py +4 -4
  28. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_pack_schema_install.py +1 -1
  29. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_pipeline.py +1 -1
  30. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_plugin_manifest_schema.py +3 -3
  31. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_projectable_subset.py +4 -4
  32. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_security.py +1 -1
  33. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_self_host_check.py +14 -14
  34. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_shared_prefix_contract.py +2 -2
  35. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_validate.py +1 -1
  36. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/config.py +1 -1
  37. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/diagnostics.py +4 -0
  38. agentbundle-0.19.0/agentbundle/catalogue_tooling/lint.py +1895 -0
  39. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/package.py +2 -2
  40. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/verify.py +362 -9
  41. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/cli.py +2 -2
  42. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/install.py +1 -1
  43. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/pack_evals.py +1 -1
  44. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/profile.py +2 -2
  45. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/validate.py +4 -4
  46. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/version.py +3 -3
  47. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle.egg-info/PKG-INFO +4 -2
  48. {agentbundle-0.17.1 → agentbundle-0.19.0}/pyproject.toml +6 -4
  49. agentbundle-0.17.1/agentbundle/catalogue_tooling/lint.py +0 -648
  50. {agentbundle-0.17.1 → agentbundle-0.19.0}/README.md +0 -0
  51. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/__init__.py +0 -0
  52. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/__main__.py +0 -0
  53. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/adapter.schema.json +0 -0
  54. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/catalogue.schema.json +0 -0
  55. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/install-defaults.toml +0 -0
  56. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/install-marker.py +0 -0
  57. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/plugin-manifest.derived.schema.json +0 -0
  58. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/plugin-manifest.schema.json +0 -0
  59. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/_data/profile.schema.json +0 -0
  60. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/__main__.py +0 -0
  61. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapter_root_bins.py +0 -0
  62. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/__init__.py +0 -0
  63. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/claude_code.py +0 -0
  64. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/codex.py +0 -0
  65. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/copilot.py +0 -0
  66. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/cursor.py +0 -0
  67. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/gemini.py +0 -0
  68. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/kiro.py +0 -0
  69. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/kiro_cli.py +0 -0
  70. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/adapters/kiro_ide.py +0 -0
  71. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/phase_order.py +0 -0
  72. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/__init__.py +0 -0
  73. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/codex_agent_toml.py +0 -0
  74. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/copilot_agent_md.py +0 -0
  75. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/copilot_hooks_json.py +0 -0
  76. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/direct_directory.py +0 -0
  77. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/gemini_command_toml.py +0 -0
  78. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/hook_id.py +0 -0
  79. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/kiro_ide_hook.py +0 -0
  80. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/merge_into_agent_json.py +0 -0
  81. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/merge_json.py +0 -0
  82. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/projections/user_merge_json.py +0 -0
  83. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/recipes/composite-agents-md.toml +0 -0
  84. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/recipes/composite-marketplace.toml +0 -0
  85. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/recipes/marketplace.toml +0 -0
  86. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/recipes/per-pack-apm-package.toml +0 -0
  87. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/recipes/per-pack-claude-plugin.toml +0 -0
  88. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/recipes/per-pack-overlay.toml +0 -0
  89. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/recipes/self-host.toml +0 -0
  90. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/scope_rails.py +0 -0
  91. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/shared_libs.py +0 -0
  92. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/target_resolver.py +0 -0
  93. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/__init__.py +0 -0
  94. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_adapter_root_bins_projection.py +0 -0
  95. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_architect_design_reviewer_rubric_parity.py +0 -0
  96. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_build_ships_seeds.py +0 -0
  97. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_direct_directory_cleanup.py +0 -0
  98. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_lint_agents_md_risk_block.py +0 -0
  99. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_load_pack_hook_wiring_safely.py +0 -0
  100. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_pack_schema_allowed_adapters.py +0 -0
  101. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_projections_merge_json.py +0 -0
  102. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_scope_rails.py +0 -0
  103. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_self_host_fixture_guard.py +0 -0
  104. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_self_host_recipe_config.py +0 -0
  105. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_shared_libs_projection.py +0 -0
  106. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_shipped_packs_v07_declarations.py +0 -0
  107. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_shipped_packs_v08_declarations.py +0 -0
  108. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_user_libs_projection.py +0 -0
  109. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/tests/test_writers_emit_lf.py +0 -0
  110. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/user_libs.py +0 -0
  111. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/build/validate.py +0 -0
  112. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue.py +0 -0
  113. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/__init__.py +0 -0
  114. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/archive.py +0 -0
  115. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/build.py +0 -0
  116. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/defaults.py +0 -0
  117. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/results.py +0 -0
  118. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/self_host.py +0 -0
  119. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/catalogue_tooling/skill_spec_lint.py +0 -0
  120. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/categories.py +0 -0
  121. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/__init__.py +0 -0
  122. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/_common.py +0 -0
  123. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/_drop_warning.py +0 -0
  124. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/adapt.py +0 -0
  125. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/catalogue_build.py +0 -0
  126. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/catalogue_lint.py +0 -0
  127. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/catalogue_package.py +0 -0
  128. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/catalogue_self_host.py +0 -0
  129. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/catalogue_sync_defaults.py +0 -0
  130. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/catalogue_tooling_stub.py +0 -0
  131. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/catalogue_verify.py +0 -0
  132. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/config.py +0 -0
  133. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/diff.py +0 -0
  134. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/init_state.py +0 -0
  135. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/list_installed.py +0 -0
  136. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/list_packs.py +0 -0
  137. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/list_profiles.py +0 -0
  138. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/list_targets.py +0 -0
  139. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/package_catalogue.py +0 -0
  140. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/reconcile.py +0 -0
  141. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/render.py +0 -0
  142. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/scaffold.py +0 -0
  143. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/show.py +0 -0
  144. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/uninstall.py +0 -0
  145. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/commands/upgrade.py +0 -0
  146. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/config.py +0 -0
  147. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/https_catalogue.py +0 -0
  148. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/pack_inventory.py +0 -0
  149. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/render.py +0 -0
  150. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/safety.py +0 -0
  151. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/scope.py +0 -0
  152. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/source_defaults.py +0 -0
  153. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/statelock.py +0 -0
  154. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle/user_config.py +0 -0
  155. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle.egg-info/SOURCES.txt +0 -0
  156. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle.egg-info/dependency_links.txt +0 -0
  157. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle.egg-info/entry_points.txt +0 -0
  158. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle.egg-info/requires.txt +0 -0
  159. {agentbundle-0.17.1 → agentbundle-0.19.0}/agentbundle.egg-info/top_level.txt +0 -0
  160. {agentbundle-0.17.1 → agentbundle-0.19.0}/setup.cfg +0 -0
  161. {agentbundle-0.17.1 → agentbundle-0.19.0}/tests/test_linear_primitive.py +0 -0
@@ -1,12 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbundle
3
- Version: 0.17.1
3
+ Version: 0.19.0
4
4
  Summary: npm for your coding agent. Install packs of skills, subagents, and hooks into any repo, for every major agent.
5
5
  Author-email: eugenelim <eugenelim@users.noreply.github.com>
6
6
  License: Apache-2.0 OR MIT
7
7
  Project-URL: Homepage, https://github.com/eugenelim/agent-ready-repo
8
8
  Project-URL: Source, https://github.com/eugenelim/agent-ready-repo
9
- Project-URL: Documentation, https://github.com/eugenelim/agent-ready-repo/blob/main/docs/guides/_shared/how-to/install-agentbundle-from-clone.md
9
+ Project-URL: Documentation, https://eugenelim.github.io/agent-ready-repo/docs/
10
+ Project-URL: Catalogue Format, https://eugenelim.github.io/agent-ready-repo/docs/reference/catalogue-format
11
+ Project-URL: Changelog, https://eugenelim.github.io/agent-ready-repo/docs/changelog
10
12
  Classifier: Development Status :: 4 - Beta
11
13
  Classifier: License :: OSI Approved :: Apache Software License
12
14
  Classifier: License :: OSI Approved :: MIT License
@@ -11,7 +11,7 @@
11
11
  # table; v0.7).
12
12
  # RFC-0013 / docs/specs/credential-broker-contract (governance bump, v0.7 —
13
13
  # admitted as a co-residing v0.7 contributor; the `metadata.auth` lint
14
- # surface lives in tools/lint-agent-artifacts.py, not in this file).
14
+ # surface lives in verify.py (_step_agent_artifacts), not in this file).
15
15
  # docs/specs/dropped-primitives-coverage (v0.8): codex `agent` projects to
16
16
  # `.codex/agents/<name>.toml` via new `codex-agent-toml` mode; codex
17
17
  # `hook-wiring` projects to `.codex/hooks.json` via existing `merge-json`
@@ -1,9 +1,15 @@
1
1
  {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "pack.schema.json",
4
+ "title": "PackConfig",
5
+ "description": "JSON Schema for pack.toml — pack metadata and adapter-contract configuration.",
2
6
  "type": "object",
7
+ "additionalProperties": false,
3
8
  "required": ["pack"],
4
9
  "properties": {
5
10
  "pack": {
6
11
  "type": "object",
12
+ "additionalProperties": false,
7
13
  "required": ["name", "version"],
8
14
  "properties": {
9
15
  "name": {"type": "string"},
@@ -13,6 +19,7 @@
13
19
  "display_name": {"type": "string"},
14
20
  "license": {"type": "string"},
15
21
  "catalogue": {"type": "string"},
22
+ "lint-seeds": {"type": "boolean"},
16
23
  "categories": {
17
24
  "type": "array",
18
25
  "items": {"type": "string"},
@@ -27,6 +34,7 @@
27
34
  "type": "array",
28
35
  "items": {
29
36
  "type": "object",
37
+ "additionalProperties": false,
30
38
  "required": ["name"],
31
39
  "properties": {
32
40
  "name": {"type": "string"},
@@ -37,6 +45,7 @@
37
45
  },
38
46
  "links": {
39
47
  "type": "object",
48
+ "additionalProperties": false,
40
49
  "properties": {
41
50
  "homepage": {"type": "string"},
42
51
  "repository": {"type": "string"},
@@ -46,24 +55,77 @@
46
55
  "icon": {"type": "string"}
47
56
  }
48
57
  },
49
- "metadata": {"type": "object"},
58
+ "metadata": {
59
+ "type": "object",
60
+ "description": "Open extension table — additionalProperties intentionally unrestricted."
61
+ },
50
62
  "adapter-contract": {
51
63
  "type": "object",
64
+ "additionalProperties": false,
52
65
  "properties": {
53
66
  "version": {"type": "string"}
54
67
  }
55
68
  },
69
+ "install": {
70
+ "type": "object",
71
+ "additionalProperties": false,
72
+ "required": ["default-scope"],
73
+ "properties": {
74
+ "default-scope": {"enum": ["repo", "user"]},
75
+ "allowed-scopes": {
76
+ "type": "array",
77
+ "minItems": 1,
78
+ "items": {"enum": ["repo", "user"]}
79
+ },
80
+ "user-scope-hooks": {"type": "boolean"},
81
+ "allowed-adapters": {
82
+ "type": "array",
83
+ "minItems": 1,
84
+ "uniqueItems": true,
85
+ "items": {"type": "string"}
86
+ }
87
+ },
88
+ "if": {
89
+ "properties": {"default-scope": {"enum": ["user"]}},
90
+ "required": ["default-scope"]
91
+ },
92
+ "then": {
93
+ "properties": {
94
+ "allowed-scopes": {"contains": {"enum": ["user"]}}
95
+ }
96
+ },
97
+ "else": {
98
+ "properties": {
99
+ "allowed-scopes": {"contains": {"enum": ["repo"]}}
100
+ }
101
+ }
102
+ },
103
+ "evals": {
104
+ "type": "object",
105
+ "additionalProperties": false,
106
+ "description": "Tier-A activation eval coverage — lists every user-triggered skill that ships evals/eval_queries.json.",
107
+ "properties": {
108
+ "skills": {
109
+ "type": "array",
110
+ "items": {"type": "string"},
111
+ "uniqueItems": true
112
+ }
113
+ }
114
+ },
56
115
  "recipes": {
57
116
  "type": "array",
117
+ "description": "Named catalogue recipes this pack participates in.",
58
118
  "items": {"type": "string"}
59
119
  },
60
120
  "dependencies": {
61
121
  "type": "object",
122
+ "additionalProperties": false,
62
123
  "properties": {
63
124
  "required": {
64
125
  "type": "array",
65
126
  "items": {
66
127
  "type": "object",
128
+ "additionalProperties": false,
67
129
  "required": ["catalogue", "pack", "version"],
68
130
  "properties": {
69
131
  "catalogue": {"type": "string"},
@@ -76,6 +138,7 @@
76
138
  "type": "array",
77
139
  "items": {
78
140
  "type": "object",
141
+ "additionalProperties": false,
79
142
  "required": ["catalogue", "pack", "version"],
80
143
  "properties": {
81
144
  "catalogue": {"type": "string"},
@@ -88,6 +151,7 @@
88
151
  "type": "array",
89
152
  "items": {
90
153
  "type": "object",
154
+ "additionalProperties": false,
91
155
  "required": ["catalogue", "pack", "version"],
92
156
  "properties": {
93
157
  "catalogue": {"type": "string"},
@@ -100,12 +164,14 @@
100
164
  },
101
165
  "adaptation": {
102
166
  "type": "object",
167
+ "additionalProperties": false,
103
168
  "properties": {
104
169
  "infer-from": {"type": "string"},
105
170
  "substitutions": {
106
171
  "type": "array",
107
172
  "items": {
108
173
  "type": "object",
174
+ "additionalProperties": false,
109
175
  "properties": {
110
176
  "marker": {"type": "string"},
111
177
  "infer-from": {"type": "string"}
@@ -116,6 +182,7 @@
116
182
  "type": "array",
117
183
  "items": {
118
184
  "type": "object",
185
+ "additionalProperties": false,
119
186
  "properties": {
120
187
  "target": {"type": "string"},
121
188
  "section-marker": {"type": "string"},
@@ -134,26 +201,31 @@
134
201
  },
135
202
  "layout": {
136
203
  "type": "object",
204
+ "additionalProperties": false,
137
205
  "properties": {
138
206
  "repo": {
139
207
  "type": "object",
208
+ "additionalProperties": false,
140
209
  "properties": {
141
210
  "parent": {"type": "string"},
142
- "template": {"type": "string"}
211
+ "template": {"type": "string"},
212
+ "output_dir": {"type": "string"}
143
213
  }
144
214
  },
145
215
  "user": {
146
216
  "type": "object",
217
+ "additionalProperties": false,
147
218
  "properties": {
148
219
  "parent": {"type": "string"},
149
- "template": {"type": "string"}
220
+ "template": {"type": "string"},
221
+ "output_dir": {"type": "string"}
150
222
  }
151
223
  }
152
224
  }
153
225
  },
154
226
  "first-value": {
155
227
  "type": "object",
156
- "description": "Pack first-value contract (RFC-0064 Amendment #4). Level A required for all packs; Level B required when level-b = true.",
228
+ "additionalProperties": false,
157
229
  "properties": {
158
230
  "audience-posture": {"type": "string", "enum": ["non-technical", "mixed", "technical"]},
159
231
  "surfaces": {"type": "array", "items": {"type": "string"}},
@@ -168,61 +240,25 @@
168
240
  "tutorial": {"type": "string"},
169
241
  "writes-to-repo": {"type": "boolean"},
170
242
  "safety-gate": {"type": "string"}
171
- },
172
- "additionalProperties": false
243
+ }
173
244
  }
174
245
  },
175
246
  "if": {
247
+ "required": ["adapter-contract"],
176
248
  "properties": {
177
249
  "adapter-contract": {
178
250
  "type": "object",
179
- "properties": {"version": {"enum": ["0.2", "0.3", "0.6"]}},
180
- "required": ["version"]
181
- }
182
- },
183
- "required": ["adapter-contract"]
184
- },
185
- "then": {
186
- "required": ["install"],
187
- "properties": {
188
- "install": {
189
- "type": "object",
190
- "required": ["default-scope"],
251
+ "required": ["version"],
191
252
  "properties": {
192
- "default-scope": {"enum": ["repo", "user"]},
193
- "allowed-scopes": {
194
- "type": "array",
195
- "minItems": 1,
196
- "items": {"enum": ["repo", "user"]}
197
- },
198
- "user-scope-hooks": {"type": "boolean"},
199
- "allowed-adapters": {
200
- "type": "array",
201
- "minItems": 1,
202
- "uniqueItems": true,
203
- "items": {"type": "string"}
204
- }
205
- },
206
- "if": {
207
- "properties": {"default-scope": {"enum": ["user"]}},
208
- "required": ["default-scope"]
209
- },
210
- "then": {
211
- "properties": {
212
- "allowed-scopes": {
213
- "contains": {"enum": ["user"]}
214
- }
215
- }
216
- },
217
- "else": {
218
- "properties": {
219
- "allowed-scopes": {
220
- "contains": {"enum": ["repo"]}
221
- }
253
+ "version": {
254
+ "pattern": "^0\\.([2-9]|[1-9][0-9])|^[1-9]"
222
255
  }
223
256
  }
224
257
  }
225
258
  }
259
+ },
260
+ "then": {
261
+ "required": ["install"]
226
262
  }
227
263
  }
228
264
  }
@@ -44,7 +44,6 @@ def _cmd_validate(args: argparse.Namespace) -> int:
44
44
 
45
45
  schema_path = (
46
46
  Path(__file__).resolve().parent.parent.parent.parent.parent
47
- / "docs"
48
47
  / "contracts"
49
48
  / "adapter.schema.json"
50
49
  )
@@ -1,6 +1,6 @@
1
1
  """Contract loader.
2
2
 
3
- Reads `docs/contracts/adapter.toml` via `tomllib` and
3
+ Reads `contracts/adapter.toml` via `tomllib` and
4
4
  returns a dict. No validation logic — `validate.py` does that, and
5
5
  the CLI's `validate` subcommand wires the two together.
6
6
 
@@ -18,7 +18,7 @@ Three checks, applied to every pack under a `--packs-dir`:
18
18
  exceed the strictest `description-max-length`. Multi-line YAML
19
19
  descriptions (`>`, `|`, continuation lines) are refused outright
20
20
  rather than mis-parsed. Constraints come from
21
- `docs/contracts/target-vocab.toml` — see
21
+ `contracts/target-vocab.toml` — see
22
22
  `docs/specs/lint-packs-target-vocab/spec.md`.
23
23
 
24
24
  The lint is Python-only so it runs on every CI platform without
@@ -48,7 +48,7 @@ _PACK_SUBTREES = ("seeds", ".apm")
48
48
  # Path to the sibling vocab file, relative to a repo root. The loader
49
49
  # walks up from a caller-supplied start until an ancestor contains
50
50
  # this relative path.
51
- _VOCAB_RELPATH = Path("docs/contracts/target-vocab.toml")
51
+ _VOCAB_RELPATH = Path("contracts/target-vocab.toml")
52
52
 
53
53
  # Sentinel returned by `_extract_frontmatter_fields` when a key's
54
54
  # value position is `>`, `|`, or empty (signaling a folded / nested
@@ -58,7 +58,7 @@ _MULTILINE = object()
58
58
 
59
59
 
60
60
  class Constraints(NamedTuple):
61
- """Strictest-cap snapshot of `docs/contracts/target-vocab.toml`.
61
+ """Strictest-cap snapshot of `contracts/target-vocab.toml`.
62
62
 
63
63
  `binding_targets` keys (`"description_max"`, `"name_max"`,
64
64
  `"name_pattern"`) carry the ASCII-sorted list of targets enforcing
@@ -84,7 +84,7 @@ def _walk_up_for_vocab(start: Path) -> Path | None:
84
84
 
85
85
 
86
86
  def _load_target_vocab(start: Path) -> tuple[dict | None, str | None]:
87
- """Walk up from `start` looking for `docs/contracts/target-vocab.toml`;
87
+ """Walk up from `start` looking for `contracts/target-vocab.toml`;
88
88
  fall back to walking up from this module's own ancestor chain when
89
89
  the explicit walk fails. This keeps the gate working when an
90
90
  adopter points `--packs-dir` at a tmp tree outside the repo while
@@ -53,7 +53,7 @@ _GITHUB_URL_RE = re.compile(
53
53
 
54
54
  def _bundled_or_repo(name: str) -> Path:
55
55
  """Locate a data file shipped under both `agentbundle/_data/` and
56
- `<repo>/docs/contracts/`.
56
+ `<repo>/contracts/`.
57
57
 
58
58
  Prefer the bundled copy when present on disk (works in a `pip install`
59
59
  and a dev checkout); fall back to the repo path for dev checkouts
@@ -64,7 +64,7 @@ def _bundled_or_repo(name: str) -> Path:
64
64
  bundled = PACKAGE_ROOT.parent / "_data" / name
65
65
  if bundled.exists():
66
66
  return bundled
67
- return REPO_ROOT / "docs" / "contracts" / name
67
+ return REPO_ROOT / "contracts" / name
68
68
 
69
69
 
70
70
  def _read_bundled(name: str) -> str:
@@ -73,7 +73,7 @@ def _read_bundled(name: str) -> str:
73
73
  Resolution order:
74
74
  1. `<package>/_data/<name>` via `importlib.resources` — works for
75
75
  filesystem installs AND inside a `zipapp` archive.
76
- 2. `<repo>/docs/contracts/<name>` — dev fallback for source trees
76
+ 2. `<repo>/contracts/<name>` — dev fallback for source trees
77
77
  whose `_data/` hasn't been populated.
78
78
  """
79
79
  try:
@@ -84,7 +84,7 @@ def _read_bundled(name: str) -> str:
84
84
  return resource.read_text(encoding="utf-8")
85
85
  except (FileNotFoundError, ModuleNotFoundError):
86
86
  pass
87
- return (REPO_ROOT / "docs" / "contracts" / name).read_text(encoding="utf-8")
87
+ return (REPO_ROOT / "contracts" / name).read_text(encoding="utf-8")
88
88
 
89
89
 
90
90
  CONTRACT_PATH = _bundled_or_repo("adapter.toml")
@@ -357,11 +357,11 @@ EXCLUDED_PATTERNS: tuple[str, ...] = (
357
357
  "docs/specs/*/plan.md",
358
358
  "docs/specs/*/state.json",
359
359
  "docs/specs/*/notes/**",
360
- "docs/contracts/**",
360
+ "contracts/**",
361
361
  "docs/architecture/*.md",
362
362
  "docs/product/*.md",
363
363
  "docs/knowledge/*.md",
364
- "docs/guides/**/*.md",
364
+ "guides/**/*.md",
365
365
  # Seeded-once / adopter-curated files (RFC-0002 Manual semantics).
366
366
  "workspace.toml", # RFC-0069: seeded once; adopter-curated thereafter
367
367
  # Manual seed-projected paths (RFC-0002 amendment 2026-05-25). The
@@ -445,7 +445,7 @@ _EXCLUDED_REGEXES: tuple[re.Pattern[str], ...] = tuple(
445
445
  # → Manual; this allow-list shrank to one entry (`docs/CONVENTIONS.md`)
446
446
  # accordingly. The reclassified paths now fall through to
447
447
  # EXCLUDED_PATTERNS coverage (`docs/architecture/*.md`,
448
- # `docs/product/*.md`, `docs/knowledge/*.md`, `docs/guides/**/*.md`,
448
+ # `docs/product/*.md`, `docs/knowledge/*.md`, `guides/**/*.md`,
449
449
  # and the 8 explicit additions listed above). See RFC-0002 §
450
450
  # Amendments § 2026-05-25.
451
451
  PROJECTED_README_OVERRIDES: tuple[str, ...] = (
@@ -538,8 +538,8 @@ def _project_seeds(packs_dir: Path, output_root: Path) -> dict[Path, Path]:
538
538
  # by-quadrant guide tree here: the seed stays by-quadrant for
539
539
  # adopters, but writing it during self-host litters a repo that
540
540
  # owns its guides (e.g. organized by pack) with untracked
541
- # `docs/guides/<quadrant>/README.md` on every build-self run.
542
- if relative.as_posix().startswith("docs/guides/"):
541
+ # `guides/<quadrant>/README.md` on every build-self run.
542
+ if relative.as_posix().startswith("guides/"):
543
543
  continue
544
544
  if _is_excluded(relative) and (output_root / relative).exists():
545
545
  # Manual file on disk — leave it alone. The seed is
@@ -11,7 +11,7 @@ from agentbundle.build.adapters.claude_code import project, project_packs
11
11
  from agentbundle.build.contract import load as load_contract
12
12
 
13
13
  REPO_ROOT = Path(__file__).resolve().parents[5]
14
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
14
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
15
15
 
16
16
 
17
17
  def _seed_pack(root: Path) -> Path:
@@ -19,7 +19,7 @@ from agentbundle.build.adapters.codex import (
19
19
  from agentbundle.build.contract import load as load_contract
20
20
 
21
21
  REPO_ROOT = Path(__file__).resolve().parents[5]
22
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
22
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
23
23
 
24
24
 
25
25
  def _seed_pack(root: Path, name: str = "pack", skill_prefix: str = "") -> Path:
@@ -10,7 +10,7 @@ from agentbundle.build.adapters.copilot import project
10
10
  from agentbundle.build.contract import load as load_contract
11
11
 
12
12
  REPO_ROOT = Path(__file__).resolve().parents[5]
13
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
13
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
14
14
 
15
15
 
16
16
  def _seed_pack(root: Path) -> Path:
@@ -21,7 +21,7 @@ from agentbundle.build.contract import load as load_contract
21
21
  from agentbundle.scope import contract_version_at_least
22
22
 
23
23
  REPO_ROOT = Path(__file__).resolve().parents[5]
24
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
24
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
25
25
 
26
26
 
27
27
  def _seed_agent(pack: Path, name: str, *, tools: str | None, model: str | None = None) -> None:
@@ -25,7 +25,7 @@ from agentbundle.build.projections.gemini_command_toml import (
25
25
  )
26
26
 
27
27
  REPO_ROOT = Path(__file__).resolve().parents[5]
28
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
28
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
29
29
 
30
30
  _COMMAND_RULE = {"target-path": ".gemini/commands/"}
31
31
 
@@ -13,7 +13,7 @@ from agentbundle.build.adapters.kiro import project, project_packs
13
13
  from agentbundle.build.contract import load as load_contract
14
14
 
15
15
  REPO_ROOT = Path(__file__).resolve().parents[5]
16
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
16
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
17
17
 
18
18
 
19
19
  def _seed_pack(root: Path) -> Path:
@@ -17,7 +17,7 @@ from agentbundle.build.adapters import ADAPTERS, kiro_ide
17
17
  from agentbundle.build.contract import load as load_contract
18
18
 
19
19
  REPO_ROOT = Path(__file__).resolve().parents[5]
20
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
20
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
21
21
 
22
22
 
23
23
  def _seed_pack(root: Path) -> Path:
@@ -17,7 +17,7 @@ from agentbundle.build.adapters.kiro_cli import project
17
17
  from agentbundle.build.contract import load as load_contract
18
18
 
19
19
  REPO_ROOT = Path(__file__).resolve().parents[5]
20
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
20
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
21
21
 
22
22
 
23
23
  def _seed_agent_pack(root: Path, tools: str = "Read, Grep, Glob, Bash") -> Path:
@@ -16,7 +16,7 @@ from agentbundle.build.adapters.kiro_ide import project
16
16
  from agentbundle.build.contract import load as load_contract
17
17
 
18
18
  REPO_ROOT = Path(__file__).resolve().parents[5]
19
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
19
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
20
20
 
21
21
 
22
22
  def _seed_agent_pack(root: Path, tools: str = "Read, Grep", model: str | None = None) -> Path:
@@ -23,7 +23,7 @@ from agentbundle.build.adapters import ADAPTERS
23
23
  from agentbundle.build.contract import load as load_contract
24
24
 
25
25
  REPO_ROOT = Path(__file__).resolve().parents[5]
26
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
26
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
27
27
  ARCHITECT_PACK = REPO_ROOT / "packs" / "architect"
28
28
  AGENT_NAME = "design-reviewer"
29
29
 
@@ -27,8 +27,8 @@ import unittest
27
27
  from pathlib import Path
28
28
 
29
29
  REPO_ROOT = Path(__file__).resolve().parents[5]
30
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
31
- SCHEMA_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.schema.json"
30
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
31
+ SCHEMA_PATH = REPO_ROOT / "contracts" / "adapter.schema.json"
32
32
 
33
33
  # All seven RFC-0001 projection modes.
34
34
  SEVEN_RFC_MODES = {
@@ -584,7 +584,7 @@ class TestCodexSkillDirectDirectory(unittest.TestCase):
584
584
  AC1: Codex `skill` is `direct-directory` projecting to
585
585
  `.agents/skills/` with `on-conflict = "prompt-then-preserve"`;
586
586
  no managed-block delimiter keys remain on the entry.
587
- AC2: `docs/contracts/adapter.toml` and the bundled `_data/adapter.toml`
587
+ AC2: `contracts/adapter.toml` and the bundled `_data/adapter.toml`
588
588
  are byte-identical.
589
589
  AC15: The seed AGENTS.md no longer carries the legacy delimiter pair.
590
590
  """
@@ -20,8 +20,8 @@ import unittest
20
20
  from pathlib import Path
21
21
 
22
22
  REPO_ROOT = Path(__file__).resolve().parents[5]
23
- CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
24
- SCHEMA_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.schema.json"
23
+ CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
24
+ SCHEMA_PATH = REPO_ROOT / "contracts" / "adapter.schema.json"
25
25
 
26
26
 
27
27
  def _load_schema() -> dict:
@@ -5,7 +5,7 @@ Verifies the T1 edits landed:
5
5
 
6
6
  - ``[contract] version == "0.7"`` in both the runtime data file
7
7
  (`_data/adapter.toml`) and the docs mirror
8
- (`docs/contracts/adapter.toml`). The two files must stay byte-
8
+ (`contracts/adapter.toml`). The two files must stay byte-
9
9
  aligned per the v0.3-schema sync test; this module pins the
10
10
  version on both as belt-and-braces (AC1 for both RFCs).
11
11
  - **RFC-0012 surface:**
@@ -39,7 +39,7 @@ REPO_ROOT = Path(__file__).resolve().parents[5]
39
39
  DATA_CONTRACT_PATH = (
40
40
  REPO_ROOT / "packages" / "agentbundle" / "agentbundle" / "_data" / "adapter.toml"
41
41
  )
42
- DOCS_CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
42
+ DOCS_CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
43
43
  DATA_SCHEMA_PATH = (
44
44
  REPO_ROOT
45
45
  / "packages"
@@ -35,7 +35,7 @@ REPO_ROOT = Path(__file__).resolve().parents[5]
35
35
  DATA_CONTRACT_PATH = (
36
36
  REPO_ROOT / "packages" / "agentbundle" / "agentbundle" / "_data" / "adapter.toml"
37
37
  )
38
- DOCS_CONTRACT_PATH = REPO_ROOT / "docs" / "contracts" / "adapter.toml"
38
+ DOCS_CONTRACT_PATH = REPO_ROOT / "contracts" / "adapter.toml"
39
39
  DATA_SCHEMA_PATH = (
40
40
  REPO_ROOT
41
41
  / "packages"
@@ -139,7 +139,7 @@ class CheckCommandTests(unittest.TestCase):
139
139
  from agentbundle.build.self_host import run_self_host
140
140
 
141
141
  contract = load_contract(
142
- REPO_ROOT / "docs" / "contracts" / "adapter.toml"
142
+ REPO_ROOT / "contracts" / "adapter.toml"
143
143
  )
144
144
  # Pre-seed using the self-host runner so the working
145
145
  # tree exactly matches what `make build-check` will render
@@ -1,8 +1,8 @@
1
1
  """`tools/lint-agents-md.py` check #8 — the Diátaxis-structure block.
2
2
 
3
3
  After the per-pack guide migration (ADR-0020) the four Diátaxis quadrant
4
- directories may live either at the top level (`docs/guides/<quadrant>/`, the
5
- by-quadrant scaffold an adopter installs) or under `docs/guides/_shared/`
4
+ directories may live either at the top level (`guides/<quadrant>/`, the
5
+ by-quadrant scaffold an adopter installs) or under `guides/_shared/`
6
6
  (the per-pack layout this catalogue uses). The check passes in *either*
7
7
  layout and fails only when a quadrant name resolves to neither.
8
8
 
@@ -36,8 +36,7 @@ _MISSING_SUBSTR = "is missing Diátaxis subdirectories"
36
36
  def _seed_common(root: Path) -> None:
37
37
  (root / "AGENTS.md").write_text("# AGENTS.md\n", encoding="utf-8")
38
38
  (root / "CLAUDE.md").symlink_to("AGENTS.md")
39
- (root / "docs").mkdir(parents=True, exist_ok=True)
40
- (root / "docs" / "guides").mkdir(parents=True, exist_ok=True)
39
+ (root / "guides").mkdir(parents=True, exist_ok=True)
41
40
 
42
41
 
43
42
  def _make_quadrants(base: Path) -> None:
@@ -63,7 +62,7 @@ class DiataxisBlockTests(unittest.TestCase):
63
62
  with tempfile.TemporaryDirectory() as tmp:
64
63
  root = Path(tmp)
65
64
  _seed_common(root)
66
- _make_quadrants(root / "docs" / "guides")
65
+ _make_quadrants(root / "guides")
67
66
  result = _run_linter(root)
68
67
  self.assertIn(_OK_SUBSTR, result.stdout)
69
68
  self.assertNotIn(_MISSING_SUBSTR, result.stderr)
@@ -72,9 +71,9 @@ class DiataxisBlockTests(unittest.TestCase):
72
71
  with tempfile.TemporaryDirectory() as tmp:
73
72
  root = Path(tmp)
74
73
  _seed_common(root)
75
- _make_quadrants(root / "docs" / "guides" / "_shared")
74
+ _make_quadrants(root / "guides" / "_shared")
76
75
  # A representative pack home, no top-level quadrant dirs.
77
- (root / "docs" / "guides" / "core" / "how-to").mkdir(parents=True)
76
+ (root / "guides" / "core" / "how-to").mkdir(parents=True)
78
77
  result = _run_linter(root)
79
78
  self.assertIn(_OK_SUBSTR, result.stdout)
80
79
  self.assertNotIn(_MISSING_SUBSTR, result.stderr)
@@ -83,7 +82,7 @@ class DiataxisBlockTests(unittest.TestCase):
83
82
  with tempfile.TemporaryDirectory() as tmp:
84
83
  root = Path(tmp)
85
84
  _seed_common(root)
86
- # docs/guides/ exists but carries no quadrant dirs in either spot.
85
+ # guides/ exists but carries no quadrant dirs in either spot.
87
86
  result = _run_linter(root)
88
87
  self.assertIn(_MISSING_SUBSTR, result.stderr)
89
88
  for q in QUADRANTS: