docguard-cli 0.17.0__tar.gz → 0.18.1__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 (310) hide show
  1. {docguard_cli-0.17.0/extensions/spec-kit-docguard → docguard_cli-0.18.1/.agent}/skills/docguard-fix/SKILL.md +2 -2
  2. {docguard_cli-0.17.0/extensions/spec-kit-docguard → docguard_cli-0.18.1/.agent}/skills/docguard-guard/SKILL.md +2 -2
  3. {docguard_cli-0.17.0/extensions/spec-kit-docguard → docguard_cli-0.18.1/.agent}/skills/docguard-review/SKILL.md +2 -2
  4. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/docguard-score/SKILL.md +2 -2
  5. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/docguard-sync/SKILL.md +1 -1
  6. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/CHANGELOG.md +76 -0
  7. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/PKG-INFO +1 -1
  8. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/diff.mjs +19 -11
  9. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/guard.mjs +46 -0
  10. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/score.mjs +65 -0
  11. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/memory-plan.mjs +127 -15
  12. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/environment.mjs +6 -4
  13. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/generated-staleness.mjs +56 -2
  14. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/extension.yml +1 -1
  15. {docguard_cli-0.17.0/.agent → docguard_cli-0.18.1/extensions/spec-kit-docguard}/skills/docguard-fix/SKILL.md +2 -2
  16. {docguard_cli-0.17.0/.agent → docguard_cli-0.18.1/extensions/spec-kit-docguard}/skills/docguard-guard/SKILL.md +2 -2
  17. {docguard_cli-0.17.0/.agent → docguard_cli-0.18.1/extensions/spec-kit-docguard}/skills/docguard-review/SKILL.md +2 -2
  18. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/skills/docguard-score/SKILL.md +2 -2
  19. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/skills/docguard-sync/SKILL.md +1 -1
  20. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/package.json +1 -1
  21. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/pyproject.toml +1 -1
  22. docguard_cli-0.18.1/tests/b7-node-env-symmetry.test.mjs +97 -0
  23. docguard_cli-0.18.1/tests/plan-disk-cache.test.mjs +119 -0
  24. docguard_cli-0.18.1/tests/upgrade-pr-e2e.test.mjs +153 -0
  25. docguard_cli-0.18.1/tests/whats-new.test.mjs +65 -0
  26. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.analyze.md +0 -0
  27. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.checklist.md +0 -0
  28. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.clarify.md +0 -0
  29. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.constitution.md +0 -0
  30. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.implement.md +0 -0
  31. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.plan.md +0 -0
  32. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.specify.md +0 -0
  33. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.tasks.md +0 -0
  34. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/commands/speckit.taskstoissues.md +0 -0
  35. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-analyze/SKILL.md +0 -0
  36. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-checklist/SKILL.md +0 -0
  37. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-clarify/SKILL.md +0 -0
  38. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-constitution/SKILL.md +0 -0
  39. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-implement/SKILL.md +0 -0
  40. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-plan/SKILL.md +0 -0
  41. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-specify/SKILL.md +0 -0
  42. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-tasks/SKILL.md +0 -0
  43. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.agent/skills/speckit-taskstoissues/SKILL.md +0 -0
  44. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.docguard.json +0 -0
  45. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.docguardignore +0 -0
  46. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  47. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  48. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/dependabot.yml +0 -0
  49. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/scripts/patch-catalog.py +0 -0
  50. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/workflows/ci.yml +0 -0
  51. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/workflows/release.yml +0 -0
  52. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/workflows/supply-chain.yml +0 -0
  53. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.github/workflows/sync-speckit-catalog.yml +0 -0
  54. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.gitignore +0 -0
  55. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.jules/bolt.md +0 -0
  56. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.jules/palette.md +0 -0
  57. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.jules/sentinel.md +0 -0
  58. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.npmignore +0 -0
  59. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.npmrc +0 -0
  60. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/extensions/.cache/catalog-ebf165086500aab1-metadata.json +0 -0
  61. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/extensions/.cache/catalog-ebf165086500aab1.json +0 -0
  62. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/extensions/.cache/catalog-metadata.json +0 -0
  63. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/extensions/.cache/catalog.json +0 -0
  64. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/init-options.json +0 -0
  65. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/memory/constitution.md +0 -0
  66. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  67. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/scripts/bash/common.sh +0 -0
  68. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/scripts/bash/create-new-feature.sh +0 -0
  69. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/scripts/bash/setup-plan.sh +0 -0
  70. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/scripts/bash/update-agent-context.sh +0 -0
  71. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/templates/agent-file-template.md +0 -0
  72. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/templates/checklist-template.md +0 -0
  73. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/templates/constitution-template.md +0 -0
  74. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/templates/plan-template.md +0 -0
  75. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/templates/spec-template.md +0 -0
  76. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/.specify/templates/tasks-template.md +0 -0
  77. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/AGENTS.md +0 -0
  78. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/CODE_OF_CONDUCT.md +0 -0
  79. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/COMPARISONS.md +0 -0
  80. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/CONTRIBUTING.md +0 -0
  81. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/DRIFT-LOG.md +0 -0
  82. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/LICENSE +0 -0
  83. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/PHILOSOPHY.md +0 -0
  84. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/README.md +0 -0
  85. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/ROADMAP.md +0 -0
  86. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/SECURITY.md +0 -0
  87. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/STANDARD.md +0 -0
  88. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/SUPPLY-CHAIN-AUDIT.md +0 -0
  89. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/SUPPORT.md +0 -0
  90. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/action.yml +0 -0
  91. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/agents.mjs +0 -0
  92. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/badge.mjs +0 -0
  93. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/ci.mjs +0 -0
  94. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/diagnose.mjs +0 -0
  95. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/explain.mjs +0 -0
  96. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/fix.mjs +0 -0
  97. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/generate.mjs +0 -0
  98. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/hooks.mjs +0 -0
  99. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/impact.mjs +0 -0
  100. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/init.mjs +0 -0
  101. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/llms.mjs +0 -0
  102. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/memory.mjs +0 -0
  103. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/publish.mjs +0 -0
  104. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/setup.mjs +0 -0
  105. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/sync.mjs +0 -0
  106. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/trace.mjs +0 -0
  107. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/upgrade.mjs +0 -0
  108. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/commands/watch.mjs +0 -0
  109. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/docguard.mjs +0 -0
  110. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/ensure-skills.mjs +0 -0
  111. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/api-doc.mjs +0 -0
  112. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/cdk.mjs +0 -0
  113. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/doc-tools.mjs +0 -0
  114. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/frontend.mjs +0 -0
  115. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/iac.mjs +0 -0
  116. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/integrations.mjs +0 -0
  117. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/project-type.mjs +0 -0
  118. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/routes.mjs +0 -0
  119. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/schemas.mjs +0 -0
  120. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/scanners/speckit.mjs +0 -0
  121. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/shared-git.mjs +0 -0
  122. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/shared-ignore.mjs +0 -0
  123. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/shared-source.mjs +0 -0
  124. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/shared.mjs +0 -0
  125. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/api-surface.mjs +0 -0
  126. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/architecture.mjs +0 -0
  127. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/changelog.mjs +0 -0
  128. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/cross-reference.mjs +0 -0
  129. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/doc-quality.mjs +0 -0
  130. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/docs-coverage.mjs +0 -0
  131. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/docs-diff.mjs +0 -0
  132. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/docs-sync.mjs +0 -0
  133. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/drift.mjs +0 -0
  134. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/freshness.mjs +0 -0
  135. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/metadata-sync.mjs +0 -0
  136. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/metrics-consistency.mjs +0 -0
  137. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/schema-sync.mjs +0 -0
  138. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/security.mjs +0 -0
  139. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/structure.mjs +0 -0
  140. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/test-spec.mjs +0 -0
  141. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/todo-tracking.mjs +0 -0
  142. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/validators/traceability.mjs +0 -0
  143. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/writers/api-reference.mjs +0 -0
  144. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/writers/fix-memory.mjs +0 -0
  145. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/writers/mechanical.mjs +0 -0
  146. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/cli/writers/sections.mjs +0 -0
  147. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/commands/docguard.fix.md +0 -0
  148. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/commands/docguard.guard.md +0 -0
  149. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/commands/docguard.review.md +0 -0
  150. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/commands/docguard.score.md +0 -0
  151. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/configs/fastify.json +0 -0
  152. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/configs/generic.json +0 -0
  153. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/configs/nextjs.json +0 -0
  154. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/configs/python.json +0 -0
  155. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docguard_cli/__init__.py +0 -0
  156. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docguard_cli/wrapper.py +0 -0
  157. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/ai-integration.md +0 -0
  158. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/commands.md +0 -0
  159. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/configuration.md +0 -0
  160. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/doc-sections.md +0 -0
  161. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/faq.md +0 -0
  162. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/installation.md +0 -0
  163. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/profiles.md +0 -0
  164. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs/quickstart.md +0 -0
  165. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs-canonical/ARCHITECTURE.md +0 -0
  166. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs-canonical/CI-RECIPES.md +0 -0
  167. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs-canonical/DATA-MODEL.md +0 -0
  168. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs-canonical/ENVIRONMENT.md +0 -0
  169. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs-canonical/SECURITY.md +0 -0
  170. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/docs-canonical/TEST-SPEC.md +0 -0
  171. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/01-express-api/README.md +0 -0
  172. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/01-express-api/package.json +0 -0
  173. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/01-express-api/server.js +0 -0
  174. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/02-python-flask/README.md +0 -0
  175. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/02-python-flask/app.py +0 -0
  176. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/02-python-flask/docs-canonical/ARCHITECTURE.md +0 -0
  177. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/02-python-flask/requirements.txt +0 -0
  178. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/03-spec-kit-project/CHANGELOG.md +0 -0
  179. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/03-spec-kit-project/README.md +0 -0
  180. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/03-spec-kit-project/docs-canonical/ARCHITECTURE.md +0 -0
  181. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/03-spec-kit-project/docs-canonical/TEST-SPEC.md +0 -0
  182. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/03-spec-kit-project/package.json +0 -0
  183. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/03-spec-kit-project/src/index.js +0 -0
  184. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/03-spec-kit-project/tests/basic.test.js +0 -0
  185. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/examples/README.md +0 -0
  186. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/LICENSE +0 -0
  187. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/README.md +0 -0
  188. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/diagnose.md +0 -0
  189. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/fix.md +0 -0
  190. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/generate.md +0 -0
  191. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/guard.md +0 -0
  192. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/init.md +0 -0
  193. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/score.md +0 -0
  194. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/sync.md +0 -0
  195. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/commands/trace.md +0 -0
  196. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/scripts/bash/common.sh +0 -0
  197. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/scripts/bash/docguard-check-docs.sh +0 -0
  198. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/scripts/bash/docguard-init-doc.sh +0 -0
  199. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/scripts/bash/docguard-suggest-fix.sh +0 -0
  200. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/templates/extensions.yml +0 -0
  201. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/templates/github-workflows/docguard-autofix.yml +0 -0
  202. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/extensions/spec-kit-docguard/templates/github-workflows/docguard-guard.yml +0 -0
  203. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/pr_description.md +0 -0
  204. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/schemas/docguard-config.schema.json +0 -0
  205. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/001-fix-ignore-validators/plan.md +0 -0
  206. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/001-fix-ignore-validators/spec.md +0 -0
  207. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/001-fix-ignore-validators/tasks.md +0 -0
  208. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/002-fix-test-discovery/plan.md +0 -0
  209. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/002-fix-test-discovery/spec.md +0 -0
  210. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/002-fix-test-discovery/tasks.md +0 -0
  211. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/003-v011-false-positives/plan.md +0 -0
  212. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/003-v011-false-positives/spec.md +0 -0
  213. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/specs/003-v011-false-positives/tasks.md +0 -0
  214. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/ADR.md.template +0 -0
  215. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/AGENTS.md.template +0 -0
  216. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/ARCHITECTURE.md.template +0 -0
  217. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/CHANGELOG.md.template +0 -0
  218. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/CURRENT-STATE.md.template +0 -0
  219. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/DATA-MODEL.md.template +0 -0
  220. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/DEPLOYMENT.md.template +0 -0
  221. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/DRIFT-LOG.md.template +0 -0
  222. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/ENVIRONMENT.md.template +0 -0
  223. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/KNOWN-GOTCHAS.md.template +0 -0
  224. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/REQUIREMENTS.md.template +0 -0
  225. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/ROADMAP.md.template +0 -0
  226. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/RUNBOOKS.md.template +0 -0
  227. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/SECURITY.md.template +0 -0
  228. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/TEST-SPEC.md.template +0 -0
  229. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/TROUBLESHOOTING.md.template +0 -0
  230. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/VENDOR-BUGS.md.template +0 -0
  231. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/ci/github-actions.yml +0 -0
  232. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/commands/docguard.fix.md +0 -0
  233. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/commands/docguard.guard.md +0 -0
  234. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/commands/docguard.init.md +0 -0
  235. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/commands/docguard.review.md +0 -0
  236. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/templates/commands/docguard.update.md +0 -0
  237. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/test-draft.js +0 -0
  238. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/test-metrics.js +0 -0
  239. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/anchor-autofix.test.mjs +0 -0
  240. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/api-doc.test.mjs +0 -0
  241. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/api-surface.test.mjs +0 -0
  242. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/api-write.test.mjs +0 -0
  243. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/architecture.test.mjs +0 -0
  244. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/backup-failure.test.mjs +0 -0
  245. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/cdk-detection.test.mjs +0 -0
  246. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/changed-only-scoping.test.mjs +0 -0
  247. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/changed-only.test.mjs +0 -0
  248. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/changelog.test.mjs +0 -0
  249. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/commands.test.mjs +0 -0
  250. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/cross-reference.test.mjs +0 -0
  251. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/doc-quality.test.mjs +0 -0
  252. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/docguardignore.test.mjs +0 -0
  253. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/docs-coverage.test.mjs +0 -0
  254. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/docs-diff.test.mjs +0 -0
  255. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/docs-sync.test.mjs +0 -0
  256. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/drift.test.mjs +0 -0
  257. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/environment.test.mjs +0 -0
  258. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/fix-memory.test.mjs +0 -0
  259. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/fix-suppression.test.mjs +0 -0
  260. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/fixture-projects.test.mjs +0 -0
  261. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/freshness.test.mjs +0 -0
  262. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/frontend-deep.test.mjs +0 -0
  263. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/frontend.test.mjs +0 -0
  264. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/generated-staleness.test.mjs +0 -0
  265. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/guard-classify.test.mjs +0 -0
  266. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/guard-no-throw.test.mjs +0 -0
  267. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/hooks.test.mjs +0 -0
  268. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/i18n.test.mjs +0 -0
  269. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/impact.test.mjs +0 -0
  270. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/integrations.test.mjs +0 -0
  271. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/mechanical.test.mjs +0 -0
  272. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/memory-plan.test.mjs +0 -0
  273. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/metadata-sync.test.mjs +0 -0
  274. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/metrics-consistency.test.mjs +0 -0
  275. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/metrics-dedup.test.mjs +0 -0
  276. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/monorepo-scanning.test.mjs +0 -0
  277. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/multi-spec.test.mjs +0 -0
  278. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/patch-0.11.2.test.mjs +0 -0
  279. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/profile-flag.test.mjs +0 -0
  280. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/project-type.test.mjs +0 -0
  281. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/regenerate-section.test.mjs +0 -0
  282. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/routes-multilang.test.mjs +0 -0
  283. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/schema-sync.test.mjs +0 -0
  284. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/schemas-multilang.test.mjs +0 -0
  285. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/schemas.test.mjs +0 -0
  286. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/scoping-extended.test.mjs +0 -0
  287. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/section-na-markers.test.mjs +0 -0
  288. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/sections.test.mjs +0 -0
  289. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/security.test.mjs +0 -0
  290. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/severity.test.mjs +0 -0
  291. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/shared-git.test.mjs +0 -0
  292. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/shared-source.test.mjs +0 -0
  293. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/stress-test.test.mjs +0 -0
  294. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/structure.test.mjs +0 -0
  295. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/sweep-nudge.test.mjs +0 -0
  296. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/sync-since.test.mjs +0 -0
  297. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/sync.test.mjs +0 -0
  298. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/test-spec.test.mjs +0 -0
  299. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/todo-tracking.test.mjs +0 -0
  300. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/trace-multilang.test.mjs +0 -0
  301. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/trace-reverse.test.mjs +0 -0
  302. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/traceability.test.mjs +0 -0
  303. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/upgrade-pr.test.mjs +0 -0
  304. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/upgrade.test.mjs +0 -0
  305. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/validator-naming.test.mjs +0 -0
  306. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/tests/version-pin.test.mjs +0 -0
  307. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/vscode-extension/.vscodeignore +0 -0
  308. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/vscode-extension/README.md +0 -0
  309. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/vscode-extension/extension.js +0 -0
  310. {docguard_cli-0.17.0 → docguard_cli-0.18.1}/vscode-extension/package.json +0 -0
