docguard-cli 0.9.9__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.9 → 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.9 → docguard_cli-0.9.10}/.specify/memory/constitution.md +2 -2
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/CHANGELOG.md +23 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/PKG-INFO +1 -1
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/score.mjs +58 -16
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/docguard.mjs +9 -0
- docguard_cli-0.9.10/cli/shared-ignore.mjs +76 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/architecture.mjs +21 -6
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/docs-diff.mjs +79 -12
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/security.mjs +49 -1
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/todo-tracking.mjs +40 -14
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/package.json +1 -1
- {docguard_cli-0.9.9 → 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.9 → docguard_cli-0.9.10}/tests/commands.test.mjs +127 -1
- docguard_cli-0.9.9/.github/workflows/release.yml +0 -78
- docguard_cli-0.9.9/.github/workflows/spec-kit-extension.yml +0 -40
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.analyze.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.checklist.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.clarify.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.constitution.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.implement.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.plan.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.specify.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.tasks.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/commands/speckit.taskstoissues.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/docguard-fix/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/docguard-guard/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/docguard-review/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/docguard-score/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-analyze/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-checklist/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-clarify/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-constitution/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-implement/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-plan/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-specify/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-tasks/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.agent/skills/speckit-taskstoissues/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.docguardignore +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.github/workflows/ci.yml +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.gitignore +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.npmignore +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/init-options.json +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/scripts/bash/check-prerequisites.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/scripts/bash/common.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/scripts/bash/create-new-feature.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/scripts/bash/setup-plan.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/scripts/bash/update-agent-context.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/templates/agent-file-template.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/templates/checklist-template.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/templates/constitution-template.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/templates/plan-template.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/templates/spec-template.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/.specify/templates/tasks-template.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/AGENTS.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/CODE_OF_CONDUCT.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/COMPARISONS.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/CONTRIBUTING.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/DRIFT-LOG.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/LICENSE +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/PHILOSOPHY.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/README.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/ROADMAP.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/SECURITY.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/STANDARD.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/SUPPORT.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/action.yml +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/agents.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/badge.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/ci.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/diagnose.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/diff.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/fix.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/generate.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/guard.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/hooks.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/init.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/llms.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/publish.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/setup.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/trace.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/commands/watch.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/ensure-skills.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/scanners/doc-tools.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/scanners/routes.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/scanners/schemas.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/scanners/speckit.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/shared.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/changelog.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/doc-quality.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/docs-coverage.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/docs-sync.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/drift.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/environment.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/freshness.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/metadata-sync.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/metrics-consistency.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/schema-sync.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/structure.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/test-spec.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/cli/validators/traceability.mjs +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/commands/docguard.fix.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/commands/docguard.guard.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/commands/docguard.review.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/commands/docguard.score.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/configs/fastify.json +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/configs/generic.json +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/configs/nextjs.json +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/configs/python.json +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docguard_cli/__init__.py +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docguard_cli/wrapper.py +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs/ai-integration.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs/commands.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs/configuration.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs/faq.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs/installation.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs/profiles.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs/quickstart.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs-canonical/ARCHITECTURE.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs-canonical/DATA-MODEL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs-canonical/ENVIRONMENT.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs-canonical/SECURITY.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/docs-canonical/TEST-SPEC.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/01-express-api/README.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/01-express-api/package.json +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/01-express-api/server.js +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/02-python-flask/README.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/02-python-flask/app.py +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/02-python-flask/docs-canonical/ARCHITECTURE.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/02-python-flask/requirements.txt +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/03-spec-kit-project/CHANGELOG.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/03-spec-kit-project/README.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/03-spec-kit-project/docs-canonical/ARCHITECTURE.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/03-spec-kit-project/docs-canonical/TEST-SPEC.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/03-spec-kit-project/package.json +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/03-spec-kit-project/src/index.js +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/03-spec-kit-project/tests/basic.test.js +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/examples/README.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/LICENSE +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/README.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/diagnose.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/generate.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/guard.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/init.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/score.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/commands/trace.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/extension.yml +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/common.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/docguard-check-docs.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/docguard-init-doc.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/scripts/bash/docguard-suggest-fix.sh +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/skills/docguard-fix/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/skills/docguard-guard/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/skills/docguard-review/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/skills/docguard-score/SKILL.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/extensions/spec-kit-docguard/templates/extensions.yml +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/ADR.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/AGENTS.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/ARCHITECTURE.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/CHANGELOG.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/CURRENT-STATE.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/DATA-MODEL.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/DEPLOYMENT.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/DRIFT-LOG.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/ENVIRONMENT.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/KNOWN-GOTCHAS.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/REQUIREMENTS.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/ROADMAP.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/RUNBOOKS.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/SECURITY.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/TEST-SPEC.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/TROUBLESHOOTING.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/VENDOR-BUGS.md.template +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/ci/github-actions.yml +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/commands/docguard.fix.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/commands/docguard.guard.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/commands/docguard.init.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/commands/docguard.review.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/templates/commands/docguard.update.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/vscode-extension/.vscodeignore +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/vscode-extension/README.md +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/vscode-extension/extension.js +0 -0
- {docguard_cli-0.9.9 → docguard_cli-0.9.10}/vscode-extension/package.json +0 -0
|
@@ -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
|
+
}
|