stella-protocol 0.1.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-plugin/marketplace.json +33 -0
- package/LICENSE +21 -0
- package/README.md +124 -0
- package/cli/index.js +37 -0
- package/cli/init.js +44 -0
- package/cli/install.js +138 -0
- package/cli/status.js +41 -0
- package/package.json +43 -0
- package/protocol/governance/buster-call.md +74 -0
- package/protocol/governance/cipher-pol.md +77 -0
- package/protocol/satellites/atlas.md +54 -0
- package/protocol/satellites/edison.md +48 -0
- package/protocol/satellites/imu.md +78 -0
- package/protocol/satellites/lilith-blue.md +63 -0
- package/protocol/satellites/lilith-red.md +88 -0
- package/protocol/satellites/morgans.md +46 -0
- package/protocol/satellites/oda.md +74 -0
- package/protocol/satellites/pythagoras.md +70 -0
- package/protocol/satellites/shaka.md +75 -0
- package/protocol/satellites/york.md +52 -0
- package/protocol/stella.md +130 -0
- package/protocol/tracks/east-blue.md +59 -0
- package/protocol/tracks/grand-line.md +58 -0
- package/punk-records/architecture.md +21 -0
- package/punk-records/ideas.md +15 -0
- package/punk-records/log-pose.md +23 -0
- package/punk-records/mini-prd-template.md +15 -0
- package/punk-records/prd-template.md +35 -0
- package/punk-records/vivre-cards.md +18 -0
- package/skills/stella-build/SKILL.md +95 -0
- package/skills/stella-close/SKILL.md +80 -0
- package/skills/stella-define/SKILL.md +94 -0
- package/skills/stella-protocol/SKILL.md +91 -0
- package/skills/stella-review/SKILL.md +113 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "stella-protocol",
|
|
3
|
+
"owner": {
|
|
4
|
+
"name": "Aditya Uttama"
|
|
5
|
+
},
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"homepage": "https://github.com/adityauttama/stella-protocol",
|
|
8
|
+
"repository": "https://github.com/adityauttama/stella-protocol",
|
|
9
|
+
"keywords": [
|
|
10
|
+
"product-management",
|
|
11
|
+
"ai-development",
|
|
12
|
+
"methodology",
|
|
13
|
+
"pm-tools"
|
|
14
|
+
],
|
|
15
|
+
"plugins": [
|
|
16
|
+
{
|
|
17
|
+
"name": "stella-protocol",
|
|
18
|
+
"source": "./",
|
|
19
|
+
"description": "PM-first AI development protocol with satellite agents, phase governance, and built-in scope/veto enforcement.",
|
|
20
|
+
"version": "0.1.0",
|
|
21
|
+
"author": {
|
|
22
|
+
"name": "Aditya Uttama"
|
|
23
|
+
},
|
|
24
|
+
"skills": [
|
|
25
|
+
"./skills/stella-protocol",
|
|
26
|
+
"./skills/stella-define",
|
|
27
|
+
"./skills/stella-build",
|
|
28
|
+
"./skills/stella-review",
|
|
29
|
+
"./skills/stella-close"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Aditya Uttama
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# The Stella Protocol
|
|
2
|
+
|
|
3
|
+
**PM-first AI development protocol. One mind, many satellites.**
|
|
4
|
+
|
|
5
|
+
Stella is a structured methodology for Product Managers who build 100% with AI. Instead of calling independent AI agents, **you are Stella** — the original mind — and AI operates as specialized extensions of your thinking called **Satellites**.
|
|
6
|
+
|
|
7
|
+
## Why Stella?
|
|
8
|
+
|
|
9
|
+
Most AI development frameworks are built for developers. Stella is built for **the PM who owns the product vision and uses AI to execute everything else** — architecture, code, tests, deployment, documentation.
|
|
10
|
+
|
|
11
|
+
- **No commands to memorize.** Satellites activate from natural conversation, not slash commands.
|
|
12
|
+
- **Built-in governance.** Scope enforcement and veto protocols are always on — not optional tools you remember to invoke.
|
|
13
|
+
- **Persistent project brain.** A structured `brain/` directory tracks decisions, state, and scope — committed to git, reviewable in PRs.
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npx stella-protocol install
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
This will:
|
|
22
|
+
1. Install 5 phase-based Agent Skills into your AI tool
|
|
23
|
+
2. Initialize a `brain/` directory (Punk Records) in your project
|
|
24
|
+
3. You're ready — start by telling your AI what you want to build
|
|
25
|
+
|
|
26
|
+
## The Protocol
|
|
27
|
+
|
|
28
|
+
### Phases
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
PHASE 0: IDEATE → Think about the problem space
|
|
32
|
+
PHASE 1: DEFINE → Requirements, architecture, UX, PRD
|
|
33
|
+
PHASE 2: BUILD → Implementation, deployment
|
|
34
|
+
PHASE 2.5: ITERATE → Post-launch feedback loop
|
|
35
|
+
PHASE 3: CLOSE → Documentation, launch, go-to-market
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Two Tracks
|
|
39
|
+
|
|
40
|
+
| Track | When to Use | What Happens |
|
|
41
|
+
|-------|-------------|--------------|
|
|
42
|
+
| **Grand Line** (Full) | New projects, >1 week scope | All phases in order, full PRD |
|
|
43
|
+
| **East Blue** (Lightweight) | Small features, <1 week | Idea Brief with Mini-PRD, skip to BUILD |
|
|
44
|
+
|
|
45
|
+
### Satellites
|
|
46
|
+
|
|
47
|
+
Satellites are specialized facets of your extended cognition. They activate from conversational context:
|
|
48
|
+
|
|
49
|
+
| Say This... | Satellite Activates | What It Does |
|
|
50
|
+
|-------------|-------------------|--------------|
|
|
51
|
+
| "I'm thinking about..." | **IMU** | Strategic vision, idea mapping, problem framing |
|
|
52
|
+
| "Let's define the requirements" | **Shaka** | PRD creation, scope definition, acceptance criteria |
|
|
53
|
+
| "Design the architecture" | **Pythagoras** | System design, tech decisions, data model |
|
|
54
|
+
| "Map the UX" | **ODA** | User flows, wireframes, design specs |
|
|
55
|
+
| "Build this" | **Edison** | Implementation, coding, all production code |
|
|
56
|
+
| "Review for security issues" | **Lilith Red** | Adversarial review, security audit |
|
|
57
|
+
| "Write tests" | **Lilith Blue** | QA, test suites, edge case coverage |
|
|
58
|
+
| "Deploy this" | **Atlas** | Infrastructure, CI/CD, deployment |
|
|
59
|
+
| "Document this" | **York** | Knowledge capture, changelogs |
|
|
60
|
+
| "Announce this" | **Morgans** | Launch, blog posts, go-to-market |
|
|
61
|
+
|
|
62
|
+
### Governance (Always On)
|
|
63
|
+
|
|
64
|
+
**Buster Call** — Any satellite can halt progress when it identifies critical issues. Severity: CONCERN → WARNING → BUSTER CALL. At BUSTER CALL level, work stops until you resolve it.
|
|
65
|
+
|
|
66
|
+
**Cipher Pol** — Continuous scope monitoring against the approved PRD. Severity: INTEL → ALERT → INTERCEPT. Drift is detected and flagged automatically. You decide whether to approve or reject.
|
|
67
|
+
|
|
68
|
+
### Punk Records (Project Brain)
|
|
69
|
+
|
|
70
|
+
Every project gets a `brain/` directory — git-committed, PR-reviewable:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
brain/
|
|
74
|
+
├── log-pose.md # Where are we? Phase, track, blockers, active work
|
|
75
|
+
├── architecture.md # Tech decisions with rationale
|
|
76
|
+
├── vivre-cards.md # Append-only decision log
|
|
77
|
+
├── ideas.md # Unprocessed idea backlog
|
|
78
|
+
└── prd-*.md # PRD documents (created as needed)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Agent Skills
|
|
82
|
+
|
|
83
|
+
Stella packages satellites into 5 phase-based skills:
|
|
84
|
+
|
|
85
|
+
| Skill | Contains | Activates When |
|
|
86
|
+
|-------|----------|----------------|
|
|
87
|
+
| `stella-protocol` | Orchestrator + IMU | Starting a project, "what's next," phase routing |
|
|
88
|
+
| `stella-define` | Shaka + Pythagoras + ODA | Requirements, architecture, UX, PRDs |
|
|
89
|
+
| `stella-build` | Edison + Atlas | Coding, deploying, implementation |
|
|
90
|
+
| `stella-review` | Lilith Red + Lilith Blue | Code review, security, QA |
|
|
91
|
+
| `stella-close` | York + Morgans | Documentation, launch, go-to-market |
|
|
92
|
+
|
|
93
|
+
Compatible with Claude Code, Cursor, and any tool supporting the Agent Skills open standard.
|
|
94
|
+
|
|
95
|
+
## Philosophy
|
|
96
|
+
|
|
97
|
+
> You are not "talking to an AI agent." You are thinking, and specialized facets of your extended cognition activate to help you execute.
|
|
98
|
+
|
|
99
|
+
Stella inverts the typical framework model. You don't call agents — you think out loud, and the right expertise surfaces. The governance protocols aren't tools you invoke — they're constitutional rules that every satellite enforces.
|
|
100
|
+
|
|
101
|
+
This is a protocol, not a product. The methodology in `protocol/` is human-readable markdown. You can apply it manually without any tooling. The `skills/` layer packages it for AI tools, but the protocol stands on its own.
|
|
102
|
+
|
|
103
|
+
## Project Structure
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
stella-protocol/
|
|
107
|
+
├── protocol/ # The methodology (human-readable markdown)
|
|
108
|
+
│ ├── stella.md # Master protocol
|
|
109
|
+
│ ├── satellites/ # Satellite definitions
|
|
110
|
+
│ ├── governance/ # Buster Call + Cipher Pol
|
|
111
|
+
│ └── tracks/ # Grand Line + East Blue
|
|
112
|
+
├── punk-records/ # Brain directory templates
|
|
113
|
+
├── skills/ # Agent Skills (AI-consumable)
|
|
114
|
+
├── cli/ # CLI installer
|
|
115
|
+
└── docs/ # Documentation
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## License
|
|
119
|
+
|
|
120
|
+
MIT
|
|
121
|
+
|
|
122
|
+
## Author
|
|
123
|
+
|
|
124
|
+
[Aditya Uttama](https://github.com/adityauttama) — Product Manager who builds 100% with AI.
|
package/cli/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const { Command } = require('commander');
|
|
4
|
+
const { version } = require('../package.json');
|
|
5
|
+
|
|
6
|
+
const program = new Command();
|
|
7
|
+
|
|
8
|
+
program
|
|
9
|
+
.name('stella')
|
|
10
|
+
.description('The Stella Protocol — PM-first AI development framework')
|
|
11
|
+
.version(version);
|
|
12
|
+
|
|
13
|
+
program
|
|
14
|
+
.command('install')
|
|
15
|
+
.description('Install Stella Protocol skills and initialize Punk Records')
|
|
16
|
+
.action(async () => {
|
|
17
|
+
const { install } = require('./install');
|
|
18
|
+
await install();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
program
|
|
22
|
+
.command('init')
|
|
23
|
+
.description('Initialize Punk Records (brain/) in the current project')
|
|
24
|
+
.action(async () => {
|
|
25
|
+
const { init } = require('./init');
|
|
26
|
+
await init();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
program
|
|
30
|
+
.command('status')
|
|
31
|
+
.description('Show current project status from Punk Records')
|
|
32
|
+
.action(async () => {
|
|
33
|
+
const { status } = require('./status');
|
|
34
|
+
await status();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
program.parse();
|
package/cli/init.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const { intro, outro, spinner } = require('@clack/prompts');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
|
|
6
|
+
async function init() {
|
|
7
|
+
intro(chalk.bold('Punk Records') + chalk.dim(' — Initialize project brain'));
|
|
8
|
+
|
|
9
|
+
const packageDir = path.resolve(__dirname, '..');
|
|
10
|
+
const brainSource = path.join(packageDir, 'punk-records');
|
|
11
|
+
const brainTarget = path.join(process.cwd(), 'brain');
|
|
12
|
+
|
|
13
|
+
if (fs.existsSync(brainTarget)) {
|
|
14
|
+
const files = await fs.readdir(brainTarget);
|
|
15
|
+
if (files.length > 0) {
|
|
16
|
+
outro(chalk.yellow('brain/ already exists with files. Skipping to avoid overwriting.'));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const s = spinner();
|
|
22
|
+
s.start('Initializing Punk Records...');
|
|
23
|
+
|
|
24
|
+
await fs.ensureDir(brainTarget);
|
|
25
|
+
|
|
26
|
+
const templates = ['log-pose.md', 'architecture.md', 'vivre-cards.md', 'ideas.md'];
|
|
27
|
+
for (const template of templates) {
|
|
28
|
+
const src = path.join(brainSource, template);
|
|
29
|
+
const dest = path.join(brainTarget, template);
|
|
30
|
+
await fs.copy(src, dest);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Replace project name placeholder
|
|
34
|
+
const logPosePath = path.join(brainTarget, 'log-pose.md');
|
|
35
|
+
const logPose = await fs.readFile(logPosePath, 'utf-8');
|
|
36
|
+
const projectName = path.basename(process.cwd());
|
|
37
|
+
await fs.writeFile(logPosePath, logPose.replace('{project-name}', projectName));
|
|
38
|
+
|
|
39
|
+
s.stop('Punk Records initialized');
|
|
40
|
+
|
|
41
|
+
outro(chalk.green('brain/ is ready.') + ' Files: log-pose.md, architecture.md, vivre-cards.md, ideas.md');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
module.exports = { init };
|
package/cli/install.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const { intro, outro, select, confirm, spinner, note } = require('@clack/prompts');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
|
|
6
|
+
const SKILLS = [
|
|
7
|
+
'stella-protocol',
|
|
8
|
+
'stella-define',
|
|
9
|
+
'stella-build',
|
|
10
|
+
'stella-review',
|
|
11
|
+
'stella-close',
|
|
12
|
+
];
|
|
13
|
+
|
|
14
|
+
function detectAITool() {
|
|
15
|
+
const cwd = process.cwd();
|
|
16
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
17
|
+
|
|
18
|
+
// Check for Claude Code
|
|
19
|
+
if (fs.existsSync(path.join(cwd, '.claude')) || fs.existsSync(path.join(home, '.claude'))) {
|
|
20
|
+
return 'claude';
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Check for Cursor
|
|
24
|
+
if (fs.existsSync(path.join(cwd, '.cursor')) || fs.existsSync(path.join(home, '.cursor'))) {
|
|
25
|
+
return 'cursor';
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getSkillsDir(tool, scope) {
|
|
32
|
+
const home = process.env.HOME || process.env.USERPROFILE;
|
|
33
|
+
const cwd = process.cwd();
|
|
34
|
+
|
|
35
|
+
if (tool === 'claude') {
|
|
36
|
+
return scope === 'project'
|
|
37
|
+
? path.join(cwd, '.claude', 'skills')
|
|
38
|
+
: path.join(home, '.claude', 'skills');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (tool === 'cursor') {
|
|
42
|
+
return scope === 'project'
|
|
43
|
+
? path.join(cwd, '.cursor', 'skills')
|
|
44
|
+
: path.join(home, '.cursor', 'skills');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Generic fallback
|
|
48
|
+
return path.join(cwd, '.ai-skills');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function install() {
|
|
52
|
+
intro(chalk.bold('THE STELLA PROTOCOL') + chalk.dim(' — One mind, many satellites.'));
|
|
53
|
+
|
|
54
|
+
// Detect AI tool
|
|
55
|
+
const detected = detectAITool();
|
|
56
|
+
const toolLabel = detected === 'claude' ? 'Claude Code' : detected === 'cursor' ? 'Cursor' : null;
|
|
57
|
+
|
|
58
|
+
if (toolLabel) {
|
|
59
|
+
note(`Detected: ${chalk.green(toolLabel)}`, 'Environment');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const tool = detected || 'claude';
|
|
63
|
+
|
|
64
|
+
// Ask installation scope
|
|
65
|
+
const scope = await select({
|
|
66
|
+
message: 'Where should skills be installed?',
|
|
67
|
+
options: [
|
|
68
|
+
{ value: 'project', label: 'This project', hint: 'recommended' },
|
|
69
|
+
{ value: 'user', label: 'My user profile', hint: 'available in all projects' },
|
|
70
|
+
],
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
if (typeof scope === 'symbol') {
|
|
74
|
+
outro('Installation cancelled.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Ask about Punk Records
|
|
79
|
+
const initBrain = await confirm({
|
|
80
|
+
message: 'Initialize Punk Records (brain/) in this project?',
|
|
81
|
+
initialValue: true,
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
if (typeof initBrain === 'symbol') {
|
|
85
|
+
outro('Installation cancelled.');
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Install skills
|
|
90
|
+
const s = spinner();
|
|
91
|
+
s.start('Installing skills...');
|
|
92
|
+
|
|
93
|
+
const packageDir = path.resolve(__dirname, '..');
|
|
94
|
+
const skillsSource = path.join(packageDir, 'skills');
|
|
95
|
+
const skillsTarget = getSkillsDir(tool, scope);
|
|
96
|
+
|
|
97
|
+
await fs.ensureDir(skillsTarget);
|
|
98
|
+
|
|
99
|
+
for (const skill of SKILLS) {
|
|
100
|
+
const src = path.join(skillsSource, skill);
|
|
101
|
+
const dest = path.join(skillsTarget, skill);
|
|
102
|
+
await fs.copy(src, dest, { overwrite: true });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
s.stop(`${SKILLS.length} skills installed to ${chalk.dim(skillsTarget)}`);
|
|
106
|
+
|
|
107
|
+
// Initialize Punk Records
|
|
108
|
+
if (initBrain) {
|
|
109
|
+
const brainS = spinner();
|
|
110
|
+
brainS.start('Initializing Punk Records...');
|
|
111
|
+
|
|
112
|
+
const brainSource = path.join(packageDir, 'punk-records');
|
|
113
|
+
const brainTarget = path.join(process.cwd(), 'brain');
|
|
114
|
+
|
|
115
|
+
await fs.ensureDir(brainTarget);
|
|
116
|
+
|
|
117
|
+
const templates = ['log-pose.md', 'architecture.md', 'vivre-cards.md', 'ideas.md'];
|
|
118
|
+
for (const template of templates) {
|
|
119
|
+
const src = path.join(brainSource, template);
|
|
120
|
+
const dest = path.join(brainTarget, template);
|
|
121
|
+
if (!fs.existsSync(dest)) {
|
|
122
|
+
await fs.copy(src, dest);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Replace project name placeholder in log-pose
|
|
127
|
+
const logPosePath = path.join(brainTarget, 'log-pose.md');
|
|
128
|
+
const logPose = await fs.readFile(logPosePath, 'utf-8');
|
|
129
|
+
const projectName = path.basename(process.cwd());
|
|
130
|
+
await fs.writeFile(logPosePath, logPose.replace('{project-name}', projectName));
|
|
131
|
+
|
|
132
|
+
brainS.stop(`Punk Records initialized at ${chalk.dim(brainTarget)}`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
outro(chalk.green('Ready.') + ' Start by telling your AI what you want to build.');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
module.exports = { install };
|
package/cli/status.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
|
|
5
|
+
async function status() {
|
|
6
|
+
const brainDir = path.join(process.cwd(), 'brain');
|
|
7
|
+
const logPosePath = path.join(brainDir, 'log-pose.md');
|
|
8
|
+
|
|
9
|
+
if (!fs.existsSync(logPosePath)) {
|
|
10
|
+
console.log(chalk.yellow('No brain/log-pose.md found.'));
|
|
11
|
+
console.log('Run ' + chalk.bold('stella init') + ' to initialize Punk Records.');
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const content = await fs.readFile(logPosePath, 'utf-8');
|
|
16
|
+
|
|
17
|
+
// Parse frontmatter
|
|
18
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
19
|
+
if (fmMatch) {
|
|
20
|
+
const fm = fmMatch[1];
|
|
21
|
+
const lines = fm.split('\n').filter(Boolean);
|
|
22
|
+
|
|
23
|
+
console.log(chalk.bold('\n THE STELLA PROTOCOL — Project Status\n'));
|
|
24
|
+
|
|
25
|
+
for (const line of lines) {
|
|
26
|
+
const [key, ...valueParts] = line.split(':');
|
|
27
|
+
const value = valueParts.join(':').trim();
|
|
28
|
+
if (key && value) {
|
|
29
|
+
const label = key.trim().replace(/"/g, '');
|
|
30
|
+
console.log(` ${chalk.dim(label + ':')} ${value}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
console.log('');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Print body (skip frontmatter)
|
|
37
|
+
const body = content.replace(/^---\n[\s\S]*?\n---\n*/, '');
|
|
38
|
+
console.log(body);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
module.exports = { status };
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "stella-protocol",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "PM-first AI development protocol. One mind, many satellites.",
|
|
5
|
+
"bin": {
|
|
6
|
+
"stella": "./cli/index.js"
|
|
7
|
+
},
|
|
8
|
+
"files": [
|
|
9
|
+
"protocol/",
|
|
10
|
+
"punk-records/",
|
|
11
|
+
"skills/",
|
|
12
|
+
"cli/",
|
|
13
|
+
".claude-plugin/"
|
|
14
|
+
],
|
|
15
|
+
"keywords": [
|
|
16
|
+
"ai",
|
|
17
|
+
"agent-skills",
|
|
18
|
+
"product-management",
|
|
19
|
+
"development-methodology",
|
|
20
|
+
"stella-protocol",
|
|
21
|
+
"ai-native",
|
|
22
|
+
"pm-tools"
|
|
23
|
+
],
|
|
24
|
+
"author": {
|
|
25
|
+
"name": "Aditya Uttama",
|
|
26
|
+
"url": "https://github.com/adityauttama"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/adityauttama/stella-protocol.git"
|
|
32
|
+
},
|
|
33
|
+
"homepage": "https://github.com/adityauttama/stella-protocol",
|
|
34
|
+
"engines": {
|
|
35
|
+
"node": ">=20.0.0"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"commander": "^14.0.0",
|
|
39
|
+
"@clack/prompts": "^1.0.0",
|
|
40
|
+
"chalk": "^4.1.2",
|
|
41
|
+
"fs-extra": "^11.3.0"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Buster Call — Veto Protocol
|
|
2
|
+
|
|
3
|
+
> The power to stop everything when something is critically wrong.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Buster Call is the Stella Protocol's veto mechanism. Any satellite can issue a Buster Call when it identifies an issue that could compromise the project's integrity, security, or viability.
|
|
8
|
+
|
|
9
|
+
Unlike optional review tools, Buster Call is **always active**. Every satellite has the authority and responsibility to flag critical issues.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Severity Levels
|
|
14
|
+
|
|
15
|
+
### CONCERN
|
|
16
|
+
- **Impact:** Low. Something worth noting but not blocking.
|
|
17
|
+
- **Action:** Log to `brain/vivre-cards.md`. Work continues.
|
|
18
|
+
- **Example:** A dependency has a newer major version available.
|
|
19
|
+
|
|
20
|
+
### WARNING
|
|
21
|
+
- **Impact:** Medium. A real issue that Stella should weigh in on.
|
|
22
|
+
- **Action:** Flag to Stella with recommendation. Work continues pending response.
|
|
23
|
+
- **Stella response:** Acknowledge, adjust, or dismiss with reasoning.
|
|
24
|
+
- **Example:** The proposed data model doesn't account for a likely future requirement.
|
|
25
|
+
|
|
26
|
+
### BUSTER CALL
|
|
27
|
+
- **Impact:** Critical. Proceeding would cause serious harm.
|
|
28
|
+
- **Action:** Work stops immediately. Satellite refuses to proceed.
|
|
29
|
+
- **Stella response required:** Must resolve, adjust approach, or explicitly override.
|
|
30
|
+
- **Example:** SQL injection vulnerability in production code. Auth bypass in API. PRD contradicts legal requirements.
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## Format
|
|
35
|
+
|
|
36
|
+
When issuing a Buster Call at any severity:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
⚠️ [SEVERITY] — [SATELLITE NAME]
|
|
40
|
+
Issue: [specific problem identified]
|
|
41
|
+
Impact: [what breaks or degrades if we proceed]
|
|
42
|
+
Recommendation: [what to do instead]
|
|
43
|
+
Status: Awaiting Stella's decision.
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## Override
|
|
49
|
+
|
|
50
|
+
Stella can override any Buster Call, including BUSTER CALL severity:
|
|
51
|
+
|
|
52
|
+
```
|
|
53
|
+
Override — [reason for proceeding despite the finding]
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Overrides are logged to `brain/vivre-cards.md` with timestamp and reasoning. Satellites respect the override and proceed.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Who Can Issue
|
|
61
|
+
|
|
62
|
+
Every satellite has Buster Call authority. The most common issuers:
|
|
63
|
+
|
|
64
|
+
- **Lilith Red** — Security vulnerabilities, abuse vectors, privacy risks
|
|
65
|
+
- **Shaka** — Scope contradictions, requirement conflicts
|
|
66
|
+
- **Pythagoras** — Architecture problems, scaling bottlenecks
|
|
67
|
+
- **Lilith Blue** — Test coverage gaps, untestable code
|
|
68
|
+
- **Edison** — Implementation impossibilities, technical debt traps
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Phase Gates
|
|
73
|
+
|
|
74
|
+
Buster Call status is checked at every phase transition. The orchestrator will not approve a phase transition if any unresolved BUSTER CALL exists. WARNINGS and CONCERNS do not block transitions but are surfaced for awareness.
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Cipher Pol — Scope Enforcement Protocol
|
|
2
|
+
|
|
3
|
+
> Silent watchers that ensure no one drifts from the mission.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
Cipher Pol is the Stella Protocol's scope enforcement mechanism. It continuously monitors all satellite work against the approved PRD (Road Poneglyph) to detect and flag scope drift.
|
|
8
|
+
|
|
9
|
+
Unlike a review you invoke, Cipher Pol is **always active**. Every satellite that produces or modifies artifacts checks its work against the approved scope.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## How It Works
|
|
14
|
+
|
|
15
|
+
1. Every satellite reads the active PRD before beginning work
|
|
16
|
+
2. As work progresses, the satellite continuously compares output against PRD scope
|
|
17
|
+
3. When drift is detected, it is classified by severity and flagged
|
|
18
|
+
4. Stella decides whether to approve the drift, reject it, or amend the PRD
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Severity Levels
|
|
23
|
+
|
|
24
|
+
### INTEL
|
|
25
|
+
- **Drift:** Minor. Within the spirit of the PRD but not explicitly specified.
|
|
26
|
+
- **Action:** Noted in `brain/log-pose.md` under Cipher Pol Report. Work continues.
|
|
27
|
+
- **Example:** Adding a loading spinner not mentioned in the PRD.
|
|
28
|
+
|
|
29
|
+
### ALERT
|
|
30
|
+
- **Drift:** Moderate. A meaningful addition or change to the approved scope.
|
|
31
|
+
- **Action:** Flagged to Stella. Work continues only if Stella approves.
|
|
32
|
+
- **Stella response:** Approve (continue), reject (revert), or amend PRD.
|
|
33
|
+
- **Example:** Adding an export feature not in the PRD but related to existing functionality.
|
|
34
|
+
|
|
35
|
+
### INTERCEPT
|
|
36
|
+
- **Drift:** Significant. A new feature, major UX change, or architectural shift.
|
|
37
|
+
- **Action:** Blocked. Cannot proceed without PRD amendment.
|
|
38
|
+
- **Stella response:** Must create a PRD amendment before work continues.
|
|
39
|
+
- **Example:** Adding a user roles system when the PRD specifies single-user only.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Format
|
|
44
|
+
|
|
45
|
+
When flagging scope drift:
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
🔍 CIPHER POL [SEVERITY]
|
|
49
|
+
Drift: [what's being added/changed]
|
|
50
|
+
PRD says: [what the approved scope specifies]
|
|
51
|
+
Gap: [the delta between approved and proposed]
|
|
52
|
+
Recommendation: [approve / reject / amend PRD]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## PRD Amendments
|
|
58
|
+
|
|
59
|
+
When scope drift is approved, it must be formalized:
|
|
60
|
+
|
|
61
|
+
1. Append an amendment to the existing PRD with date, rationale, and change description
|
|
62
|
+
2. Log the amendment decision in `brain/vivre-cards.md`
|
|
63
|
+
3. Update `brain/log-pose.md` to reflect the expanded scope
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## The 30% Rule
|
|
68
|
+
|
|
69
|
+
When accumulated amendments represent more than ~30% new surface area beyond the original PRD, Cipher Pol recommends returning to the DEFINE phase for a full PRD v2. This prevents scope from growing unbounded through incremental drift.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## When Cipher Pol Is Not Active
|
|
74
|
+
|
|
75
|
+
- **IDEATE phase** — No PRD exists yet. Scope enforcement doesn't apply.
|
|
76
|
+
- **East Blue track before PRD** — If working from a Mini-PRD, Cipher Pol monitors against that.
|
|
77
|
+
- **Explicit exploration** — If Stella says "explore freely," Cipher Pol logs but does not flag.
|