@dedesfr/prompter 0.8.23 → 0.9.0
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/CHANGELOG.md +49 -0
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/commands/init.d.ts +1 -7
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +32 -294
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +17 -40
- package/dist/commands/update.js.map +1 -1
- package/dist/core/configurators/slash/antigravity.d.ts +2 -5
- package/dist/core/configurators/slash/antigravity.d.ts.map +1 -1
- package/dist/core/configurators/slash/antigravity.js +2 -57
- package/dist/core/configurators/slash/antigravity.js.map +1 -1
- package/dist/core/configurators/slash/base.d.ts +6 -18
- package/dist/core/configurators/slash/base.d.ts.map +1 -1
- package/dist/core/configurators/slash/base.js +8 -77
- package/dist/core/configurators/slash/base.js.map +1 -1
- package/dist/core/configurators/slash/claude.d.ts +2 -5
- package/dist/core/configurators/slash/claude.d.ts.map +1 -1
- package/dist/core/configurators/slash/claude.js +2 -57
- package/dist/core/configurators/slash/claude.js.map +1 -1
- package/dist/core/configurators/slash/codex.d.ts +2 -5
- package/dist/core/configurators/slash/codex.d.ts.map +1 -1
- package/dist/core/configurators/slash/codex.js +2 -57
- package/dist/core/configurators/slash/codex.js.map +1 -1
- package/dist/core/configurators/slash/droid.d.ts +2 -5
- package/dist/core/configurators/slash/droid.d.ts.map +1 -1
- package/dist/core/configurators/slash/droid.js +2 -32
- package/dist/core/configurators/slash/droid.js.map +1 -1
- package/dist/core/configurators/slash/forge.d.ts +2 -5
- package/dist/core/configurators/slash/forge.d.ts.map +1 -1
- package/dist/core/configurators/slash/forge.js +2 -32
- package/dist/core/configurators/slash/forge.js.map +1 -1
- package/dist/core/configurators/slash/github-copilot.d.ts +2 -7
- package/dist/core/configurators/slash/github-copilot.d.ts.map +1 -1
- package/dist/core/configurators/slash/github-copilot.js +2 -96
- package/dist/core/configurators/slash/github-copilot.js.map +1 -1
- package/dist/core/configurators/slash/index.d.ts +1 -1
- package/dist/core/configurators/slash/index.d.ts.map +1 -1
- package/dist/core/configurators/slash/index.js +1 -1
- package/dist/core/configurators/slash/index.js.map +1 -1
- package/dist/core/configurators/slash/kilocode.d.ts +2 -5
- package/dist/core/configurators/slash/kilocode.d.ts.map +1 -1
- package/dist/core/configurators/slash/kilocode.js +2 -57
- package/dist/core/configurators/slash/kilocode.js.map +1 -1
- package/dist/core/configurators/slash/opencode.d.ts +2 -5
- package/dist/core/configurators/slash/opencode.d.ts.map +1 -1
- package/dist/core/configurators/slash/opencode.js +2 -57
- package/dist/core/configurators/slash/opencode.js.map +1 -1
- package/dist/core/configurators/slash/registry.d.ts +4 -4
- package/dist/core/configurators/slash/registry.d.ts.map +1 -1
- package/dist/core/configurators/slash/registry.js.map +1 -1
- package/dist/core/templates/index.d.ts +0 -1
- package/dist/core/templates/index.d.ts.map +1 -1
- package/dist/core/templates/index.js +0 -1
- package/dist/core/templates/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/ai-humanizer/SKILL.md +50 -0
- package/skills/api-contract-generator/SKILL.md +243 -0
- package/skills/apply/SKILL.md +23 -0
- package/skills/archive/SKILL.md +27 -0
- package/skills/design-system/SKILL.md +216 -0
- package/skills/document-explainer/SKILL.md +155 -0
- package/skills/enhance/SKILL.md +47 -0
- package/skills/epic-generator/SKILL.md +204 -0
- package/skills/epic-single/SKILL.md +63 -0
- package/skills/erd-generator/SKILL.md +138 -0
- package/skills/fsd-generator/SKILL.md +163 -0
- package/skills/prd-agent-generator/SKILL.md +132 -0
- package/skills/prd-generator/SKILL.md +211 -0
- package/skills/product-brief/SKILL.md +141 -0
- package/skills/proposal/SKILL.md +28 -0
- package/skills/qa-test-scenario/SKILL.md +149 -0
- package/skills/skill-creator/SKILL.md +173 -0
- package/skills/story-generator/SKILL.md +285 -0
- package/skills/story-single/SKILL.md +86 -0
- package/skills/tdd-generator/SKILL.md +300 -0
- package/skills/tdd-lite-generator/SKILL.md +230 -0
- package/skills/wireframe-generator/SKILL.md +227 -0
- package/src/cli/index.ts +1 -1
- package/src/commands/init.ts +32 -334
- package/src/commands/update.ts +20 -47
- package/src/core/configurators/slash/antigravity.ts +2 -62
- package/src/core/configurators/slash/base.ts +11 -105
- package/src/core/configurators/slash/claude.ts +2 -62
- package/src/core/configurators/slash/codex.ts +2 -62
- package/src/core/configurators/slash/droid.ts +2 -36
- package/src/core/configurators/slash/forge.ts +2 -36
- package/src/core/configurators/slash/github-copilot.ts +2 -106
- package/src/core/configurators/slash/index.ts +1 -1
- package/src/core/configurators/slash/kilocode.ts +2 -62
- package/src/core/configurators/slash/opencode.ts +2 -62
- package/src/core/configurators/slash/registry.ts +5 -5
- package/src/core/templates/index.ts +0 -1
- package/dist/core/templates/slash-command-templates.d.ts +0 -7
- package/dist/core/templates/slash-command-templates.d.ts.map +0 -1
- package/dist/core/templates/slash-command-templates.js +0 -1041
- package/dist/core/templates/slash-command-templates.js.map +0 -1
- package/src/core/templates/slash-command-templates.ts +0 -1068
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,54 @@
|
|
|
1
1
|
# CHANGELOG
|
|
2
2
|
|
|
3
|
+
## [0.9.0] - 2026-05-11
|
|
4
|
+
|
|
5
|
+
### ⚠️ Breaking Changes
|
|
6
|
+
- **Slash Command Files Deprecated**: All slash command file generation has been removed
|
|
7
|
+
- `prompter init` no longer writes `.claude/commands/prompter/*.md`, `.agent/workflows/*.md`, or equivalent files for any tool
|
|
8
|
+
- Existing slash command files are **not** automatically removed — delete them manually from your project
|
|
9
|
+
- All Prompter capabilities are now delivered exclusively as skills
|
|
10
|
+
|
|
11
|
+
### ✨ Added
|
|
12
|
+
- **22 Built-in Skills**: Every former slash command is now a first-class skill in `skills/`
|
|
13
|
+
- `enhance`, `prd-generator`, `prd-agent-generator`, `product-brief`
|
|
14
|
+
- `epic-single`, `epic-generator`, `story-single`, `story-generator`
|
|
15
|
+
- `fsd-generator`, `tdd-generator`, `tdd-lite-generator`, `erd-generator`, `api-contract-generator`
|
|
16
|
+
- `design-system`, `wireframe-generator`
|
|
17
|
+
- `proposal`, `apply`, `archive`
|
|
18
|
+
- `qa-test-scenario`, `skill-creator`, `ai-humanizer`, `document-explainer`
|
|
19
|
+
- Each skill is a proper `SKILL.md` directory with name, description, and full prompt body
|
|
20
|
+
- Discoverable and deployable through the same pipeline as user-created skills
|
|
21
|
+
- **9 Skill Categories in Init**: `prompter init` skill selection now groups all skills into named categories
|
|
22
|
+
- 📋 Planning & Strategy: project-orchestrator, feature-planner, prd-generator, prd-agent-generator, product-brief
|
|
23
|
+
- 🎯 Agile & Backlog: epic-single, epic-generator, story-single, story-generator
|
|
24
|
+
- 📐 Specification & Architecture: fsd-generator, tdd-generator, tdd-lite-generator, erd-generator, api-contract-generator
|
|
25
|
+
- 🎨 Design & UI/UX: ui-ux-pro, design-system-generator, design-system, wireframe-generator, design-md, frontend-design
|
|
26
|
+
- ⚙️ Development & Code Review: code-review, laravel-code-review, mcp-builder, skill-creator
|
|
27
|
+
- ✅ Testing & QA: qa-test-scenario
|
|
28
|
+
- ⚡ Prompter Workflow: prompter-workflow, prompter-specs, proposal, apply, archive
|
|
29
|
+
- 📝 Documentation: doc-builder, document-translator, document-explainer, ai-context-generator, meeting-notes, sph-generator
|
|
30
|
+
- ✨ Content & Productivity: enhance, enhance-prompt, ai-humanizer, gamma-builder, cerebro
|
|
31
|
+
- **Skill Descriptions in Selection UI**: Each skill now shows a short description next to its name during `prompter init`
|
|
32
|
+
- Descriptions truncated to 72 characters with `…` to prevent terminal line wrapping
|
|
33
|
+
|
|
34
|
+
### 🔄 Changed
|
|
35
|
+
- **`prompter init` Flow**: Prompt template selection step removed — init now goes directly from tool selection to skill selection
|
|
36
|
+
- The `prompter/core/` prompt file management system is retained in `prompter update` for existing projects
|
|
37
|
+
- **Tool Detection**: `detectConfiguredTools()` now detects previously configured tools by checking if the tool's skill root directory exists (e.g. `.claude/skills/`) instead of scanning for slash command files
|
|
38
|
+
- **`ToolConfigurator` Base Class**: Renamed from `SlashCommandConfigurator`; now skills-only
|
|
39
|
+
- Each of the 8 tool configurators (claude, antigravity, codex, github-copilot, opencode, kilocode, forge, droid) reduced to ~9 lines
|
|
40
|
+
- Only requires implementing `getSkillTargetDir(skillName)` alongside `toolId` and `isAvailable`
|
|
41
|
+
- **`prompter update`**: Now resolves built-in skills from the package directory (same as `prompter init`) and updates existing deployed skill files
|
|
42
|
+
|
|
43
|
+
### 🗑️ Removed
|
|
44
|
+
- **`src/core/templates/slash-command-templates.ts`**: Deleted — all 22 template bodies now live in `skills/*/SKILL.md` on disk
|
|
45
|
+
- **`SlashCommandId` type and `TemplateManager` class**: Removed from `src/core/templates/index.ts`
|
|
46
|
+
- **Prompt Template Selection Step**: Removed interactive "Select prompt templates to install" step from `prompter init`
|
|
47
|
+
- **`FILE_PATHS` and `DESCRIPTIONS` records**: Removed from all 8 tool configurators
|
|
48
|
+
- **Slash-command methods from base class**: `getTargets()`, `generateAll()`, `updateExisting()`, `getRelativePath()`, `getFrontmatter()`, `getBody()`, `updateBody()`, `SlashCommandTarget` interface, `ALL_COMMANDS` constant — all deleted
|
|
49
|
+
- **`removeWorkflowFilesForPrompts()`**: Removed from `init.ts`
|
|
50
|
+
- **`removeEmptyDirs()`**: Removed from `init.ts`
|
|
51
|
+
|
|
3
52
|
## [0.8.23] - 2026-05-08
|
|
4
53
|
|
|
5
54
|
### 🔄 Changed
|
package/dist/cli/index.js
CHANGED
|
@@ -16,7 +16,7 @@ const program = new Command();
|
|
|
16
16
|
program
|
|
17
17
|
.name('prompter')
|
|
18
18
|
.description('Enhance prompts directly in your AI coding workflow')
|
|
19
|
-
.version('0.
|
|
19
|
+
.version('0.9.0');
|
|
20
20
|
program
|
|
21
21
|
.command('init')
|
|
22
22
|
.description('Initialize Prompter in your project')
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,21 +1,15 @@
|
|
|
1
1
|
interface InitOptions {
|
|
2
2
|
tools?: string[];
|
|
3
|
-
prompts?: string[];
|
|
4
3
|
skills?: string[];
|
|
5
4
|
noInteractive?: boolean;
|
|
6
5
|
}
|
|
7
6
|
export declare class InitCommand {
|
|
8
|
-
private
|
|
7
|
+
private truncateDescription;
|
|
9
8
|
private getCategorizedSkillChoices;
|
|
10
9
|
execute(options?: InitOptions): Promise<void>;
|
|
11
10
|
private fileExists;
|
|
12
11
|
private detectConfiguredTools;
|
|
13
12
|
private removeToolFiles;
|
|
14
|
-
private removeEmptyDirs;
|
|
15
|
-
private detectInstalledPrompts;
|
|
16
|
-
private installPrompts;
|
|
17
|
-
private removePrompts;
|
|
18
|
-
private removeWorkflowFilesForPrompts;
|
|
19
13
|
private ensureRootClaudeFile;
|
|
20
14
|
private setupSkills;
|
|
21
15
|
private detectInstalledSkills;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAUA,UAAU,WAAW;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,WAAW;IACpB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,0BAA0B;IA6E5B,OAAO,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;YAsOzC,UAAU;YASV,qBAAqB;YAiBrB,eAAe;YAOf,oBAAoB;YA8CpB,WAAW;YAsGX,qBAAqB;YAoBrB,aAAa;YAgBb,oBAAoB;CAmDrC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -3,80 +3,51 @@ import path from 'path';
|
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
import chalk from 'chalk';
|
|
5
5
|
import { checkbox, Separator } from '@inquirer/prompts';
|
|
6
|
-
import { PROMPTER_DIR, SUPPORTED_TOOLS,
|
|
6
|
+
import { PROMPTER_DIR, SUPPORTED_TOOLS, PrompterConfig } from '../core/config.js';
|
|
7
7
|
import { projectTemplate, agentsTemplate, claudeTemplate } from '../core/templates/index.js';
|
|
8
|
-
import { PROMPT_TEMPLATES } from '../core/prompt-templates.js';
|
|
9
8
|
import { registry } from '../core/configurators/slash/index.js';
|
|
10
9
|
import { discoverSkills } from '../core/skill-discovery.js';
|
|
11
10
|
export class InitCommand {
|
|
12
|
-
|
|
11
|
+
truncateDescription(desc, max = 72) {
|
|
12
|
+
return desc.length > max ? desc.slice(0, max - 1) + '…' : desc;
|
|
13
|
+
}
|
|
14
|
+
getCategorizedSkillChoices(availableSkills, currentSkillNames) {
|
|
13
15
|
const categories = [
|
|
14
16
|
{
|
|
15
|
-
name: '📋
|
|
16
|
-
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
name: '📐 Specification & Documentation',
|
|
20
|
-
prompts: ['fsd-generator', 'tdd-generator', 'tdd-lite-generator', 'erd-generator', 'api-contract-generator']
|
|
17
|
+
name: '📋 Planning & Strategy',
|
|
18
|
+
skills: ['project-orchestrator', 'feature-planner', 'prd-generator', 'prd-agent-generator', 'product-brief']
|
|
21
19
|
},
|
|
22
20
|
{
|
|
23
|
-
name: '🎯 Agile &
|
|
24
|
-
|
|
21
|
+
name: '🎯 Agile & Backlog',
|
|
22
|
+
skills: ['epic-single', 'epic-generator', 'story-single', 'story-generator']
|
|
25
23
|
},
|
|
26
24
|
{
|
|
27
|
-
name: '
|
|
28
|
-
|
|
25
|
+
name: '📐 Specification & Architecture',
|
|
26
|
+
skills: ['fsd-generator', 'tdd-generator', 'tdd-lite-generator', 'erd-generator', 'api-contract-generator']
|
|
29
27
|
},
|
|
30
28
|
{
|
|
31
29
|
name: '🎨 Design & UI/UX',
|
|
32
|
-
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
name: '⚙️ Development Workflow',
|
|
36
|
-
prompts: ['proposal', 'apply', 'archive']
|
|
30
|
+
skills: ['ui-ux-pro', 'design-system-generator', 'design-system', 'wireframe-generator', 'design-md', 'frontend-design']
|
|
37
31
|
},
|
|
38
32
|
{
|
|
39
|
-
name: '
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
];
|
|
43
|
-
const choices = [];
|
|
44
|
-
for (const category of categories) {
|
|
45
|
-
choices.push(new Separator(chalk.bold.cyan(category.name)));
|
|
46
|
-
for (const promptValue of category.prompts) {
|
|
47
|
-
const prompt = AVAILABLE_PROMPTS.find(p => p.value === promptValue);
|
|
48
|
-
if (prompt) {
|
|
49
|
-
choices.push({
|
|
50
|
-
name: ` ${prompt.name} ${chalk.gray('- ' + prompt.description)}`,
|
|
51
|
-
value: prompt.value,
|
|
52
|
-
checked: currentPrompts.includes(prompt.value)
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
return choices;
|
|
58
|
-
}
|
|
59
|
-
getCategorizedSkillChoices(availableSkills, currentSkillNames) {
|
|
60
|
-
const categories = [
|
|
61
|
-
{
|
|
62
|
-
name: '📋 Planning & Strategy',
|
|
63
|
-
skills: ['project-orchestrator', 'feature-planner', 'prompter-workflow', 'prompter-specs']
|
|
33
|
+
name: '⚙️ Development & Code Review',
|
|
34
|
+
skills: ['code-review', 'laravel-code-review', 'mcp-builder', 'skill-creator']
|
|
64
35
|
},
|
|
65
36
|
{
|
|
66
|
-
name: '
|
|
67
|
-
skills: ['
|
|
37
|
+
name: '✅ Testing & QA',
|
|
38
|
+
skills: ['qa-test-scenario']
|
|
68
39
|
},
|
|
69
40
|
{
|
|
70
|
-
name: '
|
|
71
|
-
skills: ['
|
|
41
|
+
name: '⚡ Prompter Workflow',
|
|
42
|
+
skills: ['prompter-workflow', 'prompter-specs', 'proposal', 'apply', 'archive']
|
|
72
43
|
},
|
|
73
44
|
{
|
|
74
45
|
name: '📝 Documentation',
|
|
75
|
-
skills: ['doc-builder', 'document-translator', 'ai-context-generator', 'meeting-notes', 'sph-generator']
|
|
46
|
+
skills: ['doc-builder', 'document-translator', 'document-explainer', 'ai-context-generator', 'meeting-notes', 'sph-generator']
|
|
76
47
|
},
|
|
77
48
|
{
|
|
78
49
|
name: '✨ Content & Productivity',
|
|
79
|
-
skills: ['
|
|
50
|
+
skills: ['enhance', 'enhance-prompt', 'ai-humanizer', 'gamma-builder', 'cerebro']
|
|
80
51
|
}
|
|
81
52
|
];
|
|
82
53
|
const categorized = new Set();
|
|
@@ -91,7 +62,7 @@ export class InitCommand {
|
|
|
91
62
|
for (const skill of skillsInCategory) {
|
|
92
63
|
categorized.add(skill.name);
|
|
93
64
|
choices.push({
|
|
94
|
-
name: ` ${skill.name}`,
|
|
65
|
+
name: ` ${skill.name} ${chalk.gray('- ' + this.truncateDescription(skill.description))}`,
|
|
95
66
|
value: skill.name,
|
|
96
67
|
checked: currentSkillNames.includes(skill.name)
|
|
97
68
|
});
|
|
@@ -103,7 +74,7 @@ export class InitCommand {
|
|
|
103
74
|
choices.push(new Separator(chalk.bold.cyan('🔧 Other')));
|
|
104
75
|
for (const skill of uncategorized) {
|
|
105
76
|
choices.push({
|
|
106
|
-
name: ` ${skill.name}`,
|
|
77
|
+
name: ` ${skill.name} ${chalk.gray('- ' + this.truncateDescription(skill.description))}`,
|
|
107
78
|
value: skill.name,
|
|
108
79
|
checked: currentSkillNames.includes(skill.name)
|
|
109
80
|
});
|
|
@@ -175,29 +146,6 @@ export class InitCommand {
|
|
|
175
146
|
// In non-interactive re-init without tools specified, keep current tools
|
|
176
147
|
selectedTools = currentTools;
|
|
177
148
|
}
|
|
178
|
-
// Select prompts
|
|
179
|
-
let selectedPrompts = [];
|
|
180
|
-
if (options.prompts && options.prompts.length > 0) {
|
|
181
|
-
// Handle comma-separated values in a single string or array of strings
|
|
182
|
-
selectedPrompts = options.prompts.flatMap(prompt => prompt.split(',').map(p => p.trim()));
|
|
183
|
-
}
|
|
184
|
-
else if (!options.noInteractive) {
|
|
185
|
-
try {
|
|
186
|
-
// Detect currently installed prompts (use path.join to get prompter path)
|
|
187
|
-
const prompterPathForDetection = path.join(projectPath, PROMPTER_DIR);
|
|
188
|
-
const currentPrompts = await this.detectInstalledPrompts(prompterPathForDetection);
|
|
189
|
-
selectedPrompts = await checkbox({
|
|
190
|
-
message: 'Select prompt templates to install:',
|
|
191
|
-
choices: this.getCategorizedPromptChoices(currentPrompts),
|
|
192
|
-
pageSize: 20
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
catch (error) {
|
|
196
|
-
// User cancelled
|
|
197
|
-
console.log(chalk.yellow(isReInitialization ? '\nRe-configuration cancelled.' : '\nInitialization cancelled.'));
|
|
198
|
-
return;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
149
|
// Select skills — resolve from the package directory, not the user's project
|
|
202
150
|
// dist/commands/init.js → go up two levels to reach the package root
|
|
203
151
|
const packageDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
|
|
@@ -291,12 +239,6 @@ export class InitCommand {
|
|
|
291
239
|
const toolsToAdd = selectedTools.filter(t => !currentTools.includes(t));
|
|
292
240
|
const toolsToRemove = currentTools.filter(t => !selectedTools.includes(t));
|
|
293
241
|
const toolsToKeep = selectedTools.filter(t => currentTools.includes(t));
|
|
294
|
-
// Handle prompt changes
|
|
295
|
-
const prompterPathForDetection = path.join(projectPath, PROMPTER_DIR);
|
|
296
|
-
const currentPrompts = await this.detectInstalledPrompts(prompterPathForDetection);
|
|
297
|
-
const promptsToAdd = selectedPrompts.filter(p => !currentPrompts.includes(p));
|
|
298
|
-
const promptsToRemove = currentPrompts.filter(p => !selectedPrompts.includes(p));
|
|
299
|
-
const promptsToKeep = selectedPrompts.filter(p => currentPrompts.includes(p));
|
|
300
242
|
// Remove old tool files
|
|
301
243
|
if (toolsToRemove.length > 0) {
|
|
302
244
|
console.log(chalk.blue('\n🗑️ Removing workflow files...\n'));
|
|
@@ -315,67 +257,6 @@ export class InitCommand {
|
|
|
315
257
|
}
|
|
316
258
|
}
|
|
317
259
|
}
|
|
318
|
-
// Remove unchecked prompts
|
|
319
|
-
if (promptsToRemove.length > 0) {
|
|
320
|
-
console.log(chalk.blue('\n🗑️ Removing prompt templates...\n'));
|
|
321
|
-
// Remove from prompter/ folder
|
|
322
|
-
const removedPrompts = await this.removePrompts(prompterPath, promptsToRemove);
|
|
323
|
-
for (const promptName of removedPrompts) {
|
|
324
|
-
console.log(chalk.yellow('✓') + ` Removed ${chalk.cyan(promptName)}`);
|
|
325
|
-
}
|
|
326
|
-
// Remove workflow files from all configured tools
|
|
327
|
-
await this.removeWorkflowFilesForPrompts(projectPath, currentTools, promptsToRemove);
|
|
328
|
-
}
|
|
329
|
-
// Generate workflow files for new tools
|
|
330
|
-
if (toolsToAdd.length > 0) {
|
|
331
|
-
console.log(chalk.blue('\n📝 Creating workflow files...\n'));
|
|
332
|
-
// Convert selected prompt values to SlashCommandIds
|
|
333
|
-
const slashCommandIds = selectedPrompts;
|
|
334
|
-
for (const toolId of toolsToAdd) {
|
|
335
|
-
const configurator = registry.get(toolId);
|
|
336
|
-
if (configurator) {
|
|
337
|
-
try {
|
|
338
|
-
// Pass selected prompts to only generate those workflow files
|
|
339
|
-
// Pass empty array if no prompts selected to generate nothing
|
|
340
|
-
const files = await configurator.generateAll(projectPath, slashCommandIds);
|
|
341
|
-
for (const file of files) {
|
|
342
|
-
console.log(chalk.green('✓') + ` Created ${chalk.cyan(file)}`);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
catch (error) {
|
|
346
|
-
console.log(chalk.red('✗') + ` Failed to create files for ${toolId}: ${error}`);
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
// Add missing workflow files for existing tools
|
|
352
|
-
if (isReInitialization && toolsToKeep.length > 0) {
|
|
353
|
-
const missingFiles = [];
|
|
354
|
-
// Convert selected prompt values to SlashCommandIds
|
|
355
|
-
const slashCommandIds = selectedPrompts;
|
|
356
|
-
for (const toolId of toolsToKeep) {
|
|
357
|
-
const configurator = registry.get(toolId);
|
|
358
|
-
if (configurator) {
|
|
359
|
-
try {
|
|
360
|
-
// Pass selected prompts to only generate those workflow files
|
|
361
|
-
// Pass empty array if no prompts selected to generate nothing
|
|
362
|
-
const files = await configurator.generateAll(projectPath, slashCommandIds);
|
|
363
|
-
for (const file of files) {
|
|
364
|
-
missingFiles.push(file);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
catch (error) {
|
|
368
|
-
// Ignore errors for kept tools
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
if (missingFiles.length > 0) {
|
|
373
|
-
console.log(chalk.blue('\n📝 Adding missing workflow files...\n'));
|
|
374
|
-
for (const file of missingFiles) {
|
|
375
|
-
console.log(chalk.green('✓') + ` Created ${chalk.cyan(file)}`);
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
260
|
// Show kept tools
|
|
380
261
|
if (isReInitialization && toolsToKeep.length > 0 && (toolsToAdd.length > 0 || toolsToRemove.length > 0)) {
|
|
381
262
|
console.log(chalk.blue('\n✨ Keeping existing tools:\n'));
|
|
@@ -386,28 +267,12 @@ export class InitCommand {
|
|
|
386
267
|
}
|
|
387
268
|
}
|
|
388
269
|
}
|
|
389
|
-
// Install new prompts
|
|
390
|
-
if (promptsToAdd.length > 0) {
|
|
391
|
-
console.log(chalk.blue('\n📋 Installing prompt templates...\n'));
|
|
392
|
-
const installedPrompts = await this.installPrompts(projectPath, prompterPath, promptsToAdd);
|
|
393
|
-
for (const promptName of installedPrompts) {
|
|
394
|
-
console.log(chalk.green('✓') + ` Installed ${chalk.cyan(promptName)}`);
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
// Update existing prompts in prompter/core/
|
|
398
|
-
if (isReInitialization && promptsToKeep.length > 0) {
|
|
399
|
-
console.log(chalk.blue('\n🔄 Updating existing prompt templates...\n'));
|
|
400
|
-
const updatedPrompts = await this.installPrompts(projectPath, prompterPath, promptsToKeep);
|
|
401
|
-
for (const promptName of updatedPrompts) {
|
|
402
|
-
console.log(chalk.green('✓') + ` Updated ${chalk.cyan(promptName)}`);
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
270
|
// --- Skills setup ---
|
|
406
271
|
const skillChanges = await this.setupSkills(projectPath, prompterPath, selectedTools, selectedSkills);
|
|
407
272
|
// Success message
|
|
408
273
|
if (isReInitialization) {
|
|
409
274
|
console.log(chalk.green('\n✅ Prompter tools updated successfully!\n'));
|
|
410
|
-
if (toolsToAdd.length > 0 || toolsToRemove.length > 0 ||
|
|
275
|
+
if (toolsToAdd.length > 0 || toolsToRemove.length > 0 || skillChanges.added.length > 0 || skillChanges.removed.length > 0) {
|
|
411
276
|
console.log(chalk.blue('Summary:'));
|
|
412
277
|
if (toolsToAdd.length > 0) {
|
|
413
278
|
console.log(chalk.green(' Tools Added: ') + toolsToAdd.map(t => {
|
|
@@ -421,18 +286,6 @@ export class InitCommand {
|
|
|
421
286
|
return tool ? tool.name : t;
|
|
422
287
|
}).join(', '));
|
|
423
288
|
}
|
|
424
|
-
if (promptsToAdd.length > 0) {
|
|
425
|
-
console.log(chalk.green(' Prompts Added: ') + promptsToAdd.map(p => {
|
|
426
|
-
const prompt = AVAILABLE_PROMPTS.find(ap => ap.value === p);
|
|
427
|
-
return prompt ? prompt.name : p;
|
|
428
|
-
}).join(', '));
|
|
429
|
-
}
|
|
430
|
-
if (promptsToRemove.length > 0) {
|
|
431
|
-
console.log(chalk.yellow(' Prompts Removed: ') + promptsToRemove.map(p => {
|
|
432
|
-
const prompt = AVAILABLE_PROMPTS.find(ap => ap.value === p);
|
|
433
|
-
return prompt ? prompt.name : p;
|
|
434
|
-
}).join(', '));
|
|
435
|
-
}
|
|
436
289
|
if (skillChanges.added.length > 0) {
|
|
437
290
|
console.log(chalk.green(' Skills Added: ') + skillChanges.added.join(', '));
|
|
438
291
|
}
|
|
@@ -447,9 +300,6 @@ export class InitCommand {
|
|
|
447
300
|
}
|
|
448
301
|
else {
|
|
449
302
|
console.log(chalk.green('\n✅ Prompter initialized successfully!\n'));
|
|
450
|
-
if (promptsToAdd.length > 0) {
|
|
451
|
-
console.log(chalk.gray(`Installed ${promptsToAdd.length} prompt template(s).\n`));
|
|
452
|
-
}
|
|
453
303
|
if (skillChanges.added.length > 0) {
|
|
454
304
|
console.log(chalk.gray(`Installed ${skillChanges.added.length} skill(s).\n`));
|
|
455
305
|
}
|
|
@@ -469,133 +319,21 @@ export class InitCommand {
|
|
|
469
319
|
const configuredTools = [];
|
|
470
320
|
const allConfigurators = registry.getAll();
|
|
471
321
|
for (const configurator of allConfigurators) {
|
|
472
|
-
const
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
hasFiles = true;
|
|
478
|
-
break;
|
|
479
|
-
}
|
|
322
|
+
const skillsRoot = path.join(projectPath, configurator.getSkillsRootDir());
|
|
323
|
+
try {
|
|
324
|
+
const stat = await fs.stat(skillsRoot);
|
|
325
|
+
if (stat.isDirectory())
|
|
326
|
+
configuredTools.push(configurator.toolId);
|
|
480
327
|
}
|
|
481
|
-
|
|
482
|
-
|
|
328
|
+
catch {
|
|
329
|
+
// directory doesn't exist — tool not configured
|
|
483
330
|
}
|
|
484
331
|
}
|
|
485
332
|
return configuredTools;
|
|
486
333
|
}
|
|
487
334
|
async removeToolFiles(projectPath, configurator) {
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
for (const target of targets) {
|
|
491
|
-
const filePath = path.join(projectPath, target.path);
|
|
492
|
-
if (await this.fileExists(filePath)) {
|
|
493
|
-
await fs.unlink(filePath);
|
|
494
|
-
removedFiles.push(target.path);
|
|
495
|
-
// Remove empty parent directories
|
|
496
|
-
await this.removeEmptyDirs(path.dirname(filePath), projectPath);
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
return removedFiles;
|
|
500
|
-
}
|
|
501
|
-
async removeEmptyDirs(dirPath, projectPath) {
|
|
502
|
-
// Don't remove the project directory itself
|
|
503
|
-
if (dirPath === projectPath || dirPath === path.dirname(projectPath)) {
|
|
504
|
-
return;
|
|
505
|
-
}
|
|
506
|
-
try {
|
|
507
|
-
const files = await fs.readdir(dirPath);
|
|
508
|
-
if (files.length === 0) {
|
|
509
|
-
await fs.rmdir(dirPath);
|
|
510
|
-
// Recursively check parent
|
|
511
|
-
await this.removeEmptyDirs(path.dirname(dirPath), projectPath);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
catch {
|
|
515
|
-
// Directory doesn't exist or can't be removed, ignore
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
async detectInstalledPrompts(prompterPath) {
|
|
519
|
-
const installedPrompts = [];
|
|
520
|
-
const corePath = path.join(prompterPath, 'core');
|
|
521
|
-
for (const prompt of AVAILABLE_PROMPTS) {
|
|
522
|
-
const promptFilePath = path.join(corePath, prompt.sourceFile);
|
|
523
|
-
if (await this.fileExists(promptFilePath)) {
|
|
524
|
-
installedPrompts.push(prompt.value);
|
|
525
|
-
}
|
|
526
|
-
}
|
|
527
|
-
return installedPrompts;
|
|
528
|
-
}
|
|
529
|
-
async installPrompts(projectPath, prompterPath, selectedPrompts) {
|
|
530
|
-
const installedPrompts = [];
|
|
531
|
-
const corePath = path.join(prompterPath, 'core');
|
|
532
|
-
// Ensure core directory exists
|
|
533
|
-
await fs.mkdir(corePath, { recursive: true });
|
|
534
|
-
for (const promptId of selectedPrompts) {
|
|
535
|
-
const prompt = AVAILABLE_PROMPTS.find(p => p.value === promptId);
|
|
536
|
-
if (!prompt)
|
|
537
|
-
continue;
|
|
538
|
-
const destPath = path.join(corePath, prompt.sourceFile);
|
|
539
|
-
try {
|
|
540
|
-
// Get template content from embedded templates
|
|
541
|
-
const content = PROMPT_TEMPLATES[promptId];
|
|
542
|
-
if (!content) {
|
|
543
|
-
console.log(chalk.yellow(` Warning: Template not found for ${prompt.name}`));
|
|
544
|
-
continue;
|
|
545
|
-
}
|
|
546
|
-
// Write the prompt file from embedded template (overwrites if exists)
|
|
547
|
-
await fs.writeFile(destPath, content, 'utf-8');
|
|
548
|
-
installedPrompts.push(prompt.name);
|
|
549
|
-
}
|
|
550
|
-
catch (error) {
|
|
551
|
-
console.log(chalk.red(` Error installing ${prompt.name}: ${error}`));
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
return installedPrompts;
|
|
555
|
-
}
|
|
556
|
-
async removePrompts(prompterPath, promptsToRemove) {
|
|
557
|
-
const removedPrompts = [];
|
|
558
|
-
const corePath = path.join(prompterPath, 'core');
|
|
559
|
-
for (const promptId of promptsToRemove) {
|
|
560
|
-
const prompt = AVAILABLE_PROMPTS.find(p => p.value === promptId);
|
|
561
|
-
if (!prompt)
|
|
562
|
-
continue;
|
|
563
|
-
const filePath = path.join(corePath, prompt.sourceFile);
|
|
564
|
-
try {
|
|
565
|
-
if (await this.fileExists(filePath)) {
|
|
566
|
-
await fs.unlink(filePath);
|
|
567
|
-
removedPrompts.push(prompt.name);
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
catch (error) {
|
|
571
|
-
console.log(chalk.red(` Error removing ${prompt.name}: ${error}`));
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
return removedPrompts;
|
|
575
|
-
}
|
|
576
|
-
async removeWorkflowFilesForPrompts(projectPath, toolIds, promptIds) {
|
|
577
|
-
const slashCommandIds = promptIds;
|
|
578
|
-
for (const toolId of toolIds) {
|
|
579
|
-
const configurator = registry.get(toolId);
|
|
580
|
-
if (!configurator)
|
|
581
|
-
continue;
|
|
582
|
-
// Get targets for the prompts to remove
|
|
583
|
-
const targets = configurator.getTargets(slashCommandIds);
|
|
584
|
-
for (const target of targets) {
|
|
585
|
-
const filePath = path.join(projectPath, target.path);
|
|
586
|
-
try {
|
|
587
|
-
if (await this.fileExists(filePath)) {
|
|
588
|
-
await fs.unlink(filePath);
|
|
589
|
-
console.log(chalk.yellow('✓') + ` Removed ${chalk.cyan(target.path)}`);
|
|
590
|
-
// Remove empty parent directories
|
|
591
|
-
await this.removeEmptyDirs(path.dirname(filePath), projectPath);
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
catch (error) {
|
|
595
|
-
// Silently ignore errors for workflow file removal
|
|
596
|
-
}
|
|
597
|
-
}
|
|
598
|
-
}
|
|
335
|
+
await configurator.removeAllDeployedSkills(projectPath);
|
|
336
|
+
return [configurator.getSkillsRootDir() + '/'];
|
|
599
337
|
}
|
|
600
338
|
async ensureRootClaudeFile(projectPath) {
|
|
601
339
|
const rootClaudePath = path.join(projectPath, 'CLAUDE.md');
|