docguard-cli 0.11.0__tar.gz → 0.11.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 (268) hide show
  1. {docguard_cli-0.11.0/extensions/spec-kit-docguard → docguard_cli-0.11.2/.agent}/skills/docguard-fix/SKILL.md +2 -2
  2. {docguard_cli-0.11.0/extensions/spec-kit-docguard → docguard_cli-0.11.2/.agent}/skills/docguard-guard/SKILL.md +2 -2
  3. {docguard_cli-0.11.0/extensions/spec-kit-docguard → docguard_cli-0.11.2/.agent}/skills/docguard-review/SKILL.md +2 -2
  4. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/docguard-score/SKILL.md +2 -2
  5. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/docguard-sync/SKILL.md +1 -1
  6. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/AGENTS.md +1 -0
  7. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/CHANGELOG.md +63 -0
  8. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/PKG-INFO +1 -1
  9. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/diff.mjs +15 -17
  10. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/guard.mjs +12 -2
  11. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/docguard.mjs +2 -0
  12. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/ensure-skills.mjs +8 -1
  13. docguard_cli-0.11.2/cli/scanners/cdk.mjs +10 -0
  14. docguard_cli-0.11.2/cli/scanners/iac.mjs +235 -0
  15. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/shared-ignore.mjs +29 -2
  16. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/shared-source.mjs +19 -7
  17. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/docs-coverage.mjs +129 -7
  18. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/docs-sync.mjs +49 -8
  19. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/environment.mjs +9 -3
  20. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/test-spec.mjs +129 -11
  21. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/todo-tracking.mjs +55 -2
  22. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs-canonical/ARCHITECTURE.md +10 -5
  23. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/extension.yml +1 -1
  24. {docguard_cli-0.11.0/.agent → docguard_cli-0.11.2/extensions/spec-kit-docguard}/skills/docguard-fix/SKILL.md +2 -2
  25. {docguard_cli-0.11.0/.agent → docguard_cli-0.11.2/extensions/spec-kit-docguard}/skills/docguard-guard/SKILL.md +2 -2
  26. {docguard_cli-0.11.0/.agent → docguard_cli-0.11.2/extensions/spec-kit-docguard}/skills/docguard-review/SKILL.md +2 -2
  27. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/skills/docguard-score/SKILL.md +2 -2
  28. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/skills/docguard-sync/SKILL.md +1 -1
  29. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/package.json +1 -1
  30. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/pyproject.toml +1 -1
  31. docguard_cli-0.11.2/specs/003-v011-false-positives/plan.md +140 -0
  32. docguard_cli-0.11.2/specs/003-v011-false-positives/spec.md +191 -0
  33. docguard_cli-0.11.2/specs/003-v011-false-positives/tasks.md +156 -0
  34. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/ARCHITECTURE.md.template +52 -0
  35. docguard_cli-0.11.2/tests/cdk-detection.test.mjs +292 -0
  36. docguard_cli-0.11.2/tests/docs-coverage.test.mjs +258 -0
  37. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/docs-sync.test.mjs +116 -0
  38. docguard_cli-0.11.2/tests/patch-0.11.2.test.mjs +103 -0
  39. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/test-spec.test.mjs +108 -0
  40. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/todo-tracking.test.mjs +44 -0
  41. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/traceability.test.mjs +15 -9
  42. docguard_cli-0.11.0/tests/docs-coverage.test.mjs +0 -105
  43. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.analyze.md +0 -0
  44. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.checklist.md +0 -0
  45. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.clarify.md +0 -0
  46. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.constitution.md +0 -0
  47. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.implement.md +0 -0
  48. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.plan.md +0 -0
  49. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.specify.md +0 -0
  50. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.tasks.md +0 -0
  51. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/commands/speckit.taskstoissues.md +0 -0
  52. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-analyze/SKILL.md +0 -0
  53. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-checklist/SKILL.md +0 -0
  54. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-clarify/SKILL.md +0 -0
  55. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-constitution/SKILL.md +0 -0
  56. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-implement/SKILL.md +0 -0
  57. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-plan/SKILL.md +0 -0
  58. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-specify/SKILL.md +0 -0
  59. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-tasks/SKILL.md +0 -0
  60. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.agent/skills/speckit-taskstoissues/SKILL.md +0 -0
  61. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.docguard.json +0 -0
  62. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.docguardignore +0 -0
  63. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  64. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  65. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/dependabot.yml +0 -0
  66. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/scripts/patch-catalog.py +0 -0
  67. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/workflows/ci.yml +0 -0
  68. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/workflows/release.yml +0 -0
  69. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/workflows/supply-chain.yml +0 -0
  70. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.github/workflows/sync-speckit-catalog.yml +0 -0
  71. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.gitignore +0 -0
  72. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.jules/bolt.md +0 -0
  73. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.jules/palette.md +0 -0
  74. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.jules/sentinel.md +0 -0
  75. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.npmignore +0 -0
  76. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.npmrc +0 -0
  77. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/extensions/.cache/catalog-ebf165086500aab1-metadata.json +0 -0
  78. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/extensions/.cache/catalog-ebf165086500aab1.json +0 -0
  79. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/extensions/.cache/catalog-metadata.json +0 -0
  80. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/extensions/.cache/catalog.json +0 -0
  81. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/init-options.json +0 -0
  82. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/memory/constitution.md +0 -0
  83. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/scripts/bash/check-prerequisites.sh +0 -0
  84. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/scripts/bash/common.sh +0 -0
  85. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/scripts/bash/create-new-feature.sh +0 -0
  86. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/scripts/bash/setup-plan.sh +0 -0
  87. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/scripts/bash/update-agent-context.sh +0 -0
  88. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/templates/agent-file-template.md +0 -0
  89. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/templates/checklist-template.md +0 -0
  90. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/templates/constitution-template.md +0 -0
  91. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/templates/plan-template.md +0 -0
  92. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/templates/spec-template.md +0 -0
  93. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/.specify/templates/tasks-template.md +0 -0
  94. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/CODE_OF_CONDUCT.md +0 -0
  95. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/COMPARISONS.md +0 -0
  96. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/CONTRIBUTING.md +0 -0
  97. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/DRIFT-LOG.md +0 -0
  98. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/LICENSE +0 -0
  99. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/PHILOSOPHY.md +0 -0
  100. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/README.md +0 -0
  101. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/ROADMAP.md +0 -0
  102. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/SECURITY.md +0 -0
  103. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/STANDARD.md +0 -0
  104. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/SUPPLY-CHAIN-AUDIT.md +0 -0
  105. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/SUPPORT.md +0 -0
  106. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/action.yml +0 -0
  107. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/agents.mjs +0 -0
  108. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/badge.mjs +0 -0
  109. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/ci.mjs +0 -0
  110. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/diagnose.mjs +0 -0
  111. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/fix.mjs +0 -0
  112. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/generate.mjs +0 -0
  113. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/hooks.mjs +0 -0
  114. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/init.mjs +0 -0
  115. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/llms.mjs +0 -0
  116. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/publish.mjs +0 -0
  117. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/score.mjs +0 -0
  118. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/setup.mjs +0 -0
  119. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/sync.mjs +0 -0
  120. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/trace.mjs +0 -0
  121. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/commands/watch.mjs +0 -0
  122. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/api-doc.mjs +0 -0
  123. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/doc-tools.mjs +0 -0
  124. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/frontend.mjs +0 -0
  125. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/integrations.mjs +0 -0
  126. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/memory-plan.mjs +0 -0
  127. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/project-type.mjs +0 -0
  128. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/routes.mjs +0 -0
  129. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/schemas.mjs +0 -0
  130. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/scanners/speckit.mjs +0 -0
  131. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/shared.mjs +0 -0
  132. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/api-surface.mjs +0 -0
  133. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/architecture.mjs +0 -0
  134. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/changelog.mjs +0 -0
  135. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/doc-quality.mjs +0 -0
  136. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/docs-diff.mjs +0 -0
  137. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/drift.mjs +0 -0
  138. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/freshness.mjs +0 -0
  139. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/metadata-sync.mjs +0 -0
  140. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/metrics-consistency.mjs +0 -0
  141. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/schema-sync.mjs +0 -0
  142. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/security.mjs +0 -0
  143. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/structure.mjs +0 -0
  144. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/validators/traceability.mjs +0 -0
  145. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/writers/api-reference.mjs +0 -0
  146. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/writers/mechanical.mjs +0 -0
  147. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/cli/writers/sections.mjs +0 -0
  148. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/commands/docguard.fix.md +0 -0
  149. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/commands/docguard.guard.md +0 -0
  150. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/commands/docguard.review.md +0 -0
  151. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/commands/docguard.score.md +0 -0
  152. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/configs/fastify.json +0 -0
  153. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/configs/generic.json +0 -0
  154. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/configs/nextjs.json +0 -0
  155. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/configs/python.json +0 -0
  156. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docguard_cli/__init__.py +0 -0
  157. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docguard_cli/wrapper.py +0 -0
  158. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/ai-integration.md +0 -0
  159. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/commands.md +0 -0
  160. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/configuration.md +0 -0
  161. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/doc-sections.md +0 -0
  162. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/faq.md +0 -0
  163. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/installation.md +0 -0
  164. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/profiles.md +0 -0
  165. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs/quickstart.md +0 -0
  166. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs-canonical/DATA-MODEL.md +0 -0
  167. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs-canonical/ENVIRONMENT.md +0 -0
  168. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs-canonical/SECURITY.md +0 -0
  169. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/docs-canonical/TEST-SPEC.md +0 -0
  170. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/01-express-api/README.md +0 -0
  171. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/01-express-api/package.json +0 -0
  172. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/01-express-api/server.js +0 -0
  173. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/02-python-flask/README.md +0 -0
  174. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/02-python-flask/app.py +0 -0
  175. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/02-python-flask/docs-canonical/ARCHITECTURE.md +0 -0
  176. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/02-python-flask/requirements.txt +0 -0
  177. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/03-spec-kit-project/CHANGELOG.md +0 -0
  178. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/03-spec-kit-project/README.md +0 -0
  179. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/03-spec-kit-project/docs-canonical/ARCHITECTURE.md +0 -0
  180. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/03-spec-kit-project/docs-canonical/TEST-SPEC.md +0 -0
  181. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/03-spec-kit-project/package.json +0 -0
  182. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/03-spec-kit-project/src/index.js +0 -0
  183. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/03-spec-kit-project/tests/basic.test.js +0 -0
  184. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/examples/README.md +0 -0
  185. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/LICENSE +0 -0
  186. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/README.md +0 -0
  187. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/diagnose.md +0 -0
  188. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/fix.md +0 -0
  189. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/generate.md +0 -0
  190. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/guard.md +0 -0
  191. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/init.md +0 -0
  192. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/score.md +0 -0
  193. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/sync.md +0 -0
  194. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/commands/trace.md +0 -0
  195. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/scripts/bash/common.sh +0 -0
  196. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/scripts/bash/docguard-check-docs.sh +0 -0
  197. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/scripts/bash/docguard-init-doc.sh +0 -0
  198. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/scripts/bash/docguard-suggest-fix.sh +0 -0
  199. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/extensions/spec-kit-docguard/templates/extensions.yml +0 -0
  200. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/pr_description.md +0 -0
  201. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/specs/001-fix-ignore-validators/plan.md +0 -0
  202. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/specs/001-fix-ignore-validators/spec.md +0 -0
  203. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/specs/001-fix-ignore-validators/tasks.md +0 -0
  204. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/specs/002-fix-test-discovery/plan.md +0 -0
  205. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/specs/002-fix-test-discovery/spec.md +0 -0
  206. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/specs/002-fix-test-discovery/tasks.md +0 -0
  207. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/ADR.md.template +0 -0
  208. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/AGENTS.md.template +0 -0
  209. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/CHANGELOG.md.template +0 -0
  210. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/CURRENT-STATE.md.template +0 -0
  211. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/DATA-MODEL.md.template +0 -0
  212. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/DEPLOYMENT.md.template +0 -0
  213. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/DRIFT-LOG.md.template +0 -0
  214. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/ENVIRONMENT.md.template +0 -0
  215. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/KNOWN-GOTCHAS.md.template +0 -0
  216. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/REQUIREMENTS.md.template +0 -0
  217. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/ROADMAP.md.template +0 -0
  218. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/RUNBOOKS.md.template +0 -0
  219. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/SECURITY.md.template +0 -0
  220. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/TEST-SPEC.md.template +0 -0
  221. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/TROUBLESHOOTING.md.template +0 -0
  222. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/VENDOR-BUGS.md.template +0 -0
  223. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/ci/github-actions.yml +0 -0
  224. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/commands/docguard.fix.md +0 -0
  225. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/commands/docguard.guard.md +0 -0
  226. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/commands/docguard.init.md +0 -0
  227. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/commands/docguard.review.md +0 -0
  228. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/templates/commands/docguard.update.md +0 -0
  229. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/test-draft.js +0 -0
  230. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/test-metrics.js +0 -0
  231. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/api-doc.test.mjs +0 -0
  232. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/api-surface.test.mjs +0 -0
  233. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/api-write.test.mjs +0 -0
  234. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/architecture.test.mjs +0 -0
  235. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/backup-failure.test.mjs +0 -0
  236. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/changelog.test.mjs +0 -0
  237. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/commands.test.mjs +0 -0
  238. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/doc-quality.test.mjs +0 -0
  239. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/docs-diff.test.mjs +0 -0
  240. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/drift.test.mjs +0 -0
  241. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/environment.test.mjs +0 -0
  242. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/freshness.test.mjs +0 -0
  243. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/frontend-deep.test.mjs +0 -0
  244. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/frontend.test.mjs +0 -0
  245. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/guard-classify.test.mjs +0 -0
  246. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/hooks.test.mjs +0 -0
  247. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/i18n.test.mjs +0 -0
  248. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/integrations.test.mjs +0 -0
  249. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/mechanical.test.mjs +0 -0
  250. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/memory-plan.test.mjs +0 -0
  251. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/metadata-sync.test.mjs +0 -0
  252. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/metrics-consistency.test.mjs +0 -0
  253. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/monorepo-scanning.test.mjs +0 -0
  254. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/multi-spec.test.mjs +0 -0
  255. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/project-type.test.mjs +0 -0
  256. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/routes-multilang.test.mjs +0 -0
  257. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/schema-sync.test.mjs +0 -0
  258. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/schemas-multilang.test.mjs +0 -0
  259. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/schemas.test.mjs +0 -0
  260. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/sections.test.mjs +0 -0
  261. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/security.test.mjs +0 -0
  262. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/shared-source.test.mjs +0 -0
  263. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/structure.test.mjs +0 -0
  264. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/tests/sync.test.mjs +0 -0
  265. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/vscode-extension/.vscodeignore +0 -0
  266. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/vscode-extension/README.md +0 -0
  267. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/vscode-extension/extension.js +0 -0
  268. {docguard_cli-0.11.0 → docguard_cli-0.11.2}/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.9.9
