@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.
- package/README.md +142 -142
- package/dist/core/command-generation/adapters/claude.d.ts +1 -1
- package/dist/core/command-generation/adapters/claude.js +2 -2
- package/dist/core/command-generation/adapters/codex.d.ts +1 -1
- package/dist/core/command-generation/adapters/codex.js +2 -2
- package/dist/core/command-generation/adapters/cursor.d.ts +2 -2
- package/dist/core/command-generation/adapters/cursor.js +5 -5
- package/dist/core/command-generation/adapters/gemini.d.ts +1 -1
- package/dist/core/command-generation/adapters/gemini.js +2 -2
- package/dist/core/command-generation/adapters/github-copilot.d.ts +1 -1
- package/dist/core/command-generation/adapters/github-copilot.js +2 -2
- package/dist/core/command-generation/types.d.ts +1 -1
- package/dist/core/init.d.ts +3 -3
- package/dist/core/init.js +22 -22
- package/dist/core/legacy-cleanup.js +1 -1
- package/dist/core/migration.js +1 -1
- package/dist/core/openspec-migration.d.ts +15 -15
- package/dist/core/openspec-migration.js +41 -38
- package/dist/core/templates/workflows/apply-change.js +264 -203
- package/dist/core/templates/workflows/archive-change.js +204 -204
- package/dist/core/templates/workflows/continue-change.js +3 -3
- package/dist/core/templates/workflows/explore.js +300 -4
- package/dist/core/templates/workflows/ff-change.js +3 -3
- package/dist/core/templates/workflows/new-change.js +3 -3
- package/dist/core/templates/workflows/onboard.js +32 -32
- package/dist/core/templates/workflows/propose.js +186 -25
- package/dist/core/templates/workflows/sync-specs.js +1 -1
- package/dist/core/templates/workflows/trello-draft.d.ts +2 -2
- package/dist/core/templates/workflows/trello-draft.js +174 -120
- package/dist/core/templates/workflows/trello-setup.d.ts +1 -0
- package/dist/core/templates/workflows/trello-setup.js +292 -220
- package/dist/core/templates/workflows/verify-change.js +1 -1
- package/dist/core/trello-config.d.ts +36 -4
- package/dist/core/trello-config.js +35 -1
- package/dist/core/trello-init-prompt.d.ts +19 -2
- package/dist/core/trello-init-prompt.js +33 -5
- package/dist/core/update.js +3 -3
- package/dist/ui/welcome-screen.js +4 -4
- package/dist/utils/command-references.d.ts +3 -3
- package/dist/utils/command-references.js +4 -4
- 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
|
-
[](https://www.npmjs.com/package/@thiagodiogo/pastelsdd)
|
|
6
|
-
[](LICENSE)
|
|
7
|
-
[](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
|
-
/
|
|
51
|
-
/
|
|
52
|
-
/
|
|
53
|
-
/
|
|
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/
|
|
142
|
-
- [Issues / Feedback](https://github.com/
|
|
1
|
+
# pastelsdd
|
|
2
|
+
|
|
3
|
+
> Spec-driven, AI-native development workflow CLI
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/@thiagodiogo/pastelsdd)
|
|
6
|
+
[](LICENSE)
|
|
7
|
+
[](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/
|
|
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/
|
|
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', '
|
|
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/
|
|
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/
|
|
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', `
|
|
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/
|
|
11
|
-
* Frontmatter: name (as /
|
|
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/
|
|
25
|
-
* Frontmatter: name (as /
|
|
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', `
|
|
30
|
+
return path.join('.cursor', 'commands', `pstl-${commandId}.md`);
|
|
31
31
|
},
|
|
32
32
|
formatFile(content) {
|
|
33
33
|
return `---
|
|
34
|
-
name: /
|
|
35
|
-
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/
|
|
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/
|
|
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', '
|
|
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/
|
|
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/
|
|
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', `
|
|
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/
|
|
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;
|
package/dist/core/init.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Init Command
|
|
3
3
|
*
|
|
4
|
-
* Sets up Pastelsdd with Agent Skills and /
|
|
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
|
|
24
|
-
private
|
|
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 /
|
|
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 {
|
|
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
|
|
74
|
-
await this.
|
|
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
|
-
//
|
|
137
|
+
// LEGACY TOOL MIGRATION
|
|
138
138
|
// ═══════════════════════════════════════════════════════════
|
|
139
|
-
async
|
|
140
|
-
const detection = await
|
|
141
|
-
if (!detection.
|
|
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(
|
|
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.
|
|
152
|
+
await this.performLegacyToolMigration(projectPath, detection);
|
|
153
153
|
return;
|
|
154
154
|
}
|
|
155
155
|
const { confirm } = await import('@inquirer/prompts');
|
|
156
|
-
const dirName = detection.
|
|
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
|
|
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.
|
|
168
|
+
await this.performLegacyToolMigration(projectPath, detection);
|
|
169
169
|
}
|
|
170
|
-
async
|
|
171
|
-
const spinner = ora('Migrating from
|
|
172
|
-
const result = await
|
|
173
|
-
spinner.succeed('
|
|
174
|
-
const summary =
|
|
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 /
|
|
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: /
|
|
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: /
|
|
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('/
|
|
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 /
|
|
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}`);
|
package/dist/core/migration.js
CHANGED
|
@@ -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: /
|
|
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
|