prjct-cli 3.46.0 → 3.47.1
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/CHANGELOG.md +30 -0
- package/LICENSE +2 -2
- package/NOTICE +25 -0
- package/README.md +6 -2
- package/dist/bin/prjct-core.mjs +548 -543
- package/dist/bin/prjct-hooks.mjs +269 -264
- package/dist/bin/prjct.mjs +2 -2
- package/dist/daemon/entry.mjs +441 -436
- package/dist/mcp/server.mjs +348 -343
- package/dist/templates.json +1 -1
- package/package.json +18 -2
- package/templates/antigravity/SKILL.md +1 -0
- package/templates/codex/SKILL.md +1 -0
- package/templates/global/ANTIGRAVITY.md +1 -0
- package/templates/global/GEMINI.md +1 -0
- package/templates/global/STORAGE-SPEC.md +0 -327
- package/templates/planning-methodology-deep.md +0 -195
- package/templates/sdd-canonical-sequence.md +0 -85
- package/templates/spec-reviewer-rubrics/architecture.md +0 -47
- package/templates/spec-reviewer-rubrics/design.md +0 -38
- package/templates/spec-reviewer-rubrics/strategic.md +0 -32
- package/templates/spec-template.md +0 -97
- /package/templates/crew/{CLAUDE-leader-mode.md → leader-mode.md} +0 -0
- /package/templates/crew/{agents → roles}/implementer.md +0 -0
- /package/templates/crew/{agents → roles}/leader.md +0 -0
- /package/templates/crew/{agents → roles}/reviewer.md +0 -0
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
# Storage Specification
|
|
2
|
-
|
|
3
|
-
**Canonical specification for prjct storage format.**
|
|
4
|
-
|
|
5
|
-
All storage is managed by the `prjct` CLI which uses SQLite (`prjct.db`) internally. **NEVER read or write JSON storage files directly. Use `prjct` CLI commands for all storage operations.**
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Current Storage: SQLite (prjct.db)
|
|
10
|
-
|
|
11
|
-
All reads and writes go through the `prjct` CLI, which manages a SQLite database (`prjct.db`) with WAL mode for safe concurrent access.
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
~/.prjct-cli/projects/{projectId}/
|
|
15
|
-
├── prjct.db # SQLite database (SOURCE OF TRUTH for all storage)
|
|
16
|
-
├── context/
|
|
17
|
-
│ ├── now.md # Current task (generated from prjct.db)
|
|
18
|
-
│ └── next.md # Queue (generated from prjct.db)
|
|
19
|
-
├── config/
|
|
20
|
-
│ └── skills.json # Agent-to-skill mappings
|
|
21
|
-
├── agents/ # Domain specialists (auto-generated)
|
|
22
|
-
└── sync/
|
|
23
|
-
└── pending.json # Events for backend sync
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### How to interact with storage
|
|
27
|
-
|
|
28
|
-
- **Read state**: Use `prjct status`, `prjct context`, or MCP project tools
|
|
29
|
-
- **Write state**: Use `prjct` CLI commands (`task`, `status`, `capture`, `remember`, etc.)
|
|
30
|
-
- **Issue tracker setup**: Configure Linear/Jira MCP servers in the AI client; prjct has no native tracker CLI verbs
|
|
31
|
-
- **Never** read/write JSON files in `storage/` or `memory/` directories
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
## LEGACY JSON Schemas (for reference only)
|
|
36
|
-
|
|
37
|
-
> **WARNING**: These JSON schemas are LEGACY documentation only. The `storage/` and `memory/` directories are no longer used. All data lives in `prjct.db` (SQLite). Do NOT read or write these files.
|
|
38
|
-
|
|
39
|
-
### state.json (LEGACY)
|
|
40
|
-
|
|
41
|
-
```json
|
|
42
|
-
{
|
|
43
|
-
"task": {
|
|
44
|
-
"id": "uuid-v4",
|
|
45
|
-
"title": "string",
|
|
46
|
-
"type": "feature|bug|improvement|refactor|chore",
|
|
47
|
-
"status": "active|paused|done",
|
|
48
|
-
"branch": "string|null",
|
|
49
|
-
"subtasks": [
|
|
50
|
-
{
|
|
51
|
-
"id": "uuid-v4",
|
|
52
|
-
"title": "string",
|
|
53
|
-
"status": "pending|done"
|
|
54
|
-
}
|
|
55
|
-
],
|
|
56
|
-
"currentSubtask": 0,
|
|
57
|
-
"createdAt": "2024-01-15T10:30:00.000Z",
|
|
58
|
-
"updatedAt": "2024-01-15T10:30:00.000Z"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Empty state (no active task):**
|
|
64
|
-
```json
|
|
65
|
-
{
|
|
66
|
-
"task": null
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### queue.json (LEGACY)
|
|
71
|
-
|
|
72
|
-
```json
|
|
73
|
-
{
|
|
74
|
-
"tasks": [
|
|
75
|
-
{
|
|
76
|
-
"id": "uuid-v4",
|
|
77
|
-
"title": "string",
|
|
78
|
-
"type": "feature|bug|improvement|refactor|chore",
|
|
79
|
-
"priority": 1,
|
|
80
|
-
"createdAt": "2024-01-15T10:30:00.000Z"
|
|
81
|
-
}
|
|
82
|
-
],
|
|
83
|
-
"updatedAt": "2024-01-15T10:30:00.000Z"
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### shipped.json (LEGACY)
|
|
88
|
-
|
|
89
|
-
```json
|
|
90
|
-
{
|
|
91
|
-
"features": [
|
|
92
|
-
{
|
|
93
|
-
"id": "uuid-v4",
|
|
94
|
-
"name": "string",
|
|
95
|
-
"version": "1.0.0",
|
|
96
|
-
"type": "feature|bug|improvement|refactor|chore",
|
|
97
|
-
"shippedAt": "2024-01-15T10:30:00.000Z"
|
|
98
|
-
}
|
|
99
|
-
],
|
|
100
|
-
"updatedAt": "2024-01-15T10:30:00.000Z"
|
|
101
|
-
}
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### events.jsonl (LEGACY - now stored in SQLite `events` table)
|
|
105
|
-
|
|
106
|
-
Previously append-only JSONL. Now stored in SQLite.
|
|
107
|
-
|
|
108
|
-
```jsonl
|
|
109
|
-
{"type":"task.created","timestamp":"2024-01-15T10:30:00.000Z","data":{"taskId":"uuid","title":"string"}}
|
|
110
|
-
{"type":"task.started","timestamp":"2024-01-15T10:30:00.000Z","data":{"taskId":"uuid"}}
|
|
111
|
-
{"type":"subtask.completed","timestamp":"2024-01-15T10:35:00.000Z","data":{"taskId":"uuid","subtaskIndex":0}}
|
|
112
|
-
{"type":"task.completed","timestamp":"2024-01-15T10:40:00.000Z","data":{"taskId":"uuid"}}
|
|
113
|
-
{"type":"feature.shipped","timestamp":"2024-01-15T10:45:00.000Z","data":{"featureId":"uuid","name":"string","version":"1.0.0"}}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
**Event Types:**
|
|
117
|
-
- `task.created` - New task created
|
|
118
|
-
- `task.started` - Task activated
|
|
119
|
-
- `task.paused` - Task paused
|
|
120
|
-
- `task.resumed` - Task resumed
|
|
121
|
-
- `task.completed` - Task completed
|
|
122
|
-
- `subtask.completed` - Subtask completed
|
|
123
|
-
- `feature.shipped` - Feature shipped
|
|
124
|
-
|
|
125
|
-
### learnings.jsonl (LEGACY - now stored in SQLite)
|
|
126
|
-
|
|
127
|
-
Previously used for LLM-to-LLM knowledge transfer. Now stored in SQLite.
|
|
128
|
-
|
|
129
|
-
```jsonl
|
|
130
|
-
{"taskId":"uuid","linearId":"PRJ-123","timestamp":"2024-01-15T10:40:00.000Z","learnings":{"patterns":["Use NestedContextResolver for hierarchical discovery"],"approaches":["Mirror existing method structure when extending"],"decisions":["Extended class rather than wrapper for consistency"],"gotchas":["Must handle null parent case"]},"value":{"type":"feature","impact":"high","description":"Hierarchical AGENTS.md support for monorepos"},"filesChanged":["core/resolver.ts","core/types.ts"],"tags":["agents","hierarchy","monorepo"]}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
**Schema:**
|
|
134
|
-
```json
|
|
135
|
-
{
|
|
136
|
-
"taskId": "uuid-v4",
|
|
137
|
-
"linearId": "string|null",
|
|
138
|
-
"timestamp": "2024-01-15T10:40:00.000Z",
|
|
139
|
-
"learnings": {
|
|
140
|
-
"patterns": ["string"],
|
|
141
|
-
"approaches": ["string"],
|
|
142
|
-
"decisions": ["string"],
|
|
143
|
-
"gotchas": ["string"]
|
|
144
|
-
},
|
|
145
|
-
"value": {
|
|
146
|
-
"type": "feature|bugfix|performance|dx|refactor|infrastructure",
|
|
147
|
-
"impact": "high|medium|low",
|
|
148
|
-
"description": "string"
|
|
149
|
-
},
|
|
150
|
-
"filesChanged": ["string"],
|
|
151
|
-
"tags": ["string"]
|
|
152
|
-
}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**Why Local Cache**: Enables future semantic retrieval without API latency. Will feed into vector DB for cross-session knowledge transfer.
|
|
156
|
-
|
|
157
|
-
### skills.json
|
|
158
|
-
|
|
159
|
-
```json
|
|
160
|
-
{
|
|
161
|
-
"mappings": {
|
|
162
|
-
"frontend.md": ["frontend-design"],
|
|
163
|
-
"backend.md": ["javascript-typescript"],
|
|
164
|
-
"testing.md": ["developer-kit"]
|
|
165
|
-
},
|
|
166
|
-
"updatedAt": "2024-01-15T10:30:00.000Z"
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
### pending.json (sync queue)
|
|
171
|
-
|
|
172
|
-
```json
|
|
173
|
-
{
|
|
174
|
-
"events": [
|
|
175
|
-
{
|
|
176
|
-
"id": "uuid-v4",
|
|
177
|
-
"type": "task.created",
|
|
178
|
-
"timestamp": "2024-01-15T10:30:00.000Z",
|
|
179
|
-
"data": {},
|
|
180
|
-
"synced": false
|
|
181
|
-
}
|
|
182
|
-
],
|
|
183
|
-
"lastSync": "2024-01-15T10:30:00.000Z"
|
|
184
|
-
}
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## Formatting Rules (MANDATORY)
|
|
190
|
-
|
|
191
|
-
All agents MUST follow these rules for cross-agent compatibility:
|
|
192
|
-
|
|
193
|
-
| Rule | Value |
|
|
194
|
-
|------|-------|
|
|
195
|
-
| JSON indentation | 2 spaces |
|
|
196
|
-
| Trailing commas | NEVER |
|
|
197
|
-
| Key ordering | Logical (as shown in schemas above) |
|
|
198
|
-
| Timestamps | ISO-8601 with milliseconds (`.000Z`) |
|
|
199
|
-
| UUIDs | v4 format (lowercase) |
|
|
200
|
-
| Line endings | LF (not CRLF) |
|
|
201
|
-
| File encoding | UTF-8 without BOM |
|
|
202
|
-
| Empty objects | `{}` |
|
|
203
|
-
| Empty arrays | `[]` |
|
|
204
|
-
| Null values | `null` (lowercase) |
|
|
205
|
-
|
|
206
|
-
### Timestamp Generation
|
|
207
|
-
|
|
208
|
-
```bash
|
|
209
|
-
# ALWAYS use dynamic timestamps, NEVER hardcode
|
|
210
|
-
bun -e "console.log(new Date().toISOString())" 2>/dev/null || node -e "console.log(new Date().toISOString())"
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
### UUID Generation
|
|
214
|
-
|
|
215
|
-
```bash
|
|
216
|
-
# ALWAYS generate fresh UUIDs
|
|
217
|
-
bun -e "console.log(crypto.randomUUID())" 2>/dev/null || node -e "console.log(require('crypto').randomUUID())"
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## Write Rules (CRITICAL)
|
|
223
|
-
|
|
224
|
-
### Direct Writes Only
|
|
225
|
-
|
|
226
|
-
**NEVER use temporary files** - Write directly to final destination:
|
|
227
|
-
|
|
228
|
-
```
|
|
229
|
-
WRONG: Create `.tmp/file.json`, then `mv` to final path
|
|
230
|
-
CORRECT: Use prjctDb.setDoc() or StorageManager.write() to write to SQLite
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
### Atomic Updates
|
|
234
|
-
|
|
235
|
-
All writes go through SQLite which handles atomicity via WAL mode:
|
|
236
|
-
```typescript
|
|
237
|
-
// StorageManager pattern (preferred):
|
|
238
|
-
await stateStorage.update(projectId, (state) => {
|
|
239
|
-
state.field = newValue
|
|
240
|
-
return state
|
|
241
|
-
})
|
|
242
|
-
|
|
243
|
-
// Direct kv_store pattern:
|
|
244
|
-
prjctDb.setDoc(projectId, 'key', data)
|
|
245
|
-
```
|
|
246
|
-
|
|
247
|
-
### NEVER Do These
|
|
248
|
-
|
|
249
|
-
- Read or write JSON files in `storage/` or `memory/` directories
|
|
250
|
-
- Use `.tmp/` directories
|
|
251
|
-
- Use `mv` or `rename` operations for storage files
|
|
252
|
-
- Create backup files like `*.bak` or `*.old`
|
|
253
|
-
- Bypass `prjct` CLI to write directly to `prjct.db`
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
## Cross-Agent Compatibility
|
|
258
|
-
|
|
259
|
-
### Why This Matters
|
|
260
|
-
|
|
261
|
-
1. **User freedom**: Switch between Claude and Gemini freely
|
|
262
|
-
2. **Remote sync**: Storage will sync to prjct.app backend
|
|
263
|
-
3. **Single truth**: Both agents produce identical output
|
|
264
|
-
|
|
265
|
-
### Verification Test
|
|
266
|
-
|
|
267
|
-
```bash
|
|
268
|
-
# Start work with Claude
|
|
269
|
-
p. work "add feature X"
|
|
270
|
-
|
|
271
|
-
# Switch to Gemini, continue
|
|
272
|
-
prjct work --md # Should work seamlessly
|
|
273
|
-
|
|
274
|
-
# Switch back to Claude
|
|
275
|
-
p. ship # Should read Gemini's changes correctly
|
|
276
|
-
|
|
277
|
-
# All agents read from the same prjct.db via CLI commands
|
|
278
|
-
prjct status # Works from any agent
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
### Remote Sync Flow
|
|
282
|
-
|
|
283
|
-
```
|
|
284
|
-
Local Storage: prjct.db (Claude/Gemini)
|
|
285
|
-
↓
|
|
286
|
-
sync/pending.json (events queue)
|
|
287
|
-
↓
|
|
288
|
-
prjct.app API
|
|
289
|
-
↓
|
|
290
|
-
Global Remote Storage
|
|
291
|
-
↓
|
|
292
|
-
Any device, any agent
|
|
293
|
-
```
|
|
294
|
-
|
|
295
|
-
---
|
|
296
|
-
|
|
297
|
-
## MCP Issue Tracker Strategy
|
|
298
|
-
|
|
299
|
-
Issue tracker integrations are MCP-only.
|
|
300
|
-
|
|
301
|
-
### Rules
|
|
302
|
-
|
|
303
|
-
- `prjct` CLI does not call Linear/Jira SDKs or REST APIs directly.
|
|
304
|
-
- Issue operations (`sync`, `list`, `get`, `start`, `done`, `update`, etc.) are delegated to MCP tools in the AI client.
|
|
305
|
-
- `p. sync` refreshes project context and agent artifacts, not issue tracker payloads.
|
|
306
|
-
- Local storage keeps task linkage metadata (for example `linearId`) and project workflow state in SQLite.
|
|
307
|
-
|
|
308
|
-
### Setup
|
|
309
|
-
|
|
310
|
-
Configure Linear/Jira MCP servers in the AI client when issue tracker access is needed.
|
|
311
|
-
|
|
312
|
-
### Operational Model
|
|
313
|
-
|
|
314
|
-
```
|
|
315
|
-
AI client MCP tools <-> Linear/Jira
|
|
316
|
-
|
|
|
317
|
-
v
|
|
318
|
-
prjct workflow state (prjct.db)
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
The CLI remains the source of truth for local project/task state.
|
|
322
|
-
Issue-system mutations happen through MCP operations in the active AI session.
|
|
323
|
-
|
|
324
|
-
---
|
|
325
|
-
|
|
326
|
-
**Version**: 2.0.0
|
|
327
|
-
**Last Updated**: 2026-02-10
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
# Software Planning Methodology for prjct
|
|
2
|
-
|
|
3
|
-
This methodology guides the AI through developing ideas into complete technical specifications.
|
|
4
|
-
|
|
5
|
-
## Phase 1: Discovery & Problem Definition
|
|
6
|
-
|
|
7
|
-
### Questions to Ask
|
|
8
|
-
- What specific problem does this solve?
|
|
9
|
-
- Who is the target user?
|
|
10
|
-
- What's the budget and timeline?
|
|
11
|
-
- What happens if this problem isn't solved?
|
|
12
|
-
|
|
13
|
-
### Output
|
|
14
|
-
- Problem statement
|
|
15
|
-
- User personas
|
|
16
|
-
- Business constraints
|
|
17
|
-
- Success metrics
|
|
18
|
-
|
|
19
|
-
## Phase 2: User Flows & Journeys
|
|
20
|
-
|
|
21
|
-
### Process
|
|
22
|
-
1. Map primary user journey
|
|
23
|
-
2. Identify entry points
|
|
24
|
-
3. Define success states
|
|
25
|
-
4. Document error states
|
|
26
|
-
5. Note edge cases
|
|
27
|
-
|
|
28
|
-
### Jobs-to-be-Done
|
|
29
|
-
When [situation], I want to [motivation], so I can [expected outcome]
|
|
30
|
-
|
|
31
|
-
## Phase 3: Domain Modeling
|
|
32
|
-
|
|
33
|
-
### Entity Definition
|
|
34
|
-
For each entity, define:
|
|
35
|
-
- Description
|
|
36
|
-
- Attributes (name, type, constraints)
|
|
37
|
-
- Relationships
|
|
38
|
-
- Business rules
|
|
39
|
-
- Lifecycle states
|
|
40
|
-
|
|
41
|
-
### Bounded Contexts
|
|
42
|
-
Group entities into logical boundaries with:
|
|
43
|
-
- Owned entities
|
|
44
|
-
- External dependencies
|
|
45
|
-
- Events published/consumed
|
|
46
|
-
|
|
47
|
-
## Phase 4: API Contract Design
|
|
48
|
-
|
|
49
|
-
### Style Selection
|
|
50
|
-
| Style | Best For |
|
|
51
|
-
|----------|----------|
|
|
52
|
-
| REST | Simple CRUD, broad compatibility |
|
|
53
|
-
| GraphQL | Complex data requirements |
|
|
54
|
-
| tRPC | Full-stack TypeScript |
|
|
55
|
-
| gRPC | Microservices |
|
|
56
|
-
|
|
57
|
-
### Endpoint Specification
|
|
58
|
-
- Method/Type
|
|
59
|
-
- Path/Name
|
|
60
|
-
- Authentication
|
|
61
|
-
- Input/Output schemas
|
|
62
|
-
- Error responses
|
|
63
|
-
|
|
64
|
-
## Phase 5: System Architecture
|
|
65
|
-
|
|
66
|
-
### Pattern Selection
|
|
67
|
-
| Pattern | Best For |
|
|
68
|
-
|---------|----------|
|
|
69
|
-
| Modular Monolith | Small team, fast iteration |
|
|
70
|
-
| Serverless-First | Variable load, event-driven |
|
|
71
|
-
| Microservices | Large team, complex domain |
|
|
72
|
-
|
|
73
|
-
### C4 Model
|
|
74
|
-
1. Context - System and external actors
|
|
75
|
-
2. Container - Major components
|
|
76
|
-
3. Component - Internal structure
|
|
77
|
-
|
|
78
|
-
## Phase 6: Data Architecture
|
|
79
|
-
|
|
80
|
-
### Database Selection
|
|
81
|
-
| Type | Options | Best For |
|
|
82
|
-
|------|---------|----------|
|
|
83
|
-
| Relational | PostgreSQL | ACID, structured data |
|
|
84
|
-
| Document | MongoDB | Flexible schema |
|
|
85
|
-
| Key-Value | Redis | Caching, sessions |
|
|
86
|
-
|
|
87
|
-
### Schema Design
|
|
88
|
-
- Tables and columns
|
|
89
|
-
- Indexes
|
|
90
|
-
- Constraints
|
|
91
|
-
- Relationships
|
|
92
|
-
|
|
93
|
-
## Phase 7: Tech Stack Decision
|
|
94
|
-
|
|
95
|
-
### Frontend Stack
|
|
96
|
-
- Framework (Next.js, Remix, SvelteKit)
|
|
97
|
-
- Styling (Tailwind, CSS Modules)
|
|
98
|
-
- State management (Zustand, Jotai)
|
|
99
|
-
- Data fetching (TanStack Query, SWR)
|
|
100
|
-
|
|
101
|
-
### Backend Stack
|
|
102
|
-
- Runtime (Node.js, Bun)
|
|
103
|
-
- Framework (Next.js API, Hono)
|
|
104
|
-
- ORM (Drizzle, Prisma)
|
|
105
|
-
- Validation (Zod, Valibot)
|
|
106
|
-
|
|
107
|
-
### Infrastructure
|
|
108
|
-
- Hosting (Vercel, Railway, Fly.io)
|
|
109
|
-
- Database (Neon, PlanetScale)
|
|
110
|
-
- Cache (Upstash, Redis)
|
|
111
|
-
- Monitoring (Sentry, Axiom)
|
|
112
|
-
|
|
113
|
-
## Phase 8: Implementation Roadmap
|
|
114
|
-
|
|
115
|
-
### MVP Scope Definition
|
|
116
|
-
- Must-have features (P0)
|
|
117
|
-
- Should-have features (P1)
|
|
118
|
-
- Nice-to-have features (P2)
|
|
119
|
-
- Future considerations (P3)
|
|
120
|
-
|
|
121
|
-
### Development Phases
|
|
122
|
-
1. Foundation - Setup, core infrastructure
|
|
123
|
-
2. Core Features - Primary functionality
|
|
124
|
-
3. Polish & Launch - Optimization, deployment
|
|
125
|
-
|
|
126
|
-
### Risk Assessment
|
|
127
|
-
- Technical risks and mitigation
|
|
128
|
-
- Business risks and mitigation
|
|
129
|
-
- Dependencies and assumptions
|
|
130
|
-
|
|
131
|
-
## Output Structure
|
|
132
|
-
|
|
133
|
-
When complete, generate:
|
|
134
|
-
|
|
135
|
-
1. **Executive Summary** - Problem, solution, key decisions
|
|
136
|
-
2. **Architecture Documents** - All phases detailed
|
|
137
|
-
3. **Implementation Plan** - Prioritized tasks with estimates
|
|
138
|
-
4. **Decision Log** - Key choices and reasoning
|
|
139
|
-
|
|
140
|
-
## Interactive Development Process
|
|
141
|
-
|
|
142
|
-
1. **Classification**: Determine if idea needs full architecture
|
|
143
|
-
2. **Discovery**: Ask clarifying questions
|
|
144
|
-
3. **Generation**: Create architecture phase by phase
|
|
145
|
-
4. **Validation**: Review with user at key points
|
|
146
|
-
5. **Refinement**: Iterate based on feedback
|
|
147
|
-
6. **Output**: Save complete specification
|
|
148
|
-
|
|
149
|
-
## Success Criteria
|
|
150
|
-
|
|
151
|
-
A complete architecture includes:
|
|
152
|
-
- Clear problem definition
|
|
153
|
-
- User flows mapped
|
|
154
|
-
- Domain model defined
|
|
155
|
-
- API contracts specified
|
|
156
|
-
- Tech stack chosen
|
|
157
|
-
- Database schema designed
|
|
158
|
-
- Implementation roadmap created
|
|
159
|
-
- Risk assessment completed
|
|
160
|
-
|
|
161
|
-
## Templates
|
|
162
|
-
|
|
163
|
-
### Entity Template
|
|
164
|
-
```
|
|
165
|
-
Entity: [Name]
|
|
166
|
-
├── Description: [What it represents]
|
|
167
|
-
├── Attributes:
|
|
168
|
-
│ ├── id: uuid (primary key)
|
|
169
|
-
│ └── [field]: [type] ([constraints])
|
|
170
|
-
├── Relationships: [connections]
|
|
171
|
-
├── Rules: [invariants]
|
|
172
|
-
└── States: [lifecycle]
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
### API Endpoint Template
|
|
176
|
-
```
|
|
177
|
-
Operation: [Name]
|
|
178
|
-
├── Method: [GET/POST/PUT/DELETE]
|
|
179
|
-
├── Path: [/api/resource]
|
|
180
|
-
├── Auth: [Required/Optional]
|
|
181
|
-
├── Input: {schema}
|
|
182
|
-
├── Output: {schema}
|
|
183
|
-
└── Errors: [codes and descriptions]
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Phase Template
|
|
187
|
-
```
|
|
188
|
-
Phase: [Name]
|
|
189
|
-
├── Duration: [timeframe]
|
|
190
|
-
├── Tasks:
|
|
191
|
-
│ ├── [Task 1]
|
|
192
|
-
│ └── [Task 2]
|
|
193
|
-
├── Deliverable: [outcome]
|
|
194
|
-
└── Dependencies: [prerequisites]
|
|
195
|
-
```
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
# SDD canonical sequence — prjct
|
|
2
|
-
|
|
3
|
-
Spec-Driven Development is prjct's default flow for substantive work. The six stations:
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
spec ─→ audit-spec ─→ task (--spec <id>) ─→ implement ─→ ship (acceptance gate)
|
|
7
|
-
└─→ remember learning
|
|
8
|
-
```
|
|
9
|
-
|
|
10
|
-
## Stations
|
|
11
|
-
|
|
12
|
-
### 1. `spec`
|
|
13
|
-
|
|
14
|
-
The user describes a feature, fix, or initiative WITH goals or stakes. You don't run `task` yet. You run `prjct spec "<title>"` and walk the forcing questions:
|
|
15
|
-
|
|
16
|
-
- goal (1–3 sentences)
|
|
17
|
-
- eli10 (2–4 sentences)
|
|
18
|
-
- stakes if we ship the wrong thing
|
|
19
|
-
- acceptance criteria (testable, observable list)
|
|
20
|
-
- scope (what's IN)
|
|
21
|
-
- out_of_scope (what's OUT)
|
|
22
|
-
- risks (each with mitigation)
|
|
23
|
-
- test plan
|
|
24
|
-
|
|
25
|
-
The CLI persists this in the `specs` SQLite table.
|
|
26
|
-
|
|
27
|
-
### 2. `audit-spec`
|
|
28
|
-
|
|
29
|
-
Before writing any code: harden the spec. Run `prjct audit-spec <id>` — it emits a dispatch prompt for THREE review subagents that you run IN PARALLEL (one tool-use block per reviewer in the SAME message):
|
|
30
|
-
|
|
31
|
-
- **strategic** — scope sanity. Worth doing? Right size?
|
|
32
|
-
- **architecture** — feasibility. Data flow, failure modes, dependencies.
|
|
33
|
-
- **design** — UX/DX quality. Four dimensions rated 0–10.
|
|
34
|
-
|
|
35
|
-
Each returns a verdict (pass | fail) + notes. You write each back via `prjct spec record-review`. When all three pass, the spec auto-promotes from `draft` → `reviewed`.
|
|
36
|
-
|
|
37
|
-
If any reviewer fails: revise the spec via `prjct spec update`, re-audit. The cost of iteration is minutes; the cost of mid-implementation rework is hours-to-days.
|
|
38
|
-
|
|
39
|
-
### 3. `task --spec <id>`
|
|
40
|
-
|
|
41
|
-
Now create the task. The `--spec` flag wires the task to its spec via `linked_spec_id`. Without it, `ship` later has nothing to gate against.
|
|
42
|
-
|
|
43
|
-
```
|
|
44
|
-
prjct work "implement rate-limit middleware" --spec <id>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### 4. implement
|
|
48
|
-
|
|
49
|
-
Normal coding loop. Mid-flight workflows (`review`, `qa`, `investigate`) still apply. The spec is your anti-creep shield: when the user pivots into out-of-scope territory, surface the spec and ask whether to update it or defer.
|
|
50
|
-
|
|
51
|
-
### 5. `ship` (with the spec gate)
|
|
52
|
-
|
|
53
|
-
`prjct ship` reads the linked spec's `acceptance_criteria` and surfaces them as a checklist in the PR description. Walk each one — pass / fail / N/A. If any criterion is unmet → STOP and surface to the user.
|
|
54
|
-
|
|
55
|
-
Override path: `prjct ship --no-spec-gate` (use only when the user explicitly accepts).
|
|
56
|
-
|
|
57
|
-
### 6. `remember learning`
|
|
58
|
-
|
|
59
|
-
After ship, capture what the spec got right and wrong:
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
prjct remember learning "spec missed the clock-skew edge case; future rate-limit specs should call out time-source"
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
The next spec is sharper. Compounding effect: the vault accumulates spec-shaped lessons.
|
|
66
|
-
|
|
67
|
-
## When to bypass SDD
|
|
68
|
-
|
|
69
|
-
Not every keystroke goes through six stations. Routine work skips `spec`:
|
|
70
|
-
|
|
71
|
-
- single-file fix with known scope
|
|
72
|
-
- doc tweak / typo
|
|
73
|
-
- inbox capture / GTD dump
|
|
74
|
-
- conversational Q&A
|
|
75
|
-
- re-running a failing test
|
|
76
|
-
- bug fix where root cause is already known
|
|
77
|
-
|
|
78
|
-
Rule of thumb: if the work touches >1 file, ships to users, or takes >30 minutes, default to `spec` first.
|
|
79
|
-
|
|
80
|
-
## Anti-patterns
|
|
81
|
-
|
|
82
|
-
- **Skipping straight to `task` because the user said "let's build X".** If they said it WITH stakes, the spec is what protects them from scope creep mid-implementation.
|
|
83
|
-
- **Auditing AFTER implementing.** Pre-implementation review is the whole point. Post-hoc review of code-against-spec is the `review` workflow, not `audit-spec`.
|
|
84
|
-
- **Treating the spec as immutable.** Specs evolve. When implementation surfaces a missing acceptance criterion or a wrong scope assumption, update the spec — `prjct spec update` — don't ship around it.
|
|
85
|
-
- **Marking `acceptance_criteria` met without proof.** The criterion exists to be tested. If the test wasn't run, the criterion isn't met.
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# Architecture reviewer rubric — `audit-spec`
|
|
2
|
-
|
|
3
|
-
You are reviewing a `prjct` spec for engineering feasibility. You receive the spec body verbatim. Apply the questions below; return a structured verdict.
|
|
4
|
-
|
|
5
|
-
## Questions to ask
|
|
6
|
-
|
|
7
|
-
1. **Can this be built?** With the team's stack and skill set, in the implied timeframe. If "no" or "yes but only by replacing the database", fail.
|
|
8
|
-
2. **Is the data flow coherent?** Trace input → state → output. Where does data live? Who writes it? Who reads it? Failure modes at each hop.
|
|
9
|
-
3. **Is the state machine implicit or explicit?** Explicit > implicit. If acceptance criteria reference behavior that depends on state transitions, the spec should name them.
|
|
10
|
-
4. **What edge cases / failure modes are missing?** Concurrency, partial writes, retries, network blips, auth failures, rate-limit collisions, clock skew. Name the top 1–2 that the spec doesn't address.
|
|
11
|
-
5. **What dependencies does this introduce?** New runtime dep? New infra (Redis, queue, cron)? Document it. New deps that aren't named in the spec are the #1 source of mid-implementation surprise.
|
|
12
|
-
6. **Test plan adequate?** A test plan that says "tests added" is not a plan. Look for: unit, integration, manual reproduction, performance (when relevant).
|
|
13
|
-
|
|
14
|
-
## Output format
|
|
15
|
-
|
|
16
|
-
```
|
|
17
|
-
verdict: pass | fail
|
|
18
|
-
notes: 2–4 sentences + (when applicable) a short ASCII data flow / state diagram.
|
|
19
|
-
If pass, name the most load-bearing architectural choice.
|
|
20
|
-
If fail, name the SINGLE biggest gap and how to close it.
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Examples
|
|
24
|
-
|
|
25
|
-
**Pass with diagram:**
|
|
26
|
-
|
|
27
|
-
```
|
|
28
|
-
verdict: pass
|
|
29
|
-
notes: Token-bucket per IP with 5-minute Redis TTL is the right call — survives restarts, no GC pressure, easy to extend to user-id keys later. The spec correctly limits scope to /auth (no /api yet). One missing edge: clock-skew between Node process and Redis on bucket refill — recommend storing absolute timestamps server-side.
|
|
30
|
-
|
|
31
|
-
request → middleware → Redis GETSET (token, ts)
|
|
32
|
-
├── allowed → next()
|
|
33
|
-
└── refused → 429 + Retry-After
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
**Fail:**
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
verdict: fail
|
|
40
|
-
notes: Spec references "real-time updates" in acceptance_criteria but is silent on transport (WebSocket? SSE? polling?). Each has different failure modes (reconnect storms, head-of-line blocking, server load). Pick one explicitly and re-spec — current acceptance criteria are vacuously true for a 60-second polling loop, which probably isn't what the user wants.
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## Anti-patterns to refuse
|
|
44
|
-
|
|
45
|
-
- Architectural cosplay: "consider using DDD/hexagonal/CQRS" without showing why this spec demands it.
|
|
46
|
-
- Failing because "the spec doesn't say which framework" when framework is obvious from the project's stack (skill body's project context tells you).
|
|
47
|
-
- Skipping the data flow trace — the most useful thing this rubric produces.
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# Design reviewer rubric — `audit-spec`
|
|
2
|
-
|
|
3
|
-
You are reviewing a `prjct` spec for design quality (UX for user-facing surfaces, DX for developer-facing surfaces — same rubric, different surface).
|
|
4
|
-
|
|
5
|
-
## Questions to ask
|
|
6
|
-
|
|
7
|
-
Rate each dimension 0–10 against the spec's described surface (UI, API, CLI, library):
|
|
8
|
-
|
|
9
|
-
1. **Clarity** — would a new user / developer know what this does without reading code or docs? 0 = inscrutable; 10 = self-documenting.
|
|
10
|
-
2. **Ergonomics** — is the common case fast and the rare case possible? 0 = forces the rare case into every flow; 10 = invisible until needed.
|
|
11
|
-
3. **Consistency** — does it match the surrounding system's conventions? 0 = a foreign body; 10 = indistinguishable from neighboring features.
|
|
12
|
-
4. **Accessibility** — for UI: keyboard / screen-reader / contrast / motion. For API/CLI: discoverability, error messages, --help, machine-readable output. 0 = unusable for entire categories of users; 10 = enables everyone.
|
|
13
|
-
|
|
14
|
-
## Verdict rule
|
|
15
|
-
|
|
16
|
-
- All four dimensions ≥ 6 → `pass`.
|
|
17
|
-
- Any dimension < 6 → `fail`.
|
|
18
|
-
|
|
19
|
-
## Output format
|
|
20
|
-
|
|
21
|
-
```
|
|
22
|
-
verdict: pass | fail
|
|
23
|
-
notes: clarity=N ergonomics=N consistency=N accessibility=N
|
|
24
|
-
Lowest-scoring dimension first, with the SINGLE concrete change that would raise it.
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Examples
|
|
28
|
-
|
|
29
|
-
**Pass:** "clarity=8 ergonomics=7 consistency=9 accessibility=6. Lowest is accessibility — the new endpoint returns errors as JSON only; recommend adding `Accept: text/plain` fallback for grep-the-pipeline operators. Otherwise the surface matches the existing `/api/v2` shape and ergonomics are right (single required field, sensible defaults)."
|
|
30
|
-
|
|
31
|
-
**Fail:** "clarity=4 ergonomics=6 consistency=7 accessibility=7. Clarity tanks because the verb name `prjct shimmer` doesn't telegraph the action; rename to `prjct refresh` or `prjct rebuild` and re-rate. Other dimensions are healthy."
|
|
32
|
-
|
|
33
|
-
## Anti-patterns to refuse
|
|
34
|
-
|
|
35
|
-
- Vague "looks good" — every dimension needs a number.
|
|
36
|
-
- Ignoring accessibility for "internal tools" — internal users include the colorblind and the blind.
|
|
37
|
-
- Failing on aesthetic taste alone (color, typography). Design rubric is about USE, not opinion.
|
|
38
|
-
- Over-indexing on novelty. Surfaces that surprise users score LOW on consistency, not high.
|