docguard-cli 0.36.0__tar.gz → 0.36.2__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 (499) hide show
  1. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/buglog.json +146 -0
  2. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/cerebrum.md +10 -0
  3. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/CHANGELOG.md +23 -0
  4. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/PKG-INFO +1 -1
  5. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/diagnose.mjs +3 -22
  6. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/trace.mjs +15 -36
  7. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/docguard.mjs +5 -2
  8. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/docs-coverage.mjs +111 -61
  9. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/schema-sync.mjs +16 -11
  10. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/traceability.mjs +52 -14
  11. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/configuration.md +15 -0
  12. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/ARCHITECTURE.md +7 -0
  13. docguard_cli-0.36.2/docs-implementation/OSS-PRECISION-ASSESSMENT.md +97 -0
  14. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/README.md +6 -6
  15. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/sync.md +1 -1
  16. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/extension.yml +2 -2
  17. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/scripts/bash/common.sh +9 -17
  18. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/scripts/bash/docguard-check-docs.sh +18 -11
  19. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/skills/docguard-fix/SKILL.md +3 -3
  20. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/skills/docguard-guard/SKILL.md +2 -2
  21. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/skills/docguard-review/SKILL.md +2 -2
  22. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/skills/docguard-score/SKILL.md +2 -2
  23. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/skills/docguard-sync/SKILL.md +2 -2
  24. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/templates/github-workflows/docguard-guard.yml +1 -1
  25. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/package-lock.json +2 -2
  26. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/package.json +1 -1
  27. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/pyproject.toml +1 -1
  28. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/server.json +2 -2
  29. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/ci/github-actions.yml +1 -1
  30. docguard_cli-0.36.2/tests/agents-check-readonly.test.mjs +61 -0
  31. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/commands.test.mjs +16 -5
  32. docguard_cli-0.36.2/tests/diagnose-review-guidance.test.mjs +37 -0
  33. docguard_cli-0.36.2/tests/docs-coverage-reference-evidence.test.mjs +89 -0
  34. docguard_cli-0.36.2/tests/docs-coverage-scope.test.mjs +85 -0
  35. docguard_cli-0.36.2/tests/requirement-scope.test.mjs +53 -0
  36. docguard_cli-0.36.2/tests/schema-sync-scope.test.mjs +85 -0
  37. docguard_cli-0.36.2/tests/spec-kit-helper-json.test.mjs +146 -0
  38. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/trace-features.test.mjs +32 -0
  39. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/docguard.fix.md +0 -0
  40. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/docguard.guard.md +0 -0
  41. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/docguard.review.md +0 -0
  42. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/docguard.score.md +0 -0
  43. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.analyze.md +0 -0
  44. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.checklist.md +0 -0
  45. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.clarify.md +0 -0
  46. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.constitution.md +0 -0
  47. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.implement.md +0 -0
  48. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.plan.md +0 -0
  49. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.specify.md +0 -0
  50. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.tasks.md +0 -0
  51. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/commands/speckit.taskstoissues.md +0 -0
  52. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/docguard-fix/SKILL.md +0 -0
  53. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/docguard-guard/SKILL.md +0 -0
  54. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/docguard-review/SKILL.md +0 -0
  55. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/docguard-score/SKILL.md +0 -0
  56. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/docguard-sync/SKILL.md +0 -0
  57. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-analyze/SKILL.md +0 -0
  58. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-checklist/SKILL.md +0 -0
  59. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-clarify/SKILL.md +0 -0
  60. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-constitution/SKILL.md +0 -0
  61. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-implement/SKILL.md +0 -0
  62. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-plan/SKILL.md +0 -0
  63. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-specify/SKILL.md +0 -0
  64. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-tasks/SKILL.md +0 -0
  65. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.agent/skills/speckit-taskstoissues/SKILL.md +0 -0
  66. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.claude/rules/openwolf.md +0 -0
  67. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.claude/settings.json +0 -0
  68. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.docguard.json +0 -0
  69. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.docguardignore +0 -0
  70. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  71. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/ISSUE_TEMPLATE/docguard-feedback.md +0 -0
  72. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  73. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  74. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/dependabot.yml +0 -0
  75. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/scripts/speckit-submission.py +0 -0
  76. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/workflows/auto-merge.yml +0 -0
  77. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/workflows/ci.yml +0 -0
  78. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/workflows/jules-triage.yml +0 -0
  79. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/workflows/release.yml +0 -0
  80. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/workflows/scheduled-release.yml +0 -0
  81. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/workflows/supply-chain.yml +0 -0
  82. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.github/workflows/sync-speckit-catalog.yml +0 -0
  83. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.gitignore +0 -0
  84. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.jules/bolt.md +0 -0
  85. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.jules/palette.md +0 -0
  86. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.jules/sentinel.md +0 -0
  87. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.jules-setup.sh +0 -0
  88. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.npmignore +0 -0
  89. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.npmrc +0 -0
  90. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.pre-commit-hooks.yaml +0 -0
  91. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/extensions/.cache/catalog-ebf165086500aab1-metadata.json +0 -0
  92. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/extensions/.cache/catalog-ebf165086500aab1.json +0 -0
  93. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/extensions/.cache/catalog-metadata.json +0 -0
  94. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/extensions/.cache/catalog.json +0 -0
  95. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/init-options.json +0 -0
  96. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/memory/constitution.md +0 -0
  97. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  98. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/scripts/bash/common.sh +0 -0
  99. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/scripts/bash/create-new-feature.sh +0 -0
  100. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/scripts/bash/setup-plan.sh +0 -0
  101. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/scripts/bash/update-agent-context.sh +0 -0
  102. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/templates/agent-file-template.md +0 -0
  103. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/templates/checklist-template.md +0 -0
  104. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/templates/constitution-template.md +0 -0
  105. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/templates/plan-template.md +0 -0
  106. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/templates/spec-template.md +0 -0
  107. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.specify/templates/tasks-template.md +0 -0
  108. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/OPENWOLF.md +0 -0
  109. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/anatomy.md +0 -0
  110. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/config.json +0 -0
  111. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/cron-manifest.json +0 -0
  112. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/cron-state.json +0 -0
  113. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/daemon.log +0 -0
  114. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/designqc-report.json +0 -0
  115. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/_session.json +0 -0
  116. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/_wrap_up_nudged +0 -0
  117. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/package.json +0 -0
  118. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/post-read.js +0 -0
  119. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/post-write.js +0 -0
  120. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/pre-read.js +0 -0
  121. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/pre-write.js +0 -0
  122. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/session-start.js +0 -0
  123. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/shared.js +0 -0
  124. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/hooks/stop.js +0 -0
  125. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/identity.md +0 -0
  126. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/memory.md +0 -0
  127. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/reframe-frameworks.md +0 -0
  128. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/suggestions.json +0 -0
  129. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/.wolf/token-ledger.json +0 -0
  130. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/AGENTS.md +0 -0
  131. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/CLAUDE.md +0 -0
  132. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/CODE_OF_CONDUCT.md +0 -0
  133. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/COMPARISONS.md +0 -0
  134. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/CONTRIBUTING.md +0 -0
  135. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/DRIFT-LOG.md +0 -0
  136. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/Dockerfile +0 -0
  137. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/LICENSE +0 -0
  138. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/PHILOSOPHY.md +0 -0
  139. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/PRIVACY.md +0 -0
  140. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/README.es.md +0 -0
  141. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/README.md +0 -0
  142. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/README.pt-BR.md +0 -0
  143. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/ROADMAP.md +0 -0
  144. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/SECURITY.md +0 -0
  145. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/STANDARD.md +0 -0
  146. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/SUPPLY-CHAIN-AUDIT.md +0 -0
  147. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/SUPPORT.md +0 -0
  148. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/VALIDATION.md +0 -0
  149. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/action.yml +0 -0
  150. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/assets/bin/docguard +0 -0
  151. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/assets/demo.gif +0 -0
  152. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/assets/demo.tape +0 -0
  153. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/assets/docguard-logo.png +0 -0
  154. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/agent.mjs +0 -0
  155. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/agents.mjs +0 -0
  156. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/badge.mjs +0 -0
  157. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/ci.mjs +0 -0
  158. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/demo.mjs +0 -0
  159. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/diff.mjs +0 -0
  160. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/explain.mjs +0 -0
  161. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/feedback.mjs +0 -0
  162. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/fix.mjs +0 -0
  163. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/generate.mjs +0 -0
  164. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/guard.mjs +0 -0
  165. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/hooks.mjs +0 -0
  166. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/impact.mjs +0 -0
  167. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/init.mjs +0 -0
  168. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/llms.mjs +0 -0
  169. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/mcp.mjs +0 -0
  170. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/memory.mjs +0 -0
  171. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/publish.mjs +0 -0
  172. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/report.mjs +0 -0
  173. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/score.mjs +0 -0
  174. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/setup.mjs +0 -0
  175. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/sync-tests.mjs +0 -0
  176. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/sync.mjs +0 -0
  177. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/upgrade.mjs +0 -0
  178. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/verify.mjs +0 -0
  179. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/commands/watch.mjs +0 -0
  180. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/config.mjs +0 -0
  181. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/ensure-skills.mjs +0 -0
  182. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/findings.mjs +0 -0
  183. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/agent-readability.mjs +0 -0
  184. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/api-doc.mjs +0 -0
  185. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/cdk.mjs +0 -0
  186. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/doc-tools.mjs +0 -0
  187. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/frontend.mjs +0 -0
  188. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/iac.mjs +0 -0
  189. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/instruction-audit.mjs +0 -0
  190. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/integrations.mjs +0 -0
  191. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/inventory.mjs +0 -0
  192. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/js-ast.mjs +0 -0
  193. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/memory-plan.mjs +0 -0
  194. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/project-type.mjs +0 -0
  195. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/py-ast.mjs +0 -0
  196. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/routes.mjs +0 -0
  197. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/schemas.mjs +0 -0
  198. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/semantic-claims.mjs +0 -0
  199. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/scanners/speckit.mjs +0 -0
  200. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared-diff.mjs +0 -0
  201. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared-doc-roles.mjs +0 -0
  202. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared-git.mjs +0 -0
  203. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared-ignore.mjs +0 -0
  204. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared-ir.mjs +0 -0
  205. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared-source.mjs +0 -0
  206. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared-trace-patterns.mjs +0 -0
  207. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/shared.mjs +0 -0
  208. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validator-coverage.mjs +0 -0
  209. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validator-markers.mjs +0 -0
  210. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/api-doc-smells.mjs +0 -0
  211. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/api-surface.mjs +0 -0
  212. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/architecture.mjs +0 -0
  213. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/canonical-sync.mjs +0 -0
  214. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/changelog.mjs +0 -0
  215. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/cross-reference.mjs +0 -0
  216. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/diff-suspicion.mjs +0 -0
  217. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/doc-quality.mjs +0 -0
  218. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/docs-diff.mjs +0 -0
  219. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/docs-sync.mjs +0 -0
  220. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/drift.mjs +0 -0
  221. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/environment.mjs +0 -0
  222. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/freshness.mjs +0 -0
  223. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/generated-staleness.mjs +0 -0
  224. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/metadata-sync.mjs +0 -0
  225. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/metrics-consistency.mjs +0 -0
  226. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/reference-existence.mjs +0 -0
  227. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/security.mjs +0 -0
  228. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/spec-kit.mjs +0 -0
  229. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/structure.mjs +0 -0
  230. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/surface-sync.mjs +0 -0
  231. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/test-spec.mjs +0 -0
  232. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/validators/todo-tracking.mjs +0 -0
  233. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/api-reference.mjs +0 -0
  234. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/baseline.mjs +0 -0
  235. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/doc-generators.mjs +0 -0
  236. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/fix-memory.mjs +0 -0
  237. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/generate-io.mjs +0 -0
  238. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/history.mjs +0 -0
  239. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/junit.mjs +0 -0
  240. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/mechanical.mjs +0 -0
  241. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/sarif.mjs +0 -0
  242. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/cli/writers/sections.mjs +0 -0
  243. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/commands/docguard.fix.md +0 -0
  244. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/commands/docguard.guard.md +0 -0
  245. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/commands/docguard.review.md +0 -0
  246. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/commands/docguard.score.md +0 -0
  247. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/configs/fastify.json +0 -0
  248. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/configs/generic.json +0 -0
  249. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/configs/nextjs.json +0 -0
  250. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/configs/python.json +0 -0
  251. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docguard_cli/__init__.py +0 -0
  252. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docguard_cli/wrapper.py +0 -0
  253. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/ai-integration.md +0 -0
  254. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/commands.md +0 -0
  255. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/doc-sections.md +0 -0
  256. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/faq.md +0 -0
  257. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/installation.md +0 -0
  258. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/profiles.md +0 -0
  259. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs/quickstart.md +0 -0
  260. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/CI-RECIPES.md +0 -0
  261. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/DATA-MODEL.md +0 -0
  262. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/ENVIRONMENT.md +0 -0
  263. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/REQUIREMENTS.md +0 -0
  264. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/SECURITY.md +0 -0
  265. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/SURFACE-AUDIT.md +0 -0
  266. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-canonical/TEST-SPEC.md +0 -0
  267. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-implementation/MIGRATION-v0.20.md +0 -0
  268. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-implementation/PRECISION-VALIDATION.md +0 -0
  269. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-implementation/TRUST-ROADMAP.md +0 -0
  270. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/docs-implementation/TRUST-VALIDATION.md +0 -0
  271. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/01-express-api/README.md +0 -0
  272. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/01-express-api/package.json +0 -0
  273. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/01-express-api/server.js +0 -0
  274. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/02-python-flask/README.md +0 -0
  275. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/02-python-flask/app.py +0 -0
  276. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/02-python-flask/docs-canonical/ARCHITECTURE.md +0 -0
  277. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/02-python-flask/requirements.txt +0 -0
  278. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/CHANGELOG.md +0 -0
  279. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/README.md +0 -0
  280. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/docs-canonical/ARCHITECTURE.md +0 -0
  281. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/docs-canonical/TEST-SPEC.md +0 -0
  282. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/package.json +0 -0
  283. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/src/index.js +0 -0
  284. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/tasks.json +0 -0
  285. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/03-spec-kit-project/tests/basic.test.js +0 -0
  286. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/examples/README.md +0 -0
  287. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/LICENSE +0 -0
  288. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/diagnose.md +0 -0
  289. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/fix.md +0 -0
  290. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/generate.md +0 -0
  291. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/guard.md +0 -0
  292. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/init.md +0 -0
  293. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/score.md +0 -0
  294. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/commands/trace.md +0 -0
  295. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/scripts/bash/docguard-init-doc.sh +0 -0
  296. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/scripts/bash/docguard-suggest-fix.sh +0 -0
  297. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/templates/extensions.yml +0 -0
  298. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/extensions/spec-kit-docguard/templates/github-workflows/docguard-autofix.yml +0 -0
  299. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/glama.json +0 -0
  300. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/llms-full.txt +0 -0
  301. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/llms.txt +0 -0
  302. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/mcpb/README.md +0 -0
  303. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/mcpb/manifest.template.json +0 -0
  304. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/packaging/homebrew/docguard.rb +0 -0
  305. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/packaging/submissions.md +0 -0
  306. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/schemas/docguard-config.schema.json +0 -0
  307. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/smithery.yaml +0 -0
  308. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/001-fix-ignore-validators/plan.md +0 -0
  309. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/001-fix-ignore-validators/spec.md +0 -0
  310. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/001-fix-ignore-validators/tasks.md +0 -0
  311. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/002-fix-test-discovery/plan.md +0 -0
  312. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/002-fix-test-discovery/spec.md +0 -0
  313. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/002-fix-test-discovery/tasks.md +0 -0
  314. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/003-v011-false-positives/plan.md +0 -0
  315. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/003-v011-false-positives/spec.md +0 -0
  316. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/003-v011-false-positives/tasks.md +0 -0
  317. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/004-v020-env-var-false-negative/spec.md +0 -0
  318. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/specs/005-hugocross-next-bugs/spec.md +0 -0
  319. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/ADR.md.template +0 -0
  320. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/AGENTS.md.template +0 -0
  321. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/ARCHITECTURE.md.template +0 -0
  322. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/CHANGELOG.md.template +0 -0
  323. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/CURRENT-STATE.md.template +0 -0
  324. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/DATA-MODEL.md.template +0 -0
  325. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/DEPLOYMENT.md.template +0 -0
  326. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/DRIFT-LOG.md.template +0 -0
  327. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/ENVIRONMENT.md.template +0 -0
  328. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/KNOWN-GOTCHAS.md.template +0 -0
  329. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/REQUIREMENTS.md.template +0 -0
  330. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/ROADMAP.md.template +0 -0
  331. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/RUNBOOKS.md.template +0 -0
  332. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/SECURITY.md.template +0 -0
  333. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/TEST-SPEC.md.template +0 -0
  334. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/TROUBLESHOOTING.md.template +0 -0
  335. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/VENDOR-BUGS.md.template +0 -0
  336. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/ci/gitlab-component.yml +0 -0
  337. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/commands/docguard.fix.md +0 -0
  338. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/commands/docguard.guard.md +0 -0
  339. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/commands/docguard.init.md +0 -0
  340. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/commands/docguard.review.md +0 -0
  341. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/commands/docguard.update.md +0 -0
  342. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/.docguard.json +0 -0
  343. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/.env.example +0 -0
  344. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/AGENTS.md +0 -0
  345. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/CHANGELOG.md +0 -0
  346. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/DRIFT-LOG.md +0 -0
  347. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/README.md +0 -0
  348. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/docs-canonical/API-REFERENCE.md +0 -0
  349. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/docs-canonical/ARCHITECTURE.md +0 -0
  350. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/docs-canonical/DATA-MODEL.md +0 -0
  351. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/docs-canonical/ENVIRONMENT.md +0 -0
  352. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/docs-canonical/SECURITY.md +0 -0
  353. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/docs-canonical/TEST-SPEC.md +0 -0
  354. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/package.json +0 -0
  355. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/src/api.mjs +0 -0
  356. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/src/notifier.mjs +0 -0
  357. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/src/scheduler.mjs +0 -0
  358. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/templates/demo-fixture/src/worker.mjs +0 -0
  359. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/agent-evidence.test.mjs +0 -0
  360. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/agent-readability.test.mjs +0 -0
  361. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/agent.test.mjs +0 -0
  362. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/agents-command.test.mjs +0 -0
  363. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/agents-sync.test.mjs +0 -0
  364. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/anchor-autofix.test.mjs +0 -0
  365. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/api-authority-precision.test.mjs +0 -0
  366. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/api-doc-smells.test.mjs +0 -0
  367. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/api-doc.test.mjs +0 -0
  368. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/api-surface.test.mjs +0 -0
  369. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/api-write.test.mjs +0 -0
  370. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/architecture.test.mjs +0 -0
  371. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/b7-node-env-symmetry.test.mjs +0 -0
  372. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/backup-failure.test.mjs +0 -0
  373. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/badge.test.mjs +0 -0
  374. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/baseline.test.mjs +0 -0
  375. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/canonical-docs-nested-phase2.test.mjs +0 -0
  376. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/canonical-docs-nested.test.mjs +0 -0
  377. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/canonical-sync.test.mjs +0 -0
  378. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/catalog-submission.test.mjs +0 -0
  379. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/cdk-detection.test.mjs +0 -0
  380. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/changed-only-scoping.test.mjs +0 -0
  381. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/changed-only.test.mjs +0 -0
  382. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/changelog.test.mjs +0 -0
  383. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/check-coverage.test.mjs +0 -0
  384. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/ci-reproducibility.test.mjs +0 -0
  385. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/ci-scaffolder.test.mjs +0 -0
  386. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/cross-reference.test.mjs +0 -0
  387. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/demo-command.test.mjs +0 -0
  388. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/diff-suspicion.test.mjs +0 -0
  389. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/doc-quality.test.mjs +0 -0
  390. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/doc-role-boundaries.test.mjs +0 -0
  391. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/doc-role-mapping.test.mjs +0 -0
  392. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/doc-section-synonyms.test.mjs +0 -0
  393. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/docguardignore.test.mjs +0 -0
  394. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/docs-coverage.test.mjs +0 -0
  395. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/docs-diff.test.mjs +0 -0
  396. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/docs-sync.test.mjs +0 -0
  397. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/drift.test.mjs +0 -0
  398. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/ensure-skills-idempotent.test.mjs +0 -0
  399. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/env-schema-detection.test.mjs +0 -0
  400. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/environment.test.mjs +0 -0
  401. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/explain-coverage.test.mjs +0 -0
  402. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/feedback-contributions.test.mjs +0 -0
  403. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/field-context-precision.test.mjs +0 -0
  404. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/field-diff-precision.test.mjs +0 -0
  405. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/field-report-2-cli.test.mjs +0 -0
  406. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/field-report-3-deferred.test.mjs +0 -0
  407. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/field-report-3.test.mjs +0 -0
  408. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/field-review-clarity.test.mjs +0 -0
  409. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/fix-memory.test.mjs +0 -0
  410. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/fix-suppression.test.mjs +0 -0
  411. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/fixture-projects.test.mjs +0 -0
  412. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/freshness.test.mjs +0 -0
  413. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/frontend-deep.test.mjs +0 -0
  414. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/frontend.test.mjs +0 -0
  415. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/generate-io.test.mjs +0 -0
  416. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/generated-staleness.test.mjs +0 -0
  417. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/guard-classify.test.mjs +0 -0
  418. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/guard-no-throw.test.mjs +0 -0
  419. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/history.test.mjs +0 -0
  420. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/hooks-contract.test.mjs +0 -0
  421. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/hooks.test.mjs +0 -0
  422. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/i18n.test.mjs +0 -0
  423. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/impact.test.mjs +0 -0
  424. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/init-smart-detection.test.mjs +0 -0
  425. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/instruction-audit.test.mjs +0 -0
  426. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/integrations.test.mjs +0 -0
  427. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/inventory.test.mjs +0 -0
  428. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/js-ast.test.mjs +0 -0
  429. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/junit.test.mjs +0 -0
  430. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/llms-full-pack.test.mjs +0 -0
  431. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/mcp-http.test.mjs +0 -0
  432. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/mcp.test.mjs +0 -0
  433. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/mechanical.test.mjs +0 -0
  434. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/memory-plan.test.mjs +0 -0
  435. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/metadata-sync.test.mjs +0 -0
  436. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/metrics-consistency.test.mjs +0 -0
  437. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/metrics-dedup.test.mjs +0 -0
  438. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/monorepo-scanning.test.mjs +0 -0
  439. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/multi-spec.test.mjs +0 -0
  440. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/npm-pack-smoke.test.mjs +0 -0
  441. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/nudge-hook.test.mjs +0 -0
  442. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/openapi-parse-honesty.test.mjs +0 -0
  443. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/patch-0.11.2.test.mjs +0 -0
  444. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/plan-disk-cache.test.mjs +0 -0
  445. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/profile-flag.test.mjs +0 -0
  446. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/project-type.test.mjs +0 -0
  447. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/py-ast.test.mjs +0 -0
  448. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/reference-existence.test.mjs +0 -0
  449. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/regenerate-section.test.mjs +0 -0
  450. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/report.test.mjs +0 -0
  451. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/route-field-precision.test.mjs +0 -0
  452. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/routes-express-mounts.test.mjs +0 -0
  453. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/routes-fastify.test.mjs +0 -0
  454. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/routes-multilang.test.mjs +0 -0
  455. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/routes-nextjs-app-router.test.mjs +0 -0
  456. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/sarif.test.mjs +0 -0
  457. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/schema-sync.test.mjs +0 -0
  458. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/schemas-multilang.test.mjs +0 -0
  459. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/schemas.test.mjs +0 -0
  460. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/scoping-extended.test.mjs +0 -0
  461. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/score-assurance.test.mjs +0 -0
  462. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/score-suggestions.test.mjs +0 -0
  463. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/section-na-markers.test.mjs +0 -0
  464. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/sections.test.mjs +0 -0
  465. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/security-init-injection.test.mjs +0 -0
  466. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/security.test.mjs +0 -0
  467. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/severity.test.mjs +0 -0
  468. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/shared-diff.test.mjs +0 -0
  469. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/shared-git.test.mjs +0 -0
  470. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/shared-ignore-functions.test.mjs +0 -0
  471. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/shared-ir.test.mjs +0 -0
  472. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/shared-source.test.mjs +0 -0
  473. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/speckit-bugfix.test.mjs +0 -0
  474. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/speckit-phantom.test.mjs +0 -0
  475. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/starter-scaffold.test.mjs +0 -0
  476. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/stress-test.test.mjs +0 -0
  477. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/structure.test.mjs +0 -0
  478. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/surface-sync.test.mjs +0 -0
  479. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/sweep-nudge.test.mjs +0 -0
  480. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/sync-since.test.mjs +0 -0
  481. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/sync.test.mjs +0 -0
  482. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/test-spec.test.mjs +0 -0
  483. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/todo-tracking.test.mjs +0 -0
  484. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/trace-multilang.test.mjs +0 -0
  485. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/trace-reverse.test.mjs +0 -0
  486. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/traceability-fixtures.test.mjs +0 -0
  487. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/traceability-ir.test.mjs +0 -0
  488. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/traceability.test.mjs +0 -0
  489. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/upgrade-pr-e2e.test.mjs +0 -0
  490. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/upgrade-pr.test.mjs +0 -0
  491. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/upgrade.test.mjs +0 -0
  492. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/v020-consolidation.test.mjs +0 -0
  493. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/validator-markers.test.mjs +0 -0
  494. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/validator-naming.test.mjs +0 -0
  495. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/verify-change-context.test.mjs +0 -0
  496. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/version-pin.test.mjs +0 -0
  497. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/watch-reliability.test.mjs +0 -0
  498. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/whats-new.test.mjs +0 -0
  499. {docguard_cli-0.36.0 → docguard_cli-0.36.2}/tests/worker-python-capability.test.mjs +0 -0
