stella-protocol 0.4.0 → 0.4.2
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-plugin/marketplace.json +1 -1
- package/cli/index.js +24 -6
- package/cli/init.js +6 -1
- package/cli/install.js +10 -1
- package/cli/status.js +6 -2
- package/package.json +7 -2
- package/protocol/governance/cipher-pol.md +18 -6
- package/skills/stella-build/SKILL.md +4 -0
- package/skills/stella-close/SKILL.md +4 -0
- package/skills/stella-define/SKILL.md +7 -1
- package/skills/stella-review/SKILL.md +4 -0
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"name": "stella-protocol",
|
|
18
18
|
"source": "./",
|
|
19
19
|
"description": "PM-first AI development protocol with satellite agents, phase governance, and built-in scope/veto enforcement.",
|
|
20
|
-
"version": "0.
|
|
20
|
+
"version": "0.4.2",
|
|
21
21
|
"author": {
|
|
22
22
|
"name": "Aditya Uttama"
|
|
23
23
|
},
|
package/cli/index.js
CHANGED
|
@@ -17,24 +17,42 @@ program
|
|
|
17
17
|
.command('install')
|
|
18
18
|
.description('Install Stella Protocol skills and initialize Punk Records')
|
|
19
19
|
.action(async () => {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
try {
|
|
21
|
+
const { install } = require('./install');
|
|
22
|
+
await install();
|
|
23
|
+
} catch (err) {
|
|
24
|
+
const chalk = require('chalk');
|
|
25
|
+
console.error(chalk.red('Install failed:'), err.message);
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
22
28
|
});
|
|
23
29
|
|
|
24
30
|
program
|
|
25
31
|
.command('init')
|
|
26
32
|
.description('Initialize Punk Records (brain/) in the current project')
|
|
27
33
|
.action(async () => {
|
|
28
|
-
|
|
29
|
-
|
|
34
|
+
try {
|
|
35
|
+
const { init } = require('./init');
|
|
36
|
+
await init();
|
|
37
|
+
} catch (err) {
|
|
38
|
+
const chalk = require('chalk');
|
|
39
|
+
console.error(chalk.red('Init failed:'), err.message);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
30
42
|
});
|
|
31
43
|
|
|
32
44
|
program
|
|
33
45
|
.command('status')
|
|
34
46
|
.description('Show current project status from Punk Records')
|
|
35
47
|
.action(async () => {
|
|
36
|
-
|
|
37
|
-
|
|
48
|
+
try {
|
|
49
|
+
const { status } = require('./status');
|
|
50
|
+
await status();
|
|
51
|
+
} catch (err) {
|
|
52
|
+
const chalk = require('chalk');
|
|
53
|
+
console.error(chalk.red('Status failed:'), err.message);
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
38
56
|
});
|
|
39
57
|
|
|
40
58
|
program.parse();
|
package/cli/init.js
CHANGED
|
@@ -7,6 +7,7 @@ const { intro, outro, spinner } = require('@clack/prompts');
|
|
|
7
7
|
const chalk = require('chalk');
|
|
8
8
|
|
|
9
9
|
async function init() {
|
|
10
|
+
try {
|
|
10
11
|
intro(chalk.bold('Punk Records') + chalk.dim(' — Initialize project brain'));
|
|
11
12
|
|
|
12
13
|
const packageDir = path.resolve(__dirname, '..');
|
|
@@ -37,11 +38,15 @@ async function init() {
|
|
|
37
38
|
const logPosePath = path.join(brainTarget, 'log-pose.md');
|
|
38
39
|
const logPose = await fs.readFile(logPosePath, 'utf-8');
|
|
39
40
|
const projectName = path.basename(process.cwd());
|
|
40
|
-
|
|
41
|
+
const today = new Date().toISOString().split('T')[0];
|
|
42
|
+
await fs.writeFile(logPosePath, logPose.replace('{project-name}', projectName).replace('YYYY-MM-DD', today));
|
|
41
43
|
|
|
42
44
|
s.stop('Punk Records initialized');
|
|
43
45
|
|
|
44
46
|
outro(chalk.green('brain/ is ready.') + ' Files: log-pose.md, architecture.md, vivre-cards.md, ideas.md');
|
|
47
|
+
} catch (err) {
|
|
48
|
+
outro(chalk.red('Initialization failed: ') + err.message);
|
|
49
|
+
}
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
module.exports = { init };
|
package/cli/install.js
CHANGED
|
@@ -52,6 +52,7 @@ function getSkillsDir(tool, scope) {
|
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
async function install() {
|
|
55
|
+
try {
|
|
55
56
|
intro(chalk.bold('THE STELLA PROTOCOL') + chalk.dim(' — One mind, many satellites.'));
|
|
56
57
|
|
|
57
58
|
// Detect AI tool
|
|
@@ -102,6 +103,10 @@ async function install() {
|
|
|
102
103
|
for (const skill of SKILLS) {
|
|
103
104
|
const src = path.join(skillsSource, skill);
|
|
104
105
|
const dest = path.join(skillsTarget, skill);
|
|
106
|
+
if (!fs.existsSync(src)) {
|
|
107
|
+
console.warn(chalk.yellow(` ⚠ Skill "${skill}" not found at ${src} — skipped`));
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
105
110
|
await fs.copy(src, dest, { overwrite: true });
|
|
106
111
|
}
|
|
107
112
|
|
|
@@ -130,7 +135,8 @@ async function install() {
|
|
|
130
135
|
const logPosePath = path.join(brainTarget, 'log-pose.md');
|
|
131
136
|
const logPose = await fs.readFile(logPosePath, 'utf-8');
|
|
132
137
|
const projectName = path.basename(process.cwd());
|
|
133
|
-
|
|
138
|
+
const today = new Date().toISOString().split('T')[0];
|
|
139
|
+
await fs.writeFile(logPosePath, logPose.replace('{project-name}', projectName).replace('YYYY-MM-DD', today));
|
|
134
140
|
|
|
135
141
|
brainS.stop(`Punk Records initialized at ${chalk.dim(brainTarget)}`);
|
|
136
142
|
}
|
|
@@ -168,6 +174,9 @@ async function install() {
|
|
|
168
174
|
}
|
|
169
175
|
|
|
170
176
|
outro(chalk.green('Ready.') + ' Start by telling your AI what you want to build.');
|
|
177
|
+
} catch (err) {
|
|
178
|
+
outro(chalk.red('Installation failed: ') + err.message);
|
|
179
|
+
}
|
|
171
180
|
}
|
|
172
181
|
|
|
173
182
|
module.exports = { install };
|
package/cli/status.js
CHANGED
|
@@ -6,6 +6,7 @@ const fs = require('fs-extra');
|
|
|
6
6
|
const chalk = require('chalk');
|
|
7
7
|
|
|
8
8
|
async function status() {
|
|
9
|
+
try {
|
|
9
10
|
const brainDir = path.join(process.cwd(), 'brain');
|
|
10
11
|
const logPosePath = path.join(brainDir, 'log-pose.md');
|
|
11
12
|
|
|
@@ -17,8 +18,8 @@ async function status() {
|
|
|
17
18
|
|
|
18
19
|
const content = await fs.readFile(logPosePath, 'utf-8');
|
|
19
20
|
|
|
20
|
-
// Parse frontmatter
|
|
21
|
-
const fmMatch = content.match(/^---\n([\s\S]*?)\n
|
|
21
|
+
// Parse frontmatter (strict: opening --- must be first line, closing --- must be on its own line)
|
|
22
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---(?:\n|$)/);
|
|
22
23
|
if (fmMatch) {
|
|
23
24
|
const fm = fmMatch[1];
|
|
24
25
|
const lines = fm.split('\n').filter(Boolean);
|
|
@@ -39,6 +40,9 @@ async function status() {
|
|
|
39
40
|
// Print body (skip frontmatter)
|
|
40
41
|
const body = content.replace(/^---\n[\s\S]*?\n---\n*/, '');
|
|
41
42
|
console.log(body);
|
|
43
|
+
} catch (err) {
|
|
44
|
+
console.error(chalk.red('Status check failed:'), err.message);
|
|
45
|
+
}
|
|
42
46
|
}
|
|
43
47
|
|
|
44
48
|
module.exports = { status };
|
package/package.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "stella-protocol",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "PM-first AI development protocol. One mind, many satellites.",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"test": "echo \"No tests yet — see brain/test-plan.md for manual QA checklist\"",
|
|
7
|
+
"status": "node cli/index.js status"
|
|
8
|
+
},
|
|
5
9
|
"bin": {
|
|
6
|
-
"stella": "cli/index.js"
|
|
10
|
+
"stella": "cli/index.js",
|
|
11
|
+
"stella-protocol": "cli/index.js"
|
|
7
12
|
},
|
|
8
13
|
"files": [
|
|
9
14
|
"protocol/",
|
|
@@ -25,7 +25,7 @@ Unlike a review you invoke, Cipher Pol is **always active**. Every satellite tha
|
|
|
25
25
|
|
|
26
26
|
### INTEL
|
|
27
27
|
- **Drift:** Minor. Within the spirit of the PRD but not explicitly specified.
|
|
28
|
-
- **Action:**
|
|
28
|
+
- **Action:** Logged to `brain/scope-changes.md`. Work continues.
|
|
29
29
|
- **Example:** Adding a loading spinner not mentioned in the PRD.
|
|
30
30
|
|
|
31
31
|
### ALERT
|
|
@@ -81,7 +81,7 @@ When any satellite creates a new file, route, page, endpoint, or component durin
|
|
|
81
81
|
Drift: New [type] created — [path/name]
|
|
82
82
|
PRD says: [relevant scope reference]
|
|
83
83
|
Classification: [INTEL / ALERT / INTERCEPT]
|
|
84
|
-
Action: Logged to
|
|
84
|
+
Action: Logged to scope-changes.md
|
|
85
85
|
```
|
|
86
86
|
|
|
87
87
|
This applies to:
|
|
@@ -96,15 +96,27 @@ Minor implementation files (utilities, helpers, config) do not trigger Cipher Po
|
|
|
96
96
|
|
|
97
97
|
## Logging — MANDATORY
|
|
98
98
|
|
|
99
|
-
**ALL scope
|
|
99
|
+
**ALL scope drift — even approved additions — MUST be logged to `brain/scope-changes.md`** immediately. This is the primary audit trail of how scope evolved during the project.
|
|
100
100
|
|
|
101
|
-
Format
|
|
101
|
+
Format for `brain/scope-changes.md`:
|
|
102
102
|
```markdown
|
|
103
|
-
### [YYYY-MM-DD]
|
|
103
|
+
### [YYYY-MM-DD] [Feature/File Name]
|
|
104
|
+
- **File:** [path to new file]
|
|
105
|
+
- **Classification:** INTEL | ALERT | INTERCEPT
|
|
106
|
+
- **Reason:** [why this was needed]
|
|
107
|
+
- **Requested by:** Stella | Agent
|
|
108
|
+
- **Reviewed:** no
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
**Decision records go to `brain/vivre-cards.md`** — when Stella approves, rejects, or amends scope based on a Cipher Pol flag, log that decision (not the drift itself) to vivre-cards.md with the prefix "Scope decision:" in the title.
|
|
112
|
+
|
|
113
|
+
Format for `brain/vivre-cards.md` (decisions only):
|
|
114
|
+
```markdown
|
|
115
|
+
### [YYYY-MM-DD] Scope decision: [Description]
|
|
104
116
|
**Phase:** BUILD
|
|
105
117
|
**Satellite:** Cipher Pol
|
|
106
118
|
**Severity:** [INTEL / ALERT / INTERCEPT]
|
|
107
|
-
**
|
|
119
|
+
**Change:** [what was added/changed]
|
|
108
120
|
**PRD reference:** [what the PRD says about this area]
|
|
109
121
|
**Decision:** [approved by Stella / rejected / PRD amended]
|
|
110
122
|
```
|
|
@@ -214,6 +214,10 @@ Recommendation: [what to do instead]
|
|
|
214
214
|
|
|
215
215
|
Never just mention a concern in passing — use the format, log it, make it visible.
|
|
216
216
|
|
|
217
|
+
## Next Phase
|
|
218
|
+
|
|
219
|
+
Setelah BUILD selesai (semua P0 features shipped, tested), guide Stella untuk jalankan `stella-review` untuk review checkpoint. / After BUILD is complete (all P0 features shipped, tested), guide Stella to run `stella-review` for a review checkpoint.
|
|
220
|
+
|
|
217
221
|
## Communication Style
|
|
218
222
|
- Direct, concise, no filler
|
|
219
223
|
- Proactive — suggest review checkpoints, don't wait to be asked
|
|
@@ -112,6 +112,10 @@ At the end of CLOSE:
|
|
|
112
112
|
- `brain/observability-plan.md` → Created (even if monitoring not yet implemented)
|
|
113
113
|
- All documentation complete and current
|
|
114
114
|
|
|
115
|
+
## Next Phase
|
|
116
|
+
|
|
117
|
+
Setelah CLOSE selesai (docs complete, version closed), untuk fitur atau project baru, guide Stella untuk jalankan `stella-protocol` (IMU) untuk mulai ideation cycle baru. / After CLOSE is complete (docs done, version closed), for new features or projects, guide Stella to run `stella-protocol` (IMU) to start a new ideation cycle.
|
|
118
|
+
|
|
115
119
|
## Communication Style
|
|
116
120
|
- Direct, concise, no filler
|
|
117
121
|
- Proactive — identify gaps in documentation and suggest fixes
|
|
@@ -240,12 +240,14 @@ You are defining the scope that will be enforced throughout BUILD. Be precise:
|
|
|
240
240
|
- Acceptance criteria must be testable
|
|
241
241
|
|
|
242
242
|
### Buster Call
|
|
243
|
-
Issue
|
|
243
|
+
Issue Buster Calls (WARNING severity) when:
|
|
244
244
|
- Requirements contradict each other
|
|
245
245
|
- Scope exceeds what the selected track supports
|
|
246
246
|
- Critical open questions remain unresolved
|
|
247
247
|
- Architecture has fundamental flaws
|
|
248
248
|
|
|
249
|
+
**Note:** Only BUSTER CALL severity blocks phase transitions. CONCERN and WARNING are advisory — they inform Stella but don't stop work.
|
|
250
|
+
|
|
249
251
|
**Every Buster Call MUST be logged to `brain/vivre-cards.md` immediately.** Don't just mention it in conversation.
|
|
250
252
|
|
|
251
253
|
## Punk Records Updates
|
|
@@ -255,6 +257,10 @@ After DEFINE is complete:
|
|
|
255
257
|
- `brain/log-pose.md` MUST reflect current phase and state
|
|
256
258
|
- `brain/vivre-cards.md` MUST have entries for key decisions made
|
|
257
259
|
|
|
260
|
+
## Next Phase
|
|
261
|
+
|
|
262
|
+
Setelah DEFINE selesai (PRD approved, architecture decided), guide Stella untuk jalankan `stella-build` untuk masuk ke fase BUILD. / After DEFINE is complete (PRD approved, architecture decided), guide Stella to run `stella-build` to enter the BUILD phase.
|
|
263
|
+
|
|
258
264
|
## Communication Style
|
|
259
265
|
- Direct, concise, no filler
|
|
260
266
|
- Guide through PRD creation via conversation, not template dumps
|
|
@@ -181,6 +181,10 @@ After review finds issues, proactively guide the fix cycle:
|
|
|
181
181
|
|
|
182
182
|
All findings logged to `brain/vivre-cards.md`. Unresolved BUSTER CALL blocks phase transitions.
|
|
183
183
|
|
|
184
|
+
## Next Phase
|
|
185
|
+
|
|
186
|
+
Setelah REVIEW selesai (semua findings resolved atau acknowledged), guide Stella untuk jalankan `stella-close` untuk masuk ke fase CLOSE. / After REVIEW is complete (all findings resolved or acknowledged), guide Stella to run `stella-close` to enter the CLOSE phase.
|
|
187
|
+
|
|
184
188
|
## Communication Style
|
|
185
189
|
- Direct, concise, no filler
|
|
186
190
|
- Proactive — suggest what to review, don't wait to be asked
|