Skip to content

Add required Canvas Design extension and dynamic Designer pages - #40

Open
nicolehaugen wants to merge 12 commits into
mainfrom
nicolehaugen-canvas-design-pages
Open

nicolehaugen wants to merge 12 commits into
mainfrom
nicolehaugen-canvas-design-pages

Conversation

@nicolehaugen

@nicolehaugen nicolehaugen commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Add the Canvas Design Spec Kit extension with registered JSON templates for Essentials, Artifacts, Appearance, and Result Badges.
  • Make the required extension checked and locked in Wizard setup; preserve bundle ownership and capture approved selections in a versioned immutable handoff.
  • Prepare the nested child with Specify, verify selected packages and template provenance, and open the plugin-registered Designer without copying a provider into the child checkout.
  • Render the Essentials controls with theme switching and live connection status. Leave the other pages empty and Save/Generate disabled; preserve standalone opening without a handoff.
  • Preserve repeatable asynchronous launches and concurrent bundle inspections from the parent layer.

Stack

Registered as the top member of the existing native stack: #35 → #38 → #36 → #40. Targets nicolehaugen-canvas-designer-launch-pr and is based on the current parent commit 82d2932f25bb1dca4dc15c46db04fcc7b71020d6.

Validation

  • Full Wizard and provider Node suites passed after rebasing; platform-specific tests are skipped on Windows.
  • Actual Specify initialization, required-package installation, and page re-resolution passed in an isolated preparation fixture.
  • 9 Playwright browser tests passed after rebasing onto the current parent.
  • 8 Python page-loader integration tests passed.
  • Inspected light, dark, and narrow layouts.

The live app-native nested-session creation/reload/open flow has not been exercised. This increment uses a validated local development source and does not save or generate canvases.

Copilot AI balanced review requested due to automatic review settings September 30, 2026 02:54
@nicolehaugen
nicolehaugen force-pushed the nicolehaugen-canvas-design-pages branch from ad5b0c7 to bf528ab Compare September 30, 2026 02:59

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

Bundle redirects need hardened validation, and the Wizard plugin version records must be updated together.

Review effort: Balanced
Findings: 1 High severity · 1 Low severity

Open (2)
What changed in this PR

Adds the required Canvas Design extension and prepares nested Designer sessions to install packages, resolve dynamic pages, and render the Essentials UI.

Changes:

  • Adds registered JSON page templates and validation.
  • Adds immutable handoff preparation and package installation.
  • Adds dynamic Designer UI, browser tests, and CI coverage.
File Description
spec-kit-extensions/​README.md Documents extension packaging.
spec-kit-extensions/​.gitignore Ignores Python cache files.
spec-kit-extensions/​canvas-design/​README.md Documents Canvas Design.
spec-kit-extensions/​canvas-design/​extension.yml Registers pages and loader.
spec-kit-extensions/​canvas-design/​pages/​setup.json Defines Essentials fields.
spec-kit-extensions/​canvas-design/​pages/​artifacts.json Defines Artifacts placeholder.
spec-kit-extensions/​canvas-design/​pages/​appearance.json Defines Appearance placeholder.
spec-kit-extensions/​canvas-design/​pages/​results.json Defines Result Badges placeholder.
spec-kit-extensions/​canvas-design/​schemas/​page.schema.json Defines page schema.
spec-kit-extensions/​canvas-design/​scripts/​python/​pages.py Resolves and validates pages.
spec-kit-extensions/​canvas-design/​tests/​test_pages.py Tests page resolution.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​ui/​canvas-designer-dialog.js Locks the required extension.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​server/​handlers-designer.mjs Builds and dispatches handoffs.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​catalog/​designer-fingerprint.mjs Fingerprints the required source.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​canvas-runtime/​snapshot.mjs Probes source availability.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​README.md Documents preparation flow.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​test/​designer-preparation.test.mjs Tests child preparation.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​test/​designer-launch.test.mjs Tests launch validation.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​test/​canvas-designer-dialog.test.mjs Tests required selections.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​e2e/​server.mjs Hosts Designer fixtures.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​e2e/​designer-pages.spec.mjs Tests dynamic pages.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-wizard-canvas/​e2e/​canvas-designer.spec.mjs Tests setup dialog behavior.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​bootstrap.mjs Prepares child projects.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​install.mjs Installs and verifies packages.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​source.mjs Validates local extension source.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​pages.mjs Loads prepared pages.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​handoff.mjs Validates versioned handoffs.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​extension.mjs Opens prepared Designer instances.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​server.mjs Serves UI, state, and events.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​ui/​index.html Defines Designer shell.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​ui/​app.js Renders dynamic controls.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​ui/​styles.css Styles responsive themes.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​test/​provider.test.mjs Tests prepared provider behavior.
plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​README.md Documents Designer behavior.
.github/​workflows/​wizard-e2e.yml Adds Python and preparation CI tests.

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

Comment thread plugins/spec-kit-copilot-wizard/extensions/speckit-canvas-designer/install.mjs Outdated
Comment thread plugins/spec-kit-copilot-wizard/extensions/speckit-wizard-canvas/README.md Outdated
@nicolehaugen
nicolehaugen added this pull request to stack #39 September 30, 2026 03:00
Copilot AI balanced review requested due to automatic review settings September 30, 2026 03:42

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

