specsmith 0.11.7.dev462__tar.gz → 0.11.8__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 (287) hide show
  1. {specsmith-0.11.7.dev462/src/specsmith.egg-info → specsmith-0.11.8}/PKG-INFO +38 -1
  2. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/README.md +37 -0
  3. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/pyproject.toml +1 -1
  4. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/__init__.py +1 -1
  5. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/auditor.py +46 -6
  6. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/cli.py +20 -4
  7. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/config.py +1 -1
  8. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/phase.py +2 -2
  9. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/__init__.py +26 -14
  10. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/governance.py +166 -0
  11. specsmith-0.11.8/src/specsmith/skills/specsmith_skills.py +267 -0
  12. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/sync.py +12 -0
  13. {specsmith-0.11.7.dev462 → specsmith-0.11.8/src/specsmith.egg-info}/PKG-INFO +38 -1
  14. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith.egg-info/SOURCES.txt +2 -0
  15. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_auditor.py +105 -0
  16. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_cli.py +2 -2
  17. specsmith-0.11.8/tests/test_req_358_359.py +101 -0
  18. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_skill_marketplace.py +49 -6
  19. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/LICENSE +0 -0
  20. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/setup.cfg +0 -0
  21. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/__init__.py +0 -0
  22. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/belief.py +0 -0
  23. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/certainty.py +0 -0
  24. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/failure_graph.py +0 -0
  25. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/py.typed +0 -0
  26. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/recovery.py +0 -0
  27. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/session.py +0 -0
  28. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/stress_tester.py +0 -0
  29. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/epistemic/trace.py +0 -0
  30. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/__main__.py +0 -0
  31. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/__init__.py +0 -0
  32. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/broker.py +0 -0
  33. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/chat_runner.py +0 -0
  34. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/cleanup.py +0 -0
  35. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/context_seed.py +0 -0
  36. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/core.py +0 -0
  37. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/dispatch/__init__.py +0 -0
  38. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/dispatch/_status.py +0 -0
  39. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/dispatch/dag.py +0 -0
  40. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/dispatch/dispatcher.py +0 -0
  41. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/dispatch/events.py +0 -0
  42. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/dispatch/result.py +0 -0
  43. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/endpoints.py +0 -0
  44. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/events.py +0 -0
  45. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/execution_profiles.py +0 -0
  46. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/fallback.py +0 -0
  47. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/hf_leaderboard.py +0 -0
  48. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/hf_sync.py +0 -0
  49. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/indexer.py +0 -0
  50. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/llm_client.py +0 -0
  51. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/mcp.py +0 -0
  52. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/memory.py +0 -0
  53. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/model_intelligence.py +0 -0
  54. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/model_profiles.py +0 -0
  55. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/orchestrator.py +0 -0
  56. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/permissions.py +0 -0
  57. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/profiles.py +0 -0
  58. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/provider_registry.py +0 -0
  59. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/repl.py +0 -0
  60. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/router.py +0 -0
  61. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/rules.py +0 -0
  62. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/runner.py +0 -0
  63. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/safety.py +0 -0
  64. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/spawner.py +0 -0
  65. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/suggester.py +0 -0
  66. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/teams.py +0 -0
  67. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/tools.py +0 -0
  68. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/verifier.py +0 -0
  69. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/agent/voice.py +0 -0
  70. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/architect.py +0 -0
  71. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/auth.py +0 -0
  72. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/block_export.py +0 -0
  73. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/channel.py +0 -0
  74. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/ci_manager.py +0 -0
  75. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/commands/__init__.py +0 -0
  76. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/commands/intelligence.py +0 -0
  77. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/compliance/__init__.py +0 -0
  78. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/compliance/_compat.py +0 -0
  79. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/compliance/checker.py +0 -0
  80. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/compliance/evidence.py +0 -0
  81. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/compliance/regulations.py +0 -0
  82. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/compliance/reporter.py +0 -0
  83. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/compressor.py +0 -0
  84. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/console_utils.py +0 -0
  85. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/context_orchestrator.py +0 -0
  86. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/context_window.py +0 -0
  87. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/credit_analyzer.py +0 -0
  88. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/credits.py +0 -0
  89. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/__init__.py +0 -0
  90. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/base.py +0 -0
  91. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/citations.py +0 -0
  92. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/fpd.py +0 -0
  93. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/odp.py +0 -0
  94. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/patentsview.py +0 -0
  95. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/pfw.py +0 -0
  96. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/ppubs.py +0 -0
  97. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/datasources/ptab.py +0 -0
  98. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/differ.py +0 -0
  99. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/doctor.py +0 -0
  100. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/drive.py +0 -0
  101. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/editor.py +0 -0
  102. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/epistemic/__init__.py +0 -0
  103. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/epistemic/belief.py +0 -0
  104. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/epistemic/certainty.py +0 -0
  105. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/epistemic/failure_graph.py +0 -0
  106. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/epistemic/recovery.py +0 -0
  107. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/epistemic/stress_tester.py +0 -0
  108. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/esdb/__init__.py +0 -0
  109. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/esdb/bridge.py +0 -0
  110. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/eval/__init__.py +0 -0
  111. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/eval/builtins.py +0 -0
  112. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/eval/runner.py +0 -0
  113. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/executor.py +0 -0
  114. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/exporter.py +0 -0
  115. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/governance_logic.py +0 -0
  116. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/governance_store.py +0 -0
  117. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/governance_yaml.py +0 -0
  118. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/__init__.py +0 -0
  119. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/app.py +0 -0
  120. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/main_window.py +0 -0
  121. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/session_tab.py +0 -0
  122. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/theme.py +0 -0
  123. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/widgets/__init__.py +0 -0
  124. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/widgets/chat_view.py +0 -0
  125. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/widgets/input_bar.py +0 -0
  126. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/widgets/provider_bar.py +0 -0
  127. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/widgets/token_meter.py +0 -0
  128. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/widgets/tool_panel.py +0 -0
  129. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/widgets/update_checker.py +0 -0
  130. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/gui/worker.py +0 -0
  131. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/history_search.py +0 -0
  132. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/importer.py +0 -0
  133. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/instinct.py +0 -0
  134. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/__init__.py +0 -0
  135. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/agent_skill.py +0 -0
  136. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/aider.py +0 -0
  137. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/base.py +0 -0
  138. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/claude_code.py +0 -0
  139. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/codity.py +0 -0
  140. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/copilot.py +0 -0
  141. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/cursor.py +0 -0
  142. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/gemini.py +0 -0
  143. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/integrations/windsurf.py +0 -0
  144. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/issue_reporter.py +0 -0
  145. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/languages.py +0 -0
  146. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/ledger.py +0 -0
  147. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/mcp_generator.py +0 -0
  148. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/__init__.py +0 -0
  149. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/m001_governance_yaml.py +0 -0
  150. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/m002_agents_slim.py +0 -0
  151. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/m003_compliance_init.py +0 -0
  152. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/m004_ledger_esdb.py +0 -0
  153. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/m005_agent_run_tool.py +0 -0
  154. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/m006_session_governance.py +0 -0
  155. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/migrations/runner.py +0 -0
  156. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/ollama_cmds.py +0 -0
  157. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/patent.py +0 -0
  158. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/paths.py +0 -0
  159. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/plugins.py +0 -0
  160. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/profiles.py +0 -0
  161. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/rate_limits.py +0 -0
  162. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/releaser.py +0 -0
  163. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/requirements.py +0 -0
  164. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/requirements_parser.py +0 -0
  165. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/retrieval.py +0 -0
  166. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/safe_write.py +0 -0
  167. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/scaffolder.py +0 -0
  168. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/serve.py +0 -0
  169. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/session.py +0 -0
  170. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/session_init.py +0 -0
  171. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/session_store.py +0 -0
  172. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/cloud.py +0 -0
  173. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/corporate.py +0 -0
  174. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/cross_platform.py +0 -0
  175. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/devops.py +0 -0
  176. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/docs.py +0 -0
  177. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/embedded.py +0 -0
  178. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/hardware.py +0 -0
  179. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/mobile.py +0 -0
  180. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/productivity.py +0 -0
  181. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills/ssh.py +0 -0
  182. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/skills_builder.py +0 -0
  183. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/agents.md.j2 +0 -0
  184. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/bug_report.md.j2 +0 -0
  185. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/code_of_conduct.md.j2 +0 -0
  186. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/contributing.md.j2 +0 -0
  187. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/feature_request.md.j2 +0 -0
  188. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/license-Apache-2.0.j2 +0 -0
  189. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/license-MIT.j2 +0 -0
  190. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/pull_request_template.md.j2 +0 -0
  191. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/community/security.md.j2 +0 -0
  192. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/docs/architecture.md.j2 +0 -0
  193. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/docs/mkdocs.yml.j2 +0 -0
  194. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/docs/readthedocs.yaml.j2 +0 -0
  195. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/docs/requirements.md.j2 +0 -0
  196. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/docs/test-spec.md.j2 +0 -0
  197. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/editorconfig.j2 +0 -0
  198. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/gitattributes.j2 +0 -0
  199. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/gitignore.j2 +0 -0
  200. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/go/go.mod.j2 +0 -0
  201. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/go/main.go.j2 +0 -0
  202. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/belief-registry.md.j2 +0 -0
  203. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/context-budget.md.j2 +0 -0
  204. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/drift-metrics.md.j2 +0 -0
  205. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/epistemic-axioms.md.j2 +0 -0
  206. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/failure-modes.md.j2 +0 -0
  207. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/lifecycle.md.j2 +0 -0
  208. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/roles.md.j2 +0 -0
  209. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/rules.md.j2 +0 -0
  210. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/session-protocol.md.j2 +0 -0
  211. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/uncertainty-map.md.j2 +0 -0
  212. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/governance/verification.md.j2 +0 -0
  213. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/js/package.json.j2 +0 -0
  214. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/ledger.md.j2 +0 -0
  215. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/python/cli.py.j2 +0 -0
  216. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/python/init.py.j2 +0 -0
  217. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/python/pyproject.toml.j2 +0 -0
  218. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/readme.md.j2 +0 -0
  219. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/rust/Cargo.toml.j2 +0 -0
  220. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/rust/main.rs.j2 +0 -0
  221. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/scripts/exec.cmd.j2 +0 -0
  222. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/scripts/exec.sh.j2 +0 -0
  223. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/scripts/run.cmd.j2 +0 -0
  224. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/scripts/run.sh.j2 +0 -0
  225. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/scripts/setup.cmd.j2 +0 -0
  226. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/scripts/setup.sh.j2 +0 -0
  227. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/templates/workflows/release.yml.j2 +0 -0
  228. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/tool_installer.py +0 -0
  229. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/toolrules.py +0 -0
  230. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/tools.py +0 -0
  231. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/trace.py +0 -0
  232. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/updater.py +0 -0
  233. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/upgrader.py +0 -0
  234. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/validator.py +0 -0
  235. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/vcs/__init__.py +0 -0
  236. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/vcs/base.py +0 -0
  237. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/vcs/bitbucket.py +0 -0
  238. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/vcs/github.py +0 -0
  239. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/vcs/gitlab.py +0 -0
  240. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/vcs_commands.py +0 -0
  241. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/wireframes.py +0 -0
  242. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith/workspace.py +0 -0
  243. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith.egg-info/dependency_links.txt +0 -0
  244. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith.egg-info/entry_points.txt +0 -0
  245. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith.egg-info/requires.txt +0 -0
  246. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/src/specsmith.egg-info/top_level.txt +0 -0
  247. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_CMD_001.py +0 -0
  248. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_agent_profiles.py +0 -0
  249. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_agent_run_feedback.py +0 -0
  250. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_agent_runner_ready.py +0 -0
  251. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_ai_client.py +0 -0
  252. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_ai_intelligence.py +0 -0
  253. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_channel.py +0 -0
  254. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_chat_diff_decision.py +0 -0
  255. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_chat_runner_openai_compat.py +0 -0
  256. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_chat_stdin_protocol.py +0 -0
  257. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_cli_workflows_history_drive.py +0 -0
  258. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_compliance.py +0 -0
  259. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_compressor.py +0 -0
  260. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_dispatch.py +0 -0
  261. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_e2e_nexus.py +0 -0
  262. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_endpoints_cli.py +0 -0
  263. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_endpoints_store.py +0 -0
  264. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_epistemic.py +0 -0
  265. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_fallback_chain.py +0 -0
  266. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_importer.py +0 -0
  267. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_integrations.py +0 -0
  268. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_integrations_codity.py +0 -0
  269. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_intelligence.py +0 -0
  270. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_issue_reporter.py +0 -0
  271. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_mcp_client.py +0 -0
  272. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_new_modules.py +0 -0
  273. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_nexus.py +0 -0
  274. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_permissions.py +0 -0
  275. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_phase1_4_new.py +0 -0
  276. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_phase34_completion.py +0 -0
  277. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_rate_limits.py +0 -0
  278. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_req_248_262.py +0 -0
  279. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_scaffolder.py +0 -0
  280. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_skills_mcp.py +0 -0
  281. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_smoke.py +0 -0
  282. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_suggester.py +0 -0
  283. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_tools.py +0 -0
  284. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_validator.py +0 -0
  285. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_vcs.py +0 -0
  286. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_warp_parity.py +0 -0
  287. {specsmith-0.11.7.dev462 → specsmith-0.11.8}/tests/test_warp_parity_followup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specsmith