@@ -6,10 +6,10 @@ description: AI-driven documentation repair with structured research workflow, t
6
6
  compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
7
7
  metadata:
8
8
  author: docguard
9
- version: 0.17.0
9
+ version: 0.18.1
10
10
  source: extensions/spec-kit-docguard/skills/docguard-fix
11
11
  ---
12
- <!-- docguard:version: 0.17.0 -->
12
+ <!-- docguard:version: 0.18.1 -->
13
13
 
14
14
  # DocGuard Fix Skill
15
15
 
@@ -7,10 +7,10 @@ description: Run DocGuard guard validation against Canonical-Driven Development
7
7
  compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
8
8
  metadata:
9
9
  author: docguard
10
- version: 0.17.0
10
+ version: 0.18.1
11
11
  source: extensions/spec-kit-docguard/skills/docguard-guard
12
12
  ---
13
- <!-- docguard:version: 0.17.0 -->
13
+ <!-- docguard:version: 0.18.1 -->
14
14
 
15
15
  # DocGuard Guard Skill
16
16
 
@@ -6,10 +6,10 @@ description: Cross-document consistency analysis and quality assessment. Perform
6
6
  compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
7
7
  metadata:
8
8
  author: docguard
9
- version: 0.17.0
9
+ version: 0.18.1
10
10
  source: extensions/spec-kit-docguard/skills/docguard-review