Package provenance, bundle pins, Windows loading, and light-theme contrast have unresolved correctness or accessibility issues.

Review effort: Balanced
Findings: 1 High severity · 2 Medium severity · 1 Low severity

Open (4)
Resolved since last review (2)

Comment thread plugins/spec-kit-copilot-wizard/extensions/speckit-canvas-designer/specify.mjs Outdated
Comment thread plugins/spec-kit-copilot-wizard/extensions/speckit-canvas-designer/specify.mjs Outdated
Comment on lines 88 to 91
for (const { members } of bundleMembers.values()) {
for (const { kind, id, source } of members) {
if (!deselectedMembers.has(`${kind}:${source}:${id}`)
&& !result[kind].some((item) => item.id === id && item.source === source)) {
if (!result[kind].some((item) => item.id === id && item.source === source)) {
result[kind].push({ id, source, approved: true });
Copilot AI balanced review requested due to automatic review settings September 30, 2026 12:06

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 provider uses the extension process directory instead of the child checkout, preventing page loading and Designer opening in the live SDK flow.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity · 1 Low severity

Open (3)
Resolved since last review (2)

Comment thread plugins/spec-kit-copilot-wizard/extensions/speckit-canvas-designer/extension.mjs Outdated
Copilot AI balanced review requested due to automatic review settings September 30, 2026 12:14

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 provider uses the extension host’s working directory instead of the child checkout, which can block page loading and opening.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

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

In code that hasn't changed since last review

Medium severity Load handoff models using the session's child checkout

plugins/​spec-kit-copilot-wizard/​extensions/​speckit-canvas-designer/​extension.mjs:158

Opening or recovering a handoff-backed panel loads the persisted model against process.cwd(). Even if pages were stored successfully, a host cwd differing from the child checkout causes the saved checkout binding to mismatch and open_canvas fails. Use the same checkout obtained from session RPC metadata here.

@nicolehaugen
nicolehaugen force-pushed the nicolehaugen-canvas-design-pages branch from b392e46 to cd9dd25 Compare September 30, 2026 14:48
nicolehaugen and others added 10 commits September 30, 2026 09:51
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Replace the JavaScript installer with skill-driven child initialization and package installation. Preserve validation-only setup checks and require real session skill reloads before Designer opens.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Remove the separate package provenance checker and readiness receipt while retaining immutable handoff validation, registered page loading, and real session skill reloads.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Let the agent resolve templates through Specify, validate and persist the full page set in Node, and support explicit reloads without Python discovery.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Darken light-theme status text while preserving existing tints and dark-theme overrides. Add browser-computed contrast coverage for all three statuses in both themes.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@nicolehaugen
nicolehaugen force-pushed the nicolehaugen-canvas-design-pages branch from cd9dd25 to 22efef8 Compare September 30, 2026 14:51
Base automatically changed from nicolehaugen-canvas-designer-launch-pr to main September 30, 2026 17:20
nicolehaugen and others added 2 commits September 30, 2026 12:58
Reuse the Wizard workspace resolver for page validation, loading, reloads and recovery instead of inheriting the extension process cwd. Preserve persisted checkout binding and report unavailable metadata explicitly.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Preserve the merged launch gate and canonical extension package while retaining page loading and checkout resolution.

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

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

Dev-installing the required extension prevents page-extending presets from composing their generated skill and currently fails both Linux and Windows CI.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Resolved since last review (1)

1. In the child session, write the exact HANDOFF_JSON bytes into speckit-canvas-designer/handoffs/${handoff.handoffId}/handoff.json under YOUR session-state artifacts (session.workspacePath), not in the repository or the Wizard's artifacts. Do not edit it afterward.
2. YOU perform setup through the Spec Kit skills: invoke the skill tool with each named skill before its CLI commands. Check specify --version (>=1.0.7); use speckit-cli-setup if missing, speckit-self if too old. Work only in YOUR child checkout, never the Wizard checkout.
3. If the child has no .specify directory, use speckit-init with --here --integration copilot --integration-options="--skills" and --script ps on Windows or sh elsewhere, plus --force --non-interactive --ignore-agent-tools. Otherwise skip init; never overwrite an incompatible existing setup. After init, call speckit_designer_reload_skills and require success.
4. Use speckit-extension to install canvas-design from requiredExtension.path with --dev. Then use speckit-bundle for approved bundles, speckit-extension for remaining extensions, and speckit-preset for remaining presets. Use the approved handoff sources and versions; quote shell arguments. Bundles accept IDs/local paths, not --from: for downloadUrl, download a temporary ZIP via the shell, install it with --integration copilot, then clean up; never follow unvalidated redirects. Extensions/presets use their skill's --from form for downloadUrl. Use the skills to inspect CLI results and re-list installed packages, avoiding duplicate installs of components just installed by a selected bundle. Do not treat ID/version alone as proof that an existing package came from the approved source. Report installation errors in the child conversation and stop; do not claim success. Do not commit setup or mutate parent files.
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