@@ -5110,6 +5110,152 @@
5110
5110
  "related_bugs": [],
5111
5111
  "occurrences": 1,
5112
5112
  "last_seen": "2026-09-11T20:42:23.164Z"
5113
+ },
5114
+ {
5115
+ "id": "bug-311",
5116
+ "timestamp": "2026-09-11T21:26:46.402Z",
5117
+ "error_message": "Published Spec Kit installation displayed an obsolete validator count",
5118
+ "file": "extensions/spec-kit-docguard/extension.yml",
5119
+ "root_cause": "Descriptive metadata and skill prose hardcoded a count outside synchronized documentation checks",
5120
+ "fix": "Remove the hardcoded count from all three extension surfaces and verify the published ZIP after installation",
5121
+ "tags": [
5122
+ "release",
5123
+ "metadata",
5124
+ "documentation"
5125
+ ],
5126
+ "related_bugs": [],
5127
+ "occurrences": 1,
5128
+ "last_seen": "2026-09-11T21:26:46.402Z"
5129
+ },
5130
+ {
5131
+ "id": "bug-312",
5132
+ "timestamp": "2026-09-11T21:33:22.758Z",
5133
+ "error_message": "Spec Kit verbose helper emitted malformed JSON for current CLI output",
5134
+ "file": "extensions/spec-kit-docguard/scripts/bash/docguard-check-docs.sh",
5135
+ "root_cause": "Legacy regex parsing expected compact score fields and prose guard output; CLI lookup missed installed docguard and did not quote paths",
5136
+ "fix": "Parse and validate structured JSON and exit status; prefer local installs, safely quote executable paths, and refuse implicit npx downloads",
5137
+ "tags": [
5138
+ "release",
5139
+ "json",
5140
+ "hooks"
5141
+ ],
5142
+ "related_bugs": [],
5143
+ "occurrences": 1,
5144
+ "last_seen": "2026-09-11T21:33:22.758Z"
5145
+ },
5146
+ {
5147
+ "id": "bug-313",
5148
+ "timestamp": "2026-09-13T00:29:54.315Z",
5149
+ "error_message": "Documented config remains DCV004 with docs.dirs configured",
5150
+ "file": "cli/validators/docs-coverage.mjs",
5151
+ "root_cause": "Fixed document collector discarded configuration; path construction was also treated as proof of a file",
5152
+ "fix": "Honor configured scoped document evidence; distinguish direct IO from unverified paths with paired controls",
5153
+ "tags": [
5154
+ "precision",
5155
+ "oss-assessment",
5156
+ "regression"
5157
+ ],
5158
+ "related_bugs": [],
5159
+ "occurrences": 1,
5160
+ "last_seen": "2026-09-13T00:29:54.368Z"
5161
+ },
5162
+ {
5163
+ "id": "bug-314",
5164
+ "timestamp": "2026-09-13T00:29:54.368Z",
5165
+ "error_message": "Excluded models are counted and overlapping roots duplicate one model",
5166
+ "file": "cli/validators/schema-sync.mjs",
5167
+ "root_cause": "Schema traversal did not apply file excludes or deduplicate resolved files",
5168
+ "fix": "Filter through shared ignores and deduplicate by source file, preserving equal model names in separate files",
5169
+ "tags": [
5170
+ "precision",
5171
+ "oss-assessment",
5172
+ "regression"
5173
+ ],
5174
+ "related_bugs": [],
5175
+ "occurrences": 1,
5176
+ "last_seen": "2026-09-13T00:29:54.368Z"
5177
+ },
5178
+ {
5179
+ "id": "bug-315",
5180
+ "timestamp": "2026-09-13T00:29:54.368Z",
5181
+ "error_message": "Fixture JSON containing FR-001 creates feature coverage",
5182
+ "file": "cli/commands/trace.mjs",
5183
+ "root_cause": "Feature scoring scanned arbitrary text unlike the validator",
5184
+ "fix": "Reuse positive annotation and label extraction from the validator",
5185
+ "tags": [
5186
+ "precision",
5187
+ "oss-assessment",
5188
+ "regression"
5189
+ ],
5190
+ "related_bugs": [],
5191
+ "occurrences": 1,
5192
+ "last_seen": "2026-09-13T00:29:54.368Z"
5193
+ },
5194
+ {
5195
+ "id": "bug-316",
5196
+ "timestamp": "2026-09-13T00:29:54.368Z",
5197
+ "error_message": "Freshness review emits incomplete docguard fix --doc",
5198
+ "file": "cli/commands/diagnose.mjs",
5199
+ "root_cause": "Generic repair routing converted review heuristics to document rewrites",
5200
+ "fix": "Leave freshness repair commands unset and preserve review-first guidance; executable CLI regression uses at least three Git commits",
5201
+ "tags": [
5202
+ "precision",
5203
+ "oss-assessment",
5204
+ "regression"
5205
+ ],
5206
+ "related_bugs": [],
5207
+ "occurrences": 1,
5208
+ "last_seen": "2026-09-13T00:29:54.368Z"
5209
+ },
5210
+ {
5211
+ "id": "bug-317",
5212
+ "timestamp": "2026-09-14T14:22:14.613Z",
5213
+ "error_message": "agents --check scaffolds files and invokes Spec Kit",
5214
+ "file": "cli/docguard.mjs",
5215
+ "root_cause": "The check flag bypassed neither automatic setup nor the deprecated agents alias dispatch through init",
5216
+ "fix": "Skip automatic setup and dispatch checks directly to runAgents; snapshot repositories and trap setup tooling with an explicit-setup control",
5217
+ "tags": [
5218
+ "read-only",
5219
+ "cli",
5220
+ "regression"
5221
+ ],
5222
+ "related_bugs": [],
5223
+ "occurrences": 1,
5224
+ "last_seen": "2026-09-14T14:22:14.613Z"
5225
+ },
5226
+ {
5227
+ "id": "bug-318",
5228
+ "timestamp": "2026-09-14T14:25:08.472Z",
5229
+ "error_message": "Badge CLI tests refresh generated skills in the source checkout",
5230
+ "file": "tests/commands.test.mjs",
5231
+ "root_cause": "Tests used the default repository cwd for a deprecated alias that initializes skills",
5232
+ "fix": "Run both badge cases in disposable projects using process.execPath, closed tooling PATH and test cleanup",
5233
+ "tags": [
5234
+ "tests",
5235
+ "isolation"
5236
+ ],
5237
+ "related_bugs": [
5238
+ "bug-317"
5239
+ ],
5240
+ "occurrences": 1,
5241
+ "last_seen": "2026-09-14T14:25:08.472Z"
5242
+ },
5243
+ {
5244
+ "id": "bug-319",
5245
+ "timestamp": "2026-09-14T14:57:06.826Z",
5246
+ "error_message": "Repeated requirement IDs across documents share coverage incorrectly",
5247
+ "file": "cli/validators/traceability.mjs",
5248
+ "root_cause": "Definitions and feature coverage were indexed by bare IDs across the entire project",
5249
+ "fix": "Use document-qualified definition keys and shared resolution; only unique bare IDs or exact qualified references earn credit",
5250
+ "tags": [
5251
+ "traceability",
5252
+ "false-assurance"
5253
+ ],
5254
+ "related_bugs": [
5255
+ "bug-315"
5256
+ ],
5257
+ "occurrences": 1,
5258
+ "last_seen": "2026-09-14T14:57:06.826Z"
5113
5259
  }