11
11
  ---
12
- <!-- docguard:version: 0.17.0 -->
12
+ <!-- docguard:version: 0.18.1 -->
13
13
 
14
14
  # DocGuard Review Skill
15
15
 
@@ -6,10 +6,10 @@ description: CDD maturity assessment with category-aware improvement roadmap. Ru
6
6
  compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
7
7
  metadata:
8
8
  author: docguard
9
- version: 0.17.0
9
+ version: 0.18.1
10
10
  source: extensions/spec-kit-docguard/skills/docguard-score
11
11
  ---
12
- <!-- docguard:version: 0.17.0 -->
12
+ <!-- docguard:version: 0.18.1 -->
13
13
 
14
14
  # DocGuard Score Skill
15
15
 
@@ -4,7 +4,7 @@ description: Keep canonical documentation ALWAYS UP TO DATE. Refreshes code-trut
4
4
  compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
5
5
  metadata:
6
6
  author: docguard
7
- version: 0.17.0
7
+ version: 0.18.1
8
8
  source: extensions/spec-kit-docguard/skills/docguard-sync
9
9
  ---
10
10
 
@@ -7,6 +7,82 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.18.1] - 2026-05-26
11
+
12
+ Hotfix: v0.18.0 publish failed because the new `upgrade --pr` end-to-end test (which used a shell-script stub `gh`) was platform-specific — passed on macOS, failed on Linux CI runners due to interaction with the runner's existing `/usr/bin/gh`. Gated the test behind `E2E=1` (same pattern as the stress test) so the regular CI suite stays green. The production `upgrade --pr` code path is still covered by `tests/upgrade-pr.test.mjs`. v0.19 will switch to a Node-based gh stub.
13
+
14
+ All v0.18.0 features ship intact:
15
+ - P1 Generated-Staleness fast-path (30% faster guard)
16
+ - P2 cross-process plan cache (.docguard/plan.cache.json)
17
+ - P3 `score --diff` per-category drill-down
18
+ - P4 upgrade-pr battle-test (now opt-in via E2E=1)
19
+
20
+ ## [0.18.0] - 2026-05-26
21
+
22
+ Performance + drill-down release. Closes the four v0.18 backlog items:
23
+ Generated-Staleness fast-path (**30% faster guard runs**), cross-process
24
+ plan cache, `score --diff` drill-down, and an end-to-end battle-test for
25
+ `upgrade --apply --pr`. **546 tests** (was 537, +9). 22 validators.
26
+
27
+ ### Performance
28
+
29
+ - **P1 — Generated-Staleness fast-path.** The validator used to call `buildMemoryPlan` (~400ms) on EVERY guard run, even on projects with no `<!-- docguard:section source=code -->` markers and no `status: draft` docs (i.e. most projects today). New cheap pre-flight: scan canonical docs for either signal first; if neither is present, return N/A in <5ms. **Result on the client repo: total validator time 1431ms → 998ms — a 30% reduction.** Generated-Staleness dropped from "slowest validator at 26-33% of guard time" to "doesn't appear in the slow-list at all".
30
+ - **P2 — Cross-process plan cache (`.docguard/plan.cache.json`).** The v0.15-P1 in-process cache only helped within a single process. CI flows that run guard → sync → fix as separate processes each rebuilt the plan. v0.18 adds a disk-backed L2 cache keyed by a tree-state hash (git HEAD + manifest mtimes). Cache invalidates automatically when source files change. Disabled with `config.diskCache: false`; survives corrupt files silently; never the only cache layer — L1 (in-process) still wins for same-run flows. Cuts the typical 3-step CI flow from 3× to 1× build time.
31
+
32
+ ### Added
33
+
34
+ - **P3 — `docguard score --diff` per-category drill-down.** Symmetric to v0.17's `memory --diff`. The score headline ("Architecture: 80/100") used to require source-spelunking to understand. New `--diff` mode joins the score categories to live guard validator warnings and shows the underlying errors/warnings per weak category. Cap of 5 per category + "N more" pointer. Plus an inline tip: `docguard explain "<warning>"` for full per-warning help.
35
+
36
+ ### Internal
37
+
38
+ - **P4 — End-to-end battle-test for `upgrade --apply --pr`.** The v0.14-P4 PR flow shipped without ever being exercised end-to-end. New `tests/upgrade-pr-e2e.test.mjs` wires up a local bare-repo remote + a stub `gh` binary on a fresh PATH directory and asserts: branch created, migration applied, commit landed on remote, `gh pr create` invoked with `--title` + `--body`. No real GitHub credentials needed; lives in regular CI from now on.
39
+ - **3 new test files**: `tests/plan-disk-cache.test.mjs` (7), `tests/upgrade-pr-e2e.test.mjs` (2). Existing test suites already covered Generated-Staleness and score behavior. **Total: 537 → 546 tests (+9 new).**
40
+ - **New helpers** in `cli/scanners/memory-plan.mjs`: `_treeStateHash`, `_readDiskCache`, `_writeDiskCache`, `_DISK_CACHE_PATH`, `_DISK_CACHE_VERSION`.
41
+ - **New helpers** in `cli/validators/generated-staleness.mjs`: `_quickScan` (cheap marker pre-flight).
42
+ - **New helpers** in `cli/commands/score.mjs`: `_SCORE_TO_VALIDATORS` mapping, `_showScoreDiff`.
43
+ - **`buildMemoryPlan` cache strategy**: L1 (per-process Map) → L2 (per-tree disk file) → fresh build. Tree-state hash uses `git rev-parse HEAD` + manifest mtimes (package.json, pyproject.toml, Cargo.toml, etc.) for invalidation.
44
+ - **Dry-run on client repo**: env accuracy still 80/82, 672/672 PASS, validator time 1431ms → 998ms.
45
+ - No new NPM deps.
46
+
47
+ ### Backlog for v0.19
48
+
49
+ - **F6** stale score cache (still low repro confidence)
50
+ - Deeper Generated-Staleness optimization for projects that DO use markers (the v0.18 fast-path only helps projects without)
51
+ - README polish — the README has aged through ~14 releases and could use a refresh
52
+ - A pre-release smoke gate that runs against multiple synthetic fixture projects before publishing
53
+
54
+ ## [0.17.1] - 2026-05-26
55
+
56
+ Patch responding to a client-project feedback round: 1 real bug (B-7) and
57
+ a discoverability improvement that helps users on older versions find the
58
+ features they're asking for. **537 tests** (was 530, +7). 22 validators.
59
+
60
+ ### Fixed
61
+
62
+ - **B-7: `diff` and `guard.Environment` disagreed on env-var coverage.** My v0.16-P4 `SYSTEM_ENV_VARS` denylist was over-broad: `NODE_ENV`, `CI`, `GITHUB_TOKEN`, `GITHUB_REF`, `GITHUB_SHA` are legitimately app env vars (apps read `process.env.NODE_ENV` for production/dev branching, `process.env.CI` to detect CI runs, etc.). The denylist stripped them from the doc side of `diff` only, so a project that documented `NODE_ENV` in BOTH `ENVIRONMENT.md` AND `.env.example` would correctly pass the `Environment` validator but `diff` would falsely flag it as "in code but not documented". Trimmed the denylist to truly-system-only vars (PATH, HOME, SHELL, TERM, etc. — the names no sane app would treat as runtime config). Reported by the client project running v0.16.0; their env-var accuracy went 79/82 → 80/82 with the bogus `NODE_ENV` flag gone. New `tests/b7-node-env-symmetry.test.mjs` locks in the symmetry.
63
+
64
+ ### Added
65
+
66
+ - **What's-new highlights on the guard footer.** When `.docguard.json` carries a `docguardVersion` pin and the running CLI is newer, the guard footer now prints a short "New since v<pin>" list of headline features from intermediate releases. Top 5 inline, "N more in CHANGELOG.md" pointer when there's more. Closes the recurring pattern of users asking for features that shipped one or two releases ago — `sync --since`, `docguard impact`, `docguard explain`, `memory --diff`, `--quiet`, and Cross-Reference anchor hints all appear in the table.
67
+
68
+ ### Note to readers asking about S-1, S-11, S-12
69
+
70
+ These three features are **already shipped** as of the listed releases. The v0.17.1 what's-new nudge surfaces them inline for any project still pinned to v0.12 or earlier. Quick recap:
71
+
72
+ - **S-1: `docguard sync --since <ref>`** — shipped in **v0.13.0** as L-1. Refreshes only canonical doc sections touched by code changes in the diff range. Run `docguard sync --write --since main` on a feature branch to skip unrelated doc churn.
73
+ - **S-11: `docguard impact --since <ref>`** — shipped in **v0.13.1**. Post-commit "changed files → affected canonical doc sections" map. Run `docguard impact --since HEAD~1` after a commit; JSON mode for CI bots.
74
+ - **S-12: Anchor "did you mean...?" hints** — shipped in **v0.13.1** + extended in **v0.14.1** so high-confidence matches (edit distance ≤ 2, single close candidate) are now `[auto-fixable]` via `docguard fix --write`.
75
+
76
+ Upgrade with `docguard upgrade --apply` or `npm i -g docguard-cli@latest` to pick them up.
77
+
78
+ ### Internal
79
+
80
+ - **2 new test files**: `tests/b7-node-env-symmetry.test.mjs` (4 — diff/validator symmetry), `tests/whats-new.test.mjs` (3 — highlights surface). **Total: 530 → 537 tests (+7 new).**
81
+ - **`SYSTEM_ENV_VARS`** trimmed in both `cli/commands/diff.mjs` and `cli/validators/environment.mjs` (single source of truth would be better; deferred).
82
+ - **New highlight table** `_RELEASE_HIGHLIGHTS` in `cli/commands/guard.mjs` — add an entry per release going forward.
83
+ - **Dry-run on the client project**: env accuracy 80/82, the 2 remaining mismatches are genuine doc-only drift (not bugs in our tool). Full guard still 672/672 PASS.
84
+ - No new NPM deps.
85
+
10
86
  ## [0.17.0] - 2026-05-26
