palskills 1.0.4 → 1.0.6
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 +9 -7
- package/bin/palskills.js +293 -166
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,17 +48,19 @@ palskills
|
|
|
48
48
|
║ AI Development Pipeline ║
|
|
49
49
|
╚══════════════════════════════════════╝
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
What do you want to do?
|
|
52
52
|
|
|
53
|
-
[1]
|
|
54
|
-
[2]
|
|
55
|
-
[3]
|
|
56
|
-
[4]
|
|
53
|
+
[1] Learn Project → bootstrap .palbox/ (Lyleen)
|
|
54
|
+
[2] Codex CLI → .codex.md
|
|
55
|
+
[3] Cursor → .cursorrules
|
|
56
|
+
[4] Claude Code → CLAUDE.md
|
|
57
|
+
[5] All Agents → generate all configs
|
|
57
58
|
|
|
58
|
-
Choose [1-
|
|
59
|
+
Choose [1-5]:
|
|
59
60
|
```
|
|
60
61
|
|
|
61
|
-
|
|
62
|
+
**Step 1:** Pick `[1]` to analyze the project and create a `.palbox/` knowledge graph.
|
|
63
|
+
**Step 2:** Pick `[2-5]` to generate agent configs with SOLID + SRP + palbox conventions.
|
|
62
64
|
|
|
63
65
|
### One-shot (without installing)
|
|
64
66
|
```bash
|
package/bin/palskills.js
CHANGED
|
@@ -29,22 +29,30 @@ async function main() {
|
|
|
29
29
|
box('PALSKILLS\nAI Development Pipeline');
|
|
30
30
|
|
|
31
31
|
console.log('');
|
|
32
|
-
console.log(` ${BOLD}
|
|
32
|
+
console.log(` ${BOLD}What do you want to do?${NC}`);
|
|
33
33
|
console.log('');
|
|
34
|
-
console.log(` ${MAGENTA}[1]${NC}
|
|
35
|
-
console.log(` ${MAGENTA}[2]${NC}
|
|
36
|
-
console.log(` ${MAGENTA}[3]${NC}
|
|
37
|
-
console.log(` ${MAGENTA}[4]${NC}
|
|
34
|
+
console.log(` ${MAGENTA}[1]${NC} Learn Project → bootstrap .palbox/ (Lyleen)`);
|
|
35
|
+
console.log(` ${MAGENTA}[2]${NC} Codex CLI → .codex/skills/`);
|
|
36
|
+
console.log(` ${MAGENTA}[3]${NC} Cursor → .cursor/skills/`);
|
|
37
|
+
console.log(` ${MAGENTA}[4]${NC} Claude Code → .claude/skills/`);
|
|
38
|
+
console.log(` ${MAGENTA}[5]${NC} All Agents → generate all configs`);
|
|
38
39
|
console.log('');
|
|
39
40
|
|
|
40
|
-
const choice = await ask(` Choose [1-
|
|
41
|
+
const choice = await ask(` Choose [1-5]: `);
|
|
41
42
|
console.log('');
|
|
42
43
|
|
|
44
|
+
if (choice === '1') {
|
|
45
|
+
bootstrapPalbox();
|
|
46
|
+
installSkills();
|
|
47
|
+
console.log(`\n ${GREEN}✅ Done!${NC} .palbox/ created. Run again to generate agent configs.\n`);
|
|
48
|
+
process.exit(0);
|
|
49
|
+
}
|
|
50
|
+
|
|
43
51
|
const agents = [];
|
|
44
|
-
if (choice === '
|
|
45
|
-
else if (choice === '
|
|
46
|
-
else if (choice === '
|
|
47
|
-
else if (choice === '
|
|
52
|
+
if (choice === '2') agents.push('codex');
|
|
53
|
+
else if (choice === '3') agents.push('cursor');
|
|
54
|
+
else if (choice === '4') agents.push('claude');
|
|
55
|
+
else if (choice === '5') agents.push('codex', 'cursor', 'claude');
|
|
48
56
|
else { console.log(' Invalid choice. Exiting.'); process.exit(1); }
|
|
49
57
|
|
|
50
58
|
for (const agent of agents) {
|
|
@@ -57,179 +65,298 @@ async function main() {
|
|
|
57
65
|
console.log(`\n ${GREEN}✅ Done!${NC} Restart Hermes Agent to load skills.\n`);
|
|
58
66
|
}
|
|
59
67
|
|
|
60
|
-
function
|
|
68
|
+
function bootstrapPalbox() {
|
|
61
69
|
const cwd = process.cwd();
|
|
70
|
+
const palbox = path.join(cwd, '.palbox');
|
|
62
71
|
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
if (fs.existsSync(palbox)) {
|
|
73
|
+
console.log(` ${YELLOW}⚠${NC} .palbox/ already exists. Skipping bootstrap.\n`);
|
|
74
|
+
console.log(' To re-analyze, delete .palbox/ and run again.\n');
|
|
75
|
+
return;
|
|
67
76
|
}
|
|
68
77
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
78
|
+
console.log(` ${CYAN}🔍 Analyzing project...${NC}\n`);
|
|
79
|
+
|
|
80
|
+
// Detect tech stack
|
|
81
|
+
const files = fs.readdirSync(cwd);
|
|
82
|
+
const hasFile = name => files.includes(name);
|
|
83
|
+
let language = 'Unknown';
|
|
84
|
+
let framework = '';
|
|
85
|
+
let pkgManager = '';
|
|
86
|
+
|
|
87
|
+
if (hasFile('package.json')) {
|
|
88
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf8'));
|
|
89
|
+
language = 'TypeScript/JavaScript';
|
|
90
|
+
framework = pkg.dependencies?.next ? 'Next.js' :
|
|
91
|
+
pkg.dependencies?.react ? 'React' :
|
|
92
|
+
pkg.dependencies?.express ? 'Express' :
|
|
93
|
+
pkg.dependencies?.fastify ? 'Fastify' : 'Node.js';
|
|
94
|
+
pkgManager = hasFile('pnpm-lock.yaml') ? 'pnpm' :
|
|
95
|
+
hasFile('yarn.lock') ? 'yarn' : 'npm';
|
|
96
|
+
} else if (hasFile('requirements.txt') || hasFile('pyproject.toml')) {
|
|
97
|
+
language = 'Python';
|
|
98
|
+
framework = hasFile('pyproject.toml') ? 'Poetry' : 'pip';
|
|
99
|
+
if (fs.existsSync(path.join(cwd, 'pyproject.toml'))) {
|
|
100
|
+
try {
|
|
101
|
+
const toml = fs.readFileSync(path.join(cwd, 'pyproject.toml'), 'utf8');
|
|
102
|
+
if (toml.includes('fastapi')) framework = 'FastAPI';
|
|
103
|
+
else if (toml.includes('django')) framework = 'Django';
|
|
104
|
+
else if (toml.includes('flask')) framework = 'Flask';
|
|
105
|
+
} catch {}
|
|
106
|
+
}
|
|
107
|
+
} else if (hasFile('go.mod')) {
|
|
108
|
+
language = 'Go';
|
|
109
|
+
framework = 'Go modules';
|
|
110
|
+
} else if (hasFile('Cargo.toml')) {
|
|
111
|
+
language = 'Rust';
|
|
112
|
+
framework = 'Cargo';
|
|
73
113
|
}
|
|
74
114
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
115
|
+
// Detect project name
|
|
116
|
+
let projectName = path.basename(cwd);
|
|
117
|
+
if (hasFile('package.json')) {
|
|
118
|
+
try {
|
|
119
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf8'));
|
|
120
|
+
if (pkg.name) projectName = pkg.name;
|
|
121
|
+
} catch {}
|
|
79
122
|
}
|
|
80
|
-
}
|
|
81
123
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
124
|
+
// Get git info
|
|
125
|
+
let gitContributors = '';
|
|
126
|
+
try {
|
|
127
|
+
const { execSync } = require('child_process');
|
|
128
|
+
gitContributors = execSync('git log --format="%an" | sort | uniq -c | sort -rn | head -3', { cwd, encoding: 'utf8' }).trim();
|
|
129
|
+
} catch {}
|
|
85
130
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
4. **Interface Segregation:** Small, focused interfaces. No client depends on unused methods.
|
|
91
|
-
5. **Dependency Inversion:** Depend on abstractions. Inject dependencies.
|
|
131
|
+
// Create palbox structure
|
|
132
|
+
fs.mkdirSync(path.join(palbox, 'flows'), { recursive: true });
|
|
133
|
+
fs.mkdirSync(path.join(palbox, 'history'), { recursive: true });
|
|
134
|
+
fs.mkdirSync(path.join(palbox, 'plans'), { recursive: true });
|
|
92
135
|
|
|
93
|
-
|
|
94
|
-
- Repository → data access ONLY
|
|
95
|
-
- Service → business logic ONLY
|
|
96
|
-
- Validator → validation rules ONLY
|
|
97
|
-
- Model → data structures ONLY
|
|
98
|
-
- If a class mixes these, REFACTOR immediately.
|
|
99
|
-
|
|
100
|
-
## Code Structure
|
|
101
|
-
- No file exceeds 200 lines without strong justification.
|
|
102
|
-
- Business logic → services/. Data access → repositories/. Validation → validators/.
|
|
103
|
-
- Models are pure data structures — no methods, no logic.
|
|
104
|
-
|
|
105
|
-
## Language
|
|
106
|
-
ALL code, comments, docstrings, variable names, and commit messages MUST be in English.
|
|
107
|
-
|
|
108
|
-
## Git
|
|
109
|
-
- One commit per logical change.
|
|
110
|
-
- Conventional commits: feat(scope): description / fix(scope): description / test(scope): description
|
|
111
|
-
|
|
112
|
-
## Palbox Knowledge Graph (CRITICAL)
|
|
113
|
-
### Before you start ANY task
|
|
114
|
-
1. **Check if .palbox/ exists.** If not, the project has not been bootstrapped yet.
|
|
115
|
-
2. **Read the core nodes:**
|
|
116
|
-
- .palbox/README.md — project identity, tech stack, goals
|
|
117
|
-
- .palbox/architecture.md — folder structure, design patterns, key modules
|
|
118
|
-
- .palbox/methods.md — coding conventions, testing strategy, git workflow
|
|
119
|
-
3. **Search for related past work:**
|
|
120
|
-
- Search for keywords in .palbox/flows/ and .palbox/history/
|
|
121
|
-
- Follow wikilinks to discover connected context
|
|
122
|
-
4. **Read relevant flows** in .palbox/flows/ — they document how features work end-to-end
|
|
123
|
-
5. **Read relevant history** in .palbox/history/ — past plans, executions, lessons learned
|
|
124
|
-
|
|
125
|
-
### After you complete a task
|
|
126
|
-
- Record what you did. The Palskills system (Panthalus) will create a .palbox/history/YYYY-MM-DD-feature.md node with wikilinks to related entries.
|
|
127
|
-
- If you discovered new patterns, conventions, or pitfalls, note them — they enrich the graph.
|
|
128
|
-
`;
|
|
129
|
-
}
|
|
136
|
+
const date = new Date().toISOString().split('T')[0];
|
|
130
137
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
# Generated by palskills CLI
|
|
134
|
-
|
|
135
|
-
## Core Principles
|
|
136
|
-
You are working in a project managed by the Palskills development system.
|
|
137
|
-
Always follow these rules.
|
|
138
|
-
|
|
139
|
-
### SOLID
|
|
140
|
-
1. **S** — Single Responsibility: one class, one reason to change.
|
|
141
|
-
2. **O** — Open/Closed: extend, don't modify.
|
|
142
|
-
3. **L** — Liskov Substitution: subtypes fully substitutable.
|
|
143
|
-
4. **I** — Interface Segregation: small interfaces, no fat abstractions.
|
|
144
|
-
5. **D** — Dependency Inversion: depend on abstractions, inject deps.
|
|
145
|
-
|
|
146
|
-
### SRP (Single Responsibility Pattern)
|
|
147
|
-
- Repository classes: data access ONLY
|
|
148
|
-
- Service classes: business logic ONLY
|
|
149
|
-
- Validator classes: validation rules ONLY
|
|
150
|
-
- Model classes: data structures ONLY
|
|
151
|
-
- If any module mixes these, REFACTOR.
|
|
152
|
-
|
|
153
|
-
### Language
|
|
154
|
-
ALL code, comments, docs, variable names, and commit messages MUST be in English.
|
|
155
|
-
|
|
156
|
-
### Git
|
|
157
|
-
- One commit per logical change
|
|
158
|
-
- Conventional commits format: feat(scope): / fix(scope): / test(scope):
|
|
159
|
-
|
|
160
|
-
### Project Context — Palbox Knowledge Graph
|
|
161
|
-
Before you start ANY task:
|
|
162
|
-
1. **Check if .palbox/ exists.** Read the core nodes:
|
|
163
|
-
- .palbox/README.md — project identity, stack, goals
|
|
164
|
-
- .palbox/architecture.md — folder structure, patterns, key modules
|
|
165
|
-
- .palbox/methods.md — conventions, testing, git workflow
|
|
166
|
-
2. **Search .palbox/flows/ and .palbox/history/** for related past work.
|
|
167
|
-
3. **Follow wikilinks** — they connect related nodes in the knowledge graph.
|
|
168
|
-
|
|
169
|
-
After completing work:
|
|
170
|
-
- The Palskills system (Panthalus) records to .palbox/history/ with bi-directional links.
|
|
171
|
-
|
|
172
|
-
### Code Quality
|
|
173
|
-
- No file exceeds 200 lines without strong justification.
|
|
174
|
-
- Every function has a clear, single purpose.
|
|
175
|
-
- Prefer composition over inheritance.
|
|
176
|
-
- Write tests for all new logic.
|
|
177
|
-
`;
|
|
178
|
-
}
|
|
138
|
+
// README.md
|
|
139
|
+
fs.writeFileSync(path.join(palbox, 'README.md'), `# ${projectName}
|
|
179
140
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
# Generated by palskills CLI
|
|
141
|
+
**Generated:** ${date}
|
|
142
|
+
**Bootstrapped by:** Lyleen (Palskills)
|
|
183
143
|
|
|
184
|
-
##
|
|
185
|
-
|
|
186
|
-
You follow SOLID principles, Single Responsibility Pattern, and write all code in English.
|
|
144
|
+
## Overview
|
|
145
|
+
[Project description — update this]
|
|
187
146
|
|
|
188
|
-
##
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
##
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
-
|
|
201
|
-
|
|
202
|
-
|
|
147
|
+
## Tech Stack
|
|
148
|
+
- **Language:** ${language}
|
|
149
|
+
- **Framework:** ${framework}${pkgManager ? `\n- **Package Manager:** ${pkgManager}` : ''}
|
|
150
|
+
|
|
151
|
+
## Project Goal
|
|
152
|
+
[What problem does this project solve? — update this]
|
|
153
|
+
|
|
154
|
+
## Quick Start
|
|
155
|
+
[How to run the project — update this]
|
|
156
|
+
|
|
157
|
+
## Knowledge Graph
|
|
158
|
+
- [[architecture]] — folder structure and design patterns
|
|
159
|
+
- [[methods]] — coding conventions and standards
|
|
160
|
+
- [[flows/]] — feature workflow documentation
|
|
161
|
+
- [[history/]] — past development sessions
|
|
162
|
+
`);
|
|
163
|
+
|
|
164
|
+
// architecture.md
|
|
165
|
+
let dirTree = '';
|
|
166
|
+
try {
|
|
167
|
+
const result = fs.readdirSync(cwd, { withFileTypes: true })
|
|
168
|
+
.filter(d => d.isDirectory() && !d.name.startsWith('.') && d.name !== 'node_modules' && d.name !== '__pycache__')
|
|
169
|
+
.map(d => `├── ${d.name}/`)
|
|
170
|
+
.join('\n');
|
|
171
|
+
dirTree = result || '(empty)';
|
|
172
|
+
} catch { dirTree = '(unknown)'; }
|
|
173
|
+
|
|
174
|
+
fs.writeFileSync(path.join(palbox, 'architecture.md'), `# Architecture
|
|
175
|
+
|
|
176
|
+
**Last Updated:** ${date}
|
|
177
|
+
|
|
178
|
+
## Folder Structure
|
|
203
179
|
\`\`\`
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
├── repositories/ # Data access layer
|
|
207
|
-
├── services/ # Business logic
|
|
208
|
-
├── validators/ # Validation rules
|
|
209
|
-
└── interfaces/ # Abstract bases & protocols
|
|
180
|
+
${projectName}/
|
|
181
|
+
${dirTree}
|
|
210
182
|
\`\`\`
|
|
211
183
|
|
|
212
|
-
##
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
##
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
##
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
184
|
+
## Design Patterns
|
|
185
|
+
[Detected patterns — update this]
|
|
186
|
+
|
|
187
|
+
## Key Modules
|
|
188
|
+
| Module | Responsibility | Key Files |
|
|
189
|
+
|--------|---------------|-----------|
|
|
190
|
+
| ... | ... | ... |
|
|
191
|
+
|
|
192
|
+
## Data Flow
|
|
193
|
+
[How data moves through the system]
|
|
194
|
+
|
|
195
|
+
## Related
|
|
196
|
+
- [[methods]] — how we build
|
|
197
|
+
- [[README]] — project overview
|
|
198
|
+
`);
|
|
199
|
+
|
|
200
|
+
// methods.md
|
|
201
|
+
fs.writeFileSync(path.join(palbox, 'methods.md'), `# Development Methods
|
|
202
|
+
|
|
203
|
+
**Last Updated:** ${date}
|
|
204
|
+
|
|
205
|
+
## Coding Conventions
|
|
206
|
+
[Detected from codebase — update this]
|
|
207
|
+
|
|
208
|
+
## Testing Strategy
|
|
209
|
+
[Detected from test files — update this]
|
|
210
|
+
|
|
211
|
+
## Git Workflow
|
|
212
|
+
${gitContributors ? `\n**Top Contributors:**\n\`\`\`\n${gitContributors}\n\`\`\`` : '[Run git log to populate]'}
|
|
213
|
+
|
|
214
|
+
## Code Review Standards
|
|
215
|
+
- SOLID principles enforced
|
|
216
|
+
- Single Responsibility Pattern required
|
|
217
|
+
- All code in English
|
|
218
|
+
|
|
219
|
+
## Related
|
|
220
|
+
- [[architecture]] — where things live
|
|
221
|
+
- [[README]] — project overview
|
|
222
|
+
`);
|
|
223
|
+
|
|
224
|
+
console.log(` ${GREEN}✓${NC} .palbox/README.md`);
|
|
225
|
+
console.log(` ${GREEN}✓${NC} .palbox/architecture.md`);
|
|
226
|
+
console.log(` ${GREEN}✓${NC} .palbox/methods.md`);
|
|
227
|
+
console.log(` ${GREEN}✓${NC} .palbox/flows/`);
|
|
228
|
+
console.log(` ${GREEN}✓${NC} .palbox/history/`);
|
|
229
|
+
console.log(` ${GREEN}✓${NC} .palbox/plans/`);
|
|
230
|
+
console.log('');
|
|
231
|
+
console.log(` Detected: ${language} + ${framework}`);
|
|
232
|
+
if (gitContributors) console.log(` Git history found`);
|
|
233
|
+
console.log('');
|
|
234
|
+
console.log(` Next steps:`);
|
|
235
|
+
console.log(` 1. Edit .palbox/README.md with project details`);
|
|
236
|
+
console.log(` 2. Run 'palskills' again to generate agent configs`);
|
|
237
|
+
console.log(` 3. Or use Hermes skills: "Load lyleen, build feature X"`);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function generate(agent) {
|
|
241
|
+
const cwd = process.cwd();
|
|
242
|
+
const skillNames = ['lyleen', 'jetdragon', 'anubis', 'panthalus', 'astralym'];
|
|
243
|
+
|
|
244
|
+
let dir;
|
|
245
|
+
if (agent === 'codex') dir = path.join(cwd, '.codex', 'skills');
|
|
246
|
+
else if (agent === 'cursor') dir = path.join(cwd, '.cursor', 'skills');
|
|
247
|
+
else if (agent === 'claude') dir = path.join(cwd, '.claude', 'skills');
|
|
248
|
+
|
|
249
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
250
|
+
|
|
251
|
+
for (const name of skillNames) {
|
|
252
|
+
const file = path.join(dir, `${name}.md`);
|
|
253
|
+
fs.writeFileSync(file, skillContent(agent, name));
|
|
254
|
+
console.log(` ${GREEN}✓${NC} ${dir}/${name}.md`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function skillContent(agent, skill) {
|
|
259
|
+
const skills = {
|
|
260
|
+
lyleen: `# Lyleen — Palbox Knowledge Graph
|
|
261
|
+
**Agent:** ${agent === 'codex' ? 'Codex' : agent === 'cursor' ? 'Cursor' : 'Claude Code'}
|
|
262
|
+
|
|
263
|
+
## Role
|
|
264
|
+
Read and bootstrap the project knowledge graph (.palbox/).
|
|
265
|
+
|
|
266
|
+
## If .palbox/ does NOT exist — BOOTSTRAP:
|
|
267
|
+
1. Scan project: read package.json/requirements.txt/go.mod, list dirs, check git log, find tests
|
|
268
|
+
2. Create .palbox/README.md — project name, tech stack, goals, [[links]]
|
|
269
|
+
3. Create .palbox/architecture.md — folder tree, design patterns, key modules
|
|
270
|
+
4. Create .palbox/methods.md — conventions, testing, git workflow
|
|
271
|
+
5. Create .palbox/flows/, .palbox/history/, .palbox/plans/
|
|
272
|
+
6. Report: "Palbox bootstrapped. N files. Detected: [stack]."
|
|
273
|
+
|
|
274
|
+
## If .palbox/ EXISTS — RETRIEVE:
|
|
275
|
+
1. Read README.md, architecture.md, methods.md
|
|
276
|
+
2. Search flows/ and history/ for user keywords
|
|
277
|
+
3. Extract [[wikilinks]], follow 1-2 hops
|
|
278
|
+
4. Return context subgraph: seeds → 1-hop → 2-hop → conventions
|
|
279
|
+
`,
|
|
280
|
+
jetdragon: `# Jetdragon — Planner
|
|
281
|
+
**Agent:** ${agent === 'codex' ? 'Codex' : agent === 'cursor' ? 'Cursor' : 'Claude Code'}
|
|
282
|
+
|
|
283
|
+
## Role
|
|
284
|
+
Create detailed implementation plans. Ask questions until clear.
|
|
285
|
+
|
|
286
|
+
## Process
|
|
287
|
+
1. Gather palbox context (read core docs, search related history)
|
|
288
|
+
2. Generate plan → .palbox/plans/YYYY-MM-DD-feature.md with [[wikilinks]]
|
|
289
|
+
3. If ambiguous, ASK: scope, design, edge cases, integration, priority
|
|
290
|
+
4. Iterate until user says "Gas", "Go", "Execute"
|
|
291
|
+
5. Finalize as APPROVED, hand off to Anubis
|
|
292
|
+
|
|
293
|
+
## Plan Template
|
|
294
|
+
- Overview, Scope (in/out), Tasks (ordered, with files + verification)
|
|
295
|
+
- Architecture notes, SOLID focus, Risks & Mitigations
|
|
296
|
+
- All references use [[wikilinks]] to .palbox/ entries
|
|
297
|
+
`,
|
|
298
|
+
anubis: `# Anubis — Developer
|
|
299
|
+
**Agent:** ${agent === 'codex' ? 'Codex' : agent === 'cursor' ? 'Cursor' : 'Claude Code'}
|
|
300
|
+
|
|
301
|
+
## Role
|
|
302
|
+
Execute approved plans. SOLID + SRP enforced. English only.
|
|
303
|
+
|
|
304
|
+
## SOLID (Strict)
|
|
305
|
+
- **S**: One class, one reason to change
|
|
306
|
+
- **O**: Extend, never modify existing
|
|
307
|
+
- **L**: Subtypes fully substitutable
|
|
308
|
+
- **I**: Small focused interfaces
|
|
309
|
+
- **D**: Depend on abstractions, inject deps
|
|
310
|
+
|
|
311
|
+
## SRP Separation
|
|
312
|
+
- Repository → data access ONLY
|
|
313
|
+
- Service → business logic ONLY
|
|
314
|
+
- Validator → validation rules ONLY
|
|
315
|
+
- Model → data structures ONLY
|
|
316
|
+
|
|
317
|
+
## Rules
|
|
318
|
+
- ALL code, comments, docstrings, commits in English
|
|
319
|
+
- One commit per logical change (conventional commits)
|
|
320
|
+
- Read existing files before modifying
|
|
321
|
+
- Write tests if project has testing patterns
|
|
322
|
+
`,
|
|
323
|
+
panthalus: `# Panthalus — Archivist
|
|
324
|
+
**Agent:** ${agent === 'codex' ? 'Codex' : agent === 'cursor' ? 'Cursor' : 'Claude Code'}
|
|
325
|
+
|
|
326
|
+
## Role
|
|
327
|
+
Record sessions to .palbox/ with bi-directional [[wikilinks]].
|
|
328
|
+
|
|
329
|
+
## Process
|
|
330
|
+
1. Collect: plan, git diff, commits, decisions, lessons
|
|
331
|
+
2. Create .palbox/history/YYYY-MM-DD-feature.md with [[wikilinks]]
|
|
332
|
+
3. For EVERY link, add backlink to the target file ("Related Sessions")
|
|
333
|
+
4. Update core docs (architecture/methods) only if structure changed
|
|
334
|
+
5. Report graph stats: nodes, edges, enriched
|
|
335
|
+
|
|
336
|
+
## History Entry Template
|
|
337
|
+
- Links ([[flows/]], [[architecture]], [[history/]])
|
|
338
|
+
- Original prompt, Plan, Execution (files + commits)
|
|
339
|
+
- Key Decisions table, Lessons Learned (pitfalls, discoveries)
|
|
340
|
+
- Backlinks section
|
|
341
|
+
`,
|
|
342
|
+
astralym: `# Astralym — Orchestrator
|
|
343
|
+
**Agent:** ${agent === 'codex' ? 'Codex' : agent === 'cursor' ? 'Cursor' : 'Claude Code'}
|
|
344
|
+
|
|
345
|
+
## Role
|
|
346
|
+
Run the full development pipeline automatically.
|
|
347
|
+
|
|
348
|
+
## Pipeline
|
|
349
|
+
1. **CHECK_GRAPH** → Lyleen: bootstrap or retrieve context
|
|
350
|
+
2. **PLANNING** → Jetdragon: create plan, ask questions, wait for "Gas"
|
|
351
|
+
3. **DEVELOPING** → Anubis: execute with SOLID + SRP
|
|
352
|
+
4. **RECORDING** → Panthalus: record with backlinks
|
|
353
|
+
5. **DONE** → Summary with graph stats
|
|
354
|
+
|
|
355
|
+
## Usage
|
|
356
|
+
User says "Astralym: build feature X" → full pipeline runs.
|
|
357
|
+
`
|
|
358
|
+
};
|
|
359
|
+
return skills[skill] || '';
|
|
233
360
|
}
|
|
234
361
|
|
|
235
362
|
function installSkills() {
|