5114
5260
  ]
5115
5261
  }
@@ -120,3 +120,13 @@
120
120
  - **2026-09-11 (documentation trust)** — Structural score and surface alignment do not establish factual accuracy. Preserve null/unverified across score, CI, report, diagnose, and agent prompts; zero extracted claims does not prove prose correctness. Content-aware plan identity fixes stale uncommitted source results at a measurable hashing cost. Treat fixture strings separately from actual requirement annotations. Public feedback drafts carry registry metadata only; private source context stays local, and submission remains voluntary. `init --with ci` scaffolds a maintained workflow; installing a workflow does not enable branch protection. See docs-implementation/TRUST-ROADMAP.md for researched acceptance gates and deferred empirical work.
121
121
 
122
122
  - **2026-09-11 (enterprise precision)** — Compare baseline and current on identical disposable source snapshots. Keep originals untouched; concurrent consumer commits are not our changes. A lower warning total is not precision: new review scope can increase findings. OpenAPI absence is not implementation absence. Pair every exception with a true-defect control; source syntax and lexical ownership beat broad line matching. Custom doc roles need both direct-call and CLI write fences. Missing annotations leave behavioral coverage unknown; Python architecture coverage remains explicitly unsupported. Full-suite temp assertions must isolate process-owned fixtures and always clean up with ESM-safe imports. See docs-implementation/PRECISION-VALIDATION.md.