3
- Version: 0.11.7.dev462
3
+ Version: 0.11.8
4
4
  Summary: Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands.
5
5
  Author: BitConcepts
6
6
  License-Expression: MIT
@@ -957,6 +957,43 @@ See the `codity-ai-review` governance skill (`specsmith skill install codity-ai-
957
957
 
958
958
  ---
959
959
 
960
+ ## Skills
961
+
962
+ specsmith ships **70+ built-in skills** across 11 domains that AI agents (Warp, Claude Code, Codex, Cursor) can install and use.
963
+
964
+ ```bash
965
+ # List all available skills
966
+ specsmith skill list
967
+
968
+ # Search by keyword
969
+ specsmith skill search zephyr
970
+
971
+ # Install a skill into .agents/skills/
972
+ specsmith skill install specsmith
973
+ specsmith skill install specsmith-save
974
+ specsmith skill install specsmith-audit
975
+ ```
976
+
977
+ Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
978
+
979
+ ### Self-referential governance skills
980
+
981
+ Three skills document specsmith itself:
982
+
983
+ | Slug | Purpose |
984
+ |------|--------|
985
+ | `specsmith` | Master CLI reference — session workflow, commands, audit codes |
986
+ | `specsmith-save` | When and how to run `specsmith save` |
987
+ | `specsmith-audit` | Running audits and interpreting results |
988
+
989
+ ### Remote reference (Warp Oz cloud agents)
990
+
991
+ ```bash
992
+ oz agent run-cloud --skill "layer1labs/specsmith:specsmith-save" --prompt "save my work"
993
+ ```
994
+
995
+ ---
996
+
960
997
  ## The specsmith Bootstrap
961
998
 
962
999
  specsmith governs itself — the specsmith repo is a specsmith-managed project. Run `specsmith audit`
@@ -885,6 +885,43 @@ See the `codity-ai-review` governance skill (`specsmith skill install codity-ai-
885
885
 
886
886
  ---
887
887
 
888
+ ## Skills
889
+
890
+ specsmith ships **70+ built-in skills** across 11 domains that AI agents (Warp, Claude Code, Codex, Cursor) can install and use.
891
+
892
+ ```bash
893
+ # List all available skills
894
+ specsmith skill list
895
+
896
+ # Search by keyword
897
+ specsmith skill search zephyr
898
+
899
+ # Install a skill into .agents/skills/
900
+ specsmith skill install specsmith
901
+ specsmith skill install specsmith-save
902
+ specsmith skill install specsmith-audit
903
+ ```
904
+
905
+ Skills are installed as `.agents/skills/<slug>/SKILL.md` and are auto-discovered by any AI tool that scans `.agents/skills/`.
906
+
907
+ ### Self-referential governance skills
908
+
909
+ Three skills document specsmith itself:
910
+
911
+ | Slug | Purpose |
912
+ |------|--------|
913
+ | `specsmith` | Master CLI reference — session workflow, commands, audit codes |
914
+ | `specsmith-save` | When and how to run `specsmith save` |
915
+ | `specsmith-audit` | Running audits and interpreting results |
916
+
917
+ ### Remote reference (Warp Oz cloud agents)
918
+
919
+ ```bash
920
+ oz agent run-cloud --skill "layer1labs/specsmith:specsmith-save" --prompt "save my work"
921
+ ```
922
+
923
+ ---
924
+
888
925
  ## The specsmith Bootstrap
889
926
 
890
927
  specsmith governs itself — the specsmith repo is a specsmith-managed project. Run `specsmith audit`
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specsmith"
7
- version = "0.11.7.dev462"
7
+ version = "0.11.8"
8
8
  description = "Applied Epistemic Engineering toolkit — AEE agent sessions, execution profiles, FPGA/HDL governance, tool installer, 50+ CLI commands."
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -8,4 +8,4 @@ from importlib.metadata import version as _pkg_version
8
8
  try:
9
9
  __version__: str = _pkg_version("specsmith")
10
10
  except PackageNotFoundError: # running from source without install
11
- __version__ = "0.11.7" # fallback: keep in sync with pyproject.toml
11
+ __version__ = "0.11.8" # fallback: keep in sync with pyproject.toml
@@ -23,6 +23,7 @@ class AuditResult:
23
23
  passed: bool
24
24
  message: str
25
25
  fixable: bool = False
26
+ suppressed: bool = False
26
27
 
27
28
 
28
29
  @dataclass
@@ -37,7 +38,7 @@ class AuditReport:
37
38
 
38
39
  @property
39
40
  def failed(self) -> int:
40
- return sum(1 for r in self.results if not r.passed)
41
+ return sum(1 for r in self.results if not r.passed and not r.suppressed)
41
42
 
42
43
  @property
43
44
  def fixable(self) -> int:
@@ -47,6 +48,39 @@ class AuditReport:
47
48
  def healthy(self) -> bool:
48
49
  return self.failed == 0
49
50
 
51
+ @property
52
+ def suppressed_count(self) -> int:
53
+ return sum(1 for r in self.results if r.suppressed)
54
+
55
+
56
+ # ---------------------------------------------------------------------------
57
+ # Suppression aliases (scaffold.yml accepted_warnings → AuditResult.name)
58
+ # ---------------------------------------------------------------------------
59
+
60
+ _SUPPRESSION_ALIASES: dict[str, str] = {
61
+ "scaffold_type_mismatch": "type-mismatch",
62
+ "ledger_line_threshold": "ledger-size",
63
+ "open_todo_count": "ledger-open-todos",
64
+ "ledger_size": "ledger-size",
65
+ }
66
+
67
+
68
+ def _apply_accepted_warnings(report: AuditReport, accepted: list[str]) -> None:
69
+ """Mark audit results matching *accepted* warning names as suppressed.
70
+
71
+ Each entry in *accepted* is either a key in ``_SUPPRESSION_ALIASES`` or a
72
+ direct ``AuditResult.name`` (exact match or prefix match up to ``:``).
73
+ Matched results are set to ``suppressed=True`` and ``passed=True`` so they
74
+ no longer count as failures.
75
+ """
76
+ resolved: list[str] = [_SUPPRESSION_ALIASES.get(a, a) for a in accepted]
77
+ for result in report.results:
78
+ for name in resolved:
79
+ if result.name == name or result.name.startswith(name + ":"):
80
+ result.suppressed = True
81
+ result.passed = True
82
+ break
83
+
50
84
 
51
85
  # ---------------------------------------------------------------------------
52
86
  # Governance file existence checks
@@ -386,10 +420,7 @@ def check_ledger_health(root: Path) -> list[AuditResult]:
386
420
 
387
421
  # Size check — uses configurable threshold (#145)
388
422
  threshold = _get_ledger_threshold(root)
389
- # Check audit_suppressions for opt-out
390
- raw = _read_scaffold_raw(root)
391
- suppressed = "ledger_size" in (raw.get("audit_suppressions") or [])
392
- if not suppressed and line_count > threshold:
423
+ if line_count > threshold:
393
424
  results.append(
394
425
  AuditResult(
395
426
  name="ledger-size",
@@ -1171,6 +1202,15 @@ def run_audit(root: Path) -> AuditReport:
1171
1202
  report.results.extend(check_industrial_artifacts(root))
1172
1203
  report.results.extend(check_derived_artifacts(root))
1173
1204
  report.results.extend(check_cross_repo_dependencies(root))
1205
+
1206
+ # Apply accepted_warnings / audit_suppressions from scaffold.yml (REQ-357)
1207
+ raw = _read_scaffold_raw(root)
1208
+ _accepted: list[str] = list(raw.get("accepted_warnings") or [])
1209
+ # backward-compat: audit_suppressions list (pre-#188 ledger_size suppression)
1210
+ _old_suppressed: list[str] = list(raw.get("audit_suppressions") or [])
1211
+ _accepted = _accepted + _old_suppressed
1212
+ if _accepted:
1213
+ _apply_accepted_warnings(report, _accepted)
1174
1214
  return report
1175
1215
 
1176
1216
 
@@ -1182,7 +1222,7 @@ def run_auto_fix(root: Path, report: AuditReport) -> list[str]:
1182
1222
  fixed: list[str] = []
1183
1223
 
1184
1224
  for result in report.results:
1185
- if result.passed:
1225
+ if result.passed or result.suppressed:
1186
1226
  continue
1187
1227
 
1188
1228
  # Fix missing required files with minimal stubs
@@ -441,8 +441,14 @@ def audit(fix: bool, project_dir: str) -> None:
441
441
  report = run_audit(root)
442
442
 
443
443
  for r in report.results:
444
- icon = "[green]✓[/green]" if r.passed else "[red]✗[/red]"
445
- console.print(f" {icon} {r.message}")
444
+ if r.suppressed:
445
+ icon = "[dim]~[/dim]"
446
+ elif r.passed:
447
+ icon = "[green]✓[/green]"
448
+ else:
449
+ icon = "[red]✗[/red]"
450
+ msg = r.message + " [dim](accepted)[/dim]" if r.suppressed else r.message
451
+ console.print(f" {icon} {msg}")
446
452
 
447
453
  console.print()
448
454
  if report.healthy:
@@ -8524,9 +8530,19 @@ def skill_list(project_dir: str, as_json: bool) -> None:
8524
8530
  from specsmith import skills as _skills
8525
8531
 
8526
8532
  root = Path(project_dir).resolve()
8527
- installed = [p.name for p in _skills.installed_skills(root)]
8533
+ installed_paths = _skills.installed_skills(root)
8534
+ # Build identifier list: slug (subdir) or filename (flat legacy)
8535
+ installed: list[str] = []
8536
+ installed_slugs: set[str] = set()
8537
+ for p in installed_paths:
8538
+ if p.name == "SKILL.md": # subdir format: <slug>/SKILL.md
8539
+ installed.append(p.parent.name)
8540
+ installed_slugs.add(p.parent.name)
8541
+ else: # legacy flat format: <slug>.md
8542
+ installed.append(p.name)
8543
+ installed_slugs.add(p.stem)
8528
8544
  catalog = [
8529
- {"slug": entry.slug, "name": entry.name, "installed": f"{entry.slug}.md" in installed}
8545
+ {"slug": entry.slug, "name": entry.name, "installed": entry.slug in installed_slugs}
8530
8546
  for entry in _skills.CATALOG
8531
8547
  ]
8532
8548
  if as_json:
@@ -115,7 +115,7 @@ class ProjectConfig(BaseModel):
115
115
  ),
116
116
  )
117
117
  language: str = Field(default="python", description="Primary language/runtime")
118
- spec_version: str = Field(default="0.11.7", description="Spec version to scaffold from")
118
+ spec_version: str = Field(default="0.11.8", description="Spec version to scaffold from")
119
119
  description: str = Field(default="", description="Short project description")
120
120
 
121
121
  # Options
@@ -77,8 +77,8 @@ def _req_count(min_count: int) -> Callable[[Path], bool]:
77
77
  if p.exists():
78
78
  try:
79
79
  text = p.read_text(encoding="utf-8", errors="ignore")
80
- # Support both ### REQ-NNN (old) and ## N. Title / - **ID:** REQ-NNN (new)
81
- count = len(re.findall(r"^###\s+REQ-", text, re.MULTILINE))
80
+ # Support H2/H3 headings (## REQ-NNN, ### REQ-NNN, ## REQ-BE-001) (REQ-359)
81
+ count = len(re.findall(r"^#{2,3}\s+REQ-", text, re.MULTILINE))
82
82
  if count == 0:
83
83
  count = len(re.findall(r"- \*\*ID:\*\* REQ-", text))
84
84
  if count == 0:
@@ -11,16 +11,17 @@ existing code continues to work without changes.
11
11
 
12
12
  Domain modules
13
13
  ~~~~~~~~~~~~~~
14
- governance — project governance, verification, review, release workflows
15
- embedded RTOS/BSP: Zephyr, Yocto, FreeRTOS, NuttX, Buildroot, Azure RTOS …
16
- hardware EDA: KiCad, Altium, Vivado, Quartus, GTKWave, OpenOCD, JTAG
17
- mobile iOS (Xcode/Swift/TestFlight), Android (Gradle/ADB), Flutter, RN
18
- cloud AWS CLI, Azure CLI, GCP, GitHub CLI (gh)
19
- devops Docker, Kubernetes, Terraform, CI/CD pipelines
20
- ssh SSH key management, remote-dev, WSL2
21
- cross_platform CMake/vcpkg/conan, package managers, cross-OS CI
22
- productivity Email, presentations, Gamma.ai, MS Office, LibreOffice
23
- corporate Budgets, project mgmt, HR, fundraising, marketing, sales, legal
14
+ governance — project governance, verification, review, release workflows
15
+ specsmith_skills specsmith self-referential skills (save, audit, reference)
16
+ embedded RTOS/BSP: Zephyr, Yocto, FreeRTOS, NuttX, Buildroot, Azure RTOS …
17
+ hardware EDA: KiCad, Altium, Vivado, Quartus, GTKWave, OpenOCD, JTAG
18
+ mobile iOS (Xcode/Swift/TestFlight), Android (Gradle/ADB), Flutter, RN
19
+ cloud AWS CLI, Azure CLI, GCP, GitHub CLI (gh)
20
+ devops Docker, Kubernetes, Terraform, CI/CD pipelines
21
+ ssh SSH key management, remote-dev, WSL2
22
+ cross_platform CMake/vcpkg/conan, package managers, cross-OS CI
23
+ productivity Email, presentations, Gamma.ai, MS Office, LibreOffice
24
+ corporate — Budgets, project mgmt, HR, fundraising, marketing, sales, legal
24
25
 
25
26
  Usage
26
27
  ~~~~~
@@ -121,6 +122,7 @@ def _build_catalog() -> list[SkillEntry]:
121
122
  hardware,
122
123
  mobile,
123
124
  productivity,
125
+ specsmith_skills,
124
126
  ssh,
125
127
  )
