Skip to content

T-VVNK-sdf-project-setup-prompt-ui

State: closed/done · Impact: medium · Complexity: medium

With the setup action in place (T-1D8N), the operator still has no way to reach it from the app. This task adds the prompt: after a project is added, and whenever the focused project is not set up, SDF shows what setup would change and offers to run it. Nothing is written until the operator clicks.

LocationRole today
solutions/ontological/desktop/src-nuxt/app/composables/useFocusedProject.tsadd() creates the registered project, re-lists, and publishes the registry topic; nothing follows.
solutions/ontological/desktop/src-nuxt/app/components/ProjectSwitcher.vueThe header switcher with the add form (submitAdd).
solutions/ontological/desktop/src-nuxt/app/components/ProjectScopePane.vueThe scope pane with its own add form.
solutions/ontological/desktop/src-nuxt/app/composables/useActions.tsWraps the generated action client for the existing buttons.
solutions/ontological/desktop/src-nuxt/app/app.vueThe shell; where a focus-level banner belongs.
solutions/ontological/desktop/src-nuxt/app/generated/transport.tsAfter T-1D8N: actionProjectSetupStatus(projectId) and actionSetupProject(projectId, installHarness).
solutions/ontological/desktop/src-nuxt/app/components/*.stories.tsStorybook stories, which sit beside the component they cover.
  • useProjectSetup(projectId) composable: status (the read, a POST — project_setup_status follows orchestrate_watch_probe, a read that spawns), refresh(), run(installHarness: boolean), busy, error, and needsSetup (true when root_exists and not sdlc_yaml_present). The boolean is what the UI holds; the wire takes a required string, and the Rust side reads anything but the literal "false" as on.
  • ProjectSetupPanel.vue: the project label and path, the item list from the dry run grouped by status, a “Register Claude Code harness” checkbox defaulting to on, a “Set up” button, and the result list once run. An unreachable root renders the path and a note instead of the button.
  • Trigger one: after add() succeeds in either add form, the panel opens for the new project.
  • Trigger two: when the focused project’s status says needsSetup, a banner in the shell names the project and opens the panel. Dismissing the banner is remembered per project id in localStorage only; the status read itself is not cached.
  • The panel calls record for the copy affordances the same way the existing buttons do, and shows the audit outcome line after a run.
  1. Write useProjectSetup.ts over the generated client with a vitest suite mocking useTransport: status threading, needsSetup, run success and failure, and no read when projectId is null.
  2. Build ProjectSetupPanel.vue with a Storybook story per state: needs setup, already set up, root missing, running, done, failed.
  3. Wire trigger one in ProjectSwitcher.vue and ProjectScopePane.vue: both submitAdd paths emit the new project’s id (returned from add(), which today returns only a boolean; change it to return the id or null) and open the panel.
  4. Wire trigger two in app.vue: watch focusedProjectId, read status, render the banner.
  5. Capture before and after screenshots with Playwright of the add flow and the banner, commit them under the SDF docs directory, and embed them in a PR comment.
AreaNote
solutions/ontological/desktop/src-nuxt/app/composables/useProjectSetup.tsStatus read, run, needsSetup.
solutions/ontological/desktop/src-nuxt/app/composables/useProjectSetup.test.tsVitest suite.
solutions/ontological/desktop/src-nuxt/app/components/ProjectSetupPanel.vueThe panel.
solutions/ontological/desktop/src-nuxt/app/components/ProjectSetupPanel.stories.tsOne story per state.
solutions/ontological/desktop/src-nuxt/app/composables/useFocusedProject.tsadd() returns the new id.
solutions/ontological/desktop/src-nuxt/app/composables/useFocusedProject.test.tsCover the returned id.
solutions/ontological/desktop/src-nuxt/app/components/ProjectSwitcher.vueOpen the panel after add.
solutions/ontological/desktop/src-nuxt/app/components/ProjectScopePane.vueOpen the panel after add.
solutions/ontological/desktop/src-nuxt/app/app.vueFocus banner.
solutions/ontological/desktop/docs/screenshots/Before and after captures for the PR.
  • AC-1: Adding a project whose root has no sdlc.yaml opens the panel listing at least the sdlc.yaml and docs/planning/tasks items as would-create; nothing is written until “Set up” is clicked.
  • AC-2: Clicking “Set up” with the harness checkbox on calls actionSetupProject with installHarness as ""; with it off, as "false" (vitest on the composable, pinning both directions).
  • AC-3: Focusing a registered project that lacks sdlc.yaml shows the banner naming that project; focusing one that has it shows no banner.
  • AC-4: With no focused project, useProjectSetup issues no read.
  • AC-5: A project whose root directory does not exist renders the path and a note, with no “Set up” button.
  • AC-6: Storybook builds with the six panel states; moon run sdf:check and the SDF vitest suite pass.
  • AC-7: The PR carries before and after screenshots of the add flow and the banner.
  • Editing sdlc.yaml from the panel; the verbs stay commented suggestions for the operator to edit in a text editor.
  • Surfacing entities audit or project doctor output.
  • Auto-running setup without a click.
  • T-1D8N provides the two service fns and the generated client.

The user-facing half of the 2026-09-20 survey into setting up SDLC configuration from SDF.

T-1D8N


← Back to Tasks