123
+
124
+ - **2026-09-11 (release verification)** — Install the actual release ZIP in a disposable Spec Kit project before updating the catalog: CLI tests and self-guard did not catch obsolete counts in extension install descriptions. Catalog draft checkboxes are evidence to fill after testing, not automatic assertions. Reuse the existing open submission issue; refresh MCP Registry identity auth when its JWT expires. Preserve published versions and use a patch release for post-publication corrections.
125
+
126
+ - **2026-09-13 — Independent OSS warning triage:** SvelteKit configured docs dirs exposed docsCoverage using a fixed collector; Django exposed schema ignores and overlapping-root duplicates; Astro showed directory construction and plain skip reasons misrepresented as factual defects. FastAPI is a neutral directory-fix holdout, not evidence of improved recall. Count setup requirements, review signals, unsupported formats and true defects separately. Feature scores must use positive annotation/label evidence rather than arbitrary fixture text; freshness diagnosis must not prescribe rewriting before intent review.
127
+
128
+ - **2026-09-14 — Read-only alias dispatch:** agents --check requires both an automatic-setup exemption and direct dispatch around runInit. Quiet/headless alone is insufficient because init installs skills independently. Regression fixtures use a closed PATH with specify and which traps, reset after intentional setup, and assert full tree snapshots plus unchanged tooling logs. Preserve normal setup as a positive control.
129
+
130
+ - **2026-09-14 — Badge test isolation:** legacy badge aliases run init and may refresh skills even when testing output. Keep their fixtures outside the source checkout; use the current Node executable and prevent global setup tooling from entering tests. Read-only audit/score tests remain separate from mutating alias tests.
131
+
132
+ - **2026-09-14 — Scoped requirement identity:** validator and feature scoring share document-qualified definitions and positive reference resolution. Bare IDs resolve only when unique; an invalid qualifier never falls back. Repeated definitions in one document collapse; cross-document IDs remain separate. Qualified paths are repository-relative with forward slashes.
@@ -7,6 +7,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.36.2] - 2026-09-14
11
+
12
+ ### Fixed
13
+
14
+ - Requirement identities include the defining document, preventing duplicate IDs across specs from sharing test coverage. Validator and feature scores share resolution; unique bare IDs remain compatible, and qualified references target exactly one document.
15
+
16
+ - Legacy badge command tests run in disposable projects with host setup tooling excluded, preventing source-checkout mutations during the test suite.
17
+
18
+ - `agents --check` preserves the repository and never bootstraps skills or invokes Spec Kit; stale managed files still exit 2, and explicit setup remains available.
19
+ - Documentation coverage honors configured documentation directories and raw role mappings, while excluded/private/symlinked documents cannot supply evidence. Reproduced against a pinned SvelteKit checkout.
20
+ - Configuration path construction and existence checks produce low-confidence review signals instead of asserting that directories are undocumented config files. Parsed comments and example strings do not establish file usage; findings identify the scanned documentation scope.
21
+ - Schema synchronization honors file exclusions and counts each source file once across overlapping roots, preserving separate models with the same name. Verified against a pinned Django checkout.
22
+ - Feature trace scoring uses the validator's explicit test annotations and labels; fixture JSON and incidental source strings no longer inflate requirement linkage. This does not yet solve duplicate requirement identities across specs.
23
+ - Diagnosis preserves freshness as a review task instead of suggesting incomplete or automatic document rewrites, and its AI prompt no longer demands removal of every warning.
24
+
25
+ ## [0.36.1] - 2026-09-11
26
+
27
+ ### Fixed
28
+
29
+ - Removed stale validator counts from the Spec Kit extension installation description, README, and repair skill. Found by installing the published v0.36.0 ZIP in a disposable Spec Kit project. The validation engine is unchanged.
30
+ - The Spec Kit verbose helper reads structured score/guard JSON, preserves PASS/WARN/FAIL, and rejects malformed reports. CLI resolution prefers local installs, quotes paths safely, and requires an installed CLI instead of fetching through npx.
31
+
32
+
10
33
  ## [0.36.0] - 2026-09-11
