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