docguard-cli 0.9.8__tar.gz → 0.9.10__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.9.8/extensions/spec-kit-docguard → docguard_cli-0.9.10/.agent}/skills/docguard-fix/SKILL.md +2 -1
- {docguard_cli-0.9.8/extensions/spec-kit-docguard → docguard_cli-0.9.10/.agent}/skills/docguard-guard/SKILL.md +9 -4
- {docguard_cli-0.9.8/extensions/spec-kit-docguard → docguard_cli-0.9.10/.agent}/skills/docguard-review/SKILL.md +5 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/docguard-score/SKILL.md +2 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.docguard.json +4 -0
- docguard_cli-0.9.10/.github/scripts/patch-catalog.py +104 -0
- docguard_cli-0.9.10/.github/workflows/release.yml +191 -0
- docguard_cli-0.9.10/.github/workflows/sync-speckit-catalog.yml +162 -0
- docguard_cli-0.9.10/.specify/extensions/.cache/catalog-ebf165086500aab1-metadata.json +4 -0
- docguard_cli-0.9.10/.specify/extensions/.cache/catalog-ebf165086500aab1.json +595 -0
- docguard_cli-0.9.10/.specify/extensions/.cache/catalog-metadata.json +4 -0
- docguard_cli-0.9.10/.specify/extensions/.cache/catalog.json +21 -0
- docguard_cli-0.9.10/.specify/memory/constitution.md +76 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/CHANGELOG.md +61 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/PKG-INFO +1 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/diagnose.mjs +64 -24
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/fix.mjs +1 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/guard.mjs +12 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/hooks.mjs +2 -2
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/init.mjs +94 -73
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/score.mjs +58 -16
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/setup.mjs +60 -30
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/docguard.mjs +14 -5
- docguard_cli-0.9.10/cli/ensure-skills.mjs +314 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/scanners/speckit.mjs +1 -1
- docguard_cli-0.9.10/cli/shared-ignore.mjs +76 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/architecture.mjs +21 -6
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/doc-quality.mjs +1 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/docs-diff.mjs +79 -12
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/schema-sync.mjs +1 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/security.mjs +49 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/todo-tracking.mjs +41 -15
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/extension.yml +6 -2
- {docguard_cli-0.9.8/.agent → docguard_cli-0.9.10/extensions/spec-kit-docguard}/skills/docguard-fix/SKILL.md +2 -1
- {docguard_cli-0.9.8/.agent → docguard_cli-0.9.10/extensions/spec-kit-docguard}/skills/docguard-guard/SKILL.md +9 -4
- {docguard_cli-0.9.8/.agent → docguard_cli-0.9.10/extensions/spec-kit-docguard}/skills/docguard-review/SKILL.md +5 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/skills/docguard-score/SKILL.md +2 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/package.json +1 -1
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/pyproject.toml +1 -1
- docguard_cli-0.9.10/specs/001-fix-ignore-validators/plan.md +115 -0
- docguard_cli-0.9.10/specs/001-fix-ignore-validators/spec.md +104 -0
- docguard_cli-0.9.10/specs/001-fix-ignore-validators/tasks.md +49 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/tests/commands.test.mjs +127 -1
- docguard_cli-0.9.8/.github/workflows/release.yml +0 -78
- docguard_cli-0.9.8/.github/workflows/spec-kit-extension.yml +0 -40
- docguard_cli-0.9.8/.specify/memory/constitution.md +0 -50
- docguard_cli-0.9.8/cli/ensure-skills.mjs +0 -96
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.analyze.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.checklist.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.clarify.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.constitution.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.implement.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.plan.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.specify.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.tasks.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/commands/speckit.taskstoissues.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-analyze/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-checklist/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-clarify/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-constitution/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-implement/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-plan/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-specify/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-tasks/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.agent/skills/speckit-taskstoissues/SKILL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.docguardignore +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.github/workflows/ci.yml +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.gitignore +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.npmignore +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/init-options.json +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/scripts/bash/common.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/scripts/bash/setup-plan.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/templates/agent-file-template.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/templates/checklist-template.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/templates/constitution-template.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/templates/plan-template.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/templates/spec-template.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/.specify/templates/tasks-template.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/AGENTS.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/CODE_OF_CONDUCT.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/COMPARISONS.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/CONTRIBUTING.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/DRIFT-LOG.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/LICENSE +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/PHILOSOPHY.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/README.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/ROADMAP.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/SECURITY.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/STANDARD.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/SUPPORT.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/action.yml +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/agents.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/badge.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/ci.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/diff.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/generate.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/llms.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/publish.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/trace.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/commands/watch.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/scanners/doc-tools.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/scanners/routes.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/scanners/schemas.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/shared.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/changelog.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/docs-coverage.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/docs-sync.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/drift.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/environment.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/freshness.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/metadata-sync.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/metrics-consistency.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/structure.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/test-spec.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/cli/validators/traceability.mjs +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/commands/docguard.fix.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/commands/docguard.guard.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/commands/docguard.review.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/commands/docguard.score.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/configs/fastify.json +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/configs/generic.json +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/configs/nextjs.json +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/configs/python.json +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docguard_cli/__init__.py +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docguard_cli/wrapper.py +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs/ai-integration.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs/commands.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs/configuration.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs/faq.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs/installation.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs/profiles.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs/quickstart.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs-canonical/ARCHITECTURE.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs-canonical/DATA-MODEL.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs-canonical/ENVIRONMENT.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs-canonical/SECURITY.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/docs-canonical/TEST-SPEC.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/01-express-api/README.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/01-express-api/package.json +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/01-express-api/server.js +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/02-python-flask/README.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/02-python-flask/app.py +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/02-python-flask/docs-canonical/ARCHITECTURE.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/02-python-flask/requirements.txt +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/03-spec-kit-project/CHANGELOG.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/03-spec-kit-project/README.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/03-spec-kit-project/docs-canonical/ARCHITECTURE.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/03-spec-kit-project/docs-canonical/TEST-SPEC.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/03-spec-kit-project/package.json +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/03-spec-kit-project/src/index.js +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/03-spec-kit-project/tests/basic.test.js +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/examples/README.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/LICENSE +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/README.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/diagnose.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/generate.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/guard.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/init.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/score.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/trace.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/common.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/docguard-check-docs.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/docguard-init-doc.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/docguard-suggest-fix.sh +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/templates/extensions.yml +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/ADR.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/AGENTS.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/ARCHITECTURE.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/CHANGELOG.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/CURRENT-STATE.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/DATA-MODEL.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/DEPLOYMENT.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/DRIFT-LOG.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/ENVIRONMENT.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/KNOWN-GOTCHAS.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/REQUIREMENTS.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/ROADMAP.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/RUNBOOKS.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/SECURITY.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/TEST-SPEC.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/TROUBLESHOOTING.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/VENDOR-BUGS.md.template +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/ci/github-actions.yml +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/commands/docguard.fix.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/commands/docguard.guard.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/commands/docguard.init.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/commands/docguard.review.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/templates/commands/docguard.update.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/vscode-extension/.vscodeignore +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/vscode-extension/README.md +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/vscode-extension/extension.js +0 -0
- {docguard_cli-0.9.8 → docguard_cli-0.9.10}/vscode-extension/package.json +0 -0
|
@@ -6,9 +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
|
+
version: 0.9.9
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-fix
|
|
11
11
|
---
|
|
12
|
+
<!-- docguard:version: 0.9.9 -->
|
|
12
13
|
|
|
13
14
|
# DocGuard Fix Skill
|
|
14
15
|
|
|
@@ -7,9 +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.
|
|
10
|
+
version: 0.9.9
|
|
11
11
|
source: extensions/spec-kit-docguard/skills/docguard-guard
|
|
12
12
|
---
|
|
13
|
+
<!-- docguard:version: 0.9.9 -->
|
|
13
14
|
|
|
14
15
|
# DocGuard Guard Skill
|
|
15
16
|
|
|
@@ -155,12 +156,16 @@ Present the user with options:
|
|
|
155
156
|
- **Track progress** — if user runs guard multiple times, compare before/after
|
|
156
157
|
- If user provides `$ARGUMENTS` like "just structure" or "only security", filter report to those validators
|
|
157
158
|
|
|
158
|
-
## Integration with Spec Kit
|
|
159
|
+
## Integration with Spec Kit (Extension-First)
|
|
159
160
|
|
|
160
|
-
|
|
161
|
+
DocGuard is a spec-kit extension. When this project has a `.specify/` directory:
|
|
162
|
+
- Read `.specify/memory/constitution.md` for project principles that constrain documentation
|
|
161
163
|
- Include Spec-Kit validator results in the triage
|
|
162
164
|
- Cross-reference spec quality issues with `specs/*/spec.md` file paths
|
|
163
|
-
-
|
|
165
|
+
- When specification issues found → suggest `/speckit.specify` or `/speckit.clarify`
|
|
166
|
+
- When architecture gaps found → suggest `/speckit.plan`
|
|
167
|
+
- When cross-artifact inconsistencies exceed 3 → suggest `/speckit.analyze`
|
|
168
|
+
- When no constitution exists → suggest `/speckit.constitution` as first step
|
|
164
169
|
|
|
165
170
|
## Context
|
|
166
171
|
|
|
@@ -6,9 +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
|
+
version: 0.9.9
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-review
|
|
11
11
|
---
|
|
12
|
+
<!-- docguard:version: 0.9.9 -->
|
|
12
13
|
|
|
13
14
|
# DocGuard Review Skill
|
|
14
15
|
|
|
@@ -163,7 +164,10 @@ Output a structured markdown report (do NOT write to disk):
|
|
|
163
164
|
|
|
164
165
|
Based on findings:
|
|
165
166
|
- **If CRITICAL issues**: "Run `/docguard.fix --doc [name]` to resolve blocking issues"
|
|
167
|
+
- **If spec-related gaps**: "Run `/speckit.specify` to update specifications" or "/speckit.clarify to resolve ambiguities"
|
|
168
|
+
- **If architecture drift**: "Run `/speckit.plan` to realign implementation plan with codebase"
|
|
166
169
|
- **If only LOW/MEDIUM**: "Documentation is healthy. Consider `/docguard.fix` for polish"
|
|
170
|
+
- **If constitution missing**: "Run `/speckit.constitution` to establish project principles"
|
|
167
171
|
- **If all clean**: "Documentation is excellent. No action needed."
|
|
168
172
|
|
|
169
173
|
Ask: "Would you like me to fix the top N issues? (I'll show you what I plan to change before applying)"
|
|
@@ -6,9 +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
|
+
version: 0.9.9
|
|
10
10
|
source: extensions/spec-kit-docguard/skills/docguard-score
|
|
11
11
|
---
|
|
12
|
+
<!-- docguard:version: 0.9.9 -->
|
|
12
13
|
|
|
13
14
|
# DocGuard Score Skill
|
|
14
15
|
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Surgical catalog.community.json patcher for DocGuard.
|
|
3
|
+
|
|
4
|
+
Updates ONLY the docguard entry and top-level updated_at.
|
|
5
|
+
Does NOT re-serialize the entire JSON (preserves unicode escapes,
|
|
6
|
+
formatting, and other extensions' entries exactly as-is).
|
|
7
|
+
|
|
8
|
+
Usage: python3 patch-catalog.py <version> <download_url> <updated_at>
|
|
9
|
+
"""
|
|
10
|
+
import sys
|
|
11
|
+
import json
|
|
12
|
+
|
|
13
|
+
if len(sys.argv) != 4:
|
|
14
|
+
print("Usage: patch-catalog.py <version> <download_url> <updated_at>")
|
|
15
|
+
sys.exit(1)
|
|
16
|
+
|
|
17
|
+
version = sys.argv[1]
|
|
18
|
+
download_url = sys.argv[2]
|
|
19
|
+
updated_at = sys.argv[3]
|
|
20
|
+
|
|
21
|
+
CATALOG_FILE = "extensions/catalog.community.json"
|
|
22
|
+
|
|
23
|
+
with open(CATALOG_FILE, "r") as f:
|
|
24
|
+
content = f.read()
|
|
25
|
+
|
|
26
|
+
# Parse to validate structure and get current values
|
|
27
|
+
data = json.loads(content)
|
|
28
|
+
|
|
29
|
+
if "extensions" not in data or "docguard" not in data["extensions"]:
|
|
30
|
+
print("❌ DocGuard entry not found in catalog.extensions")
|
|
31
|
+
sys.exit(1)
|
|
32
|
+
|
|
33
|
+
dg = data["extensions"]["docguard"]
|
|
34
|
+
old_version = dg["version"]
|
|
35
|
+
old_url = dg["download_url"]
|
|
36
|
+
old_entry_updated = dg["updated_at"]
|
|
37
|
+
old_desc = dg["description"]
|
|
38
|
+
top_updated = data["updated_at"]
|
|
39
|
+
|
|
40
|
+
# Correct description (matches our constitution: "Zero NPM runtime dependencies")
|
|
41
|
+
new_desc = (
|
|
42
|
+
"Canonical-Driven Development enforcement. "
|
|
43
|
+
"Validates, scores, and traces project documentation with automated checks, "
|
|
44
|
+
"AI-driven workflows, and spec-kit hooks. Zero NPM runtime dependencies."
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
# Surgical string replacements — only touch specific values
|
|
48
|
+
# 1. DocGuard version (first occurrence after "docguard" block)
|
|
49
|
+
content = content.replace(
|
|
50
|
+
f'"version": "{old_version}"',
|
|
51
|
+
f'"version": "{version}"',
|
|
52
|
+
1,
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
# 2. Download URL (unique string, safe to replace globally)
|
|
56
|
+
content = content.replace(old_url, download_url)
|
|
57
|
+
|
|
58
|
+
# 3. DocGuard updated_at (first occurrence after version change)
|
|
59
|
+
content = content.replace(
|
|
60
|
+
f'"updated_at": "{old_entry_updated}"',
|
|
61
|
+
f'"updated_at": "{updated_at}"',
|
|
62
|
+
1,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# 4. Description fix (if needed)
|
|
66
|
+
if old_desc != new_desc:
|
|
67
|
+
content = content.replace(old_desc, new_desc)
|
|
68
|
+
|
|
69
|
+
# 5. Bump top-level updated_at (should appear early in file)
|
|
70
|
+
content = content.replace(
|
|
71
|
+
f'"updated_at": "{top_updated}"',
|
|
72
|
+
f'"updated_at": "{updated_at}"',
|
|
73
|
+
1,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
with open(CATALOG_FILE, "w") as f:
|
|
77
|
+
f.write(content)
|
|
78
|
+
|
|
79
|
+
print(f"✅ Updated catalog.community.json → v{version} (surgical, no noisy diffs)")
|
|
80
|
+
print(f" version: {old_version} → {version}")
|
|
81
|
+
print(f" download_url: updated")
|
|
82
|
+
print(f" updated_at: {old_entry_updated} → {updated_at}")
|
|
83
|
+
print(f" top-level updated_at: {top_updated} → {updated_at}")
|
|
84
|
+
if old_desc != new_desc:
|
|
85
|
+
print(f" description: updated to match constitution")
|
|
86
|
+
|
|
87
|
+
# --- Also patch extensions/README.md (table row description) ---
|
|
88
|
+
README_FILE = "extensions/README.md"
|
|
89
|
+
try:
|
|
90
|
+
with open(README_FILE, "r") as f:
|
|
91
|
+
readme = f.read()
|
|
92
|
+
|
|
93
|
+
# The DocGuard row in the README table looks like:
|
|
94
|
+
# | DocGuard — CDD Enforcement | <description> | [spec-kit-docguard](...) |
|
|
95
|
+
# Only update if the old description is present
|
|
96
|
+
if old_desc in readme and old_desc != new_desc:
|
|
97
|
+
readme = readme.replace(old_desc, new_desc)
|
|
98
|
+
with open(README_FILE, "w") as f:
|
|
99
|
+
f.write(readme)
|
|
100
|
+
print(f"✅ Updated extensions/README.md — description synced")
|
|
101
|
+
else:
|
|
102
|
+
print(f"ℹ️ extensions/README.md already up to date")
|
|
103
|
+
except FileNotFoundError:
|
|
104
|
+
print(f"⚠️ {README_FILE} not found — skipping README update")
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
name: Auto Release — Tag, GitHub Release, npm, PyPI
|
|
2
|
+
|
|
3
|
+
# Triggers on push to main — detects version bumps automatically
|
|
4
|
+
on:
|
|
5
|
+
workflow_dispatch: # Allow manual trigger for recovery
|
|
6
|
+
push:
|
|
7
|
+
branches: [main]
|
|
8
|
+
paths:
|
|
9
|
+
- 'package.json' # Only run when package.json changes (version bump)
|
|
10
|
+
|
|
11
|
+
permissions:
|
|
12
|
+
contents: write # Needed to create tags and releases
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
# ── Step 1: Detect if version changed ──────────────────────────────────
|
|
16
|
+
detect-version:
|
|
17
|
+
runs-on: ubuntu-latest
|
|
18
|
+
outputs:
|
|
19
|
+
version: ${{ steps.check.outputs.version }}
|
|
20
|
+
changed: ${{ steps.check.outputs.changed }}
|
|
21
|
+
steps:
|
|
22
|
+
- uses: actions/checkout@v4
|
|
23
|
+
with:
|
|
24
|
+
fetch-depth: 2 # Need previous commit to compare
|
|
25
|
+
|
|
26
|
+
- name: Check if version changed
|
|
27
|
+
id: check
|
|
28
|
+
run: |
|
|
29
|
+
CURRENT=$(node -p "require('./package.json').version")
|
|
30
|
+
# Get version from previous commit
|
|
31
|
+
PREVIOUS=$(git show HEAD~1:package.json 2>/dev/null | node -p "JSON.parse(require('fs').readFileSync('/dev/stdin','utf-8')).version" 2>/dev/null || echo "0.0.0")
|
|
32
|
+
echo "current=$CURRENT"
|
|
33
|
+
echo "previous=$PREVIOUS"
|
|
34
|
+
if [ "$CURRENT" != "$PREVIOUS" ]; then
|
|
35
|
+
echo "version=$CURRENT" >> "$GITHUB_OUTPUT"
|
|
36
|
+
echo "changed=true" >> "$GITHUB_OUTPUT"
|
|
37
|
+
echo "✅ Version changed: $PREVIOUS → $CURRENT"
|
|
38
|
+
else
|
|
39
|
+
echo "changed=false" >> "$GITHUB_OUTPUT"
|
|
40
|
+
echo "⏭️ Version unchanged ($CURRENT), skipping release"
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# ── Step 2: Run full test suite ────────────────────────────────────────
|
|
44
|
+
test:
|
|
45
|
+
needs: detect-version
|
|
46
|
+
if: needs.detect-version.outputs.changed == 'true'
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
strategy:
|
|
49
|
+
matrix:
|
|
50
|
+
node-version: [18, 20, 22]
|
|
51
|
+
steps:
|
|
52
|
+
- uses: actions/checkout@v4
|
|
53
|
+
with:
|
|
54
|
+
fetch-depth: 0
|
|
55
|
+
- uses: actions/setup-node@v4
|
|
56
|
+
with:
|
|
57
|
+
node-version: ${{ matrix.node-version }}
|
|
58
|
+
- name: Run Tests
|
|
59
|
+
run: npm test
|
|
60
|
+
- name: Guard (self-check)
|
|
61
|
+
run: node cli/docguard.mjs guard || [ $? -eq 2 ]
|
|
62
|
+
|
|
63
|
+
# ── Step 3: Create git tag + GitHub Release ────────────────────────────
|
|
64
|
+
create-release:
|
|
65
|
+
needs: [detect-version, test]
|
|
66
|
+
if: needs.detect-version.outputs.changed == 'true'
|
|
67
|
+
runs-on: ubuntu-latest
|
|
68
|
+
outputs:
|
|
69
|
+
tag: v${{ needs.detect-version.outputs.version }}
|
|
70
|
+
steps:
|
|
71
|
+
- uses: actions/checkout@v4
|
|
72
|
+
with:
|
|
73
|
+
fetch-depth: 0 # Fetch all history + tags for reliable tag detection
|
|
74
|
+
|
|
75
|
+
- name: Create and push tag
|
|
76
|
+
env:
|
|
77
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
78
|
+
run: |
|
|
79
|
+
VERSION="${{ needs.detect-version.outputs.version }}"
|
|
80
|
+
TAG="v${VERSION}"
|
|
81
|
+
|
|
82
|
+
# Check if tag already exists on remote (not just local)
|
|
83
|
+
if git ls-remote --tags origin | grep -q "refs/tags/$TAG$"; then
|
|
84
|
+
echo "✅ Tag $TAG already exists on remote, skipping tag creation"
|
|
85
|
+
else
|
|
86
|
+
git config user.name "github-actions[bot]"
|
|
87
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
88
|
+
git tag -a "$TAG" -m "Release $TAG"
|
|
89
|
+
git push origin "$TAG"
|
|
90
|
+
echo "✅ Tag $TAG created and pushed"
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
- name: Generate release notes from CHANGELOG
|
|
94
|
+
id: notes
|
|
95
|
+
run: |
|
|
96
|
+
VERSION="${{ needs.detect-version.outputs.version }}"
|
|
97
|
+
# Extract the section for this version from CHANGELOG.md
|
|
98
|
+
# Matches from ## [X.X.X] until the next ## [
|
|
99
|
+
NOTES=$(awk "/^## \\[${VERSION}\\]/{found=1; next} /^## \\[/{if(found) exit} found{print}" CHANGELOG.md)
|
|
100
|
+
if [ -z "$NOTES" ]; then
|
|
101
|
+
NOTES="Release v${VERSION} — see CHANGELOG.md for details."
|
|
102
|
+
fi
|
|
103
|
+
# Write to file to avoid escaping issues
|
|
104
|
+
echo "$NOTES" > /tmp/release-notes.md
|
|
105
|
+
echo "✅ Release notes extracted"
|
|
106
|
+
|
|
107
|
+
- name: Create GitHub Release
|
|
108
|
+
env:
|
|
109
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
110
|
+
run: |
|
|
111
|
+
VERSION="${{ needs.detect-version.outputs.version }}"
|
|
112
|
+
TAG="v${VERSION}"
|
|
113
|
+
# Skip if release already exists (e.g., manually created)
|
|
114
|
+
if gh release view "$TAG" >/dev/null 2>&1; then
|
|
115
|
+
echo "✅ Release $TAG already exists, skipping"
|
|
116
|
+
else
|
|
117
|
+
gh release create "$TAG" \
|
|
118
|
+
--title "DocGuard $TAG" \
|
|
119
|
+
--notes-file /tmp/release-notes.md \
|
|
120
|
+
--latest
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
# ── Step 4: Build and attach spec-kit extension ZIP ────────────────────
|
|
124
|
+
build-extension:
|
|
125
|
+
needs: [detect-version, create-release]
|
|
126
|
+
runs-on: ubuntu-latest
|
|
127
|
+
steps:
|
|
128
|
+
- uses: actions/checkout@v4
|
|
129
|
+
|
|
130
|
+
- name: Build extension ZIP
|
|
131
|
+
run: |
|
|
132
|
+
VERSION="${{ needs.detect-version.outputs.version }}"
|
|
133
|
+
cd extensions/spec-kit-docguard
|
|
134
|
+
zip -r "../../spec-kit-docguard-v${VERSION}.zip" . -x ".*"
|
|
135
|
+
cd ../..
|
|
136
|
+
echo "--- ZIP contents ---"
|
|
137
|
+
unzip -l "spec-kit-docguard-v${VERSION}.zip"
|
|
138
|
+
|
|
139
|
+
- name: Upload to release
|
|
140
|
+
env:
|
|
141
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
142
|
+
run: |
|
|
143
|
+
VERSION="${{ needs.detect-version.outputs.version }}"
|
|
144
|
+
gh release upload "v${VERSION}" \
|
|
145
|
+
"spec-kit-docguard-v${VERSION}.zip" \
|
|
146
|
+
--clobber
|
|
147
|
+
|
|
148
|
+
# ── Step 5: Publish to npm ─────────────────────────────────────────────
|
|
149
|
+
publish-npm:
|
|
150
|
+
needs: [detect-version, test, create-release]
|
|
151
|
+
runs-on: ubuntu-latest
|
|
152
|
+
steps:
|
|
153
|
+
- uses: actions/checkout@v4
|
|
154
|
+
- uses: actions/setup-node@v4
|
|
155
|
+
with:
|
|
156
|
+
node-version: 20
|
|
157
|
+
registry-url: 'https://registry.npmjs.org'
|
|
158
|
+
|
|
159
|
+
- name: Publish
|
|
160
|
+
run: npm publish
|
|
161
|
+
env:
|
|
162
|
+
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
163
|
+
|
|
164
|
+
# ── Step 6: Publish to PyPI ────────────────────────────────────────────
|
|
165
|
+
publish-pypi:
|
|
166
|
+
needs: [detect-version, test, create-release]
|
|
167
|
+
runs-on: ubuntu-latest
|
|
168
|
+
steps:
|
|
169
|
+
- uses: actions/checkout@v4
|
|
170
|
+
- uses: actions/setup-python@v5
|
|
171
|
+
with:
|
|
172
|
+
python-version: '3.12'
|
|
173
|
+
|
|
174
|
+
- name: Sync version in pyproject.toml
|
|
175
|
+
run: |
|
|
176
|
+
VERSION="${{ needs.detect-version.outputs.version }}"
|
|
177
|
+
sed -i "s/^version = \".*\"/version = \"$VERSION\"/" pyproject.toml
|
|
178
|
+
echo "Publishing version $VERSION"
|
|
179
|
+
grep 'version' pyproject.toml
|
|
180
|
+
|
|
181
|
+
- name: Install build tools
|
|
182
|
+
run: pip install build twine
|
|
183
|
+
|
|
184
|
+
- name: Build
|
|
185
|
+
run: python -m build
|
|
186
|
+
|
|
187
|
+
- name: Publish
|
|
188
|
+
run: python -m twine upload dist/*
|
|
189
|
+
env:
|
|
190
|
+
TWINE_USERNAME: __token__
|
|
191
|
+
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
name: Sync DocGuard to Spec Kit Community Catalog
|
|
2
|
+
|
|
3
|
+
# Triggers after the release workflow completes, or manually
|
|
4
|
+
on:
|
|
5
|
+
workflow_run:
|
|
6
|
+
workflows: ["Auto Release — Tag, GitHub Release, npm, PyPI"]
|
|
7
|
+
types: [completed]
|
|
8
|
+
branches: [main]
|
|
9
|
+
workflow_dispatch:
|
|
10
|
+
inputs:
|
|
11
|
+
version:
|
|
12
|
+
description: 'Override version (leave empty to read from package.json)'
|
|
13
|
+
required: false
|
|
14
|
+
type: string
|
|
15
|
+
|
|
16
|
+
permissions:
|
|
17
|
+
contents: read
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
sync-catalog:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
# Only run if the release workflow succeeded (or manual trigger)
|
|
23
|
+
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
|
|
24
|
+
|
|
25
|
+
steps:
|
|
26
|
+
- name: Checkout docguard repo
|
|
27
|
+
uses: actions/checkout@v4
|
|
28
|
+
|
|
29
|
+
- name: Get version and metadata
|
|
30
|
+
id: meta
|
|
31
|
+
run: |
|
|
32
|
+
if [ -n "${{ inputs.version }}" ]; then
|
|
33
|
+
VERSION="${{ inputs.version }}"
|
|
34
|
+
else
|
|
35
|
+
VERSION=$(node -p "require('./package.json').version")
|
|
36
|
+
fi
|
|
37
|
+
echo "version=$VERSION" >> "$GITHUB_OUTPUT"
|
|
38
|
+
echo "tag=v${VERSION}" >> "$GITHUB_OUTPUT"
|
|
39
|
+
echo "download_url=https://github.com/raccioly/docguard/releases/download/v${VERSION}/spec-kit-docguard-v${VERSION}.zip" >> "$GITHUB_OUTPUT"
|
|
40
|
+
echo "updated_at=$(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$GITHUB_OUTPUT"
|
|
41
|
+
|
|
42
|
+
# Extract short description (avoid multiline output issues)
|
|
43
|
+
DESC="Canonical-Driven Development enforcement with automated checks, AI skills, and spec-kit hooks. Zero NPM runtime dependencies."
|
|
44
|
+
echo "description=$DESC" >> "$GITHUB_OUTPUT"
|
|
45
|
+
|
|
46
|
+
# Count commands
|
|
47
|
+
COMMANDS=$(ls extensions/spec-kit-docguard/commands/*.md 2>/dev/null | wc -l | tr -d ' ')
|
|
48
|
+
echo "commands=${COMMANDS:-6}" >> "$GITHUB_OUTPUT"
|
|
49
|
+
|
|
50
|
+
echo "✅ Version: $VERSION"
|
|
51
|
+
echo " Download: https://github.com/raccioly/docguard/releases/download/v${VERSION}/spec-kit-docguard-v${VERSION}.zip"
|
|
52
|
+
|
|
53
|
+
- name: Extract release notes from CHANGELOG
|
|
54
|
+
id: notes
|
|
55
|
+
run: |
|
|
56
|
+
VERSION="${{ steps.meta.outputs.version }}"
|
|
57
|
+
NOTES=$(awk "/^## \\[${VERSION}\\]/{found=1; next} /^## \\[/{if(found) exit} found{print}" CHANGELOG.md)
|
|
58
|
+
if [ -z "$NOTES" ]; then
|
|
59
|
+
NOTES="Updated to v${VERSION}. See [CHANGELOG](https://github.com/raccioly/docguard/blob/main/CHANGELOG.md) for details."
|
|
60
|
+
fi
|
|
61
|
+
# Write to file (avoids multiline env var issues)
|
|
62
|
+
echo "$NOTES" > /tmp/changelog-section.md
|
|
63
|
+
echo "✅ Release notes extracted ($(wc -l < /tmp/changelog-section.md) lines)"
|
|
64
|
+
|
|
65
|
+
- name: Sync fork with upstream
|
|
66
|
+
env:
|
|
67
|
+
GH_TOKEN: ${{ secrets.SPECKIT_PR_TOKEN }}
|
|
68
|
+
run: |
|
|
69
|
+
# Use GitHub API to sync fork — avoids needing workflow scope on PAT
|
|
70
|
+
gh repo sync raccioly/spec-kit --source github/spec-kit --branch main --force
|
|
71
|
+
echo "✅ Fork synced with upstream"
|
|
72
|
+
|
|
73
|
+
- name: Checkout spec-kit fork (fresh after sync)
|
|
74
|
+
uses: actions/checkout@v4
|
|
75
|
+
with:
|
|
76
|
+
repository: raccioly/spec-kit
|
|
77
|
+
token: ${{ secrets.SPECKIT_PR_TOKEN }}
|
|
78
|
+
path: spec-kit-fork
|
|
79
|
+
ref: main
|
|
80
|
+
|
|
81
|
+
- name: Update catalog.community.json
|
|
82
|
+
working-directory: spec-kit-fork
|
|
83
|
+
run: |
|
|
84
|
+
VERSION="${{ steps.meta.outputs.version }}"
|
|
85
|
+
DOWNLOAD_URL="${{ steps.meta.outputs.download_url }}"
|
|
86
|
+
UPDATED_AT="${{ steps.meta.outputs.updated_at }}"
|
|
87
|
+
|
|
88
|
+
# Surgical updates using external script — no full-file re-serialization
|
|
89
|
+
# Prevents noisy diffs on unrelated extensions (unicode escapes, formatting)
|
|
90
|
+
# Also bumps top-level updated_at and fixes description wording
|
|
91
|
+
cp ${{ github.workspace }}/.github/scripts/patch-catalog.py /tmp/patch-catalog.py
|
|
92
|
+
python3 /tmp/patch-catalog.py "$VERSION" "$DOWNLOAD_URL" "$UPDATED_AT"
|
|
93
|
+
|
|
94
|
+
- name: Create or update branch
|
|
95
|
+
working-directory: spec-kit-fork
|
|
96
|
+
run: |
|
|
97
|
+
BRANCH="update-docguard"
|
|
98
|
+
git config user.name "github-actions[bot]"
|
|
99
|
+
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
100
|
+
|
|
101
|
+
# Always use the same branch name (so PRs get updated, not duplicated)
|
|
102
|
+
git checkout -B "$BRANCH"
|
|
103
|
+
git add extensions/catalog.community.json extensions/README.md
|
|
104
|
+
git commit -m "chore: update DocGuard extension to v${{ steps.meta.outputs.version }}" || echo "No changes to commit"
|
|
105
|
+
git push --force origin "$BRANCH"
|
|
106
|
+
echo "✅ Branch $BRANCH pushed"
|
|
107
|
+
|
|
108
|
+
- name: Create or update PR
|
|
109
|
+
working-directory: spec-kit-fork
|
|
110
|
+
env:
|
|
111
|
+
GH_TOKEN: ${{ secrets.SPECKIT_PR_TOKEN }}
|
|
112
|
+
run: |
|
|
113
|
+
VERSION="${{ steps.meta.outputs.version }}"
|
|
114
|
+
BRANCH="update-docguard"
|
|
115
|
+
|
|
116
|
+
# Build PR body
|
|
117
|
+
cat > /tmp/pr-body.md << 'HEADER'
|
|
118
|
+
## DocGuard Community Extension Update
|
|
119
|
+
|
|
120
|
+
Updates the DocGuard community extension catalog entry.
|
|
121
|
+
|
|
122
|
+
### Changes
|
|
123
|
+
HEADER
|
|
124
|
+
|
|
125
|
+
echo "- Version: **v${VERSION}**" >> /tmp/pr-body.md
|
|
126
|
+
echo "- Download: \`spec-kit-docguard-v${VERSION}.zip\`" >> /tmp/pr-body.md
|
|
127
|
+
echo "- Repository: https://github.com/raccioly/docguard" >> /tmp/pr-body.md
|
|
128
|
+
echo "" >> /tmp/pr-body.md
|
|
129
|
+
echo "### Release Notes" >> /tmp/pr-body.md
|
|
130
|
+
echo "" >> /tmp/pr-body.md
|
|
131
|
+
cat /tmp/changelog-section.md >> /tmp/pr-body.md
|
|
132
|
+
echo "" >> /tmp/pr-body.md
|
|
133
|
+
echo "---" >> /tmp/pr-body.md
|
|
134
|
+
echo "*This PR was automatically generated by the DocGuard release pipeline.*" >> /tmp/pr-body.md
|
|
135
|
+
|
|
136
|
+
# Try to create PR first — if it already exists, edit it instead
|
|
137
|
+
PR_URL=$(gh pr create \
|
|
138
|
+
--repo github/spec-kit \
|
|
139
|
+
--head "raccioly:${BRANCH}" \
|
|
140
|
+
--base main \
|
|
141
|
+
--title "chore: update DocGuard extension to v${VERSION}" \
|
|
142
|
+
--body-file /tmp/pr-body.md 2>&1) && {
|
|
143
|
+
echo "✅ Created new PR: $PR_URL"
|
|
144
|
+
} || {
|
|
145
|
+
echo "PR already exists — updating title and body..."
|
|
146
|
+
# Find the existing PR number
|
|
147
|
+
EXISTING_PR=$(gh pr list \
|
|
148
|
+
--repo github/spec-kit \
|
|
149
|
+
--head "raccioly:${BRANCH}" \
|
|
150
|
+
--state open \
|
|
151
|
+
--json number \
|
|
152
|
+
--jq '.[0].number' 2>/dev/null || echo "")
|
|
153
|
+
if [ -n "$EXISTING_PR" ] && [ "$EXISTING_PR" != "null" ]; then
|
|
154
|
+
gh pr edit "$EXISTING_PR" \
|
|
155
|
+
--repo github/spec-kit \
|
|
156
|
+
--title "chore: update DocGuard extension to v${VERSION}" \
|
|
157
|
+
--body-file /tmp/pr-body.md
|
|
158
|
+
echo "✅ Updated existing PR #${EXISTING_PR}"
|
|
159
|
+
else
|
|
160
|
+
echo "✅ Branch force-pushed — PR content is updated via the branch"
|
|
161
|
+
fi
|
|
162
|
+
}
|