11
34
 
12
35
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: docguard-cli
3
- Version: 0.36.0
3
+ Version: 0.36.2
4
4
  Summary: The enforcement tool for Canonical-Driven Development (CDD). Audit, generate, and guard your project documentation. No Python dependencies (requires Node.js 18+).
5
5
  Project-URL: Homepage, https://github.com/raccioly/docguard
6
6
  Project-URL: Documentation, https://github.com/raccioly/docguard#readme
@@ -101,10 +101,8 @@ const FIX_INSTRUCTIONS = {
101
101
  autoFixable: false,
102
102
  },
103
103
  'Freshness': {
104
- action: 'Review stale documents',
105
- command: 'docguard fix --doc',
106
- llmCommand: '/docguard.fix --doc',
107
- description: 'Documents haven\'t been reviewed since recent code changes. Re-run fix --doc for each stale doc.',
104
+ action: 'Review document evidence against relevant changes',
105
+ description: 'Review signals do not establish incorrect documentation. Check whether the documentation or implementation needs a change; preserve approved intent.',
108
106
  autoFixable: false,
109
107
  },
110
108
  // ── Routed (Phase F): these used to fall through to a generic "Manual review needed" ──
@@ -257,23 +255,6 @@ export function runDiagnose(projectDir, config, flags) {
257
255
  }