9
+ version: 0.11.2
10
10
  source: extensions/spec-kit-docguard/skills/docguard-fix
11
11
  ---
12
- <!-- docguard:version: 0.9.9 -->
12
+ <!-- docguard:version: 0.11.2 -->
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.9.9
10
+ version: 0.11.2
11
11
  source: extensions/spec-kit-docguard/skills/docguard-guard
12
12
  ---
13
- <!-- docguard:version: 0.9.9 -->
13
+ <!-- docguard:version: 0.11.2 -->
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.9.9
9
+ version: 0.11.2
10
10
  source: extensions/spec-kit-docguard/skills/docguard-review
11
11
  ---
12
- <!-- docguard:version: 0.9.9 -->
12
+ <!-- docguard:version: 0.11.2 -->
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.9.9
9
+ version: 0.11.2
10
10
  source: extensions/spec-kit-docguard/skills/docguard-score
11
11
  ---
12
- <!-- docguard:version: 0.9.9 -->
12
+ <!-- docguard:version: 0.11.2 -->
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.10.0
7
+ version: 0.11.2
8
8
  source: extensions/spec-kit-docguard/skills/docguard-sync
9
9
  ---
10
10
 
@@ -96,6 +96,7 @@ extensions/spec-kit-docguard/
96
96
 
