Skip to content

Extract Canvas Design into a standalone Specify extension package - #42

Merged
nicolehaugen merged 6 commits into
mainfrom
nicolehaugen-canvas-design-package
Sep 30, 2026
Merged

nicolehaugen merged 6 commits into
mainfrom
nicolehaugen-canvas-design-package

Conversation

@nicolehaugen

@nicolehaugen nicolehaugen commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Extract Canvas Design into an independently publishable Specify CLI extension package, with a Copilot-specific extension catalog parallel to the existing preset catalog. No Wizard/Designer consumer changes.

  • Extract spec-kit-extensions/ from the pinned source snapshot 22efef80d01a70178ca2357b5fcfc6b3e9ca3876 in Add required Canvas Design extension and dynamic Designer pages #40. Preserve version 0.1.0, command/template IDs, four JSON pages, and command. Add the requested copilot and exact lowercase canvas-design discovery tags to the source manifest. Tighten the page schema so a field's default requires an explicit boolean type, matching the pinned Designer's runtime validation.
  • Add spec-kit-extensions/catalog.json, scoped to extensions depending on Copilot tools/providers, with Canvas Design as its only entry. Its metadata and published ZIP URL agree with the manifest and release workflow. This is a Specify extension catalog, not a Copilot plugin marketplace entry or upstream community-catalog submission.
  • Document catalog registration using --install-allowed, install-by-ID, and direct --from <release-url> installation. Preserve Copilot --skills initialization and explicitly require a separately supplied compatible Designer provider exposing speckit_designer_load_pages. The package does not ship a Designer or imply existing released Wizards support the protocol. Installation requires the release ZIP to be published.
  • Add focused Python unittest package contracts with PyYAML/jsonschema, independent of Wizard dependencies or the Specify executable.
  • Add release-extension.yml: test and inline ZIP packaging on relevant PRs/main pushes; publish only from maintainer-pushed extension/canvas-design/vX.Y.Z tags, following the existing tag-driven Release Preset approach. Validate manifest/catalog/tag versions, catalog download URL, and archive contents before publishing. No custom manual-dispatch publisher or workflow tag creation remains. Extension tags do not match the existing preset release trigger, and releases do not become the repository's latest release.

Validation

  • 13/13 tests passed, covering schema positive/negative cases, default page/field shape, manifest/file declarations, command contract, Copilot catalog and discovery tags, installation documentation, release permissions/triggers, version guards, and rejection of catalog version/download-URL drift.
  • The field-default regression reproduced all four invalid cases before the fix: omitted/string types with true/false defaults. They now fail schema validation while explicitly boolean fields accept both defaults.
  • Executed the workflow's exact inline ZIP builder locally and verified all 8 archive members, with extension.yml at the archive root and byte-for-byte matches to package files. The catalog and tests remain outside the installable ZIP; no plugin/provider code or cache files are packaged.
  • Checked the new catalog entry against the actual designerCatalogFingerprint implementation from the pinned Add required Canvas Design extension and dynamic Designer pages #40 source: the entry is included using canvas-design; wrong-case, partial, missing, and non-array tag variants are rejected.
  • Every workflow shell block passes bash -n; staged diff checks pass.

Scope and sequencing

This is a standalone PR targeting main, not a native stack member. No release/tag was published. No preset release behavior, plugin/marketplace metadata, core skills, Wizard/Designer implementation, or existing PR/stack was changed. #40 remains the consumer and was not modified or closed.

Repository-hosted catalog support and exact discovery tags were added at the user's request after the initial extraction. Publishing, upstream catalog submission, the full real-CLI normal-install/preset-composition matrix (Step 2), and migration of the consumer to a released URL remain separate follow-ups. These package tests do not claim that integration matrix has passed. The known development-symlink composition issue is not worked around by changing integration mode.

Blockers: none for this extraction PR.

