Skip to content

Onboarding output advertises /opsx:new and /opsx:continue, which the default core profile never installs #1409

Description

@clay-good

Summary

Two onboarding surfaces tell users to run /opsx:new and /opsx:continue, but neither workflow is in the default core profile, so those slash commands are never generated. Users follow the instructions, the command isn't there, and they file a bug.

openspec init already got this right — update and the welcome screen did not.

Evidence

CORE_WORKFLOWS (src/core/profiles.ts:14) is:

export const CORE_WORKFLOWS = ['propose', 'explore', 'apply', 'update', 'sync', 'archive'] as const;

new and continue are absent. The default profile is core (src/core/global-config.ts, DEFAULT_CONFIG = { profile: 'core', delivery: 'both' }).

1. src/core/update.ts:331-334 — hardcoded, not profile-aware:

console.log(chalk.bold('Getting started:'));
console.log('  /opsx:new       Start a new change');
console.log('  /opsx:continue  Create the next artifact');
console.log('  /opsx:apply     Implement tasks');

Two of the three commands listed do not exist on the default profile.

2. src/ui/welcome-screen.ts:27-30 — same problem, shown during openspec init before tool selection:

chalk.white('Quick start after setup:'),
`  ${chalk.yellow('/opsx:new')}      ${chalk.dim('Create a change')}`,
`  ${chalk.yellow('/opsx:continue')} ${chalk.dim('Next artifact')}`,
`  ${chalk.yellow('/opsx:apply')}    ${chalk.dim('Implement tasks')}`,

The contrast — init is already correct

src/core/init.ts:867-880 gates on the resolved profile:

const activeWorkflows = [...getProfileWorkflows(activeProfile, globalCfg.workflows)];
if (activeWorkflows.includes('propose')) {
  console.log('  Start your first change: /opsx:propose "your idea"');
} else if (activeWorkflows.includes('new')) {
  console.log('  Start your first change: /opsx:new "your idea"');
} else {
  console.log("Done. Run 'openspec config profile' to configure your workflows.");
}

update.ts and welcome-screen.ts were never given the same treatment.

Why this matters

This is the likely source of a recurring class of "commands are missing" reports — users are told to run a command that was correctly never installed, so the tool looks broken when it is working as designed. openspec update compounds it by printing ✓ All 1 tool(s) up to date without saying which workflows are actually installed.

To be clear: the underlying file detection is not broken. hasToolProfileOrDeliveryDrift (src/core/profile-sync-drift.ts:111-146) correctly detects and regenerates missing skill and command files. This is purely a messaging bug.

Suggested fix

Mirror the init.ts pattern in both places:

  1. update.tsdesiredWorkflows is already in scope (computed around L136-139); filter the listed commands through it.
  2. welcome-screen.tsgetWelcomeText() takes no arguments today, so it needs the active workflows passed in.
  3. Optional: have displayUpToDateMessage (update.ts:362-368) name the active profile and hint at openspec config profile, so "up to date" doesn't read as "everything is installed".

No behavior change beyond output — no files generated or removed differently.

Related

Explains part of the confusion in #1128 (though that reporter's underlying issue is profile selection, so this alone would not close it), and is adjacent to #1067 / #1097.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions