plan-flow-skill 1.0.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/.claude/commands/create-contract.md +468 -0
- package/.claude/commands/create-plan.md +512 -0
- package/.claude/commands/discovery-plan.md +561 -0
- package/.claude/commands/execute-plan.md +682 -0
- package/.claude/commands/review-code.md +459 -0
- package/.claude/commands/review-pr.md +651 -0
- package/.claude/commands/setup.md +1609 -0
- package/.claude/commands/write-tests.md +543 -0
- package/.claude/rules/core/allowed-patterns.md +175 -0
- package/.claude/rules/core/complexity-scoring.md +225 -0
- package/.claude/rules/core/forbidden-patterns.md +253 -0
- package/.claude/rules/languages/python-patterns.md +6 -0
- package/.claude/rules/languages/typescript-patterns.md +7 -0
- package/.claude/rules/patterns/contract-patterns.md +332 -0
- package/.claude/rules/patterns/discovery-patterns.md +342 -0
- package/.claude/rules/patterns/discovery-templates.md +319 -0
- package/.claude/rules/patterns/jest-patterns.md +482 -0
- package/.claude/rules/patterns/plans-patterns.md +225 -0
- package/.claude/rules/patterns/plans-templates.md +227 -0
- package/.claude/rules/patterns/pytest-patterns.md +457 -0
- package/.claude/rules/patterns/review-code-templates.md +305 -0
- package/.claude/rules/patterns/review-pr-patterns.md +360 -0
- package/.claude/rules/tools/auth-pr-tool.md +30 -0
- package/.claude/rules/tools/interactive-questions-tool.md +235 -0
- package/.claude/rules/tools/jest-testing-tool.md +73 -0
- package/.claude/rules/tools/plan-mode-tool.md +164 -0
- package/.claude/rules/tools/pytest-testing-tool.md +121 -0
- package/.claude/rules/tools/reference-expansion-tool.md +326 -0
- package/LICENSE +21 -0
- package/README.md +167 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +139 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/handlers/claude.d.ts +9 -0
- package/dist/cli/handlers/claude.d.ts.map +1 -0
- package/dist/cli/handlers/claude.js +119 -0
- package/dist/cli/handlers/claude.js.map +1 -0
- package/dist/cli/handlers/codex.d.ts +9 -0
- package/dist/cli/handlers/codex.d.ts.map +1 -0
- package/dist/cli/handlers/codex.js +100 -0
- package/dist/cli/handlers/codex.js.map +1 -0
- package/dist/cli/handlers/cursor.d.ts +8 -0
- package/dist/cli/handlers/cursor.d.ts.map +1 -0
- package/dist/cli/handlers/cursor.js +34 -0
- package/dist/cli/handlers/cursor.js.map +1 -0
- package/dist/cli/handlers/openclaw.d.ts +8 -0
- package/dist/cli/handlers/openclaw.d.ts.map +1 -0
- package/dist/cli/handlers/openclaw.js +34 -0
- package/dist/cli/handlers/openclaw.js.map +1 -0
- package/dist/cli/handlers/shared.d.ts +9 -0
- package/dist/cli/handlers/shared.d.ts.map +1 -0
- package/dist/cli/handlers/shared.js +44 -0
- package/dist/cli/handlers/shared.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +43 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/types.d.ts +26 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +5 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/utils/files.d.ts +37 -0
- package/dist/cli/utils/files.d.ts.map +1 -0
- package/dist/cli/utils/files.js +122 -0
- package/dist/cli/utils/files.js.map +1 -0
- package/dist/cli/utils/logger.d.ts +11 -0
- package/dist/cli/utils/logger.d.ts.map +1 -0
- package/dist/cli/utils/logger.js +34 -0
- package/dist/cli/utils/logger.js.map +1 -0
- package/dist/cli/utils/prompts.d.ts +10 -0
- package/dist/cli/utils/prompts.d.ts.map +1 -0
- package/dist/cli/utils/prompts.js +65 -0
- package/dist/cli/utils/prompts.js.map +1 -0
- package/dist/test/setup.d.ts +5 -0
- package/dist/test/setup.d.ts.map +1 -0
- package/dist/test/setup.js +7 -0
- package/dist/test/setup.js.map +1 -0
- package/package.json +63 -0
- package/rules/core/_index.mdc +89 -0
- package/rules/core/allowed-patterns.mdc +185 -0
- package/rules/core/complexity-scoring.mdc +235 -0
- package/rules/core/forbidden-patterns.mdc +263 -0
- package/rules/languages/_index.mdc +80 -0
- package/rules/languages/python-patterns.mdc +188 -0
- package/rules/languages/typescript-patterns.mdc +128 -0
- package/rules/patterns/_index.mdc +185 -0
- package/rules/patterns/contract-patterns.mdc +344 -0
- package/rules/patterns/discovery-patterns.mdc +354 -0
- package/rules/patterns/discovery-templates.mdc +329 -0
- package/rules/patterns/jest-patterns.mdc +492 -0
- package/rules/patterns/plans-patterns.mdc +237 -0
- package/rules/patterns/plans-templates.mdc +237 -0
- package/rules/patterns/pytest-patterns.mdc +467 -0
- package/rules/patterns/review-code-templates.mdc +315 -0
- package/rules/patterns/review-pr-patterns.mdc +370 -0
- package/rules/skills/_index.mdc +174 -0
- package/rules/skills/create-contract-skill.mdc +239 -0
- package/rules/skills/create-plan-skill.mdc +271 -0
- package/rules/skills/discovery-skill.mdc +295 -0
- package/rules/skills/execute-plan-skill.mdc +388 -0
- package/rules/skills/review-code-skill.mdc +308 -0
- package/rules/skills/review-pr-skill.mdc +496 -0
- package/rules/skills/setup-skill.mdc +923 -0
- package/rules/skills/write-tests-skill.mdc +294 -0
- package/rules/templates/index-template.mdc +126 -0
- package/rules/tools/_index.mdc +114 -0
- package/rules/tools/auth-pr-tool.mdc +362 -0
- package/rules/tools/interactive-questions-tool.mdc +337 -0
- package/rules/tools/jest-testing-tool.mdc +96 -0
- package/rules/tools/plan-mode-tool.mdc +229 -0
- package/rules/tools/pytest-testing-tool.mdc +144 -0
- package/rules/tools/reference-expansion-tool.mdc +338 -0
- package/skills/plan-flow/SKILL.md +109 -0
- package/skills/plan-flow/create-contract/SKILL.md +139 -0
- package/skills/plan-flow/create-plan/SKILL.md +93 -0
- package/skills/plan-flow/discovery/SKILL.md +85 -0
- package/skills/plan-flow/execute-plan/SKILL.md +89 -0
- package/skills/plan-flow/review-code/SKILL.md +100 -0
- package/skills/plan-flow/review-pr/SKILL.md +122 -0
- package/skills/plan-flow/setup/SKILL.md +73 -0
- package/skills/plan-flow/write-tests/SKILL.md +115 -0
- package/templates/shared/AGENTS.md.template +60 -0
- package/templates/shared/CLAUDE.md.template +62 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude Code handler
|
|
3
|
+
*
|
|
4
|
+
* Copies .claude/commands/ and .claude/rules/ to the user's project,
|
|
5
|
+
* and creates/updates CLAUDE.md with plan-flow instructions.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { copyDir, getPackageRoot, ensureDir } from '../utils/files.js';
|
|
10
|
+
import * as log from '../utils/logger.js';
|
|
11
|
+
const MARKER_START = '<!-- plan-flow-start -->';
|
|
12
|
+
const MARKER_END = '<!-- plan-flow-end -->';
|
|
13
|
+
function getPlanFlowSection(packageRoot) {
|
|
14
|
+
const templatePath = join(packageRoot, 'templates', 'shared', 'CLAUDE.md.template');
|
|
15
|
+
if (existsSync(templatePath)) {
|
|
16
|
+
return [
|
|
17
|
+
MARKER_START,
|
|
18
|
+
readFileSync(templatePath, 'utf-8').trim(),
|
|
19
|
+
MARKER_END,
|
|
20
|
+
].join('\n');
|
|
21
|
+
}
|
|
22
|
+
// Fallback minimal section if template is missing
|
|
23
|
+
return [
|
|
24
|
+
MARKER_START,
|
|
25
|
+
'',
|
|
26
|
+
'# Plan-Flow',
|
|
27
|
+
'',
|
|
28
|
+
'Use `/setup` to get started. See plan-flow documentation for available commands.',
|
|
29
|
+
'',
|
|
30
|
+
MARKER_END,
|
|
31
|
+
].join('\n');
|
|
32
|
+
}
|
|
33
|
+
function handleClaudeMd(target, packageRoot, options) {
|
|
34
|
+
const result = { created: [], skipped: [], updated: [] };
|
|
35
|
+
const claudeMdPath = join(target, 'CLAUDE.md');
|
|
36
|
+
const section = getPlanFlowSection(packageRoot);
|
|
37
|
+
if (!existsSync(claudeMdPath)) {
|
|
38
|
+
// No CLAUDE.md exists - create it with the plan-flow section
|
|
39
|
+
writeFileSync(claudeMdPath, section + '\n', 'utf-8');
|
|
40
|
+
result.created.push(claudeMdPath);
|
|
41
|
+
log.success('Created CLAUDE.md');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const existing = readFileSync(claudeMdPath, 'utf-8');
|
|
45
|
+
if (existing.includes(MARKER_START)) {
|
|
46
|
+
if (options.force) {
|
|
47
|
+
// Replace existing plan-flow section
|
|
48
|
+
const updated = existing.replace(new RegExp(`${escapeRegExp(MARKER_START)}[\\s\\S]*?${escapeRegExp(MARKER_END)}`), section);
|
|
49
|
+
writeFileSync(claudeMdPath, updated, 'utf-8');
|
|
50
|
+
result.updated.push(claudeMdPath);
|
|
51
|
+
log.warn('Updated plan-flow section in CLAUDE.md');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
result.skipped.push(claudeMdPath);
|
|
55
|
+
log.skip('CLAUDE.md already has plan-flow section');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Append plan-flow section to existing CLAUDE.md
|
|
60
|
+
const appended = existing.trimEnd() + '\n\n' + section + '\n';
|
|
61
|
+
writeFileSync(claudeMdPath, appended, 'utf-8');
|
|
62
|
+
result.updated.push(claudeMdPath);
|
|
63
|
+
log.success('Appended plan-flow section to CLAUDE.md');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
function escapeRegExp(str) {
|
|
69
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
70
|
+
}
|
|
71
|
+
export async function initClaude(target, options) {
|
|
72
|
+
const result = { created: [], skipped: [], updated: [] };
|
|
73
|
+
const packageRoot = getPackageRoot();
|
|
74
|
+
// 1. Copy .claude/commands/
|
|
75
|
+
const commandsSrc = join(packageRoot, '.claude', 'commands');
|
|
76
|
+
const commandsDest = join(target, '.claude', 'commands');
|
|
77
|
+
if (existsSync(commandsSrc)) {
|
|
78
|
+
ensureDir(commandsDest);
|
|
79
|
+
const cmdResult = copyDir(commandsSrc, commandsDest, options);
|
|
80
|
+
result.created.push(...cmdResult.created);
|
|
81
|
+
result.skipped.push(...cmdResult.skipped);
|
|
82
|
+
result.updated.push(...cmdResult.updated);
|
|
83
|
+
for (const f of cmdResult.created) {
|
|
84
|
+
log.success(`Created ${f.replace(target + '/', '')}`);
|
|
85
|
+
}
|
|
86
|
+
for (const f of cmdResult.skipped) {
|
|
87
|
+
log.skip(`Skipped ${f.replace(target + '/', '')}`);
|
|
88
|
+
}
|
|
89
|
+
for (const f of cmdResult.updated) {
|
|
90
|
+
log.warn(`Updated ${f.replace(target + '/', '')}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 2. Copy .claude/rules/ (preserving subdirectory structure)
|
|
94
|
+
const rulesSrc = join(packageRoot, '.claude', 'rules');
|
|
95
|
+
const rulesDest = join(target, '.claude', 'rules');
|
|
96
|
+
if (existsSync(rulesSrc)) {
|
|
97
|
+
ensureDir(rulesDest);
|
|
98
|
+
const rulesResult = copyDir(rulesSrc, rulesDest, options);
|
|
99
|
+
result.created.push(...rulesResult.created);
|
|
100
|
+
result.skipped.push(...rulesResult.skipped);
|
|
101
|
+
result.updated.push(...rulesResult.updated);
|
|
102
|
+
for (const f of rulesResult.created) {
|
|
103
|
+
log.success(`Created ${f.replace(target + '/', '')}`);
|
|
104
|
+
}
|
|
105
|
+
for (const f of rulesResult.skipped) {
|
|
106
|
+
log.skip(`Skipped ${f.replace(target + '/', '')}`);
|
|
107
|
+
}
|
|
108
|
+
for (const f of rulesResult.updated) {
|
|
109
|
+
log.warn(`Updated ${f.replace(target + '/', '')}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// 3. Handle CLAUDE.md
|
|
113
|
+
const mdResult = handleClaudeMd(target, packageRoot, options);
|
|
114
|
+
result.created.push(...mdResult.created);
|
|
115
|
+
result.skipped.push(...mdResult.skipped);
|
|
116
|
+
result.updated.push(...mdResult.updated);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/cli/handlers/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI handler
|
|
3
|
+
*
|
|
4
|
+
* Copies skills/plan-flow/ to .agents/skills/plan-flow/ in the user's project,
|
|
5
|
+
* and creates/updates AGENTS.md with plan-flow instructions.
|
|
6
|
+
*/
|
|
7
|
+
import type { CopyOptions, CopyResult } from '../types.js';
|
|
8
|
+
export declare function initCodex(target: string, options: CopyOptions): Promise<CopyResult>;
|
|
9
|
+
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/codex.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoF3D,wBAAsB,SAAS,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAiCrB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI handler
|
|
3
|
+
*
|
|
4
|
+
* Copies skills/plan-flow/ to .agents/skills/plan-flow/ in the user's project,
|
|
5
|
+
* and creates/updates AGENTS.md with plan-flow instructions.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { copyDir, getPackageRoot, ensureDir } from '../utils/files.js';
|
|
10
|
+
import * as log from '../utils/logger.js';
|
|
11
|
+
const MARKER_START = '<!-- plan-flow-start -->';
|
|
12
|
+
const MARKER_END = '<!-- plan-flow-end -->';
|
|
13
|
+
function getPlanFlowSection(packageRoot) {
|
|
14
|
+
const templatePath = join(packageRoot, 'templates', 'shared', 'AGENTS.md.template');
|
|
15
|
+
if (existsSync(templatePath)) {
|
|
16
|
+
return [
|
|
17
|
+
MARKER_START,
|
|
18
|
+
readFileSync(templatePath, 'utf-8').trim(),
|
|
19
|
+
MARKER_END,
|
|
20
|
+
].join('\n');
|
|
21
|
+
}
|
|
22
|
+
// Fallback minimal section if template is missing
|
|
23
|
+
return [
|
|
24
|
+
MARKER_START,
|
|
25
|
+
'',
|
|
26
|
+
'# Plan-Flow',
|
|
27
|
+
'',
|
|
28
|
+
'Use `/setup` to get started. See plan-flow documentation for available commands.',
|
|
29
|
+
'',
|
|
30
|
+
MARKER_END,
|
|
31
|
+
].join('\n');
|
|
32
|
+
}
|
|
33
|
+
function handleAgentsMd(target, packageRoot, options) {
|
|
34
|
+
const result = { created: [], skipped: [], updated: [] };
|
|
35
|
+
const agentsMdPath = join(target, 'AGENTS.md');
|
|
36
|
+
const section = getPlanFlowSection(packageRoot);
|
|
37
|
+
if (!existsSync(agentsMdPath)) {
|
|
38
|
+
// No AGENTS.md exists - create it with the plan-flow section
|
|
39
|
+
writeFileSync(agentsMdPath, section + '\n', 'utf-8');
|
|
40
|
+
result.created.push(agentsMdPath);
|
|
41
|
+
log.success('Created AGENTS.md');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
const existing = readFileSync(agentsMdPath, 'utf-8');
|
|
45
|
+
if (existing.includes(MARKER_START)) {
|
|
46
|
+
if (options.force) {
|
|
47
|
+
// Replace existing plan-flow section
|
|
48
|
+
const updated = existing.replace(new RegExp(`${escapeRegExp(MARKER_START)}[\\s\\S]*?${escapeRegExp(MARKER_END)}`), section);
|
|
49
|
+
writeFileSync(agentsMdPath, updated, 'utf-8');
|
|
50
|
+
result.updated.push(agentsMdPath);
|
|
51
|
+
log.warn('Updated plan-flow section in AGENTS.md');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
result.skipped.push(agentsMdPath);
|
|
55
|
+
log.skip('AGENTS.md already has plan-flow section');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// Append plan-flow section to existing AGENTS.md
|
|
60
|
+
const appended = existing.trimEnd() + '\n\n' + section + '\n';
|
|
61
|
+
writeFileSync(agentsMdPath, appended, 'utf-8');
|
|
62
|
+
result.updated.push(agentsMdPath);
|
|
63
|
+
log.success('Appended plan-flow section to AGENTS.md');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
function escapeRegExp(str) {
|
|
69
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
70
|
+
}
|
|
71
|
+
export async function initCodex(target, options) {
|
|
72
|
+
const result = { created: [], skipped: [], updated: [] };
|
|
73
|
+
const packageRoot = getPackageRoot();
|
|
74
|
+
// 1. Copy skills/plan-flow/ → .agents/skills/plan-flow/
|
|
75
|
+
const skillsSrc = join(packageRoot, 'skills', 'plan-flow');
|
|
76
|
+
const skillsDest = join(target, '.agents', 'skills', 'plan-flow');
|
|
77
|
+
if (existsSync(skillsSrc)) {
|
|
78
|
+
ensureDir(skillsDest);
|
|
79
|
+
const copyResult = copyDir(skillsSrc, skillsDest, options);
|
|
80
|
+
result.created.push(...copyResult.created);
|
|
81
|
+
result.skipped.push(...copyResult.skipped);
|
|
82
|
+
result.updated.push(...copyResult.updated);
|
|
83
|
+
for (const f of copyResult.created) {
|
|
84
|
+
log.success(`Created ${f.replace(target + '/', '')}`);
|
|
85
|
+
}
|
|
86
|
+
for (const f of copyResult.skipped) {
|
|
87
|
+
log.skip(`Skipped ${f.replace(target + '/', '')}`);
|
|
88
|
+
}
|
|
89
|
+
for (const f of copyResult.updated) {
|
|
90
|
+
log.warn(`Updated ${f.replace(target + '/', '')}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// 2. Handle AGENTS.md
|
|
94
|
+
const mdResult = handleAgentsMd(target, packageRoot, options);
|
|
95
|
+
result.created.push(...mdResult.created);
|
|
96
|
+
result.skipped.push(...mdResult.skipped);
|
|
97
|
+
result.updated.push(...mdResult.updated);
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli/handlers/codex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor handler
|
|
3
|
+
*
|
|
4
|
+
* Copies rules/*.mdc files to the user's project.
|
|
5
|
+
*/
|
|
6
|
+
import type { CopyOptions, CopyResult } from '../types.js';
|
|
7
|
+
export declare function initCursor(target: string, options: CopyOptions): Promise<CopyResult>;
|
|
8
|
+
//# sourceMappingURL=cursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/cursor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI3D,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA2BrB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cursor handler
|
|
3
|
+
*
|
|
4
|
+
* Copies rules/*.mdc files to the user's project.
|
|
5
|
+
*/
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { copyDir, getPackageRoot, ensureDir } from '../utils/files.js';
|
|
9
|
+
import * as log from '../utils/logger.js';
|
|
10
|
+
export async function initCursor(target, options) {
|
|
11
|
+
const result = { created: [], skipped: [], updated: [] };
|
|
12
|
+
const packageRoot = getPackageRoot();
|
|
13
|
+
// Copy rules/**/*.mdc to user's rules/
|
|
14
|
+
const rulesSrc = join(packageRoot, 'rules');
|
|
15
|
+
const rulesDest = join(target, 'rules');
|
|
16
|
+
if (existsSync(rulesSrc)) {
|
|
17
|
+
ensureDir(rulesDest);
|
|
18
|
+
const rulesResult = copyDir(rulesSrc, rulesDest, options);
|
|
19
|
+
result.created.push(...rulesResult.created);
|
|
20
|
+
result.skipped.push(...rulesResult.skipped);
|
|
21
|
+
result.updated.push(...rulesResult.updated);
|
|
22
|
+
for (const f of rulesResult.created) {
|
|
23
|
+
log.success(`Created ${f.replace(target + '/', '')}`);
|
|
24
|
+
}
|
|
25
|
+
for (const f of rulesResult.skipped) {
|
|
26
|
+
log.skip(`Skipped ${f.replace(target + '/', '')}`);
|
|
27
|
+
}
|
|
28
|
+
for (const f of rulesResult.updated) {
|
|
29
|
+
log.warn(`Updated ${f.replace(target + '/', '')}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=cursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/cli/handlers/cursor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,OAAoB;IAEpB,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACrE,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,uCAAuC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,SAAS,CAAC,CAAC;QACrB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QAE5C,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACpC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACpC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw handler
|
|
3
|
+
*
|
|
4
|
+
* Copies skills/plan-flow/ to the user's project.
|
|
5
|
+
*/
|
|
6
|
+
import type { CopyOptions, CopyResult } from '../types.js';
|
|
7
|
+
export declare function initOpenClaw(target: string, options: CopyOptions): Promise<CopyResult>;
|
|
8
|
+
//# sourceMappingURL=openclaw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/openclaw.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI3D,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CA2BrB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw handler
|
|
3
|
+
*
|
|
4
|
+
* Copies skills/plan-flow/ to the user's project.
|
|
5
|
+
*/
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { existsSync } from 'node:fs';
|
|
8
|
+
import { copyDir, getPackageRoot, ensureDir } from '../utils/files.js';
|
|
9
|
+
import * as log from '../utils/logger.js';
|
|
10
|
+
export async function initOpenClaw(target, options) {
|
|
11
|
+
const result = { created: [], skipped: [], updated: [] };
|
|
12
|
+
const packageRoot = getPackageRoot();
|
|
13
|
+
// Copy skills/plan-flow/ preserving directory structure
|
|
14
|
+
const skillsSrc = join(packageRoot, 'skills', 'plan-flow');
|
|
15
|
+
const skillsDest = join(target, 'skills', 'plan-flow');
|
|
16
|
+
if (existsSync(skillsSrc)) {
|
|
17
|
+
ensureDir(skillsDest);
|
|
18
|
+
const copyResult = copyDir(skillsSrc, skillsDest, options);
|
|
19
|
+
result.created.push(...copyResult.created);
|
|
20
|
+
result.skipped.push(...copyResult.skipped);
|
|
21
|
+
result.updated.push(...copyResult.updated);
|
|
22
|
+
for (const f of copyResult.created) {
|
|
23
|
+
log.success(`Created ${f.replace(target + '/', '')}`);
|
|
24
|
+
}
|
|
25
|
+
for (const f of copyResult.skipped) {
|
|
26
|
+
log.skip(`Skipped ${f.replace(target + '/', '')}`);
|
|
27
|
+
}
|
|
28
|
+
for (const f of copyResult.updated) {
|
|
29
|
+
log.warn(`Updated ${f.replace(target + '/', '')}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=openclaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../../src/cli/handlers/openclaw.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAc,EACd,OAAoB;IAEpB,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACrE,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,wDAAwD;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEvD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,UAAU,CAAC,CAAC;QACtB,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAE3C,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared handler
|
|
3
|
+
*
|
|
4
|
+
* Creates flow/ directory structure.
|
|
5
|
+
* Runs for all platform installations.
|
|
6
|
+
*/
|
|
7
|
+
import type { CopyOptions, CopyResult } from '../types.js';
|
|
8
|
+
export declare function initShared(target: string, _options: CopyOptions): Promise<CopyResult>;
|
|
9
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/cli/handlers/shared.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAc3D,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,UAAU,CAAC,CAyBrB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared handler
|
|
3
|
+
*
|
|
4
|
+
* Creates flow/ directory structure.
|
|
5
|
+
* Runs for all platform installations.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
9
|
+
import { ensureDir } from '../utils/files.js';
|
|
10
|
+
import * as log from '../utils/logger.js';
|
|
11
|
+
const FLOW_SUBDIRS = [
|
|
12
|
+
'archive',
|
|
13
|
+
'contracts',
|
|
14
|
+
'discovery',
|
|
15
|
+
'plans',
|
|
16
|
+
'references',
|
|
17
|
+
'reviewed-code',
|
|
18
|
+
'reviewed-pr',
|
|
19
|
+
];
|
|
20
|
+
export async function initShared(target, _options) {
|
|
21
|
+
const result = { created: [], skipped: [], updated: [] };
|
|
22
|
+
// Create flow/ directory structure with .gitkeep files
|
|
23
|
+
const flowDir = join(target, 'flow');
|
|
24
|
+
for (const subdir of FLOW_SUBDIRS) {
|
|
25
|
+
const dir = join(flowDir, subdir);
|
|
26
|
+
const gitkeep = join(dir, '.gitkeep');
|
|
27
|
+
if (!existsSync(dir)) {
|
|
28
|
+
ensureDir(dir);
|
|
29
|
+
writeFileSync(gitkeep, '', 'utf-8');
|
|
30
|
+
result.created.push(dir);
|
|
31
|
+
log.success(`Created flow/${subdir}/`);
|
|
32
|
+
}
|
|
33
|
+
else if (!existsSync(gitkeep)) {
|
|
34
|
+
writeFileSync(gitkeep, '', 'utf-8');
|
|
35
|
+
result.created.push(gitkeep);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
result.skipped.push(dir);
|
|
39
|
+
log.skip(`flow/${subdir}/ already exists`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/cli/handlers/shared.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEpD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,GAAG,MAAM,oBAAoB,CAAC;AAE1C,MAAM,YAAY,GAAG;IACnB,SAAS;IACT,WAAW;IACX,WAAW;IACX,OAAO;IACP,YAAY;IACZ,eAAe;IACf,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAc,EACd,QAAqB;IAErB,MAAM,MAAM,GAAe,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAErE,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAEtC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,SAAS,CAAC,GAAG,CAAC,CAAC;YACf,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,GAAG,CAAC,OAAO,CAAC,gBAAgB,MAAM,GAAG,CAAC,CAAC;QACzC,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,aAAa,CAAC,OAAO,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzB,GAAG,CAAC,IAAI,CAAC,QAAQ,MAAM,kBAAkB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Plan-Flow CLI
|
|
4
|
+
*
|
|
5
|
+
* Installs plan-flow skills into your project for Claude Code, Cursor, and/or OpenClaw.
|
|
6
|
+
*/
|
|
7
|
+
import { Command } from 'commander';
|
|
8
|
+
import { readFileSync } from 'node:fs';
|
|
9
|
+
import { fileURLToPath } from 'node:url';
|
|
10
|
+
import { dirname, join } from 'node:path';
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
function getVersion() {
|
|
14
|
+
try {
|
|
15
|
+
const pkgPath = join(__dirname, '..', '..', 'package.json');
|
|
16
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
17
|
+
return pkg.version || '1.0.0';
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return '1.0.0';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const program = new Command();
|
|
24
|
+
program
|
|
25
|
+
.name('plan-flow')
|
|
26
|
+
.description('Structured AI-assisted development workflows for discovery, planning, execution, code reviews, and testing.')
|
|
27
|
+
.version(getVersion());
|
|
28
|
+
program
|
|
29
|
+
.command('init', { isDefault: true })
|
|
30
|
+
.description('Install plan-flow into your project for Claude Code, Cursor, OpenClaw, and/or Codex CLI')
|
|
31
|
+
.option('--claude', 'Install for Claude Code (slash commands + rules)')
|
|
32
|
+
.option('--cursor', 'Install for Cursor (rules)')
|
|
33
|
+
.option('--openclaw', 'Install for OpenClaw (skill manifests)')
|
|
34
|
+
.option('--codex', 'Install for Codex CLI (skills + AGENTS.md)')
|
|
35
|
+
.option('--all', 'Install for all platforms')
|
|
36
|
+
.option('--force', 'Overwrite existing files')
|
|
37
|
+
.option('--target <dir>', 'Target directory (defaults to current directory)', process.cwd())
|
|
38
|
+
.action(async (options) => {
|
|
39
|
+
const { runInit } = await import('./commands/init.js');
|
|
40
|
+
await runInit(options);
|
|
41
|
+
});
|
|
42
|
+
program.parse();
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CACV,6GAA6G,CAC9G;KACA,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACpC,WAAW,CACV,yFAAyF,CAC1F;KACA,MAAM,CAAC,UAAU,EAAE,kDAAkD,CAAC;KACtE,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC;KAChD,MAAM,CAAC,YAAY,EAAE,wCAAwC,CAAC;KAC9D,MAAM,CAAC,SAAS,EAAE,4CAA4C,CAAC;KAC/D,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC;KAC5C,MAAM,CAAC,SAAS,EAAE,0BAA0B,CAAC;KAC7C,MAAM,CACL,gBAAgB,EAChB,kDAAkD,EAClD,OAAO,CAAC,GAAG,EAAE,CACd;KACA,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACvD,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the CLI
|
|
3
|
+
*/
|
|
4
|
+
export interface InitOptions {
|
|
5
|
+
claude?: boolean;
|
|
6
|
+
cursor?: boolean;
|
|
7
|
+
openclaw?: boolean;
|
|
8
|
+
codex?: boolean;
|
|
9
|
+
all?: boolean;
|
|
10
|
+
force?: boolean;
|
|
11
|
+
target: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CopyOptions {
|
|
14
|
+
force: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface CopyResult {
|
|
17
|
+
created: string[];
|
|
18
|
+
skipped: string[];
|
|
19
|
+
updated: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface InitResult {
|
|
22
|
+
platform: string;
|
|
23
|
+
result: CopyResult;
|
|
24
|
+
}
|
|
25
|
+
export type Platform = 'claude' | 'cursor' | 'openclaw' | 'codex';
|
|
26
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cli/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File operation utilities for the init command
|
|
3
|
+
*/
|
|
4
|
+
import type { CopyOptions, CopyResult } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the package root directory by finding the nearest package.json
|
|
7
|
+
* with name "plan-flow" starting from a known internal path.
|
|
8
|
+
*
|
|
9
|
+
* Works with:
|
|
10
|
+
* - Local development (src/cli/utils/)
|
|
11
|
+
* - Built output (dist/cli/utils/)
|
|
12
|
+
* - npx / global install (node_modules/plan-flow/dist/cli/utils/)
|
|
13
|
+
* - Jest/CJS (__dirname available)
|
|
14
|
+
*/
|
|
15
|
+
export declare function getPackageRoot(): string;
|
|
16
|
+
/**
|
|
17
|
+
* Recursively copies a directory, preserving structure.
|
|
18
|
+
* Returns a CopyResult with created, skipped, and updated files.
|
|
19
|
+
*/
|
|
20
|
+
export declare function copyDir(src: string, dest: string, options: CopyOptions): CopyResult;
|
|
21
|
+
/**
|
|
22
|
+
* Copies a single file with skip/overwrite logic.
|
|
23
|
+
*/
|
|
24
|
+
export declare function copyFile(src: string, dest: string, options: CopyOptions): CopyResult;
|
|
25
|
+
/**
|
|
26
|
+
* Creates a directory recursively if it doesn't exist.
|
|
27
|
+
*/
|
|
28
|
+
export declare function ensureDir(dir: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Checks if a file or directory exists.
|
|
31
|
+
*/
|
|
32
|
+
export declare function fileExists(filePath: string): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Formats a file path relative to a base for display.
|
|
35
|
+
*/
|
|
36
|
+
export declare function relativePath(filePath: string, base: string): string;
|
|
37
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/files.ts"],"names":[],"mappings":"AAAA;;GAEG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D;;;;;;;;;GASG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAkCvC;AAED;;;GAGG;AACH,wBAAgB,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,GACnB,UAAU,CA8BZ;AAED;;GAEG;AACH,wBAAgB,QAAQ,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,GACnB,UAAU,CAkBZ;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAI3C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE"}
|