Preserve the pinned 0.1.0 package contract, document normal release installation and external Designer requirements, and add focused package/archive tests with isolated extension release packaging.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings September 30, 2026 17:09

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Manual publishing cannot recover from a transient failure after its tag has been pushed.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
What changed in this PR

Extracts Canvas Design into an independently versioned Specify extension package with validation and release automation.

Changes:

  • Adds the extension manifest, command, schema, and four page templates.
  • Documents installation, provider boundaries, customization, and versioning.
  • Adds package-contract tests and ZIP publishing automation.
File Description
.github/​workflows/​release-extension.yml Tests, packages, and publishes the extension.
spec-kit-extensions/​.gitignore Ignores Python cache files.
spec-kit-extensions/​README.md Documents extension packaging and releases.
spec-kit-extensions/​canvas-design/​README.md Documents installation and usage.
spec-kit-extensions/​canvas-design/​extension.yml Defines the extension package.
spec-kit-extensions/​canvas-design/​commands/​load-page.md Defines page resolution and loading.
spec-kit-extensions/​canvas-design/​schemas/​page.schema.json Defines page validation rules.
spec-kit-extensions/​canvas-design/​pages/​setup.json Adds Essentials fields.
spec-kit-extensions/​canvas-design/​pages/​artifacts.json Adds the Artifacts placeholder.
spec-kit-extensions/​canvas-design/​pages/​appearance.json Adds the Appearance placeholder.
spec-kit-extensions/​canvas-design/​pages/​results.json Adds the Result Badges placeholder.
spec-kit-extensions/​tests/​test_canvas_design.py Tests package and workflow contracts.
spec-kit-extensions/​tests/​requirements.txt Declares test dependencies.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread .github/workflows/release-extension.yml Outdated
Remove the bespoke manual tag-and-publish path. Publish only from maintainer-pushed version tags, preserving archive validation and separate extension versioning.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings September 30, 2026 17:25
Remove PR-specific publishing rationale and retry details from the extension README.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The schema accepts string fields with boolean defaults that the compatible Designer provider rejects.

Review effort: Balanced
Findings: None

Resolved since last review (1)
Previously missed (1)

In code that hasn't changed since last review

Medium severity Require boolean type for fields with boolean defaults

spec-kit-extensions/​canvas-design/​schemas/​page.schema.json:26

The shipped schema accepts a field with default: true when type is omitted (implicitly string) or explicitly string, but the compatible Designer provider rejects defaults unless the field type is boolean. This lets a preset pass the package's advertised schema validation and then fail during page loading. Require an explicit boolean type whenever default is present, and cover that schema-negative case.

Copilot AI balanced review requested due to automatic review settings September 30, 2026 17:31

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🔵 Needs a closer look

The published schema accepts field defaults that the compatible Designer rejects.

Review effort: Balanced
Findings: None

Previously missed (1)

In code that hasn't changed since last review

Medium severity Schema allows boolean defaults for string-typed fields

spec-kit-extensions/​canvas-design/​schemas/​page.schema.json:26

The schema accepts a boolean default when type is omitted (implicitly a string) or is explicitly string, but the compatible Designer implementation pinned in #40 rejects both as an invalid field. Preset authors can therefore pass the published schema and still have the entire page batch rejected. Couple default to an explicit boolean type (and cover this case in the schema tests).

Mirror the preset catalog structure, document catalog installation, and enforce manifest/catalog version and release URL agreement. Preserve the exact canvas-design tag consumed by the source Designer integration.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings September 30, 2026 17:35
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The standalone package, documentation, contracts, and release workflow are internally consistent and appropriately scoped.

Review effort: Balanced
Findings: None

Copilot AI balanced review requested due to automatic review settings September 30, 2026 17:42
Align the published page schema with the Designer validation contract and cover omitted/string field types with both true and false defaults.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The published schema differs from the pinned source despite the stated preservation requirement.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)

Comment thread spec-kit-extensions/canvas-design/schemas/page.schema.json
@nicolehaugen
nicolehaugen merged commit 549507a into main Sep 30, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants