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.
@@ -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.3.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
- const { install } = require('./install');
21
- await install();
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
- const { init } = require('./init');
29
- await init();
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
- const { status } = require('./status');
37
- await status();
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
- await fs.writeFile(logPosePath, logPose.replace('{project-name}', projectName));
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
- await fs.writeFile(logPosePath, logPose.replace('{project-name}', projectName));
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.0",
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:** Noted in `brain/log-pose.md` under Cipher Pol Report. Work continues.
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 vivre-cards.md
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 additions — even approved ones — MUST be logged to `brain/vivre-cards.md`** with the prefix "Scope addition:" in the title. This creates an audit trail of how scope evolved during the project.
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] Scope addition: [Description]
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
- **Added:** [what was added]
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 warnings when:
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