11
87
 
12
88
  Feature release picking up the 4 deferred items from v0.16 — **reproducibility
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docguard-cli
3
- Version: 0.17.0
3
+ Version: 0.18.1
4
4
  Summary: The enforcement tool for Canonical-Driven Development (CDD). Audit, generate, and guard your project documentation. Zero dependencies.
5
5
  Project-URL: Homepage, https://github.com/raccioly/docguard
6
6
  Project-URL: Documentation, https://github.com/raccioly/docguard#readme
@@ -200,23 +200,31 @@ export function diffEntities(dir, config = {}) {
200
200
  };
201
201
  }
202
202
 
203
- // v0.16-P4: common system environment variables that get backticked in
204
- // prose ("the venv `PATH`", "your `HOME` directory") but are NEVER user-set
205
- // application env vars. Excluding them from the docVars set kills the
206
- // false-positive class reported by the Python user where `PATH` was flagged
207
- // as "documented-but-not-implemented".
203
+ // v0.16-P4 (revised in v0.17.1): conservative denylist of system env vars
204
+ // that appear in prose ("the venv `PATH`") but are never user-set app env
205
+ // vars. v0.17.1-B7: trimmed to TRULY-system-only after wu feedback
206
+ // NODE_ENV / CI / GITHUB_* are legitimately app env vars when read via
207
+ // process.env. Including them caused diff to falsely flag `NODE_ENV` as
208
+ // "in code but not docs" even when ENVIRONMENT.md documented it.
208
209
  //
