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:
update.ts — desiredWorkflows is already in scope (computed around L136-139); filter the listed commands through it.
welcome-screen.ts — getWelcomeText() takes no arguments today, so it needs the active workflows passed in.
- 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.
Summary
Two onboarding surfaces tell users to run
/opsx:newand/opsx:continue, but neither workflow is in the defaultcoreprofile, so those slash commands are never generated. Users follow the instructions, the command isn't there, and they file a bug.openspec initalready got this right —updateand the welcome screen did not.Evidence
CORE_WORKFLOWS(src/core/profiles.ts:14) is:newandcontinueare absent. The default profile iscore(src/core/global-config.ts,DEFAULT_CONFIG = { profile: 'core', delivery: 'both' }).1.
src/core/update.ts:331-334— hardcoded, not profile-aware:Two of the three commands listed do not exist on the default profile.
2.
src/ui/welcome-screen.ts:27-30— same problem, shown duringopenspec initbefore tool selection:The contrast —
initis already correctsrc/core/init.ts:867-880gates on the resolved profile:update.tsandwelcome-screen.tswere 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 updatecompounds it by printing✓ All 1 tool(s) up to datewithout 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.tspattern in both places:update.ts—desiredWorkflowsis already in scope (computed around L136-139); filter the listed commands through it.welcome-screen.ts—getWelcomeText()takes no arguments today, so it needs the active workflows passed in.displayUpToDateMessage(update.ts:362-368) name the active profile and hint atopenspec 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.