97
97
  ## Rules
98
98
 
99
+ - **PR-first workflow — no direct-to-main commits.** Create a branch (`git checkout -b <type>/<slug>`), push, `gh pr create`, let CI run, self-review, squash-merge. Tag releases only after merge on `main`. The only acceptable direct-to-main: typo fixes in comments or README badge URLs.
99
100
  - Never commit without updating CHANGELOG.md
100
101
  - If code deviates from docs, add `// DRIFT: reason`
101
102
  - Security rules in SECURITY.md are mandatory
@@ -7,6 +7,69 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.11.2] - 2026-05-25
11
+
12
+ Patch release addressing the four bugs (B-1..B-4) reported from the v0.11.1 audit of `wu-whatsappinbox` (score 98/100, 572/575 passed, 1 warning), plus Antigravity/Kiro/Windsurf agent-routing aliases and a Docs-Coverage silent-fail fix that the new B-4 nudge itself exposed.
13
+
14
+ ### Fixed
15
+ - **B-1: Vite intrinsics no longer reported as user env vars.** `grepEnvUsage` in `cli/shared-source.mjs` now skips `DEV`, `PROD`, `MODE`, `BASE_URL`, and `SSR` on `import.meta.env.*` — these are injected by Vite at build time, not user-configured. Real user vars like `VITE_API_URL` are still captured. (Reported by wu-whatsappinbox v0.11.1 audit.)
16
+ - **B-2: `docguard diff` Data Entities now uses real exported names, not file basenames.** Previously the entity diff walked filenames and reported the stem (e.g. `models.py` → "models"), missing all the actual classes inside. Now uses `scanSchemasDeep` — the same code-side scanner the rest of DocGuard uses — which extracts real Pydantic/Dataclass/Mongoose/Prisma/Zod/Sequelize/Sqlx/SQLAlchemy/JPA entity names. (Reported by wu-whatsappinbox v0.11.1 audit.)
17
+ - **B-3: Literal `` `VITE_` `` prefix in prose no longer captured as an env var name.** Tightened the env-var name regex across `shared-source.mjs`, `validators/environment.mjs`, and `commands/diff.mjs` from `[A-Z][A-Z0-9_]*` to `[A-Z][A-Z0-9_]*[A-Z0-9]` (must end with letter/digit, not underscore). Documentation like ``All vars start with `VITE_` (Vite convention)`` no longer triggers a "missing `VITE_`" warning. (Reported by wu-whatsappinbox v0.11.1 audit.)
18
+ - **B-4 nudge surfaced: Docs-Coverage Check 5 (`checkReadmeSections`) silent-fail fixed.** The "recommended sections" loop bumped `total` without emitting a message when missing — exactly the anti-pattern B-4 flags. Recommended sections are now a true bonus: present = +1 to both passed/total, missing = no-op. Restores honest scoring on the README checker. (Found by the B-4 nudge running on the wu-whatsappinbox fixture.)
19
+
20
+ ### Added
21
+ - **B-4: `--show-failing` flag and validator-bug nudge.** `docguard guard --show-failing` shows warnings/errors for every non-passing validator even if the overall status would have suppressed them. New nudge fires when a validator has `passed < total` but emits no warning or error messages — points at a likely silent-fail validator bug for the user to file an issue. (Reported by wu-whatsappinbox v0.11.1 audit.)
22
+ - **Antigravity / Kiro / Windsurf / GEMINI agent signals.** `cli/ensure-skills.mjs` now detects these agent ecosystems via additional signal files (`.agents`, `.antigravity`, `ANTIGRAVITY.md`, `.kiro`, `.windsurf`, `GEMINI.md`) so the right skills are installed for each. Antigravity was already wired via `.agents → agy`; this expands the alias surface so neither side-by-side IDEs nor Spec Kit's `.agents` convention break detection.
23
+
24
+ ### Internal
25
+ - New test file: `tests/patch-0.11.2.test.mjs` with regression coverage for B-1 (Vite intrinsics skip), B-2 (Pydantic class names, not file basename), and B-3 (literal `VITE_` not captured). **Total: 339 tests passing (was 336, +3 new).**
26
+ - No new NPM dependencies. Zero schema or config-file changes. Bumped `pyproject.toml` from `0.11.0 → 0.11.2` to re-sync the PyPI publish (the previous patch released to npm but skipped PyPI version bump).
27
+
28
+ ### Out of scope (deferred to v0.12)
29
+ - S-1 (`sync --since` surgical refresh), S-2 (sweep-needed nudge from freshness counters), S-3 (`trace --reverse` code→doc map), S-4 (rename detection via `git log --follow`), S-5 (`.docguardignore` template at init), S-6 (per-validator severity in `.docguard.json`), S-7 (generated-doc-in-draft staleness validator), S-8 (cross-reference validator for broken `§X` anchors), S-9 (pre-commit lite on changed files only), S-10 (`.docguard/fixed.json` memory of past fixes).
30
+
31
+ Credit: feedback from running v0.11.1 on the `wu-whatsappinbox` enterprise monorepo (audit score 98/100, 572/575 passed).
32
+
33
+ ## [0.11.1] - 2026-05-25
34
+
35
+ Patch release addressing false positives surfaced by the v0.11.0 audit of the `wu-whatsappinbox` enterprise monorepo, generalized into a multi-tool IaC detector, plus several DocGuard self-audit improvements. Spec: `specs/003-v011-false-positives/`.
36
+
37
+ ### Fixed
38
+ - **Docs-Sync no longer misclassifies frontend API clients as backend routes.** Dropped the ambiguous bare `'api'` from the route-directory convention list. `src/api/client.ts` (frontend axios) and similar are no longer scanned as Express/Next.js routes (FP-1). For Next.js App Router (`src/app/api`, `app/api`), only files matching the strict `route.{ts,tsx,js,jsx,mjs}` filename convention are counted — helper files in the same tree are skipped (FR-001, FR-002).
39
+ - **Test files are no longer flagged as undocumented services or routes.** The docs-sync route and service loops now skip paths under `__tests__/` and filenames matching `*.{test,spec}.{ts,tsx,js,jsx,mjs,py,java,go}` (FP-2, FR-003, FR-004). Eliminates ~7 spurious warnings per monorepo with co-located tests.
40
+ - **Build outputs no longer flagged as undocumented source.** Added `cdk.out`, `out`, `.nuxt`, `.claude` to the docs-coverage `IGNORE_DIRS` set (FP-3, FR-005).
41
+ - **`config.ignore` is now honored by Docs-Coverage's source-directory scan** (FP-3, FR-006 / IR-5). Closes a long-standing inconsistency where other validators respected the user's ignore but the source-dir scan did not. Patterns like `**/cdk.out/**` now match the directory itself as well as files inside it.
42
+ - **Worktree copies no longer double-counted.** `globMatch` in `cli/shared-ignore.mjs` now rejects paths under `.claude/worktrees/`, `.git/worktrees/`, and `.jj/` at any depth — same treatment as `node_modules` (FP-4, FR-007). Affects every Claude-Code project using parallel-agent worktrees.
43
+ - **Check 1 (config files) no longer flags build-cache dotdirs as undocumented configs.** Now skips directories — `.nuxt`, `.claude`, etc. are excluded by `IGNORE_DIRS` for the source-dir scan instead.
44
+ - **Check 1 (config files) now honors `config.ignore` too.** Originally fixed only for the source-directory scan; a follow-up audit reproduced the same FP-3 class with `.local` in `ignore` still being flagged. Both Docs-Coverage scans now call `shouldIgnore(entry, config) || shouldIgnore(entry + '/', config)`. Closes FR-015 (audit-confirmed gap).
45
+ - **Test-Spec validator parses multi-path Journey rows correctly.** Previously a Journey cell like `` `path/a.test.ts`, `path/b.test.ts` `` was stripped of all backticks then `existsSync()`d as one string — a 100% false-positive rate on multi-path rows. Now: split on commas outside backticks, strip backticks per segment, evaluate each independently. Row passes if ANY referenced file has evidence. Glob entries (`foo_*.test.ts`) are expanded; `(N suites)` / `(N tests)` annotations are accepted as the author's explicit coverage claim. Closes FP-6 and FR-016.
46
+ - **TODO-Tracking validator no longer false-positives on its own keyword list.** Previously the regex matched `TEMP(?!late|orar)` inside its own source. Two-part fix: (1) match restricted to text following a comment marker (`//`, `#`, `/*`, `<!--`, block `*`), (2) the validator skips its own source file (`cli/validators/todo-tracking.mjs`) since the docstring legitimately names the keywords.
47
+ - **TODO-Tracking validator no longer false-positives on test fixture strings.** Test files commonly contain `// TODO:` inside template literals (`writeFileSync(..., '// TODO:')`) that single-line heuristics can't distinguish from real comments. Test files are now skipped by default; opt back in with `config.todoTracking.includeTestFiles = true`.
48
+ - **Traceability validator's own fixtures no longer leak as orphan refs.** `tests/traceability.test.mjs` previously contained literal `REQ-001`/`REQ-002`/`REQ-003` strings that the validator scanned and reported as orphaned test references. Fixtures now build the IDs from parts so the validator's pattern doesn't match.
49
+
50
+ ### Added
51
+ - **Multi-tool IaC detector + consolidated documentation reminder.** New `cli/scanners/iac.mjs` identifies projects shipping any of: **AWS CDK** (`cdk.json`), **Terraform** (`*.tf` files), **Pulumi** (`Pulumi.yaml`), **AWS SAM** (`template.yaml` with `AWS::Serverless::`), and **Serverless Framework** (`serverless.yml`). When an IaC project's ARCHITECTURE.md has no Infrastructure heading, DocGuard emits ONE actionable warning per detected tool naming the marker file location and the expected source layout — instead of multiple generic per-directory warnings (FR-009, FR-010, FR-011). The generic per-dir warnings inside IaC packages (`bin/`, `lib/`, `modules/`, `stacks/`, `constructs/`, `handlers/`, etc.) are suppressed in favor of these consolidated messages. The legacy `cli/scanners/cdk.mjs` is preserved as a thin re-export for backward compatibility.
52
+ - **`## Infrastructure (IaC)` section in `templates/ARCHITECTURE.md.template`.** New projects initialized via `docguard init` start with placeholder tables for AWS CDK, Terraform, and Pulumi/SAM/Serverless layouts plus a Deployment Pipeline subsection (FR-012). Explicitly skippable for non-IaC projects via a header comment.
53
+ - **`DEFAULT_IGNORE_DIRS`** exported from `cli/shared-ignore.mjs` — canonical shared ignore set covering build outputs (`dist`, `build`, `out`, `cdk.out`, `target`, `.gradle`), VCS internals (`.git`, `.jj`, `.hg`, `.svn`), package caches (`node_modules`, `vendor`, `.venv`, `__pycache__`), and framework synth outputs (`.next`, `.nuxt`, `.turbo`, `.vercel`, `.cache`, `.svelte-kit`) (FR-008). Added `target` (Rust/Java), `.gradle`, and `.svelte-kit` per the updated wu-whatsappinbox audit. Available for any future validator to import; existing per-validator `IGNORE_DIRS` sets are left in place (deferred migration).
54
+
55
+ ### Changed
56
+ - **DocGuard package version bumped to 0.11.1** across `package.json` and all `extensions/spec-kit-docguard/` files (extension.yml + 5 SKILL.md files were referencing stale `v0.9.9`/`v0.10.0`).
57
+ - **`docs-canonical/ARCHITECTURE.md`** updated to add `cli/writers/` and `cli/shared-*.mjs` to the Component Map and Layer Boundaries — closes a real doc gap surfaced by dogfooding (the writers/ directory has shipped for several releases without being documented).
58
+ - **`specs/003-v011-false-positives/plan.md`** restructured to match the spec-kit `plan-template.md` shape (added Summary, Technical Context, Constitution Check, Project Structure sections). `tasks.md` rewritten with the spec-kit phased T### convention.
59
+
60
+ ### Internal
61
+ - New test files: `tests/cdk-detection.test.mjs` (CDK + multi-tool IaC detector tests + `globMatch` worktree rejection + `DEFAULT_IGNORE_DIRS` shape). Existing test suites extended with regression cases for FP-1..FP-5, TODO-tracking false-positive guards, and IaC-tool detection across Terraform/Pulumi/SAM/Serverless. New tests are annotated with `// @req FR-NNN` / `// @req SC-NNN` comments for traceability. **Total: 329 tests passing (was 306, +23 new).**
62
+ - **DocGuard self-audit improvements**: ran `docguard guard` on the repo as part of this release. Warnings dropped from **57 → 15** across the session by fixing real drift (stale extension versions, missing `cli/writers/` mention, traceability gaps) and reducing self-referential false positives (TODO validator scanning its own keyword list).
63
+ - **Round 2 fixes after a second audit report**: FP-3 part B (`checkConfigFiles` honoring `config.ignore`), FP-6 (Test-Spec multi-path Journey row parsing with glob and `(N suites)` annotation support), additional `DEFAULT_IGNORE_DIRS` entries for Rust/Java/SvelteKit. **Total tests passing: 336** (was 306).
64
+ - No new NPM dependencies. Zero schema or config-file changes.
65
+
66
+ ### Out of scope (deferred to v0.12)
67
+ - Feature requests IR-1..IR-4, IR-6..IR-8 (per-validator severity, `--diff-only`, draft-staleness warning, `sync --section`, `.docguardignore` template at init, extended Next.js detection, `routesGlob`/`servicesGlob` overrides). IR-5 (honor ignore in source-dir scan) shipped as part of this release alongside FP-3.
68
+ - Migrating all 17 modules that define their own `IGNORE_DIRS` constant to import `DEFAULT_IGNORE_DIRS` — mechanical, large diff, tracked separately.
69
+ - Multi-line string-literal detection in TODO-Tracking — current heuristic still false-positives on `// TODO:` inside multi-line template literals. Workaround: keep test files out of TODO scanning (now default) or use `config.todoIgnore` globs.
70
+
71
+ Credit: feedback from running v0.11.0 on the `wu-whatsappinbox` enterprise monorepo (audit score 98/100, 40 warnings).
72
+
10
73
  ## [0.11.0] - 2026-05-22