126
128
 
@@ -136,6 +138,7 @@ def _build_catalog() -> list[SkillEntry]:
136
138
  + productivity.SKILLS
137
139
  + corporate.SKILLS
138
140
  + docs.SKILLS
141
+ + specsmith_skills.SKILLS
139
142
  )
140
143
 
141
144
 
@@ -207,15 +210,21 @@ def by_project_type(project_type: str) -> list[SkillEntry]:
207
210
 
208
211
 
209
212
  def installed_skills(project_dir: Path) -> list[Path]:
210
- """Return SKILL.md files installed under ``.agents/skills/``."""
213
+ """Return installed skill files under ``.agents/skills/`` (both flat and subdir formats)."""
211
214
  base = project_dir / ".agents" / "skills"
212
215
  if not base.is_dir():
213
216
  return []
214
- return sorted(p for p in base.iterdir() if p.is_file() and p.suffix == ".md")
217
+ paths: list[Path] = []
218
+ for item in sorted(base.iterdir()):
219
+ if item.is_file() and item.suffix == ".md": # legacy flat format
220
+ paths.append(item)
221
+ elif item.is_dir() and (item / "SKILL.md").exists(): # subdir format
222
+ paths.append(item / "SKILL.md")
223
+ return sorted(paths)
215
224
 
