@crewpilot/agent 2.0.0 → 3.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/README.md +131 -131
- package/dist-npm/cli.js +5 -5
- package/dist-npm/index.js +100 -100
- package/package.json +69 -69
- package/prompts/agent.md +282 -282
- package/prompts/copilot-instructions.md +36 -36
- package/prompts/{catalyst.config.json → crewpilot.config.json} +72 -72
- package/prompts/skills/assure-code-quality/SKILL.md +112 -112
- package/prompts/skills/assure-pr-intelligence/SKILL.md +148 -148
- package/prompts/skills/assure-review-functional/SKILL.md +114 -114
- package/prompts/skills/assure-review-standards/SKILL.md +106 -106
- package/prompts/skills/assure-threat-model/SKILL.md +182 -182
- package/prompts/skills/assure-vulnerability-scan/SKILL.md +146 -146
- package/prompts/skills/autopilot-meeting/SKILL.md +434 -434
- package/prompts/skills/autopilot-worker/SKILL.md +737 -737
- package/prompts/skills/daily-digest/SKILL.md +188 -188
- package/prompts/skills/deliver-change-management/SKILL.md +132 -132
- package/prompts/skills/deliver-deploy-guard/SKILL.md +144 -144
- package/prompts/skills/deliver-doc-governance/SKILL.md +130 -130
- package/prompts/skills/engineer-feature-builder/SKILL.md +270 -270
- package/prompts/skills/engineer-root-cause-analysis/SKILL.md +150 -150
- package/prompts/skills/engineer-test-first/SKILL.md +148 -148
- package/prompts/skills/insights-knowledge-base/SKILL.md +202 -202
- package/prompts/skills/insights-pattern-detection/SKILL.md +142 -142
- package/prompts/skills/strategize-architecture-planner/SKILL.md +141 -141
- package/prompts/skills/strategize-solution-design/SKILL.md +118 -118
- package/scripts/postinstall.js +108 -108
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
# Solution Design
|
|
2
|
-
|
|
3
|
-
> **Pillar**: Strategize | **ID**: `strategize-solution-design`
|
|
4
|
-
|
|
5
|
-
## Purpose
|
|
6
|
-
|
|
7
|
-
Structured ideation and trade-off analysis for technical decisions. Transforms vague questions into evaluated options with clear recommendations.
|
|
8
|
-
|
|
9
|
-
## Activation Triggers
|
|
10
|
-
|
|
11
|
-
- "brainstorm", "explore options", "what are the approaches", "tradeoffs", "should I use X or Y"
|
|
12
|
-
- Any open-ended technical question with multiple viable paths
|
|
13
|
-
|
|
14
|
-
## Methodology
|
|
15
|
-
|
|
16
|
-
### Process Flow
|
|
17
|
-
|
|
18
|
-
```dot
|
|
19
|
-
digraph solution_design {
|
|
20
|
-
rankdir=TB;
|
|
21
|
-
node [shape=box];
|
|
22
|
-
|
|
23
|
-
frame [label="Phase 1\nProblem Framing"];
|
|
24
|
-
options [label="Phase 2\nOption Generation\n(3-4 approaches)"];
|
|
25
|
-
matrix [label="Phase 3\nTrade-off Matrix"];
|
|
26
|
-
recommend [label="Phase 4\nRecommendation", shape=diamond, style=filled, fillcolor="#ffcccc"];
|
|
27
|
-
arch [label="architecture-planner", shape=doublecircle];
|
|
28
|
-
build [label="feature-builder", shape=doublecircle];
|
|
29
|
-
|
|
30
|
-
frame -> options;
|
|
31
|
-
options -> matrix;
|
|
32
|
-
matrix -> recommend;
|
|
33
|
-
recommend -> arch [label="needs detailed design"];
|
|
34
|
-
recommend -> build [label="ready to implement"];
|
|
35
|
-
recommend -> options [label="user rejects\nall options"];
|
|
36
|
-
}
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Phase 1 — Problem Framing
|
|
40
|
-
1. Restate the problem in one sentence
|
|
41
|
-
2. Identify constraints: time, team size, existing tech stack, scale requirements
|
|
42
|
-
3. Ask 1-2 clarifying questions ONLY if the problem is genuinely ambiguous
|
|
43
|
-
|
|
44
|
-
### Phase 2 — Option Generation
|
|
45
|
-
1. Generate 3-4 distinct approaches (configurable via `max_options` in config)
|
|
46
|
-
2. Each option must include:
|
|
47
|
-
- **Name**: Short memorable label
|
|
48
|
-
- **Approach**: 2-3 sentence description
|
|
49
|
-
- **Strengths**: What it does well
|
|
50
|
-
- **Risks**: What could go wrong
|
|
51
|
-
- **Effort**: T-shirt size (S/M/L/XL) with justification
|
|
52
|
-
3. Options must be genuinely different — not variations of the same approach
|
|
53
|
-
|
|
54
|
-
### Phase 3 — Trade-off Matrix
|
|
55
|
-
Build a comparison table:
|
|
56
|
-
|
|
57
|
-
| Criterion | Option A | Option B | Option C |
|
|
58
|
-
|---|---|---|---|
|
|
59
|
-
| Implementation effort | | | |
|
|
60
|
-
| Maintainability | | | |
|
|
61
|
-
| Performance | | | |
|
|
62
|
-
| Team familiarity | | | |
|
|
63
|
-
|
|
64
|
-
Rate each cell: `++` (strong), `+` (good), `~` (neutral), `-` (weak), `--` (poor)
|
|
65
|
-
|
|
66
|
-
### Phase 4 — Recommendation
|
|
67
|
-
|
|
68
|
-
<HARD-GATE>
|
|
69
|
-
Do NOT proceed to implementation or architecture planning until the user has reviewed the trade-off matrix and confirmed the recommended option.
|
|
70
|
-
Present the recommendation and wait for explicit approval or selection.
|
|
71
|
-
</HARD-GATE>
|
|
72
|
-
|
|
73
|
-
1. State the recommended option clearly
|
|
74
|
-
2. Provide confidence level (1-10) with reasoning
|
|
75
|
-
3. Identify the "decision reversal cost" — how hard is it to switch later
|
|
76
|
-
4. List 1-2 things to validate before committing
|
|
77
|
-
|
|
78
|
-
## Tools Required
|
|
79
|
-
|
|
80
|
-
- `codebase` — Scan existing stack for constraints
|
|
81
|
-
- `fetch` — Pull external docs/benchmarks when comparing technologies
|
|
82
|
-
- `
|
|
83
|
-
|
|
84
|
-
## Output Format
|
|
85
|
-
|
|
86
|
-
```
|
|
87
|
-
## [
|
|
88
|
-
|
|
89
|
-
### Problem
|
|
90
|
-
{one-sentence problem statement}
|
|
91
|
-
|
|
92
|
-
### Options
|
|
93
|
-
1. **{Name}** — {approach}
|
|
94
|
-
- Strengths: ...
|
|
95
|
-
- Risks: ...
|
|
96
|
-
- Effort: {T-shirt}
|
|
97
|
-
|
|
98
|
-
### Trade-off Matrix
|
|
99
|
-
{table}
|
|
100
|
-
|
|
101
|
-
### Recommendation
|
|
102
|
-
**{Option Name}** (Confidence: {N}/10)
|
|
103
|
-
{reasoning}
|
|
104
|
-
|
|
105
|
-
**Reversal cost**: {Low/Medium/High}
|
|
106
|
-
**Validate first**: {list}
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Chains To
|
|
110
|
-
|
|
111
|
-
- `architecture-planner` — When the recommended option needs detailed design
|
|
112
|
-
- `feature-builder` — When the user wants to start implementing immediately
|
|
113
|
-
|
|
114
|
-
## Anti-Patterns
|
|
115
|
-
|
|
116
|
-
- Do NOT generate options just to fill a quota — 2 genuine options beat 4 padded ones
|
|
117
|
-
- Do NOT recommend without stating confidence and reversal cost
|
|
118
|
-
- Do NOT skip the trade-off matrix — it's the core value of this skill
|
|
1
|
+
# Solution Design
|
|
2
|
+
|
|
3
|
+
> **Pillar**: Strategize | **ID**: `strategize-solution-design`
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Structured ideation and trade-off analysis for technical decisions. Transforms vague questions into evaluated options with clear recommendations.
|
|
8
|
+
|
|
9
|
+
## Activation Triggers
|
|
10
|
+
|
|
11
|
+
- "brainstorm", "explore options", "what are the approaches", "tradeoffs", "should I use X or Y"
|
|
12
|
+
- Any open-ended technical question with multiple viable paths
|
|
13
|
+
|
|
14
|
+
## Methodology
|
|
15
|
+
|
|
16
|
+
### Process Flow
|
|
17
|
+
|
|
18
|
+
```dot
|
|
19
|
+
digraph solution_design {
|
|
20
|
+
rankdir=TB;
|
|
21
|
+
node [shape=box];
|
|
22
|
+
|
|
23
|
+
frame [label="Phase 1\nProblem Framing"];
|
|
24
|
+
options [label="Phase 2\nOption Generation\n(3-4 approaches)"];
|
|
25
|
+
matrix [label="Phase 3\nTrade-off Matrix"];
|
|
26
|
+
recommend [label="Phase 4\nRecommendation", shape=diamond, style=filled, fillcolor="#ffcccc"];
|
|
27
|
+
arch [label="architecture-planner", shape=doublecircle];
|
|
28
|
+
build [label="feature-builder", shape=doublecircle];
|
|
29
|
+
|
|
30
|
+
frame -> options;
|
|
31
|
+
options -> matrix;
|
|
32
|
+
matrix -> recommend;
|
|
33
|
+
recommend -> arch [label="needs detailed design"];
|
|
34
|
+
recommend -> build [label="ready to implement"];
|
|
35
|
+
recommend -> options [label="user rejects\nall options"];
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Phase 1 — Problem Framing
|
|
40
|
+
1. Restate the problem in one sentence
|
|
41
|
+
2. Identify constraints: time, team size, existing tech stack, scale requirements
|
|
42
|
+
3. Ask 1-2 clarifying questions ONLY if the problem is genuinely ambiguous
|
|
43
|
+
|
|
44
|
+
### Phase 2 — Option Generation
|
|
45
|
+
1. Generate 3-4 distinct approaches (configurable via `max_options` in config)
|
|
46
|
+
2. Each option must include:
|
|
47
|
+
- **Name**: Short memorable label
|
|
48
|
+
- **Approach**: 2-3 sentence description
|
|
49
|
+
- **Strengths**: What it does well
|
|
50
|
+
- **Risks**: What could go wrong
|
|
51
|
+
- **Effort**: T-shirt size (S/M/L/XL) with justification
|
|
52
|
+
3. Options must be genuinely different — not variations of the same approach
|
|
53
|
+
|
|
54
|
+
### Phase 3 — Trade-off Matrix
|
|
55
|
+
Build a comparison table:
|
|
56
|
+
|
|
57
|
+
| Criterion | Option A | Option B | Option C |
|
|
58
|
+
|---|---|---|---|
|
|
59
|
+
| Implementation effort | | | |
|
|
60
|
+
| Maintainability | | | |
|
|
61
|
+
| Performance | | | |
|
|
62
|
+
| Team familiarity | | | |
|
|
63
|
+
|
|
64
|
+
Rate each cell: `++` (strong), `+` (good), `~` (neutral), `-` (weak), `--` (poor)
|
|
65
|
+
|
|
66
|
+
### Phase 4 — Recommendation
|
|
67
|
+
|
|
68
|
+
<HARD-GATE>
|
|
69
|
+
Do NOT proceed to implementation or architecture planning until the user has reviewed the trade-off matrix and confirmed the recommended option.
|
|
70
|
+
Present the recommendation and wait for explicit approval or selection.
|
|
71
|
+
</HARD-GATE>
|
|
72
|
+
|
|
73
|
+
1. State the recommended option clearly
|
|
74
|
+
2. Provide confidence level (1-10) with reasoning
|
|
75
|
+
3. Identify the "decision reversal cost" — how hard is it to switch later
|
|
76
|
+
4. List 1-2 things to validate before committing
|
|
77
|
+
|
|
78
|
+
## Tools Required
|
|
79
|
+
|
|
80
|
+
- `codebase` — Scan existing stack for constraints
|
|
81
|
+
- `fetch` — Pull external docs/benchmarks when comparing technologies
|
|
82
|
+
- `crewpilot_knowledge_search` — Check if similar decisions were made before
|
|
83
|
+
|
|
84
|
+
## Output Format
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
## [CrewPilot → Solution Design]
|
|
88
|
+
|
|
89
|
+
### Problem
|
|
90
|
+
{one-sentence problem statement}
|
|
91
|
+
|
|
92
|
+
### Options
|
|
93
|
+
1. **{Name}** — {approach}
|
|
94
|
+
- Strengths: ...
|
|
95
|
+
- Risks: ...
|
|
96
|
+
- Effort: {T-shirt}
|
|
97
|
+
|
|
98
|
+
### Trade-off Matrix
|
|
99
|
+
{table}
|
|
100
|
+
|
|
101
|
+
### Recommendation
|
|
102
|
+
**{Option Name}** (Confidence: {N}/10)
|
|
103
|
+
{reasoning}
|
|
104
|
+
|
|
105
|
+
**Reversal cost**: {Low/Medium/High}
|
|
106
|
+
**Validate first**: {list}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Chains To
|
|
110
|
+
|
|
111
|
+
- `architecture-planner` — When the recommended option needs detailed design
|
|
112
|
+
- `feature-builder` — When the user wants to start implementing immediately
|
|
113
|
+
|
|
114
|
+
## Anti-Patterns
|
|
115
|
+
|
|
116
|
+
- Do NOT generate options just to fill a quota — 2 genuine options beat 4 padded ones
|
|
117
|
+
- Do NOT recommend without stating confidence and reversal cost
|
|
118
|
+
- Do NOT skip the trade-off matrix — it's the core value of this skill
|
package/scripts/postinstall.js
CHANGED
|
@@ -1,108 +1,108 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* postinstall.js — Runs after `npm install @crewpilot/agent`
|
|
3
|
-
*
|
|
4
|
-
* Creates .github/ files in the user's project so @
|
|
5
|
-
* appears in Copilot Chat dropdown automatically.
|
|
6
|
-
*
|
|
7
|
-
* Uses INIT_CWD (set by npm to the directory where `npm install` was run).
|
|
8
|
-
* Silently exits on global installs or npx (no project root).
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import fs from 'fs';
|
|
12
|
-
import path from 'path';
|
|
13
|
-
import { fileURLToPath } from 'url';
|
|
14
|
-
|
|
15
|
-
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
|
|
17
|
-
// INIT_CWD is the directory where the user ran `npm install`
|
|
18
|
-
const projectRoot = process.env.INIT_CWD;
|
|
19
|
-
|
|
20
|
-
// Skip if no project root (global install, npx, CI, etc.)
|
|
21
|
-
if (!projectRoot) {
|
|
22
|
-
process.exit(0);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
// Skip if installing as a dependency of this package itself (dev scenario)
|
|
26
|
-
const ownPackageDir = path.join(__dirname, '..');
|
|
27
|
-
if (path.resolve(projectRoot) === path.resolve(ownPackageDir)) {
|
|
28
|
-
process.exit(0);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Skip if no package.json in project root (not a real project)
|
|
32
|
-
if (!fs.existsSync(path.join(projectRoot, 'package.json'))) {
|
|
33
|
-
process.exit(0);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const githubDir = path.join(projectRoot, '.github');
|
|
37
|
-
const promptsDir = path.join(__dirname, '..', 'prompts');
|
|
38
|
-
|
|
39
|
-
// If prompts aren't bundled, silently exit
|
|
40
|
-
if (!fs.existsSync(promptsDir)) {
|
|
41
|
-
process.exit(0);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
let created = 0;
|
|
45
|
-
let skipped = 0;
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Copy a file from prompts/ to .github/ — never overwrites existing files
|
|
49
|
-
*/
|
|
50
|
-
function syncFile(srcName, destRelative) {
|
|
51
|
-
const src = path.join(promptsDir, srcName);
|
|
52
|
-
const dest = path.join(githubDir, destRelative);
|
|
53
|
-
|
|
54
|
-
if (!fs.existsSync(src)) return;
|
|
55
|
-
|
|
56
|
-
if (fs.existsSync(dest)) {
|
|
57
|
-
skipped++;
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
62
|
-
fs.copyFileSync(src, dest);
|
|
63
|
-
created++;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Copy all skills from prompts/skills/ to .github/skills/
|
|
68
|
-
*/
|
|
69
|
-
function syncSkills() {
|
|
70
|
-
const skillsDir = path.join(promptsDir, 'skills');
|
|
71
|
-
if (!fs.existsSync(skillsDir)) return;
|
|
72
|
-
|
|
73
|
-
const skillDirs = fs.readdirSync(skillsDir).filter(d =>
|
|
74
|
-
fs.statSync(path.join(skillsDir, d)).isDirectory()
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
for (const name of skillDirs) {
|
|
78
|
-
const src = path.join(skillsDir, name, 'SKILL.md');
|
|
79
|
-
if (!fs.existsSync(src)) continue;
|
|
80
|
-
|
|
81
|
-
const dest = path.join(githubDir, 'skills', name, 'SKILL.md');
|
|
82
|
-
if (fs.existsSync(dest)) {
|
|
83
|
-
skipped++;
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
88
|
-
fs.copyFileSync(src, dest);
|
|
89
|
-
created++;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// --- Run ---
|
|
94
|
-
try {
|
|
95
|
-
fs.mkdirSync(githubDir, { recursive: true });
|
|
96
|
-
|
|
97
|
-
syncFile('agent.md', path.join('agents', '
|
|
98
|
-
syncFile('copilot-instructions.md', 'copilot-instructions.md');
|
|
99
|
-
syncFile('
|
|
100
|
-
syncSkills();
|
|
101
|
-
|
|
102
|
-
if (created > 0) {
|
|
103
|
-
console.log(`\n ⚡ CrewPilot: Created ${created} file(s) in .github/ (${skipped} already existed)`);
|
|
104
|
-
console.log(' ⚡ Open Copilot Chat and select @
|
|
105
|
-
}
|
|
106
|
-
} catch {
|
|
107
|
-
// Silently fail — postinstall should never break npm install
|
|
108
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* postinstall.js — Runs after `npm install @crewpilot/agent`
|
|
3
|
+
*
|
|
4
|
+
* Creates .github/ files in the user's project so @CrewPilot agent
|
|
5
|
+
* appears in Copilot Chat dropdown automatically.
|
|
6
|
+
*
|
|
7
|
+
* Uses INIT_CWD (set by npm to the directory where `npm install` was run).
|
|
8
|
+
* Silently exits on global installs or npx (no project root).
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import fs from 'fs';
|
|
12
|
+
import path from 'path';
|
|
13
|
+
import { fileURLToPath } from 'url';
|
|
14
|
+
|
|
15
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
|
|
17
|
+
// INIT_CWD is the directory where the user ran `npm install`
|
|
18
|
+
const projectRoot = process.env.INIT_CWD;
|
|
19
|
+
|
|
20
|
+
// Skip if no project root (global install, npx, CI, etc.)
|
|
21
|
+
if (!projectRoot) {
|
|
22
|
+
process.exit(0);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Skip if installing as a dependency of this package itself (dev scenario)
|
|
26
|
+
const ownPackageDir = path.join(__dirname, '..');
|
|
27
|
+
if (path.resolve(projectRoot) === path.resolve(ownPackageDir)) {
|
|
28
|
+
process.exit(0);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Skip if no package.json in project root (not a real project)
|
|
32
|
+
if (!fs.existsSync(path.join(projectRoot, 'package.json'))) {
|
|
33
|
+
process.exit(0);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const githubDir = path.join(projectRoot, '.github');
|
|
37
|
+
const promptsDir = path.join(__dirname, '..', 'prompts');
|
|
38
|
+
|
|
39
|
+
// If prompts aren't bundled, silently exit
|
|
40
|
+
if (!fs.existsSync(promptsDir)) {
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
let created = 0;
|
|
45
|
+
let skipped = 0;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Copy a file from prompts/ to .github/ — never overwrites existing files
|
|
49
|
+
*/
|
|
50
|
+
function syncFile(srcName, destRelative) {
|
|
51
|
+
const src = path.join(promptsDir, srcName);
|
|
52
|
+
const dest = path.join(githubDir, destRelative);
|
|
53
|
+
|
|
54
|
+
if (!fs.existsSync(src)) return;
|
|
55
|
+
|
|
56
|
+
if (fs.existsSync(dest)) {
|
|
57
|
+
skipped++;
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
62
|
+
fs.copyFileSync(src, dest);
|
|
63
|
+
created++;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Copy all skills from prompts/skills/ to .github/skills/
|
|
68
|
+
*/
|
|
69
|
+
function syncSkills() {
|
|
70
|
+
const skillsDir = path.join(promptsDir, 'skills');
|
|
71
|
+
if (!fs.existsSync(skillsDir)) return;
|
|
72
|
+
|
|
73
|
+
const skillDirs = fs.readdirSync(skillsDir).filter(d =>
|
|
74
|
+
fs.statSync(path.join(skillsDir, d)).isDirectory()
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
for (const name of skillDirs) {
|
|
78
|
+
const src = path.join(skillsDir, name, 'SKILL.md');
|
|
79
|
+
if (!fs.existsSync(src)) continue;
|
|
80
|
+
|
|
81
|
+
const dest = path.join(githubDir, 'skills', name, 'SKILL.md');
|
|
82
|
+
if (fs.existsSync(dest)) {
|
|
83
|
+
skipped++;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
fs.mkdirSync(path.dirname(dest), { recursive: true });
|
|
88
|
+
fs.copyFileSync(src, dest);
|
|
89
|
+
created++;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// --- Run ---
|
|
94
|
+
try {
|
|
95
|
+
fs.mkdirSync(githubDir, { recursive: true });
|
|
96
|
+
|
|
97
|
+
syncFile('agent.md', path.join('agents', 'crewpilot.md'));
|
|
98
|
+
syncFile('copilot-instructions.md', 'copilot-instructions.md');
|
|
99
|
+
syncFile('crewpilot.config.json', 'crewpilot.config.json');
|
|
100
|
+
syncSkills();
|
|
101
|
+
|
|
102
|
+
if (created > 0) {
|
|
103
|
+
console.log(`\n ⚡ CrewPilot: Created ${created} file(s) in .github/ (${skipped} already existed)`);
|
|
104
|
+
console.log(' ⚡ Open Copilot Chat and select @CrewPilot from the agent dropdown\n');
|
|
105
|
+
}
|
|
106
|
+
} catch {
|
|
107
|
+
// Silently fail — postinstall should never break npm install
|
|
108
|
+
}
|