11
74
 
12
75
  This release reshapes DocGuard from a documentation linter into an **AI-readable, always-current project memory builder** — for any language project, not just JS/web. The four-mode lifecycle (`generate → guard → sync → fix`) is now coherent end-to-end.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: docguard-cli
3
- Version: 0.11.0
3
+ Version: 0.11.2
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
@@ -10,6 +10,8 @@ import { collectPackageJsons, detectDocker, grepEnvUsage, resolveSourceRoots } f
10
10
  import { parseApiReferenceDoc, compareEndpoints } from '../scanners/api-doc.mjs';
11
11
  import { resolveApiSurface } from '../validators/api-surface.mjs';
12
12
  import { collectCodeTests } from '../validators/docs-diff.mjs';
13
+ import { scanSchemasDeep } from '../scanners/schemas.mjs';
14
+ import { detectDocTools } from '../scanners/doc-tools.mjs';
13
15
 
14
16
  const IGNORE_DIRS = new Set([
15
17
  'node_modules', '.git', '.next', 'dist', 'build',
@@ -163,22 +165,17 @@ function diffEntities(dir, config = {}) {
163
165
  docEntities.add(name.toLowerCase());
164
166
  }
165
167
 
166
- // Find model/entity files in code monorepo-aware (honors config.sourceRoot/workspaces).
168
+ // Use the REAL exported entity names from scanSchemasDeep, not file basenames
169
+ // (a file `dynamoModels.ts` exports `User`/`Order`/etc. — its basename is not
170
+ // an entity). scanSchemasDeep covers JS ORMs, SQLAlchemy/Pydantic, Diesel,
171
+ // Go structs, JPA, Rails, and OpenAPI schemas.
172
+ const docTools = detectDocTools(dir);
173
+ const schemas = scanSchemasDeep(dir, {}, docTools);
167
174
  const codeEntities = new Set();
168
- const modelSubdirs = ['models', 'entities', 'schema', 'schemas', 'prisma'];
169
- const roots = resolveSourceRoots(dir, config);
170
- for (const root of roots) {
171
- for (const sub of modelSubdirs) {
172
- const modelDir = join(root, sub);
173
- if (!existsSync(modelDir)) continue;
174
- const files = getFilesRecursive(modelDir);
175
- for (const f of files) {
176
- const name = basename(f, extname(f)).toLowerCase();
177
- // Skip non-entity infrastructure/aggregation filenames.
178
- if (CODE_ENTITY_NOISE.has(name)) continue;
179
- codeEntities.add(name);
180
- }
181
- }
175
+ for (const e of (schemas.entities || [])) {
176
+ const n = String(e.name || '').toLowerCase();
177
+ if (!n || CODE_ENTITY_NOISE.has(n)) continue;
178
+ codeEntities.add(n);
182
179
  }
183
180
 
184
181
  // No code-side entity source (e.g. DynamoDB single-table design with no model
@@ -207,7 +204,8 @@ function diffEnvVars(dir, config = {}) {
207
204
 
208
205
  // Extract env var names from ENVIRONMENT.md
209
206
  const docVars = new Set();
210
- const varRegex = /`([A-Z][A-Z0-9_]{2,})`/g;
207
+ // Reject names ending in `_` (e.g. the literal prefix `VITE_` in prose).
208
+ const varRegex = /`([A-Z][A-Z0-9_]*[A-Z0-9])`/g;
211
209
  let match;
212
210
  while ((match = varRegex.exec(content)) !== null) {
213
211
  docVars.add(match[1]);
@@ -220,7 +218,7 @@ function diffEnvVars(dir, config = {}) {
220
218
  const envExamplePath = resolve(dir, envFile);
221
219
  if (existsSync(envExamplePath)) {
222
220
  const envContent = readFileSync(envExamplePath, 'utf-8');
223
- const envRegex = /^([A-Z][A-Z0-9_]+)\s*=/gm;
221
+ const envRegex = /^([A-Z][A-Z0-9_]*[A-Z0-9])\s*=/gm;
224
222
  while ((match = envRegex.exec(envContent)) !== null) {
225
223
  codeVars.add(match[1]);
226
224
  }
@@ -194,16 +194,26 @@ export function runGuard(projectDir, config, flags) {
194
194
  console.log(` ${c.yellow}⚠️ ${v.name}${c.reset} ${qBadge}${c.dim} ${v.passed}/${v.total} checks passed${c.reset}`);
195
195
  }
196
196
 
197
- if (flags.verbose || v.status === 'fail') {
197
+ // --show-failing forces enumeration of every error/warning regardless of
198
+ // overall validator status — useful when a validator passes overall
199
+ // (passed < total) without surfacing the specific failing checks.
200
+ const show = flags.verbose || flags.showFailing;
201
+ if (show || v.status === 'fail') {
198
202
  for (const err of v.errors) {
199
203
  console.log(` ${c.red}✗ ${err}${c.reset}`);
200
204
  }
201
205
  }
202
- if (flags.verbose || v.status === 'warn') {
206
+ if (show || v.status === 'warn') {
203
207
  for (const warn of v.warnings) {
204
208
  console.log(` ${c.yellow}⚠ ${warn}${c.reset}`);
205
209
  }
206
210
  }
211
+ // If a validator reports passed < total but has no errors/warnings, surface
212
+ // the gap honestly so users aren't left wondering where the deficit went.
213
+ if (v.status === 'pass' && v.total > v.passed && v.errors.length === 0 && v.warnings.length === 0) {
214
+ const gap = v.total - v.passed;
215
+ console.log(` ${c.yellow}⚠ ${gap} check(s) did not pass but emitted no message — likely a validator bug. Please file an issue.${c.reset}`);
216
+ }
207
217
  }
208
218
 
209
219
  // Summary
@@ -365,6 +365,8 @@ async function main() {
365
365
  } else if (args[i] === '--since' && args[i + 1]) {
366
366
  flags.since = args[i + 1];
367
367
  i++;
368
+ } else if (args[i] === '--show-failing') {
369
+ flags.showFailing = true;
368
370
  } else if (args[i] === '--doc' && args[i + 1]) {
369
371
  flags.doc = args[i + 1];
370
372
  i++;
@@ -54,8 +54,13 @@ export function detectAgentMode(projectDir) {
54
54
  '.specify',
55
55
  '.github/copilot-instructions.md',
56
56
  'CLAUDE.md',
57
+ 'GEMINI.md',
57
58
  '.gemini',
58
59
  '.agents',
60
+ '.antigravity',
61
+ 'ANTIGRAVITY.md',
62
+ '.kiro',
63
+ '.windsurf',
59
64
  ];
60
65
 
61
66
  for (const signal of llmSignals) {
@@ -105,7 +110,9 @@ export function detectAIAgent(projectDir) {
105
110
  { signal: '.claude', agent: 'claude' },
106
111
  { signal: 'CLAUDE.md', agent: 'claude' },
107
112
  { signal: '.gemini', agent: 'gemini' },
108
- { signal: '.agents', agent: 'agy' }, // Antigravity
113
+ { signal: '.agents', agent: 'agy' }, // Antigravity (Spec Kit convention)
114
+ { signal: '.antigravity', agent: 'agy' }, // Antigravity (alt convention)
115
+ { signal: 'ANTIGRAVITY.md', agent: 'agy' }, // Antigravity rules file
109
116
  { signal: '.github/copilot-instructions.md', agent: 'copilot' },
110
117
  { signal: '.windsurf', agent: 'windsurf' },
111
118
  { signal: '.codex', agent: 'codex' },
@@ -0,0 +1,10 @@
1
+ /**
2
+ * CDK Detector — Re-export shim.
3
+ *
4
+ * The CDK-specific detector has been generalized into a multi-tool IaC
5
+ * detector at cli/scanners/iac.mjs covering CDK, Terraform, Pulumi, SAM,
6
+ * and Serverless Framework. This module re-exports the CDK-only API for
7
+ * backward compatibility. New code should import from iac.mjs directly.
8
+ */
9
+
10
+ export { detectCDK, hasInfrastructureHeading } from './iac.mjs';
@@ -0,0 +1,235 @@
1
+ /**
2
+ * IaC Detector — Identifies Infrastructure-as-Code projects.
3
+ *
4
+ * IaC code is real production source that defines cloud infrastructure.
5
+ * It MUST be documented in ARCHITECTURE.md, not silently ignored. This
6
+ * detector identifies which IaC tool the project uses so docs-coverage
7
+ * can emit ONE consolidated actionable warning naming the actual layout
8
+ * (instead of multiple generic per-directory warnings).
9
+ *
10
+ * Supported tools:
11
+ * - AWS CDK → cdk.json marker file
12
+ * - Terraform → *.tf files in any non-ignored directory
13
+ * - Pulumi → Pulumi.yaml marker file
14
+ * - AWS SAM → template.yaml/yml with "AWS::Serverless::"
15
+ * - Serverless Fmw → serverless.yml/serverless.yaml/serverless.ts
16
+ *
17
+ * Zero NPM dependencies — pure Node.js built-ins only.
18
+ */
19
+
20
+ import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
21
+ import { join, relative } from 'node:path';
22
+ import { DEFAULT_IGNORE_DIRS } from '../shared-ignore.mjs';
23
+
24
+ const MAX_DEPTH = 6;
25
+
26
+ /**
27
+ * Per-tool conventions: marker file/pattern + the directories that hold the
28
+ * actual IaC source. Used to construct the consolidated warning text.
29
+ */
30
+ const TOOL_PROFILES = {
31
+ cdk: {
32
+ label: 'AWS CDK',
33
+ markerFile: 'cdk.json',
34
+ sourceDirs: ['bin/ (app entrypoint)', 'lib/stacks/', 'lib/constructs/'],
35
+ headingPattern: /^#+\s+(infrastructure|cdk|iac)\b/im,
36
+ },
37
+ terraform: {
38
+ label: 'Terraform',
39
+ markerFile: null, // any *.tf file
40
+ sourceDirs: ['*.tf (root module)', 'modules/ (reusable modules)', 'environments/ (per-env tfvars)'],
41
+ headingPattern: /^#+\s+(infrastructure|terraform|iac)\b/im,
42
+ },
43
+ pulumi: {
44
+ label: 'Pulumi',
45
+ markerFile: 'Pulumi.yaml',
46
+ sourceDirs: ['index.ts (main program)', 'stacks/', 'config/'],
47
+ headingPattern: /^#+\s+(infrastructure|pulumi|iac)\b/im,
48
+ },
49
+ sam: {
50
+ label: 'AWS SAM',
51
+ markerFile: 'template.yaml', // also template.yml — checked below
52
+ sourceDirs: ['template.yaml (SAM manifest)', 'src/ (Lambda handlers)', 'events/'],
53
+ headingPattern: /^#+\s+(infrastructure|sam|serverless|iac)\b/im,
54
+ },
55
+ serverless: {
56
+ label: 'Serverless Framework',
57
+ markerFile: 'serverless.yml', // also .yaml, .ts — checked below
58
+ sourceDirs: ['serverless.yml (manifest)', 'handlers/', 'src/'],
59
+ headingPattern: /^#+\s+(infrastructure|serverless|iac)\b/im,
60
+ },
61
+ };
62
+
63
+ /**
64
+ * Detect every IaC tool used in the project. Walks the tree from projectDir
65
+ * looking for marker files, respecting DEFAULT_IGNORE_DIRS.
66
+ *
67
+ * @param {string} projectDir - Absolute path to project root
68
+ * @returns {{
69
+ * isIaC: boolean,
70
+ * tools: Array<{
71
+ * tool: string, // 'cdk' | 'terraform' | 'pulumi' | 'sam' | 'serverless'
72
+ * label: string, // 'AWS CDK' etc.
73
+ * markerPaths: string[], // relative paths to detected marker files
74
+ * packageDirs: string[], // relative dirs containing the markers
75
+ * sourceDirs: string[], // expected source layout per tool convention
76
+ * }>
77
+ * }}
78
+ */
79
+ export function detectIaC(projectDir) {
80
+ const findings = {
81
+ cdk: { markerPaths: [], packageDirs: [] },
82
+ terraform: { markerPaths: [], packageDirs: [] },
83
+ pulumi: { markerPaths: [], packageDirs: [] },
84
+ sam: { markerPaths: [], packageDirs: [] },
85
+ serverless: { markerPaths: [], packageDirs: [] },
86
+ };
87
+
88
+ const recordFinding = (tool, fullPath) => {
89
+ const relPath = relative(projectDir, fullPath);
90
+ findings[tool].markerPaths.push(relPath);
91
+ const pkgDir = relative(projectDir, dirnameOf(fullPath)) || '.';
92
+ if (!findings[tool].packageDirs.includes(pkgDir)) {
93
+ findings[tool].packageDirs.push(pkgDir);
94
+ }
95
+ };
96
+
97
+ const walk = (dir, depth) => {
98
+ if (depth > MAX_DEPTH) return;
99
+ let entries;
100
+ try { entries = readdirSync(dir, { withFileTypes: true }); } catch { return; }
101
+
102
+ for (const e of entries) {
103
+ if (!e.isFile()) continue;
104
+ const full = join(dir, e.name);
105
+
106
+ // CDK
107
+ if (e.name === 'cdk.json') recordFinding('cdk', full);
108
+
109
+ // Terraform — any .tf file (we record one per directory, not per file)
110
+ if (e.name.endsWith('.tf')) {
111
+ const pkgDir = relative(projectDir, dir) || '.';
112
+ if (!findings.terraform.packageDirs.includes(pkgDir)) {
113
+ findings.terraform.markerPaths.push(relative(projectDir, full));
114
+ findings.terraform.packageDirs.push(pkgDir);
115
+ }
116
+ }
117
+
118
+ // Pulumi
119
+ if (e.name === 'Pulumi.yaml' || e.name === 'Pulumi.yml') {
120
+ recordFinding('pulumi', full);
121
+ }
122
+
123
+ // SAM — template.yaml/yml WITH AWS::Serverless::
124
+ if (e.name === 'template.yaml' || e.name === 'template.yml') {
125
+ if (fileContains(full, 'AWS::Serverless::')) recordFinding('sam', full);
126
+ }
127
+
128
+ // Serverless Framework
129
+ if (
130
+ e.name === 'serverless.yml' ||
131
+ e.name === 'serverless.yaml' ||
132
+ e.name === 'serverless.ts' ||
133
+ e.name === 'serverless.js'
134
+ ) {
135
+ recordFinding('serverless', full);
136
+ }
137
+ }
138
+
139
+ for (const e of entries) {
140
+ if (!e.isDirectory()) continue;
141
+ if (DEFAULT_IGNORE_DIRS.has(e.name)) continue;
142
+ if (e.name.startsWith('.')) continue;
143
+ walk(join(dir, e.name), depth + 1);
144
+ }
145
+ };
146
+
147
+ if (existsSync(projectDir)) {
148
+ try {
149
+ if (statSync(projectDir).isDirectory()) walk(projectDir, 0);
150
+ } catch { /* skip */ }
151
+ }
152
+
153
+ const tools = [];
154
+ for (const [tool, data] of Object.entries(findings)) {
155
+ if (data.markerPaths.length > 0) {
156
+ tools.push({
157
+ tool,
158
+ label: TOOL_PROFILES[tool].label,
159
+ markerPaths: data.markerPaths,
160
+ packageDirs: data.packageDirs,
161
+ sourceDirs: TOOL_PROFILES[tool].sourceDirs,
162
+ });
163
+ }
164
+ }
165
+
166
+ return { isIaC: tools.length > 0, tools };
167
+ }
168
+
169
+ /**
170
+ * Check whether ARCHITECTURE.md content includes an Infrastructure/CDK/IaC/
171
+ * Terraform/Pulumi/SAM heading at any level. Case-insensitive.
172
+ *
173
+ * @param {string} archContent - Full ARCHITECTURE.md content
174
+ * @returns {boolean}
175
+ */
176
+ export function hasInfrastructureHeading(archContent) {
177
+ if (!archContent) return false;
178
+ return /^#+\s+(infrastructure|cdk|iac|terraform|pulumi|sam|serverless)\b/im.test(archContent);
179
+ }
180
+
181
+ /**
182
+ * Build the consolidated warning text for a detected IaC tool.
183
+ * One warning per tool — names the marker location and required content.
184
+ */
185
+ export function buildIaCWarning(toolFinding) {
186
+ const primary = toolFinding.markerPaths[0];
187
+ const pkgDir = toolFinding.packageDirs[0];
188
+ const where = pkgDir === '.' ? '' : pkgDir + '/';
189
+ const sourceList = toolFinding.sourceDirs
190
+ .map(s => s.startsWith('*.') ? `${where}${s}` : `${where}${s}`)
191
+ .join(', ');
192
+ return `${toolFinding.label} detected at ${primary} — add an "Infrastructure" section to ` +
193
+ `ARCHITECTURE.md covering ${sourceList}`;
194
+ }
195
+
196
+ // ── Helpers ─────────────────────────────────────────────────────────────────
197
+
198
+ function dirnameOf(p) {
199
+ const i = p.lastIndexOf('/');
200
+ if (i < 0) {
201
+ const j = p.lastIndexOf('\\');
202
+ return j < 0 ? p : p.slice(0, j);
203
+ }
204
+ return p.slice(0, i);
205
+ }
206
+
207
+ function fileContains(filePath, needle) {
208
+ try {
209
+ const content = readFileSync(filePath, 'utf-8');
210
+ return content.includes(needle);
211
+ } catch {
212
+ return false;
213
+ }
214
+ }
215
+
216
+ // ── Backwards-compatibility shim ────────────────────────────────────────────
217
+
218
+ /**
219
+ * Legacy CDK-only API kept for callers that don't need multi-tool detection.
220
+ * Delegates to detectIaC and projects the CDK slice into the old shape.
221
+ *
222
+ * @deprecated Use detectIaC for new code.
223
+ */
224
+ export function detectCDK(projectDir) {
225
+ const result = detectIaC(projectDir);
226
+ const cdk = result.tools.find(t => t.tool === 'cdk');
227
+ if (!cdk) {
228
+ return { isCDK: false, cdkJsonPaths: [], cdkPackageDirs: [] };
229
+ }
230
+ return {
231
+ isCDK: true,
232
+ cdkJsonPaths: cdk.markerPaths,
233
+ cdkPackageDirs: cdk.packageDirs,
234
+ };
235
+ }
@@ -15,6 +15,31 @@
15
15
  * Zero NPM dependencies — pure Node.js built-ins only.
16
16
  */
17
17
 
18
+ /**
19
+ * Canonical set of directory names that should never be scanned, regardless
20
+ * of validator. Build outputs, VCS internals, package caches, framework synth
21
+ * outputs. Validators MAY extend this with their own additions but SHOULD
22
+ * start from this base so behavior is consistent across the tool.
23
+ */
24
+ export const DEFAULT_IGNORE_DIRS = new Set([
25
+ // Package managers
26
+ 'node_modules', 'vendor', '.venv', '__pycache__',
27
+ // VCS
28
+ '.git', '.jj', '.hg', '.svn',
29
+ // Build outputs — JS/TS, Rust/Java, generic
30
+ 'dist', 'build', 'out', 'coverage', 'target', '.gradle',
31
+ // Framework synth/cache
32
+ '.next', '.nuxt', '.turbo', '.vercel', '.cache', '.svelte-kit', 'cdk.out',
33
+ // OS
34
+ '.DS_Store',
35
+ ]);
36
+
37
+ // Regex for paths that must always be rejected at any depth, regardless of
38
+ // the glob pattern matching them. These are duplicate file trees (worktrees)
39
+ // or runtime caches that should NEVER be treated as primary source.
40
+ const ALWAYS_REJECT_PATH_RE =
41
+ /(?:^|[/\\])(?:node_modules|\.claude[/\\]worktrees|\.git[/\\]worktrees|\.jj)(?:[/\\]|$)/;
42
+
18
43
  /**
19
44
  * Convert a glob pattern to a RegExp.
20
45
  * Supports: * (any chars except /), ** (any path segments), . (literal dot).
@@ -111,8 +136,10 @@ function globToMatchRegex(pattern) {
111
136
  export function globMatch(relPath, patterns) {
112
137
  if (!relPath || !patterns || patterns.length === 0) return false;
113
138
 
114
- // Always reject paths containing node_modules at any depth
115
- if (/(?:^|[/\\])node_modules(?:[/\\]|$)/.test(relPath)) return false;
139
+ // Always reject paths inside node_modules / worktree copies / .jj at any
140
+ // depth. A user's testPatterns like "**/*.test.ts" would otherwise match
141
+ // duplicate trees under .claude/worktrees and inflate test counts.
142
+ if (ALWAYS_REJECT_PATH_RE.test(relPath)) return false;
116
143
 
117
144
  const regexes = patterns.map(p => globToMatchRegex(p));
118
145
  return regexes.some(r => r.test(relPath));
@@ -18,8 +18,9 @@ import { resolve, join, dirname, relative, extname } from 'node:path';
18
18
  import { shouldIgnore } from './shared-ignore.mjs';
19
19
 
20
20
  const IGNORE_DIRS = new Set([
21
- 'node_modules', '.git', '.next', 'dist', 'build',
21
+ 'node_modules', '.git', '.next', '.nuxt', 'dist', 'build', 'out',
22
22
  'coverage', '.cache', '__pycache__', '.venv', 'vendor', '.turbo',
23
+ 'cdk.out',
23
24
  ]);
24
25
 
25
26
  const CODE_EXTENSIONS = new Set([
@@ -209,11 +210,16 @@ export function grepEnvUsage(projectDir, config = {}) {
209
210
  const roots = resolveSourceRoots(projectDir, config);
210
211
  const seen = new Set();
211
212
 
213
+ // Require names to start with a letter and END with a letter/digit (NOT an
214
+ // underscore) — fixes "VITE_" being captured as a literal env var name.
215
+ const NAME = '([A-Z][A-Z0-9_]*[A-Z0-9])';
212
216
  const patterns = [
213
- /process\.env\.([A-Z][A-Z0-9_]+)/g,
214
- /process\.env\[\s*['"]([A-Z][A-Z0-9_]+)['"]\s*\]/g,
215
- /import\.meta\.env\.([A-Z][A-Z0-9_]+)/g,
217
+ new RegExp(`process\\.env\\.${NAME}`, 'g'),
218
+ new RegExp(`process\\.env\\[\\s*['"]${NAME}['"]\\s*\\]`, 'g'),
219
+ new RegExp(`import\\.meta\\.env\\.${NAME}`, 'g'),
216
220
  ];
221
+ // Vite injects these at build time; they are not user-set env vars.
222
+ const VITE_INTRINSICS = new Set(['DEV', 'PROD', 'MODE', 'BASE_URL', 'SSR']);
217
223
 
218
224
  const visit = (filePath) => {
219
225
  if (seen.has(filePath)) return;
@@ -224,10 +230,16 @@ export function grepEnvUsage(projectDir, config = {}) {
224
230
  let content;
225
231
  try { content = readFileSync(filePath, 'utf-8'); } catch { return; }
226
232
  if (!content.includes('env')) return;
227
- for (const re of patterns) {
233
+ // patterns[2] is the import.meta.env one — its matches are Vite-injected
234
+ // when the name is an intrinsic, and must not be reported as user env vars.
235
+ for (let i = 0; i < patterns.length; i++) {
228
236
  let m;
229
- const rx = new RegExp(re.source, 'g');
230
- while ((m = rx.exec(content)) !== null) names.add(m[1]);
237
+ const rx = new RegExp(patterns[i].source, 'g');
238
+ const isViteSource = i === 2;
239
+ while ((m = rx.exec(content)) !== null) {
240
+ if (isViteSource && VITE_INTRINSICS.has(m[1])) continue;
241
+ names.add(m[1]);
242
+ }
231
243
  }
232
244
  };
233
245