258
256
  }
259
257
 
260
- // Detect stale docs from freshness and map to specific fix --doc targets
261
- for (const issue of issues) {
262
- if (issue.validator === 'Freshness' && !issue.docTarget) {
263
- const match = issue.message.match(/([\w-]+\.md)/i);
264
- if (match) {
265
- const docName = match[1].toLowerCase().replace('.md', '');
266
- const docMap = { 'architecture': 'architecture', 'data-model': 'data-model', 'security': 'security', 'test-spec': 'test-spec', 'environment': 'environment' };
267
- issue.docTarget = docMap[docName] || null;
268
- if (issue.docTarget) {
269
- issue.command = agentMode === 'llm'
270
- ? `/docguard.fix --doc ${issue.docTarget}`
271
- : `docguard fix --doc ${issue.docTarget}`;
272
- }
273
- }
274
- }
275
- }
276
-
277
258
  // ── Step 4: Output ──
278
259
  if (flags.format === 'json') {
279
260
  outputJSON(guardData, scoreData, issues);
@@ -497,7 +478,7 @@ function outputPrompt(projectDir, guardData, scoreData, issues, flags, agentMode
497
478
  } else {
498
479
  lines.push('After making all fixes, run: docguard guard');
499
480
  }
500
- lines.push('Expected result: All checks pass (0 errors, 0 warnings)');
481
+ lines.push('Expected result: Resolve verified defects; explain remaining review signals and unsupported checks. Do not rewrite correct documents merely to remove warnings.');
501
482
  lines.push(`Structural baseline: ${scoreData.score}/100. Resolve evidenced defects; verify material claims separately.`);
502
483
  lines.push('Preserve approved requirements when implementation disagrees. A higher score is not proof of factual correctness.');
503
484
 
@@ -10,6 +10,7 @@ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
10
10
  import { resolve, join, extname, basename, relative, dirname } from 'node:path';
11
11
  import { c } from '../shared.mjs';
12
12
  import { detectSpecKit } from '../scanners/speckit.mjs';
13
+ import { scanTestFilesForReferences, collectRequirementIds, resolveRequirementReferences } from '../validators/traceability.mjs';
13
14
  import { listCanonicalDocs } from '../shared-ignore.mjs';
14
15
 
15
16
  const IGNORE_DIRS = new Set([
@@ -378,7 +379,7 @@ function scanDir(rootDir, dir, files) {
378
379
  // repo-wide scores that `docguard score` produces. Deterministic signals only —
379
380
  // no LLM judgment:
380
381
  //
381
- // reqCoverage 40% FR-/SC- IDs in spec.md referenced by any test file
382
+ // reqCoverage 40% FR-/SC- IDs in spec.md explicitly annotated or labeled in test sources
382
383
  // taskCompletion 25% checked/total `- [x]` tasks in tasks.md
383
384
  // taskEvidence 20% checked tasks whose line names an existing file
384
385
  // artifactCompleteness 15% spec.md (40%) + plan.md (30%) + tasks.md (30%)
@@ -425,34 +426,21 @@ function featureBar(score) {
425
426
  }
426
427
 
427
428
  /**
428
- * Collect every FR-/SC- ID referenced anywhere in a test file, once for the
429
- * whole project. Test-file discovery mirrors the traceability validator's
430
- * scanTestFilesForReferences(): TEST_PATTERNS __tests__/ tests?/ dirs, and
431
- * any occurrence of the ID in file content counts (not just @req lines).
429
+ * Collect declared FR-/SC- test links once for the whole project, using the
430
+ * validator's source eligibility and annotation/label parser. This is positive
431
+ * linkage evidence, independent of validator findings or suppression policy.
432
432
  */
433
433
  function collectTestReferencedIds(projectDir) {
434
434
  const projectFiles = [];
435
435
  scanDir(projectDir, projectDir, projectFiles);
436
- const testFiles = projectFiles.filter(f =>
437
- TEST_PATTERNS.some(p => p.test(f)) || /__tests__\//.test(f) || /tests?\//.test(f)
438
- );
439
-
440
- const ids = new Set();
441
- for (const rel of testFiles) {
442
- let content;
443
- try { content = readFileSync(resolve(projectDir, rel), 'utf-8'); } catch { continue; }
444
- FEATURE_REQ_RE.lastIndex = 0;
445
- let m;
446
- while ((m = FEATURE_REQ_RE.exec(content)) !== null) ids.add(m[0]);
447
- }
448
- return ids;
436
+ return scanTestFilesForReferences(projectDir, projectFiles, [FEATURE_REQ_RE]);
449
437
  }
450
438
 
451
439
  /**
452
440
  * Compute the four adherence signals for one detected spec-kit feature.
453
441
  * Each signal: { applicable, value (0..1 | null), ...n/m detail fields }.
454
442
  */
455
- function computeFeatureSignals(projectDir, feature, testRefIds) {
443
+ function computeFeatureSignals(projectDir, feature, testRefIds, definitions) {
456
444
  // ── artifactCompleteness — always measurable ──
457
445
  const artifactValue = (feature.hasSpec ? 0.4 : 0)
458
446
  + (feature.hasPlan ? 0.3 : 0)
@@ -483,21 +471,11 @@ function computeFeatureSignals(projectDir, feature, testRefIds) {
483
471
  }
484
472
  }
485
473
 
486
- // ── reqCoverage — spec.md IDs that appear in ANY test file ──
487
- const specIds = [];
488
- if (feature.hasSpec && feature.specPath) {
489
- try {
490
- const spec = readFileSync(feature.specPath, 'utf-8');
491
- const seen = new Set();
492
- FEATURE_REQ_RE.lastIndex = 0;
493
- let m;
494
- while ((m = FEATURE_REQ_RE.exec(spec)) !== null) {
495
- if (!seen.has(m[0])) { seen.add(m[0]); specIds.push(m[0]); }
496
- }
497
- } catch { /* unreadable spec → no IDs */ }
498
- }
499
- const covered = specIds.filter(id => testRefIds.has(id));
500
- const uncovered = specIds.filter(id => !testRefIds.has(id));
474
+ // ── reqCoverage — spec.md IDs declared in eligible test annotations or labels ──
475
+ const specPath = feature.specPath ? relative(projectDir, feature.specPath).replaceAll('\\', '/') : null;
476
+ const specIds = [...definitions.values()].filter(def => def.file === specPath).map(def => def.id);
477
+ const covered = specIds.filter(id => testRefIds.has(`${specPath}#${id}`));
478
+ const uncovered = specIds.filter(id => !testRefIds.has(`${specPath}#${id}`));
501
479
 
502
480
  return {
503
481
  reqCoverage: {
@@ -606,10 +584,11 @@ export function runTraceFeatures(projectDir, config, flags) {
606
584
  return;
607
585
  }
608
586
 
609
- const testRefIds = collectTestReferencedIds(projectDir);
587
+ const definitions = collectRequirementIds(projectDir, config, [FEATURE_REQ_RE]);
588
+ const testRefIds = resolveRequirementReferences(definitions, collectTestReferencedIds(projectDir));
610
589
 
611
590
  const features = speckit.specs.map(f => {
612
- const signals = computeFeatureSignals(projectDir, f, testRefIds);
591
+ const signals = computeFeatureSignals(projectDir, f, testRefIds, definitions);
613
592
  const score = scoreFromSignals(signals);
614
593
  const weakest = weakestSignal(signals);
615
594
  const needsFix = weakest !== null && signals[weakest].value < 1;
@@ -652,6 +652,8 @@ async function main() {
652
652
  command !== 'setup' &&
653
653
  command !== 'init' &&
654
654
  !READ_ONLY_COMMANDS.has(command) &&
655
+ // Agent-family staleness checks must not bootstrap skills or Spec Kit.
656
+ !(command === 'agents' && flags.check) &&
655
657
  !headless
656
658
  ) {
657
659
  ensureSkills(projectDir, flags);
@@ -733,8 +735,9 @@ async function main() {
733
735
  }
734
736
  break;
735
737
  case 'agents':
736
- // v0.20: deprecated dispatches through init --with
737
- await runInit(projectDir, config, { ...flags, with: ['agents'], skipPrompts: true });
738
+ // A staleness check must bypass init's scaffolding and skill installation.
739
+ if (flags.check) runAgents(projectDir, config, flags);
740
+ else await runInit(projectDir, config, { ...flags, with: ['agents'], skipPrompts: true });
738
741
  break;
739
742
  case 'generate':
740
743
  runGenerate(projectDir, config, flags);
@@ -19,10 +19,12 @@ import { docRolePath, resolveDocRole } from '../shared-doc-roles.mjs';
19
19
  * existing tests are unaffected; guard just renders richer output.
20
20
  */
21
21
 
22
- import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
23
- import { resolve, join, relative, basename, extname } from 'node:path';
22
+ import { existsSync, readFileSync, readdirSync, statSync, lstatSync } from 'node:fs';
23
+ import { resolve, join, relative, basename, extname, isAbsolute } from 'node:path';
24
24
  import { resolveSourceRoots } from '../shared-source.mjs';
25
- import { shouldIgnore, walkFiles as sharedWalkFiles, listCanonicalDocs } from '../shared-ignore.mjs';
25
+ import { shouldIgnore, walkFiles as sharedWalkFiles, buildIgnoreFilter, mergeIgnoreFile, DEFAULT_IGNORE_DIRS } from '../shared-ignore.mjs';
26
+ import { resolveDocDirs } from '../shared.mjs';
27
+ import { parseJsTs, walk } from '../scanners/js-ast.mjs';
26
28
  import { detectIaC, hasInfrastructureHeading, buildIaCWarning } from '../scanners/iac.mjs';
27
29
  import { mkFinding, resultFromFindings } from '../findings.mjs';
28
30
 
@@ -73,7 +75,7 @@ export function validateDocsCoverage(projectDir, config) {
73
75
  let total = 0;
74
76
 
75
77
  // Collect all doc content for searching
76
- const allDocContent = collectDocContent(projectDir);
78
+ const allDocContent = collectDocContent(projectDir, config);
77
79
  if (!allDocContent) {
78
80
  // Literal legacy shape (no findings key) — tests deepEqual this exact object.
79
81
  return { errors: [], warnings: [], passed: 0, total: 0 };
@@ -172,7 +174,7 @@ function checkConfigFiles(projectDir, allDocContent, config = {}) {
172
174
  code: 'DCV001',
173
175
  validator: 'docsCoverage',
174
176
  severity: 'warn',
175
- message: `Config file "${entry}" exists but is not mentioned in any documentation. Document its purpose in ARCHITECTURE.md or README.md`,
177
+ message: `Config file "${entry}" exists but is not mentioned in scanned supported Markdown or extension YAML documentation. Document its purpose in ARCHITECTURE.md or README.md`,
176
178
  location: entry,
177
179
  suggestion: { kind: 'fix', text: 'Explain what this config file does in ARCHITECTURE.md or README.md' },
178
180
  }));
@@ -372,42 +374,60 @@ function checkIaCDocumentation(projectDir, iac, config = {}) {
372
374
  }
373
375
 
374
376
  /**
375
- * Check 4: Config files that code actually READS are documented.
376
- *
377
- * Scans source code for resolve(dir, '.configname') and existsSync('.configname')
378
- * patterns — these are configs the project USES. Avoids matching config names
379
- * sitting in arrays (scan patterns for detecting other projects' configs).
377
+ * Check 4: Distinguish direct file IO from config-like path expressions.
378
+ * Parsed calls exclude comments and example strings. Unparsed text supplies
379
+ * review candidates only; it cannot establish file IO or documentation need.
380
380
  */
381
381
  function checkCodeReferencedConfigs(projectDir, allDocContent, config = {}) {
382
382
  const findings = [];
383
383
  let passed = 0;
384
384
  let total = 0;
385
-
386
385
  const lowerDocContent = allDocContent.toLowerCase();
387
- const foundConfigs = new Set();
388
-
389
- // Only match config filenames inside function calls that actually USE the file:
390
- // resolve(dir, '.docguardignore'), existsSync('.env.example'), readFileSync('vitest.config.ts')
391
- const usageRegex = /(?:resolve|join|existsSync|readFileSync|accessSync|writeFileSync)\s*\([^)]*['"`]([^'"`\n]{2,})['"`]/g;
386
+ const foundConfigs = new Map();
387
+ const methods = new Set(['resolve', 'join', 'existsSync', 'accessSync', 'readFileSync', 'writeFileSync']);
388
+ const directIO = new Set(['readFileSync', 'writeFileSync']);
392
389
 
393
390
  const scanFile = (filePath) => {
394
- const ext = extname(filePath);
395
- if (!['.js', '.mjs', '.cjs', '.ts', '.tsx', '.jsx'].includes(ext)) return;
391
+ if (!['.js', '.mjs', '.cjs', '.ts', '.tsx', '.jsx'].includes(extname(filePath))) return;
396
392
  let content;
397
393
  try { content = readFileSync(filePath, 'utf-8'); } catch { return; }
398
-
399
- usageRegex.lastIndex = 0;
400
- let match;
401
- while ((match = usageRegex.exec(content)) !== null) {
402
- const name = match[1];
403
- // Must be a dotfile (.something) or *.config.* not a path
404
- if (name.includes('/') || name.startsWith('..')) continue;
405
- const isDotConfig = name.startsWith('.') && name.length > 2;
406
- const isNamedConfig = /^[\w-]+\.config\.\w+$/.test(name);
407
- if (!isDotConfig && !isNamedConfig) continue;
408
- // Skip bare extensions
409
- if (/^\.[a-z]{1,4}$/i.test(name)) continue;
410
- foundConfigs.add(name);
394
+ if (!/(?:resolve|join|existsSync|accessSync|readFileSync|writeFileSync)\s*\(/.test(content)) return;
395
+ // Parsing cannot yield a config candidate without a matching literal prefix.
396
+ // Keep every escaped source conservatively: escapes may encode that prefix.
397
+ if (!/['"\x60](?:\.(?![./])|[\w-]+\.config\.)|\\/.test(content)) return;
398
+ const source = relative(projectDir, filePath).split('\\').join('/');
399
+ const record = (name, method, line, parsed) => {
400
+ if (typeof name !== 'string' || name.includes('/') || name.includes('\\') || name.startsWith('..')) return;
401
+ if (!(name.startsWith('.') && name.length > 2) && !/^[\w-]+\.config\.\w+$/.test(name)) return;
402
+ if (/^\.[a-z]{1,4}$/i.test(name) || COMMON_DOTFILES.has(name)) return;
403
+ const direct = parsed && directIO.has(method);
404
+ // Prefer concrete IO when the same name also occurs in a path expression.
405
+ if (!foundConfigs.has(name) || (direct && !foundConfigs.get(name).direct)) {
406
+ foundConfigs.set(name, { direct, parsed, method, source: source + ':' + line });
407
+ }
408
+ };
409
+ const { ast, ok } = parseJsTs(content, filePath);
410
+ if (ok && !ast.errors?.length) {
411
+ walk(ast, node => {
412
+ if (node.type !== 'CallExpression') return;
413
+ const callee = node.callee;
414
+ const method = callee.type === 'Identifier' ? callee.name
415
+ : callee.type === 'MemberExpression' && !callee.computed ? callee.property.name : null;
416
+ if (!methods.has(method)) return;
417
+ // IO and existence checks use argument one as the path; join/resolve
418
+ // may supply a filename in any segment. No dynamic-path evaluation.
419
+ const args = ['join', 'resolve'].includes(method) ? node.arguments : node.arguments.slice(0, 1);
420
+ for (const arg of args) {
421
+ const value = arg.type === 'StringLiteral' ? arg.value
422
+ : arg.type === 'TemplateLiteral' && arg.expressions.length === 0 ? arg.quasis[0].value.cooked : null;
423
+ record(value, method, node.loc.start.line, true);
424
+ }
425
+ });
426
+ } else {
427
+ const pattern = /\b(resolve|join|existsSync|accessSync|readFileSync|writeFileSync)\s*\([^)]*?['"\x60]([^'"\x60\n]{2,})['"\x60]/g;
428
+ for (const match of content.matchAll(pattern)) {
429
+ record(match[2], match[1], content.slice(0, match.index).split('\n').length, false);
430
+ }
411
431
  }
412
432
  };
413
433
 
@@ -415,19 +435,26 @@ function checkCodeReferencedConfigs(projectDir, allDocContent, config = {}) {
415
435
  walkFiles(rootDir, scanFile);
416
436
  }
417
437
 
418
- for (const configName of foundConfigs) {
419
- if (COMMON_DOTFILES.has(configName)) continue;
438
+ for (const [configName, evidence] of foundConfigs) {
420
439
  total++;
421
440
  if (lowerDocContent.includes(configName.toLowerCase())) {
422
441
  passed++;
423
442
  } else {
443
+ const scope = 'scanned supported Markdown or extension YAML documentation';
444
+ const context = evidence.parsed ? evidence.method + ' call' : 'unparsed source text (parser unavailable or failed)';
424
445
  findings.push(mkFinding({
425
446
  code: 'DCV004',
426
447
  validator: 'docsCoverage',
427
448
  severity: 'warn',
428
- message: `Code references config file "${configName}" but no documentation mentions it. Add it to README.md or ARCHITECTURE.md`,
449
+ confidence: evidence.direct ? 'high' : 'low',
450
+ message: evidence.direct
451
+ ? 'Direct ' + context + ' references config file "' + configName + '" at ' + evidence.source + ', but it is not mentioned in ' + scope + '.'
452
+ : 'Config-like path "' + configName + '" appears in ' + context + ' at ' + evidence.source + '; file use and documentation need are unverified. No mention was found in ' + scope + '.',
453
+ // Preserve the published filename location; source context is in the message.
429
454
  location: configName,
430
- suggestion: { kind: 'fix', text: 'Describe this config file (purpose and format) in README.md or ARCHITECTURE.md' },
455
+ suggestion: evidence.direct
456
+ ? { kind: 'fix', text: 'Describe this config file (purpose and format) in a supported documentation file' }
457
+ : { kind: 'review', text: 'Inspect this source reference: it may be a directory, generated output, or example. Document it only if appropriate.' },
431
458
  }));
432
459
  }
433
460
  }
@@ -500,36 +527,59 @@ function checkReadmeSections(projectDir) {
500
527
  /**
501
528
  * Collect all documentation content into a single searchable string.
502
529
  */
503
- function collectDocContent(projectDir) {
504
- const docPaths = [];
505
-
506
- const rootDocs = ['README.md', 'AGENTS.md', 'CLAUDE.md', 'CONTRIBUTING.md', 'STANDARD.md'];
507
- for (const doc of rootDocs) {
508
- const p = resolve(projectDir, doc);
509
- if (existsSync(p)) docPaths.push(p);
510
- }
511
-
512
- for (const doc of listCanonicalDocs(projectDir)) docPaths.push(doc.abs); // recursive
513
-
514
- const extDir = resolve(projectDir, 'extensions');
515
- if (existsSync(extDir)) {
516
- walkFiles(extDir, (f) => {
517
- if (f.endsWith('.md') || f.endsWith('.yml') || f.endsWith('.yaml')) {
518
- docPaths.push(f);
530
+ function collectDocContent(projectDir, config = {}) {
531
+ const docPaths = new Set();
532
+ const visited = new Set();
533
+ const isIgnored = buildIgnoreFilter(mergeIgnoreFile(projectDir, { ...config }).ignore);
534
+
535
+ // Check every ancestor before traversal: the shared walker follows symlinks.
536
+ // Explicit homes must remain scoped inside the project, including private aliases.
537
+ const safePath = (path) => {
538
+ const normalized = path.replace(/\\/g, '/');
539
+ if (isAbsolute(normalized) || /^[A-Za-z]:/.test(normalized) || normalized.includes('\0')) return null;
540
+ const parts = normalized.split('/').filter(p => p && p !== '.');
541
+ if (!parts.length || parts.some(p => p === '..' || ['.local', '.git'].includes(p.toLowerCase())
542
+ || /^\.env(?:\.|$)/i.test(p) || DEFAULT_IGNORE_DIRS.has(p) || IGNORE_DIRS.has(p))) return null;
543
+ let current = resolve(projectDir);
544
+ let rel = '';
545
+ try {
546
+ for (const part of parts) {
547
+ rel = rel ? rel + '/' + part : part;
548
+ if (isIgnored(rel) || isIgnored(rel + '/')) return null;
549
+ current = join(current, part);
550
+ if (lstatSync(current).isSymbolicLink()) return null;
519
551
  }
520
- });
521
- }
522
-
523
- for (const docsDir of ['docs', 'docs-implementation']) {
524
- const d = resolve(projectDir, docsDir);
525
- if (existsSync(d)) {
526
- walkFiles(d, (f) => {
527
- if (f.endsWith('.md')) docPaths.push(f);
528
- });
552
+ return current;
553
+ } catch { return null; }
554
+ };
555
+ const addDoc = (rel) => {
556
+ const abs = safePath(rel);
557
+ if (abs && lstatSync(abs).isFile()) docPaths.add(abs);
558
+ };
559
+ const walkDocs = (rel) => {
560
+ const dir = safePath(rel);
561
+ if (!dir || visited.has(dir)) return;
562
+ visited.add(dir);
563
+ let entries;
564
+ try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return; }
565
+ for (const entry of entries) {
566
+ if (entry.isSymbolicLink()) continue;
567
+ const path = relative(projectDir, join(dir, entry.name)).split('\\').join('/');
568
+ if (entry.isDirectory() && !entry.name.startsWith('.')) walkDocs(path);
569
+ else if (entry.isFile() && (/\.md$/i.test(entry.name)
570
+ || (path.startsWith('extensions/') && /\.ya?ml$/i.test(entry.name)))) addDoc(path);
529
571
  }
572
+ };
573
+
574
+ for (const doc of ['README.md', 'AGENTS.md', 'CLAUDE.md', 'CONTRIBUTING.md', 'STANDARD.md']) addDoc(doc);
575
+ for (const dir of resolveDocDirs(projectDir, config)) walkDocs(dir);
576
+ // Resolve roles directly so raw callers get the same boundaries as loadConfig.
577
+ for (const role of Object.keys(config.docs?.roles || {})) {
578
+ const abs = resolveDocRole(projectDir, config, role);
579
+ addDoc(relative(projectDir, abs));
530
580
  }
531
581
 
532
- if (docPaths.length === 0) return null;
582
+ if (docPaths.size === 0) return null;
533
583
  const parts = [];
534
584
  for (const p of docPaths) {
535
585
  try { parts.push(readFileSync(p, 'utf-8')); } catch { /* skip */ }