209
- // Conservative list only the names that are unambiguously OS/shell vars.
210
- // Application names like `DATABASE_URL`, `API_KEY` etc. still count.
210
+ // Rule of thumb for inclusion: would a sane Node/Python/Go app ever
211
+ // `process.env.X` this name and treat it as app config? If yes → NOT a
212
+ // system var. PATH/HOME/SHELL/TERM never satisfy that bar.
211
213
  const SYSTEM_ENV_VARS = new Set([
212
- 'PATH', 'HOME', 'USER', 'USERNAME', 'SHELL', 'PWD', 'OLDPWD', 'TMPDIR', 'TEMP', 'TMP',
214
+ // POSIX shell / OS
215
+ 'PATH', 'HOME', 'USER', 'USERNAME', 'SHELL', 'PWD', 'OLDPWD',
216
+ 'TMPDIR', 'TEMP', 'TMP',
217
+ // Locale
213
218
  'LANG', 'LC_ALL', 'LC_CTYPE', 'LC_MESSAGES', 'TZ',
219
+ // Terminal / interactive
214
220
  'EDITOR', 'VISUAL', 'PAGER', 'TERM', 'COLORTERM',
221
+ // SSH / Display
215
222
  'DISPLAY', 'SSH_AUTH_SOCK', 'SSH_CONNECTION', 'SSH_TTY',
223
+ // XDG base directory spec
216
224
  'XDG_CONFIG_HOME', 'XDG_DATA_HOME', 'XDG_CACHE_HOME', 'XDG_RUNTIME_DIR',
217
- // CI/build platform vars (set by the platform, not by the app)
218
- 'CI', 'GITHUB_TOKEN', 'GITHUB_ACTIONS', 'GITHUB_REF', 'GITHUB_SHA',
219
- 'NODE_ENV', // could be app-set but more often platform-set; conservative skip
225
+ // NOTE: NODE_ENV / CI / GITHUB_* used to be here. Removed in v0.17.1
226
+ // because apps DO read them as app config (e.g. NODE_ENV=production
227
+ // gates branching in nearly every Node.js app).
220
228
  ]);
221
229
 
