@thiagodiogo/pastelsdd 1.0.0-beta.2 → 1.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +142 -142
  2. package/dist/core/command-generation/adapters/claude.d.ts +1 -1
  3. package/dist/core/command-generation/adapters/claude.js +2 -2
  4. package/dist/core/command-generation/adapters/codex.d.ts +1 -1
  5. package/dist/core/command-generation/adapters/codex.js +2 -2
  6. package/dist/core/command-generation/adapters/cursor.d.ts +2 -2
  7. package/dist/core/command-generation/adapters/cursor.js +5 -5
  8. package/dist/core/command-generation/adapters/gemini.d.ts +1 -1
  9. package/dist/core/command-generation/adapters/gemini.js +2 -2
  10. package/dist/core/command-generation/adapters/github-copilot.d.ts +1 -1
  11. package/dist/core/command-generation/adapters/github-copilot.js +2 -2
  12. package/dist/core/command-generation/types.d.ts +1 -1
  13. package/dist/core/init.d.ts +3 -3
  14. package/dist/core/init.js +22 -22
  15. package/dist/core/legacy-cleanup.js +1 -1
  16. package/dist/core/migration.js +1 -1
  17. package/dist/core/openspec-migration.d.ts +15 -15
  18. package/dist/core/openspec-migration.js +41 -38
  19. package/dist/core/templates/workflows/apply-change.js +264 -203
  20. package/dist/core/templates/workflows/archive-change.js +204 -204
  21. package/dist/core/templates/workflows/continue-change.js +3 -3
  22. package/dist/core/templates/workflows/explore.js +300 -4
  23. package/dist/core/templates/workflows/ff-change.js +3 -3
  24. package/dist/core/templates/workflows/new-change.js +3 -3
  25. package/dist/core/templates/workflows/onboard.js +32 -32
  26. package/dist/core/templates/workflows/propose.js +186 -25
  27. package/dist/core/templates/workflows/sync-specs.js +1 -1
  28. package/dist/core/templates/workflows/trello-draft.d.ts +2 -2
  29. package/dist/core/templates/workflows/trello-draft.js +174 -120
  30. package/dist/core/templates/workflows/trello-setup.d.ts +1 -0
  31. package/dist/core/templates/workflows/trello-setup.js +292 -220
  32. package/dist/core/templates/workflows/verify-change.js +1 -1
  33. package/dist/core/trello-config.d.ts +36 -4
  34. package/dist/core/trello-config.js +35 -1
  35. package/dist/core/trello-init-prompt.d.ts +19 -2
  36. package/dist/core/trello-init-prompt.js +33 -5
  37. package/dist/core/update.js +3 -3
  38. package/dist/ui/welcome-screen.js +4 -4
  39. package/dist/utils/command-references.d.ts +3 -3
  40. package/dist/utils/command-references.js +4 -4
  41. package/package.json +3 -3