216
225
 
217
226
  def install(slug: str, project_dir: Path, *, force: bool = False) -> Path:
218
- """Copy skill *slug* into ``<project_dir>/.agents/skills/<slug>.md``.
227
+ """Copy skill *slug* into ``<project_dir>/.agents/skills/<slug>/SKILL.md``.
219
228
 
220
229
  Raises
221
230
  ------
@@ -229,7 +238,10 @@ def install(slug: str, project_dir: Path, *, force: bool = False) -> Path:
229
238
  raise KeyError(f"Unknown skill: {slug!r}")
230
239
  base = project_dir / ".agents" / "skills"
231
240
  base.mkdir(parents=True, exist_ok=True)
232
- target = base / f"{slug}.md"
241
+ # Subdirectory format: <slug>/SKILL.md (REQ-360)
242
+ skill_dir = base / slug
243
+ skill_dir.mkdir(exist_ok=True)
244
+ target = skill_dir / "SKILL.md"
233
245
  if target.exists() and not force:
234
246
  raise FileExistsError(f"Already installed: {target}. Pass force=True to overwrite.")
235
247
  target.write_text(entry.body, encoding="utf-8")
@@ -293,6 +293,172 @@ print("Rust backend:", RUST_BACKEND)
293
293
  """
294
294
  ),
295
295
  ),
296
+ SkillEntry(
297
+ slug="specsmith",
298
+ name="Specsmith — master governance CLI reference",
299
+ description=(
300
+ "Master reference for the specsmith AEE governance tool — key concepts, "
301
+ "common commands, session workflow, phase advancement, and audit codes. "
302
+ "Use whenever working in a specsmith-governed project."
303
+ ),
304
+ domain=SkillDomain.GOVERNANCE,
305
+ tags=["specsmith", "governance", "aee", "cli", "session", "audit", "phase", "ledger"],
306
+ prerequisites=["specsmith"],
307
+ body="""\
308
+ # Specsmith — Master Governance CLI Reference
309
+
310
+ specsmith is the Applied Epistemic Engineering (AEE) toolkit for AI-assisted
311
+ development. It governs projects through a 7-phase lifecycle and enforces
312
+ 22 hard rules (H1–H22) via preflight gates, audits, and cryptographic trace
313
+ vaults.
314
+
315
+ ## Key Concepts
316
+ - **AEE Phase** — inception → architecture → requirements → test_spec →
317
+ implementation → verification → release. `specsmith phase` shows the
318
+ current phase and readiness percentage.
319
+ - **Preflight Gate** — every proposed change must pass
320
+ `specsmith preflight "<intent>" --json` before execution.
321
+ - **Work Item** — a scoped unit of work (`WI-<hash>`) assigned by preflight.
322
+ - **Governance Anchor** — `specsmith checkpoint` emits a timestamped snapshot
323
+ of phase, health, and active work items.
324
+ - **ESDB** — EpiStemic State Database (ChronoMemory WAL) stores beliefs,
325
+ decisions, and trace seals.
326
+
327
+ ## Common Commands
328
+ ```bash
329
+ specsmith audit # governance health (28 checks)
330
+ specsmith sync # YAML → JSON → Markdown sync
331
+ specsmith validate --strict # schema validation
332
+ specsmith preflight "..." # preflight gate
333
+ specsmith checkpoint # emit GOVERNANCE ANCHOR
334
+ specsmith save # ESDB backup + commit + push
335
+ specsmith phase # show current phase + readiness
336
+ specsmith phase next # advance phase (checks prerequisites)
337
+ specsmith kill-session # terminate all agent processes
338
+ specsmith ledger add "msg" # append to LEDGER.md
339
+ ```
340
+
341
+ ## Session Workflow
342
+ 1. `specsmith audit && specsmith sync && specsmith checkpoint`
343
+ 2. `specsmith preflight "<describe change>" --json`
344
+ 3. Execute work (only if decision == accepted)
345
+ 4. Every 8-10 turns: `specsmith checkpoint` (output verbatim)
346
+ 5. `specsmith save && specsmith kill-session`
347
+
348
+ ## Audit Codes
349
+ - 28 checks across structure, REQ↔TEST coverage, governance size,
350
+ tool config, phase readiness, and supplementary rules.
351
+ - `specsmith audit --fix` auto-repairs missing files and CI configs.
352
+
353
+ ## Phase Advancement
354
+ - `specsmith phase next` checks prerequisites before advancing.
355
+ - `specsmith phase set <phase>` jumps (with `--force` to skip checks).
356
+ - Phase stored as `aee_phase` in `scaffold.yml`.
357
+ """,
358
+ ),
359
+ SkillEntry(
360
+ slug="specsmith-audit",
361
+ name="Specsmith Audit — drift detection and governance health",
362
+ description=(
363
+ "Run specsmith audit to check for governance drift between requirements, "
364
+ "tests, and architecture. Required before advancing an AEE phase."
365
+ ),
366
+ domain=SkillDomain.GOVERNANCE,
367
+ tags=["specsmith", "audit", "drift", "health", "governance", "aee", "requirements"],
368
+ prerequisites=["specsmith"],
369
+ body="""\
370
+ # Specsmith Audit — Drift Detection and Governance Health
371
+
372
+ ## When to Run
373
+ - At the start of every session (part of bootstrap)
374
+ - Before advancing an AEE phase (`specsmith phase next`)
375
+ - After significant code or requirements changes
376
+ - When drift is suspected (stale coverage, missing tests)
377
+
378
+ ## Command
379
+ ```bash
380
+ specsmith audit # full 28-check governance audit
381
+ specsmith audit --fix # auto-repair missing files
382
+ specsmith audit --project-dir . # explicit project root
383
+ ```
384
+
385
+ ## What It Checks (28 checks)
386
+ 1. Governance file structure (.specsmith/, docs/, AGENTS.md)
387
+ 2. REQ↔TEST bidirectional coverage (no orphan tests, no untested REQs)
388
+ 3. Governance file size thresholds
389
+ 4. CI tool configuration matches project type
390
+ 5. Phase readiness prerequisites
391
+ 6. Supplementary rules referenced in AGENTS.md
392
+ 7. Duplicate governance files (root vs docs/ canonical)
393
+ 8. YAML↔JSON↔Markdown sync state
394
+
395
+ ## Interpreting Results
396
+ - **28/28 checks passed** — governance is healthy
397
+ - **Failures** — surface to user before starting work
398
+ - **Warnings** — non-blocking but should be addressed
399
+
400
+ ## Suppressing Warnings
401
+ In `scaffold.yml`:
402
+ ```yaml
403
+ accepted_warnings:
404
+ - <alias> # renders as ~ <check> (accepted), excluded from failure count
405
+ ```
406
+
407
+ ## Integration with Phase Advancement
408
+ `specsmith phase next` runs audit internally. All checks must pass
409
+ (or be accepted) before the phase advances.
410
+ """,
411
+ ),
412
+ SkillEntry(
413
+ slug="specsmith-save",
414
+ name="Specsmith Save — governance-aware save workflow",
415
+ description=(
416
+ "Run specsmith save to commit and push all current changes with governance "
417
+ "state backup. Use at the end of any work session or after completing a feature/fix."
418
+ ),
419
+ domain=SkillDomain.GOVERNANCE,
420
+ tags=["specsmith", "save", "commit", "push", "esdb", "backup", "governance"],
421
+ prerequisites=["specsmith"],
422
+ body="""\
423
+ # Specsmith Save — Governance-Aware Save Workflow
424
+
425
+ ## When to Use
426
+ - At the end of every work session
427
+ - After completing a feature or fix
428
+ - Before switching branches or contexts
429
+ - Never end a session with uncommitted governance changes
430
+
431
+ ## Command
432
+ ```bash
433
+ specsmith save # ESDB backup + commit + push
434
+ specsmith save --project-dir . # explicit project root
435
+ ```
436
+
437
+ ## What It Does (in order)
438
+ 1. Creates a timestamped ESDB backup (.specsmith/backups/)
439
+ 2. Runs `git add -A` to stage all changes
440
+ 3. Commits with a governance-stamped message
441
+ 4. Pushes to the current remote branch
442
+
443
+ ## Prerequisites
444
+ - All governance changes must be consistent (run `specsmith audit` first
445
+ if unsure)
446
+ - A git remote must be configured
447
+ - Working tree should have changes to commit
448
+
449
+ ## Session End Protocol
450
+ ```bash
451
+ specsmith save --project-dir . # ESDB backup + commit + push
452
+ specsmith kill-session # stop governance-serve and tracked processes
453
+ ```
454
+
455
+ ## ESDB Backup Details
456
+ - Backups are written to `.specsmith/backups/`
457
+ - Filename format: `backup-YYYY-MM-DDTHH-MM-SS.json`
458
+ - Contains requirements.json and testcases.json snapshots
459
+ - Use `specsmith esdb rollback --steps N` to restore from backup
460
+ """,
461
+ ),
296
462
  SkillEntry(
297
463
  slug="specsmith-session-governance",
298
464
  name="Specsmith Session Governance — drift prevention, heartbeat, preflight gate",