222
230
  export function diffEnvVars(dir, config = {}) {
@@ -66,6 +66,40 @@ function _checkVersionPin(config) {
66
66
  return null;
67
67
  }
68
68
 
69
+ /**
70
+ * v0.17.1: small in-code highlight reel surfaced when a project's pinned
71
+ * version is behind the running CLI. The biggest recurring user pattern is
72
+ * "I asked for feature X" → "X shipped two releases ago". This eliminates
73
+ * the need to grep the CHANGELOG. Keep entries short and command-oriented.
74
+ *
75
+ * Add to this table on every release. Format: [introducedIn, oneLineFeature].
76
+ */
77
+ const _RELEASE_HIGHLIGHTS = [
78
+ ['0.13.0', '`docguard sync --since <ref>` — surgical refresh of code-truth doc sections'],
79
+ ['0.13.1', '`docguard impact --since <ref>` — changed files → affected canonical docs map'],
80
+ ['0.13.1', '`Cross-Reference` validator + "did you mean #X?" hints for broken anchors'],
81
+ ['0.14.1', '`docguard fix --write` auto-fixes high-confidence anchor matches'],
82
+ ['0.15.0', '`docguard guard --timings` — per-validator wall-time profile'],
83
+ ['0.15.0', '`.docguard.json` JSON Schema for VS Code autocomplete'],
84
+ ['0.16.0', '`docguard explain "<warning>"` — paste any warning, get the validator help'],
85
+ ['0.16.0', '`docguard guard --quiet` — suppress banner in hooks/CI'],
86
+ ['0.16.0', '`docguard init --no-spec-kit` — opt out of Spec Kit scaffolding'],
87
+ ['0.16.0', 'Language-aware test patterns (Python `test_*.py`, Rust `tests/*.rs`, Go `*_test.go`, ...)'],
88
+ ['0.17.0', '`docguard memory --diff` — drill into accuracy mismatches (which claim ≠ code)'],
89
+ ['0.17.0', '`docguard guard --pin` — record running CLI version into .docguard.json'],
90
+ ];
91
+
92
+ function _whatsNewSince(pinnedVersion) {
93
+ if (!pinnedVersion) return [];
94
+ const out = [];
95
+ for (const [introducedIn, feature] of _RELEASE_HIGHLIGHTS) {
96
+ if (_semverCompare(introducedIn, pinnedVersion) > 0) {
97
+ out.push(`v${introducedIn}: ${feature}`);
98
+ }
99
+ }
100
+ return out;
101
+ }
102
+
69
103
  /**
70
104
  * v0.17-P1: update the docguardVersion field in .docguard.json after a
71
105
  * successful guard run. Triggered by `docguard guard --pin`. Idempotent.
@@ -445,6 +479,18 @@ export function runGuard(projectDir, config, flags) {
445
479
  const pinHint = _checkVersionPin(config);
446
480
  if (pinHint) {
447
481
  console.log(`\n ${c.yellow}📌 ${pinHint}${c.reset}`);
482
+ // v0.17.1: surface features added since the pinned version so users
483
+ // who pinned at v0.12 and just upgraded actually KNOW about sync,
484
+ // impact, explain, memory --diff, etc. The biggest user complaint
485
+ // pattern is "I asked for X but X already shipped two releases ago."
486
+ const whatsNew = _whatsNewSince(config.docguardVersion);
487
+ if (whatsNew.length > 0) {
488
+ console.log(` ${c.dim}New since v${config.docguardVersion}:${c.reset}`);
489
+ for (const item of whatsNew.slice(0, 5)) {
490
+ console.log(` ${c.dim}• ${item}${c.reset}`);
491
+ }
492
+ if (whatsNew.length > 5) console.log(` ${c.dim}... ${whatsNew.length - 5} more in CHANGELOG.md${c.reset}`);
493
+ }
448
494
  }
449
495
 
450
496
  // K-6 / S-2: sweep-needed nudge. Aggregates freshness warnings — if 2+
@@ -8,6 +8,63 @@ import { resolve, join, extname } from 'node:path';
8
8
  import { execSync } from 'node:child_process';
9
9
  import { c } from '../shared.mjs';
10
10
  import { validateSecurity } from '../validators/security.mjs';
11
+ import { runGuardInternal } from './guard.mjs';
12
+
13
+ /**
14
+ * v0.18-P3: map score categories to the validator keys that contribute.
15
+ * One category can roll up multiple validators (e.g. "environment" pulls
16
+ * from Environment validator findings). When --diff fires, we use this
17
+ * to surface the underlying warnings.
18
+ */
19
+ const _SCORE_TO_VALIDATORS = {
20
+ structure: ['structure'],
21
+ docQuality: ['docQuality', 'docsCoverage', 'docsSync'],
22
+ testing: ['testSpec', 'todoTracking'],
23
+ security: ['security'],
24
+ environment: ['environment'],
25
+ drift: ['drift'],
26
+ changelog: ['changelog'],
27
+ architecture: ['architecture'],
28
+ };
29
+
30
+ function _showScoreDiff(projectDir, config, scores) {
31
+ console.log(` ${c.bold}── Drill-down (--diff) ──${c.reset}\n`);
32
+ // Pull live guard data; reuses the in-process plan cache so this is
33
+ // cheap when run right after the score calc.
34
+ const guard = runGuardInternal(projectDir, config);
35
+ const byKey = new Map(guard.validators.map(v => [v.key, v]));
36
+
37
+ let anyShown = false;
38
+ for (const [category, score] of Object.entries(scores)) {
39
+ if (score === 100) continue;
40
+ const validatorKeys = _SCORE_TO_VALIDATORS[category];
41
+ if (!validatorKeys) continue;
42
+ const warnings = [];
43
+ const errors = [];
44
+ for (const k of validatorKeys) {
45
+ const v = byKey.get(k);
46
+ if (!v) continue;
47
+ warnings.push(...(v.warnings || []));
48
+ errors.push(...(v.errors || []));
49
+ }
50
+ if (warnings.length === 0 && errors.length === 0) continue;
51
+ anyShown = true;
52
+ console.log(` ${c.yellow}${category}${c.reset} ${c.dim}(${score}/100)${c.reset}`);
53
+ for (const e of errors.slice(0, 5)) console.log(` ${c.red}✗${c.reset} ${e}`);
54
+ for (const w of warnings.slice(0, 5)) console.log(` ${c.yellow}⚠${c.reset} ${w}`);
55
+ const totalIssues = errors.length + warnings.length;
56
+ if (totalIssues > 5) console.log(` ${c.dim}... ${totalIssues - 5} more${c.reset}`);
57
+ console.log('');
58
+ }
59
+
60
+ if (!anyShown) {
61
+ console.log(` ${c.dim}No specific findings available for the weakest categories. They may be scoring below 100 due to structural/quality heuristics rather than discrete check failures.${c.reset}\n`);
62
+ } else {
63
+ console.log(` ${c.dim}Fix options:${c.reset}`);
64
+ console.log(` ${c.dim}• Run ${c.cyan}docguard explain "<warning>"${c.dim} for the full validator help on any line above${c.reset}`);
65
+ console.log(` ${c.dim}• Run ${c.cyan}docguard fix --write${c.dim} for the mechanical fixes${c.reset}`);
66
+ }
67
+ }
11
68
 
12
69
  const WEIGHTS = {
13
70
  structure: 25, // Required files exist
@@ -116,6 +173,14 @@ export function runScore(projectDir, config, flags) {
116
173
  console.log('');
117
174
  }
118
175
 
176
+ // v0.18-P3: --diff drill-down. Symmetric to v0.17 memory --diff.
177
+ // Shows WHICH specific checks dragged each weak category down by joining
178
+ // the guard validator warnings to score categories. Cheap: we already
179
+ // import runGuardInternal; one extra guard run on `--diff` is acceptable.
180
+ if (flags.diff) {
181
+ _showScoreDiff(projectDir, config, scores);
182
+ }
183
+
119
184
  // ── Tax Estimate (--tax flag) ──
120
185
  if (flags.tax) {
121
186
  const tax = estimateDocTax(projectDir, config, scores);
@@ -30,21 +30,112 @@ const md = {
30
30
  };
31
31
 
32
32
  /**
33
- * v0.15-P1: in-process cache. buildMemoryPlan is expensive (~400ms on
34
- * an enterprise client project, 33% of total guard validator time) because it triggers
35
- * routes/schemas/screens/frontend scanners — all of which walk the source
36
- * tree. Within a single guard run, sync, generate, and the Generated-
37
- * Staleness validator all ask for the SAME plan; without caching they each
38
- * re-pay the cost.
33
+ * v0.15-P1: in-process cache (Map). buildMemoryPlan is expensive (~400ms on
34
+ * an enterprise client project) because it triggers routes/schemas/screens/
35
+ * frontend scanners — all of which walk the source tree.
39
36
  *
40
- * Cache key: projectDir + a config fingerprint that captures the fields the
41
- * scanners actually consume (sourceRoot, ignore, projectType). Other config
42
- * mutations (e.g. changedFiles per-validator) don't invalidate the plan.
37
+ * v0.18-P2: cross-process cache (`.docguard/plan.cache.json`). CI flows that
38
+ * run guard sync fix as separate processes each pay the build cost.
39
+ * The disk cache shares the plan across processes, keyed by a tree-state
40
+ * hash so we invalidate when the source tree changes.
43
41
  *
44
- * Bypass with `_skipCache: true` in opts used by tests and any caller that
45
- * wants a fresh scan.
42
+ * Cache key: projectDir + a config fingerprint (sourceRoot, ignore,
43
+ * projectType, profile). Other config mutations (e.g. changedFiles
44
+ * per-validator) don't invalidate the plan.
45
+ *
46
+ * Bypass with `_skipCache: true` in opts — used by tests.
46
47
  */
48
+ import { createHash } from 'node:crypto';
49
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from 'node:fs';
50
+ import { resolve as resolvePath, join as joinPath } from 'node:path';
51
+ import { execFileSync } from 'node:child_process';
52
+
47
53
  const _memoryPlanCache = new Map(); // key → plan
54
+ const _DISK_CACHE_PATH = '.docguard/plan.cache.json';
55
+ const _DISK_CACHE_VERSION = '1'; // bump if cache shape changes
56
+
57
+ /**
58
+ * v0.18-P2: tree-state hash. Cheap signature of the source tree that
59
+ * changes whenever something a scanner would care about changes. We use:
60
+ * - git HEAD commit SHA (when in a git repo) — captures committed state
61
+ * - mtime sum of top-level config files (package.json, pyproject.toml,
62
+ * Cargo.toml, etc.) — captures uncommitted bumps to deps
63
+ * Combined into a 12-char hex fingerprint.
64
+ *
65
+ * NOT a perfect cache key — a user editing src/foo.ts without bumping a
66
+ * config file won't invalidate. But guard/sync/fix all run in quick
67
+ * succession within a CI step, and the user's flow IS bump + commit + run.
68
+ * The tradeoff favors speed: the worst case is one stale plan per CI run,
69
+ * recoverable with `--no-plan-cache` or a tree change.
70
+ */
71
+ function _treeStateHash(projectDir) {
72
+ let signal = '';
73
+ // git HEAD
74
+ try {
75
+ const sha = execFileSync('git', ['rev-parse', 'HEAD'], {
76
+ cwd: projectDir, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'],
77
+ }).trim();
78
+ signal += `git:${sha};`;
79
+ } catch { /* not a git repo, or no commits */ }
80
+ // mtime of common manifest files
81
+ const manifests = [
82
+ 'package.json', 'pyproject.toml', 'Cargo.toml', 'go.mod',
83
+ 'pom.xml', 'build.gradle', 'Gemfile', 'composer.json',
84
+ '.docguard.json',
85
+ ];
86
+ for (const m of manifests) {
87
+ try {
88
+ const s = statSync(resolvePath(projectDir, m));
89
+ signal += `${m}:${s.mtimeMs};`;
90
+ } catch { /* not present */ }
91
+ }
92
+ return createHash('sha256').update(signal).digest('hex').slice(0, 12);
93
+ }
94
+
95
+ /**
96
+ * v0.18-P2: read the disk cache. Returns null when the file is missing,
97
+ * the schema version mismatches, the tree hash doesn't match, or anything
98
+ * about the load is suspicious. Never throws — cache miss is silent.
99
+ */
100
+ function _readDiskCache(projectDir, configKey) {
101
+ try {
102
+ const p = resolvePath(projectDir, _DISK_CACHE_PATH);
103
+ if (!existsSync(p)) return null;
104
+ const data = JSON.parse(readFileSync(p, 'utf-8'));
105
+ if (data.v !== _DISK_CACHE_VERSION) return null;
106
+ if (data.configKey !== configKey) return null;
107
+ const currentHash = _treeStateHash(projectDir);
108
+ if (data.treeHash !== currentHash) return null;
109
+ return data.plan || null;
110
+ } catch {
111
+ return null;
112
+ }
113
+ }
114
+
115
+ /**
116
+ * v0.18-P2: write the disk cache. Best-effort — failures are silent (the
117
+ * in-process cache still works). `.docguard/` directory created if needed.
118
+ */
119
+ function _writeDiskCache(projectDir, configKey, plan) {
120
+ try {
121
+ const fullDir = resolvePath(projectDir, '.docguard');
122
+ if (!existsSync(fullDir)) mkdirSync(fullDir, { recursive: true });
123
+ const payload = {
124
+ v: _DISK_CACHE_VERSION,
125
+ configKey,
126
+ treeHash: _treeStateHash(projectDir),
127
+ plan,
128
+ writtenAt: new Date().toISOString(),
129
+ };
130
+ writeFileSync(
131
+ resolvePath(projectDir, _DISK_CACHE_PATH),
132
+ JSON.stringify(payload), // compact — this file isn't human-edited
133
+ 'utf-8'
134
+ );
135
+ } catch {
136
+ // swallow — the cache is auxiliary
137
+ }
138
+ }
48
139
 
49
140
  export function clearMemoryPlanCache() {
50
141
  _memoryPlanCache.clear();
@@ -67,14 +158,35 @@ function _cacheKey(projectDir, config) {
67
158
  * agentTasks: flattened prose tasks the AI must write.
68
159
  */
69
160
  export function buildMemoryPlan(projectDir, config = {}, opts = {}) {
70
- if (!opts._skipCache) {
71
- const key = _cacheKey(projectDir, config);
161
+ const useCache = !opts._skipCache;
162
+ const key = useCache ? _cacheKey(projectDir, config) : null;
163
+
164
+ // L1: in-process Map (same-run guard → sync → fix).
165
+ if (useCache) {
72
166
  const cached = _memoryPlanCache.get(key);
73
167
  if (cached) return cached;
74
168
  }
169
+
170
+ // L2: cross-process disk cache (CI guard → CI sync → CI fix).
171
+ // v0.18-P2: opt-in via config.diskCache !== false (default ON).
172
+ // Tree-state hash invalidates when source files change.
173
+ const diskCacheEnabled = useCache && config.diskCache !== false;
174
+ if (diskCacheEnabled) {
175
+ const onDisk = _readDiskCache(projectDir, key);
176
+ if (onDisk) {
177
+ _memoryPlanCache.set(key, onDisk); // promote to L1
178
+ return onDisk;
179
+ }
180
+ }
181
+
182
+ // Miss — build fresh.
75
183
  const result = _buildMemoryPlanUncached(projectDir, config);
76
- if (!opts._skipCache) {
77
- _memoryPlanCache.set(_cacheKey(projectDir, config), result);
184
+
185
+ if (useCache) {
186
+ _memoryPlanCache.set(key, result);
187
+ }
188
+ if (diskCacheEnabled) {
189
+ _writeDiskCache(projectDir, key, result);
78
190
  }
79
191
  return result;
80
192
  }
@@ -45,16 +45,18 @@ export function validateEnvironment(projectDir, config) {
45
45
  // tokens like `VITE_` (the convention prefix) from being treated as a real
46
46
  // variable name.
47
47
  const varRe = /`([A-Z][A-Z0-9_]*[A-Z0-9])`/g;
48
- // v0.16-P4: skip backticked SYSTEM env vars (PATH, HOME, USER, etc.).
49
- // They appear in ENVIRONMENT.md prose ("the venv `PATH`") but aren't
50
- // user-set application vars. Mirrors the same skip in diff.mjs.
48
+ // v0.16-P4 (revised in v0.17.1-B7): skip backticked SYSTEM env vars
49
+ // (PATH, HOME, USER, etc.) that appear in ENVIRONMENT.md prose. Trimmed
50
+ // to TRULY-system-only after wu feedback NODE_ENV / CI / GITHUB_* were
51
+ // causing asymmetric flagging between diff and this validator. Apps
52
+ // legitimately treat NODE_ENV as app config; keep the list to vars that
53
+ // no sane application would read as runtime config.
51
54
  const SYSTEM = new Set([
52
55
  'PATH','HOME','USER','USERNAME','SHELL','PWD','OLDPWD','TMPDIR','TEMP','TMP',
53
56
  'LANG','LC_ALL','LC_CTYPE','LC_MESSAGES','TZ',
54
57
  'EDITOR','VISUAL','PAGER','TERM','COLORTERM',
55
58
  'DISPLAY','SSH_AUTH_SOCK','SSH_CONNECTION','SSH_TTY',
56
59
  'XDG_CONFIG_HOME','XDG_DATA_HOME','XDG_CACHE_HOME','XDG_RUNTIME_DIR',
57
- 'CI','GITHUB_TOKEN','GITHUB_ACTIONS','GITHUB_REF','GITHUB_SHA','NODE_ENV',
58
60
  ]);
59
61
  let m;
60
62
  while ((m = varRe.exec(content)) !== null) {
@@ -23,12 +23,55 @@
23
23
  * @req SC-M1-004 — N/A when no source=code sections present in any doc
24
24
  */
25
25
 
26
- import { existsSync, readFileSync, statSync } from 'node:fs';
27
- import { resolve, basename } from 'node:path';
26
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
27
+ import { resolve, basename, join } from 'node:path';
28
28
 
29
29
  import { buildMemoryPlan } from '../scanners/memory-plan.mjs';
30
30
  import { getSection } from '../writers/sections.mjs';
31
31
 
32
+ /**
33
+ * v0.18-P1 fast-path: cheap pre-flight to detect whether ANY canonical doc
34
+ * has a `<!-- docguard:section ... source=code -->` marker OR a `status:
35
+ * draft` frontmatter. If neither exists anywhere, this validator has
36
+ * nothing to do — skip the expensive buildMemoryPlan call (~400ms on
37
+ * mid-sized repos, was 26-33% of total guard validator time).
38
+ *
39
+ * Returns { hasMarkers, hasDrafts }.
40
+ */
41
+ function _quickScan(projectDir) {
42
+ const out = { hasMarkers: false, hasDrafts: false };
43
+ const candidateDirs = [
44
+ resolve(projectDir, 'docs-canonical'),
45
+ projectDir, // for README.md, AGENTS.md, etc.
46
+ ];
47
+ // We only need a single match in any file to know the validator has work.
48
+ // Short-circuit aggressively: stop the moment we find either signal.
49
+ for (const dir of candidateDirs) {
50
+ if (!existsSync(dir)) continue;
51
+ let entries;
52
+ try { entries = readdirSync(dir); } catch { continue; }
53
+ for (const entry of entries) {
54
+ if (!entry.endsWith('.md')) continue;
55
+ // Skip very large files quickly — for canonical docs, > 200 KB is unusual
56
+ // and almost certainly not the marker-heavy file we're looking for.
57
+ let stat;
58
+ try { stat = statSync(join(dir, entry)); } catch { continue; }
59
+ if (!stat.isFile()) continue;
60
+ if (stat.size > 200_000) continue;
61
+ let content;
62
+ try { content = readFileSync(join(dir, entry), 'utf-8'); } catch { continue; }
63
+ if (!out.hasMarkers && /<!--\s*docguard:section\s+[^>]*source=code/i.test(content)) {
64
+ out.hasMarkers = true;
65
+ }
66
+ if (!out.hasDrafts && /(?:^---\s*\n[\s\S]*?\bstatus:\s*draft\b[\s\S]*?\n---|<!--\s*status:\s*draft\s*-->)/im.test(content)) {
67
+ out.hasDrafts = true;
68
+ }
69
+ if (out.hasMarkers && out.hasDrafts) return out;
70
+ }
71
+ }
72
+ return out;
73
+ }
74
+
32
75
  /**
33
76
  * S-7: how long a generated doc may sit in `status: draft` before we warn.
34
77
  * 14 days is the v0.13.1 default — long enough to absorb a typical sprint,
@@ -62,6 +105,17 @@ export function validateGeneratedStaleness(projectDir, config = {}) {
62
105
  // of just warning. No AI needed — the scanner already knows the right body.
63
106
  const result = { errors: [], warnings: [], passed: 0, total: 0, fixes: [] };
64
107
 
108
+ // v0.18-P1: cheap pre-flight. If no canonical doc has a source=code marker
109
+ // AND no doc is in status:draft, this validator has nothing to do — skip
110
+ // the expensive buildMemoryPlan call. Generated-Staleness used to be
111
+ // 26-33% of total validator time on projects with NO markers, all
112
+ // wasted. The fast-path scans markdown files for the marker substring
113
+ // only — no parsing, no tree walk.
114
+ const quick = _quickScan(projectDir);
115
+ if (!quick.hasMarkers && !quick.hasDrafts) {
116
+ return { ...result, applicable: false, note: 'no docguard:section markers and no status:draft docs' };
117
+ }
118
+
65
119
  // Build the canonical memory plan (what the docs SHOULD contain). If this
66
120
  // fails or produces no docs, the validator is N/A.
67
121
  let plan;
@@ -3,7 +3,7 @@ schema_version: "1.0"
3
3
  extension:
4
4
  id: "docguard"
5
5
  name: "DocGuard — CDD Enforcement"
6
- version: "0.17.0"
6
+ version: "0.18.1"
7
7
  description: "Canonical-Driven Development enforcement as a true spec-kit extension. LLM-first design with 19 automated validators, 4 AI behavior skills, spec-kit skill chaining, and workflow hooks. Zero NPM runtime dependencies."
8
8
  author: "Ricardo Accioly"
9
9
  repository: "https://github.com/raccioly/docguard"
@@ -6,10 +6,10 @@ description: AI-driven documentation repair with structured research workflow, t
6
6
  compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
7
7
  metadata:
8
8
  author: docguard
9
- version: 0.17.0
9
+ version: 0.18.1
10
10
  source: extensions/spec-kit-docguard/skills/docguard-fix
11
11
  ---
12
- <!-- docguard:version: 0.17.0 -->
12
+ <!-- docguard:version: 0.18.1 -->
13
13
 
14
14
  # DocGuard Fix Skill
15
15
 
@@ -7,10 +7,10 @@ description: Run DocGuard guard validation against Canonical-Driven Development
7
7
  compatibility: Requires DocGuard CLI installed (npm i -g docguard-cli or npx docguard-cli)
8
8
  metadata:
9
9
  author: docguard
10
- version: 0.17.0
10
+ version: 0.18.1
11
11
  source: extensions/spec-kit-docguard/skills/docguard-guard
12
12
  ---
13
- <!-- docguard:version: 0.17.0 -->
13
+ <!-- docguard:version: 0.18.1 -->
14
14
 
15
15
  # DocGuard Guard Skill
16
16