package/README.md CHANGED
@@ -1,142 +1,142 @@
1
- # pastelsdd
2
-
3
- > Spec-driven, AI-native development workflow CLI
4
-
5
- [![npm](https://img.shields.io/npm/v/@thiagodiogo/pastelsdd)](https://www.npmjs.com/package/@thiagodiogo/pastelsdd)
6
- [![license](https://img.shields.io/npm/l/@thiagodiogo/pastelsdd)](LICENSE)
7
- [![node](https://img.shields.io/node/v/@thiagodiogo/pastelsdd)](https://nodejs.org)
8
-
9
- Pastelsdd installs a planning pipeline inside your repo. Every feature goes through **proposal → specs → design → tasks → apply**, tracked as versioned files and exposed as slash commands to your AI agent.
10
-
11
- ---
12
-
13
- ## Requirements
14
-
15
- - Node.js `>= 20.19.0`
16
- - At least one supported AI tool: **Claude Code**, **Cursor**, **Gemini CLI**, **GitHub Copilot**, or **Codex CLI**
17
-
18
- ---
19
-
20
- ## Install
21
-
22
- ```bash
23
- npm install -g @thiagodiogo/pastelsdd
24
- # or
25
- pnpm add -g @thiagodiogo/pastelsdd
26
- ```
27
-
28
- ---
29
-
30
- ## Quick Start
31
-
32
- ```bash
33
- cd your-project
34
- pastelsdd init
35
- ```
36
-
37
- The init wizard auto-detects which AI tools you have (`.claude/`, `.cursor/`, etc.), installs skill files and slash commands, and creates the planning folder:
38
-
39
- ```
40
- pastelsdd/
41
- ├── changes/ ← one subfolder per active change
42
- │ └── archive/ ← completed changes
43
- ├── specs/ ← project capability specs
44
- └── config.yaml ← local schema config
45
- ```
46
-
47
- Once initialized, use slash commands in your AI agent:
48
-
49
- ```
50
- /pastel:propose "add dark mode" ← creates a new change
51
- /pastel:continue ← advances to the next artifact
52
- /pastel:apply ← applies pending tasks
53
- /pastel:archive ← archives a completed change
54
- ```
55
-
56
- ---
57
-
58
- ## How It Works
59
-
60
- Each change lives in `pastelsdd/changes/<name>/` and follows a DAG of artifacts defined by a workflow schema:
61
-
62
- ```
63
- pastelsdd/changes/dark-mode/
64
- ├── proposal.md ← why this change
65
- ├── specs/ ← what the system must do
66
- ├── design.md ← how to implement it
67
- └── tasks.md ← implementation checklist
68
- ```
69
-
70
- The AI agent reads these files at each step and generates the next artifact using enriched instructions from the schema.
71
-
72
- ---
73
-
74
- ## CLI Reference
75
-
76
- | Command | Description |
77
- |---------|-------------|
78
- | `pastelsdd init [path]` | Initialize Pastelsdd in a project |
79
- | `pastelsdd update [path]` | Regenerate skill/command files after an upgrade |
80
- | `pastelsdd list` | List active changes |
81
- | `pastelsdd list --specs` | List project specs |
82
- | `pastelsdd status` | Show artifact completion for the current change |
83
- | `pastelsdd instructions [artifact]` | Print enriched instructions for an artifact |
84
- | `pastelsdd validate [name]` | Validate a change or spec |
85
- | `pastelsdd validate --all` | Validate everything |
86
- | `pastelsdd show [name]` | Display a change or spec |
87
- | `pastelsdd archive [name]` | Archive a completed change |
88
- | `pastelsdd new change <name>` | Create a new change directory |
89
- | `pastelsdd schemas` | List available workflow schemas |
90
- | `pastelsdd view` | Interactive dashboard |
91
- | `pastelsdd feedback <message>` | Submit feedback |
92
- | `pastelsdd completion install` | Install shell completions |
93
-
94
- ### `init` options
95
-
96
- | Flag | Description |
97
- |------|-------------|
98
- | `--tools <list>` | Skip interactive selection. Use `all`, `none`, or e.g. `claude,cursor` |
99
- | `--force` | Skip all confirmations (CI-friendly) |
100
- | `--profile <name>` | Workflow profile: `core` (default) or `custom` |
101
-
102
- **Non-interactive example:**
103
-
104
- ```bash
105
- pastelsdd init --tools claude --force
106
- ```
107
-
108
- ---
109
-
110
- ## Supported AI Tools
111
-
112
- | Tool | Skills dir |
113
- |------|-----------|
114
- | Claude Code | `.claude/` |
115
- | Codex CLI | `.codex/` |
116
- | Cursor | `.cursor/` |
117
- | Gemini CLI | `.gemini/` |
118
- | GitHub Copilot | `.github/` |
119
-
120
- ---
121
-
122
- ## Migrating from OpenSpec
123
-
124
- If your project used the old `openspec` tool, `pastelsdd init` detects `.openspec/` automatically and offers to migrate your changes and specs — no manual steps needed.
125
-
126
- ---
127
-
128
- ## After Upgrading
129
-
130
- Re-run `pastelsdd init` (or `pastelsdd update`) to regenerate skill files with the latest instructions:
131
-
132
- ```bash
133
- pastelsdd update
134
- ```
135
-
136
- ---
137
-
138
- ## Links
139
-
140
- - [npm](https://www.npmjs.com/package/@thiagodiogo/pastelsdd)
141
- - [Repository](https://github.com/thiagodiogo/pastelsdd)
142
- - [Issues / Feedback](https://github.com/thiagodiogo/pastelsdd/issues)
1
+ # pastelsdd
2
+
3
+ > Spec-driven, AI-native development workflow CLI
4
+
5
+ [![npm](https://img.shields.io/npm/v/@thiagodiogo/pastelsdd)](https://www.npmjs.com/package/@thiagodiogo/pastelsdd)
6
+ [![license](https://img.shields.io/npm/l/@thiagodiogo/pastelsdd)](LICENSE)
7
+ [![node](https://img.shields.io/node/v/@thiagodiogo/pastelsdd)](https://nodejs.org)
8
+
9
+ Pastelsdd installs a planning pipeline inside your repo. Every feature goes through **proposal → specs → design → tasks → apply**, tracked as versioned files and exposed as slash commands to your AI agent.
10
+
11
+ ---
12
+
13
+ ## Requirements
14
+
15
+ - Node.js `>= 20.19.0`
16
+ - At least one supported AI tool: **Claude Code**, **Cursor**, **Gemini CLI**, **GitHub Copilot**, or **Codex CLI**
17
+
18
+ ---
19
+
20
+ ## Install
21
+
22
+ ```bash
23
+ npm install -g @thiagodiogo/pastelsdd
24
+ # or
25
+ pnpm add -g @thiagodiogo/pastelsdd
26
+ ```
27
+
28
+ ---
29
+
30
+ ## Quick Start
31
+
32
+ ```bash
33
+ cd your-project
34
+ pastelsdd init
35
+ ```
36
+
37
+ The init wizard auto-detects which AI tools you have (`.claude/`, `.cursor/`, etc.), installs skill files and slash commands, and creates the planning folder:
38
+
39
+ ```
40
+ pastelsdd/
41
+ ├── changes/ ← one subfolder per active change
42
+ │ └── archive/ ← completed changes
43
+ ├── specs/ ← project capability specs
44
+ └── config.yaml ← local schema config
45
+ ```
46
+
47
+ Once initialized, use slash commands in your AI agent:
48
+
49
+ ```
50
+ /pstl:propose "add dark mode" ← creates a new change
51
+ /pstl:continue ← advances to the next artifact
52
+ /pstl:apply ← applies pending tasks
53
+ /pstl:archive ← archives a completed change
54
+ ```
55
+
56
+ ---
57
+
58
+ ## How It Works
59
+
60
+ Each change lives in `pastelsdd/changes/<name>/` and follows a DAG of artifacts defined by a workflow schema:
61
+
62
+ ```
63
+ pastelsdd/changes/dark-mode/
64
+ ├── proposal.md ← why this change
65
+ ├── specs/ ← what the system must do
66
+ ├── design.md ← how to implement it
67
+ └── tasks.md ← implementation checklist
68
+ ```
69
+
70
+ The AI agent reads these files at each step and generates the next artifact using enriched instructions from the schema.
71
+
72
+ ---
73
+
74
+ ## CLI Reference
75
+
76
+ | Command | Description |
77
+ |---------|-------------|
78
+ | `pastelsdd init [path]` | Initialize Pastelsdd in a project |
79
+ | `pastelsdd update [path]` | Regenerate skill/command files after an upgrade |
80
+ | `pastelsdd list` | List active changes |
81
+ | `pastelsdd list --specs` | List project specs |
82
+ | `pastelsdd status` | Show artifact completion for the current change |
83
+ | `pastelsdd instructions [artifact]` | Print enriched instructions for an artifact |
84
+ | `pastelsdd validate [name]` | Validate a change or spec |
85
+ | `pastelsdd validate --all` | Validate everything |
86
+ | `pastelsdd show [name]` | Display a change or spec |
87
+ | `pastelsdd archive [name]` | Archive a completed change |
88
+ | `pastelsdd new change <name>` | Create a new change directory |
89
+ | `pastelsdd schemas` | List available workflow schemas |
90
+ | `pastelsdd view` | Interactive dashboard |
91
+ | `pastelsdd feedback <message>` | Submit feedback |
92
+ | `pastelsdd completion install` | Install shell completions |
93
+
94
+ ### `init` options
95
+
96
+ | Flag | Description |
97
+ |------|-------------|
98
+ | `--tools <list>` | Skip interactive selection. Use `all`, `none`, or e.g. `claude,cursor` |
99
+ | `--force` | Skip all confirmations (CI-friendly) |
100
+ | `--profile <name>` | Workflow profile: `core` (default) or `custom` |
101
+
102
+ **Non-interactive example:**
103
+
104
+ ```bash
105
+ pastelsdd init --tools claude --force
106
+ ```
107
+
108
+ ---
109
+
110
+ ## Supported AI Tools
111
+
112
+ | Tool | Skills dir |
113
+ |------|-----------|
114
+ | Claude Code | `.claude/` |
115
+ | Codex CLI | `.codex/` |
116
+ | Cursor | `.cursor/` |
117
+ | Gemini CLI | `.gemini/` |
118
+ | GitHub Copilot | `.github/` |
119
+
120
+ ---
121
+
122
+ ## Migrating from OpenSpec
123
+
124
+ If your project used the old `openspec` tool, `pastelsdd init` detects `.openspec/` automatically and offers to migrate your changes and specs — no manual steps needed.
125
+
126
+ ---
127
+
128
+ ## After Upgrading
129
+
130
+ Re-run `pastelsdd init` (or `pastelsdd update`) to regenerate skill files with the latest instructions:
131
+
132
+ ```bash
133
+ pastelsdd update
134
+ ```
135
+
136
+ ---
137
+
138
+ ## Links
139
+
140
+ - [npm](https://www.npmjs.com/package/@thiagodiogo/pastelsdd)
141
+ - [Repository](https://github.com/eipastel/pastelsdd)
142
+ - [Issues / Feedback](https://github.com/eipastel/pastelsdd/issues)
@@ -6,7 +6,7 @@
6
6
  import type { ToolCommandAdapter } from '../types.js';
7
7
  /**
8
8
  * Claude Code adapter for command generation.
9
- * File path: .claude/commands/pastel/<id>.md
9
+ * File path: .claude/commands/pstl/<id>.md
10
10
  * Frontmatter: name, description, category, tags
11
11
  */
12
12
  export declare const claudeAdapter: ToolCommandAdapter;
@@ -27,13 +27,13 @@ function formatTagsArray(tags) {
27
27
  }
28
28
  /**
29
29
  * Claude Code adapter for command generation.
30
- * File path: .claude/commands/pastel/<id>.md
30
+ * File path: .claude/commands/pstl/<id>.md
31
31
  * Frontmatter: name, description, category, tags
32
32
  */
33
33
  export const claudeAdapter = {
34
34
  toolId: 'claude',
35
35
  getFilePath(commandId) {
36
- return path.join('.claude', 'commands', 'pastel', `${commandId}.md`);
36
+ return path.join('.claude', 'commands', 'pstl', `${commandId}.md`);
37
37
  },
38
38
  formatFile(content) {
39
39
  return `---
@@ -9,7 +9,7 @@
9
9
  import type { ToolCommandAdapter } from '../types.js';
10
10
  /**
11
11
  * Codex adapter for command generation.
12
- * File path: <CODEX_HOME>/prompts/pastel-<id>.md (absolute, global)
12
+ * File path: <CODEX_HOME>/prompts/pstl-<id>.md (absolute, global)
13
13
  * Frontmatter: description, argument-hint
14
14
  */
15
15
  export declare const codexAdapter: ToolCommandAdapter;
@@ -18,13 +18,13 @@ function getCodexHome() {
18
18
  }
19
19
  /**
20
20
  * Codex adapter for command generation.
21
- * File path: <CODEX_HOME>/prompts/pastel-<id>.md (absolute, global)
21
+ * File path: <CODEX_HOME>/prompts/pstl-<id>.md (absolute, global)
22
22
  * Frontmatter: description, argument-hint
23
23
  */
24
24
  export const codexAdapter = {
25
25
  toolId: 'codex',
26
26
  getFilePath(commandId) {
27
- return path.join(getCodexHome(), 'prompts', `pastel-${commandId}.md`);
27
+ return path.join(getCodexHome(), 'prompts', `pstl-${commandId}.md`);
28
28
  },
29
29
  formatFile(content) {
30
30
  return `---
@@ -7,8 +7,8 @@
7
7
  import type { ToolCommandAdapter } from '../types.js';
8
8
  /**
9
9
  * Cursor adapter for command generation.
10
- * File path: .cursor/commands/pastel-<id>.md
11
- * Frontmatter: name (as /pastel-<id>), id, category, description
10
+ * File path: .cursor/commands/pstl-<id>.md
11
+ * Frontmatter: name (as /pstl-<id>), id, category, description
12
12
  */
13
13
  export declare const cursorAdapter: ToolCommandAdapter;
14
14
  //# sourceMappingURL=cursor.d.ts.map
@@ -21,18 +21,18 @@ function escapeYamlValue(value) {
21
21
  }
22
22
  /**
23
23
  * Cursor adapter for command generation.
24
- * File path: .cursor/commands/pastel-<id>.md
25
- * Frontmatter: name (as /pastel-<id>), id, category, description
24
+ * File path: .cursor/commands/pstl-<id>.md
25
+ * Frontmatter: name (as /pstl-<id>), id, category, description
26
26
  */
27
27
  export const cursorAdapter = {
28
28
  toolId: 'cursor',
29
29
  getFilePath(commandId) {
30
- return path.join('.cursor', 'commands', `pastel-${commandId}.md`);
30
+ return path.join('.cursor', 'commands', `pstl-${commandId}.md`);
31
31
  },
32
32
  formatFile(content) {
33
33
  return `---
34
- name: /pastel-${content.id}
35
- id: pastel-${content.id}
34
+ name: /pstl-${content.id}
35
+ id: pstl-${content.id}
36
36
  category: ${escapeYamlValue(content.category)}
37
37
  description: ${escapeYamlValue(content.description)}
38
38
  ---
@@ -6,7 +6,7 @@
6
6
  import type { ToolCommandAdapter } from '../types.js';
7
7
  /**
8
8
  * Gemini adapter for command generation.
9
- * File path: .gemini/commands/pastel/<id>.toml
9
+ * File path: .gemini/commands/pstl/<id>.toml
10
10
  * Format: TOML with description and prompt fields
11
11
  */
12
12
  export declare const geminiAdapter: ToolCommandAdapter;
@@ -6,13 +6,13 @@
6
6
  import path from 'path';
7
7
  /**
8
8
  * Gemini adapter for command generation.
9
- * File path: .gemini/commands/pastel/<id>.toml
9
+ * File path: .gemini/commands/pstl/<id>.toml
10
10
  * Format: TOML with description and prompt fields
11
11
  */
12
12
  export const geminiAdapter = {
13
13
  toolId: 'gemini',
14
14
  getFilePath(commandId) {
15
- return path.join('.gemini', 'commands', 'pastel', `${commandId}.toml`);
15
+ return path.join('.gemini', 'commands', 'pstl', `${commandId}.toml`);
16
16
  },
17
17
  formatFile(content) {
18
18
  return `description = "${content.description}"
@@ -6,7 +6,7 @@
6
6
  import type { ToolCommandAdapter } from '../types.js';
7
7
  /**
8
8
  * GitHub Copilot adapter for command generation.
9
- * File path: .github/prompts/pastel-<id>.prompt.md
9
+ * File path: .github/prompts/pstl-<id>.prompt.md
10
10
  * Frontmatter: description
11
11
  */
12
12
  export declare const githubCopilotAdapter: ToolCommandAdapter;
@@ -6,13 +6,13 @@
6
6
  import path from 'path';
7
7
  /**
8
8
  * GitHub Copilot adapter for command generation.
9
- * File path: .github/prompts/pastel-<id>.prompt.md
9
+ * File path: .github/prompts/pstl-<id>.prompt.md
10
10
  * Frontmatter: description
11
11
  */
12
12
  export const githubCopilotAdapter = {
13
13
  toolId: 'github-copilot',
14
14
  getFilePath(commandId) {
15
- return path.join('.github', 'prompts', `pastel-${commandId}.prompt.md`);
15
+ return path.join('.github', 'prompts', `pstl-${commandId}.prompt.md`);
16
16
  },
17
17
  formatFile(content) {
18
18
  return `---
@@ -33,7 +33,7 @@ export interface ToolCommandAdapter {
33
33
  /**
34
34
  * Returns the file path for a command.
35
35
  * @param commandId - The command identifier (e.g., 'explore')
36
- * @returns Path from project root (e.g., '.claude/commands/pastel/explore.md').
36
+ * @returns Path from project root (e.g., '.claude/commands/pstl/explore.md').
37
37
  * May be absolute for tools with global-scoped prompts (e.g., Codex).
38
38
  */
39
39
  getFilePath(commandId: string): string;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Init Command
3
3
  *
4
- * Sets up Pastelsdd with Agent Skills and /pastel:* slash commands.
4
+ * Sets up Pastelsdd with Agent Skills and /pstl:* slash commands.
5
5
  * This is the unified setup command that replaces both the old init and experimental commands.
6
6
  */
7
7
  type InitCommandOptions = {
@@ -20,8 +20,8 @@ export declare class InitCommand {
20
20
  private validate;
21
21
  private canPromptInteractively;
22
22
  private resolveProfileOverride;
23
- private handleOpenspecMigration;
24
- private performOpenspecMigration;
23
+ private handleLegacyToolMigration;
24
+ private performLegacyToolMigration;
25
25
  private handleLegacyCleanup;
26
26
  private performLegacyCleanup;
27
27
  private getSelectedTools;
package/dist/core/init.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Init Command
3
3
  *
4
- * Sets up Pastelsdd with Agent Skills and /pastel:* slash commands.
4
+ * Sets up Pastelsdd with Agent Skills and /pstl:* slash commands.
5
5
  * This is the unified setup command that replaces both the old init and experimental commands.
6
6
  */
7
7
  import path from 'path';
@@ -17,7 +17,7 @@ import { isInteractive } from '../utils/interactive.js';
17
17
  import { serializeConfig } from './config-prompts.js';
18
18
  import { generateCommands, CommandAdapterRegistry, } from './command-generation/index.js';
19
19
  import { detectLegacyArtifacts, cleanupLegacyArtifacts, formatCleanupSummary, formatDetectionSummary, } from './legacy-cleanup.js';
20
- import { detectOpenspecArtifacts, migrateFromOpenspec, formatOpenspecDetectionSummary, formatOpenspecMigrationSummary, pastelsddDirExists, } from './openspec-migration.js';
20
+ import { detectLegacyToolArtifacts, runLegacyToolMigration, formatLegacyToolDetectionSummary, formatLegacyToolMigrationSummary, pastelsddDirExists, } from './openspec-migration.js';
21
21
  import { runTrelloInitPrompt } from './trello-init-prompt.js';
22
22
  import { getToolsWithSkillsDir, getToolStates, getSkillTemplates, getCommandContents, generateSkillContent, } from './shared/index.js';
23
23
  import { getGlobalConfig } from './global-config.js';
@@ -70,8 +70,8 @@ export class InitCommand {
70
70
  const pastelsddPath = path.join(projectPath, pastelsddDir);
71
71
  // Validation happens silently in the background
72
72
  const extendMode = await this.validate(projectPath, pastelsddPath);
73
- // Check for openspec migration first (before legacy cleanup)
74
- await this.handleOpenspecMigration(projectPath);
73
+ // Check for legacy tool migration first (before legacy cleanup)
74
+ await this.handleLegacyToolMigration(projectPath);
75
75
  // Check for legacy artifacts and handle cleanup
76
76
  await this.handleLegacyCleanup(projectPath, extendMode);
77
77
  // Detect available tools in the project (task 7.1)
@@ -134,29 +134,29 @@ export class InitCommand {
134
134
  throw new Error(`Invalid profile "${this.profileOverride}". Available profiles: core, custom`);
135
135
  }
136
136
  // ═══════════════════════════════════════════════════════════
137
- // OPENSPEC MIGRATION
137
+ // LEGACY TOOL MIGRATION
138
138
  // ═══════════════════════════════════════════════════════════
139
- async handleOpenspecMigration(projectPath) {
140
- const detection = await detectOpenspecArtifacts(projectPath);
141
- if (!detection.hasOpenspecArtifacts) {
139
+ async handleLegacyToolMigration(projectPath) {
140
+ const detection = await detectLegacyToolArtifacts(projectPath);
141
+ if (!detection.hasLegacyArtifacts) {
142
142
  return;
143
143
  }
144
144
  // Determine whether pastelsdd/ already exists so we can show the right summary
145
145
  const alreadyExists = await pastelsddDirExists(projectPath);
146
146
  console.log();
147
- console.log(formatOpenspecDetectionSummary(detection, alreadyExists));
147
+ console.log(formatLegacyToolDetectionSummary(detection, alreadyExists));
148
148
  console.log();
149
149
  const canPrompt = this.canPromptInteractively();
150
150
  if (this.force || !canPrompt) {
151
151
  // Non-interactive or --force: migrate automatically
152
- await this.performOpenspecMigration(projectPath, detection);
152
+ await this.performLegacyToolMigration(projectPath, detection);
153
153
  return;
154
154
  }
155
155
  const { confirm } = await import('@inquirer/prompts');
156
- const dirName = detection.openspecDirName;
156
+ const dirName = detection.legacyDirName;
157
157
  const migrateLabel = alreadyExists
158
158
  ? `Merge ${dirName}/ into pastelsdd/ and complete the migration?`
159
- : `Migrate this project from OpenSpec to Pastelsdd?`;
159
+ : `Migrate this project from the legacy tool to Pastelsdd?`;
160
160
  const shouldMigrate = await confirm({
161
161
  message: migrateLabel,
162
162
  default: true,
@@ -165,13 +165,13 @@ export class InitCommand {
165
165
  console.log(chalk.dim('Migration cancelled. Re-run with --force to skip this prompt.'));
166
166
  process.exit(0);
167
167
  }
168
- await this.performOpenspecMigration(projectPath, detection);
168
+ await this.performLegacyToolMigration(projectPath, detection);
169
169
  }
170
- async performOpenspecMigration(projectPath, detection) {
171
- const spinner = ora('Migrating from OpenSpec...').start();
172
- const result = await migrateFromOpenspec(projectPath, detection);
173
- spinner.succeed('OpenSpec migration complete');
174
- const summary = formatOpenspecMigrationSummary(result);
170
+ async performLegacyToolMigration(projectPath, detection) {
171
+ const spinner = ora('Migrating from legacy tool...').start();
172
+ const result = await runLegacyToolMigration(projectPath, detection);
173
+ spinner.succeed('Migration to Pastelsdd complete');
174
+ const summary = formatLegacyToolMigrationSummary(result);
175
175
  if (summary) {
176
176
  console.log();
177
177
  console.log(summary);
@@ -435,7 +435,7 @@ export class InitCommand {
435
435
  const delivery = globalConfig.delivery ?? 'both';
436
436
  const profileWorkflows = getProfileWorkflows(profile, globalConfig.workflows);
437
437
  // Trello workflows are always generated regardless of profile, so users can
438
- // run /pastel:trello-setup to configure the integration at any time.
438
+ // run /pstl:trello-setup to configure the integration at any time.
439
439
  const TRELLO_WORKFLOWS = ['trello-setup', 'task', 'draft'];
440
440
  const workflowsSet = new Set([...profileWorkflows, ...TRELLO_WORKFLOWS]);
441
441
  const workflows = [...workflowsSet];
@@ -598,11 +598,11 @@ export class InitCommand {
598
598
  console.log();
599
599
  if (activeWorkflows.includes('propose')) {
600
600
  console.log(chalk.bold('Getting started:'));
601
- console.log(' Start your first change: /pastel:propose "your idea"');
601
+ console.log(' Start your first change: /pstl:propose "your idea"');
602
602
  }
603
603
  else if (activeWorkflows.includes('new')) {
604
604
  console.log(chalk.bold('Getting started:'));
605
- console.log(' Start your first change: /pastel:new "your idea"');
605
+ console.log(' Start your first change: /pstl:new "your idea"');
606
606
  }
607
607
  else {
608
608
  console.log("Done. Run 'pastelsdd config profile' to configure your workflows.");
@@ -612,7 +612,7 @@ export class InitCommand {
612
612
  console.log();
613
613
  console.log(chalk.bold('Trello Integration'));
614
614
  console.log(` Preferences saved to ${chalk.cyan('pastelsdd/trello.yaml')}`);
615
- console.log(` Run ${chalk.cyan('/pastel:trello-setup')} in Claude Code to connect your Trello lists.`);
615
+ console.log(` Run ${chalk.cyan('/pstl:trello-setup')} in Claude Code to connect your Trello lists.`);
616
616
  }
617
617
  // Links
618
618
  console.log();
@@ -306,7 +306,7 @@ export function formatCleanupSummary(result) {
306
306
  lines.push(` ✓ Removed ${file}`);
307
307
  }
308
308
  for (const dir of result.deletedDirs) {
309
- lines.push(` ✓ Removed ${dir}/ (replaced by /pastel:*)`);
309
+ lines.push(` ✓ Removed ${dir}/ (replaced by /pstl:*)`);
310
310
  }
311
311
  for (const file of result.modifiedFiles) {
312
312
  lines.push(` ✓ Removed Pastelsdd markers from ${file}`);
@@ -103,6 +103,6 @@ export function migrateIfNeeded(projectPath, tools) {
103
103
  }
104
104
  saveGlobalConfig(config);
105
105
  console.log(`Migrated: custom profile with ${installedWorkflows.length} workflows`);
106
- console.log("New in this version: /pastel:propose. Try 'pastelsdd config profile core' for the streamlined experience.");
106
+ console.log("New in this version: /pstl:propose. Try 'pastelsdd config profile core' for the streamlined experience.");
107
107
  }
108
108
  //# sourceMappingURL=migration.js.map