@chrisai/base 2.3.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/README.md +157 -0
- package/bin/install.js +340 -0
- package/package.json +40 -0
- package/src/commands/audit-claude-md.md +31 -0
- package/src/commands/audit.md +33 -0
- package/src/commands/carl-hygiene.md +33 -0
- package/src/commands/groom.md +35 -0
- package/src/commands/history.md +27 -0
- package/src/commands/pulse.md +33 -0
- package/src/commands/scaffold.md +33 -0
- package/src/commands/status.md +28 -0
- package/src/commands/surface-convert.md +35 -0
- package/src/commands/surface-create.md +34 -0
- package/src/commands/surface-list.md +27 -0
- package/src/framework/context/base-principles.md +71 -0
- package/src/framework/frameworks/audit-strategies.md +53 -0
- package/src/framework/frameworks/satellite-registration.md +44 -0
- package/src/framework/tasks/audit-claude-md.md +68 -0
- package/src/framework/tasks/audit.md +64 -0
- package/src/framework/tasks/carl-hygiene.md +160 -0
- package/src/framework/tasks/groom.md +164 -0
- package/src/framework/tasks/history.md +34 -0
- package/src/framework/tasks/pulse.md +83 -0
- package/src/framework/tasks/scaffold.md +167 -0
- package/src/framework/tasks/status.md +35 -0
- package/src/framework/tasks/surface-convert.md +143 -0
- package/src/framework/tasks/surface-create.md +184 -0
- package/src/framework/tasks/surface-list.md +42 -0
- package/src/framework/templates/active-md.md +112 -0
- package/src/framework/templates/backlog-md.md +100 -0
- package/src/framework/templates/state-md.md +48 -0
- package/src/framework/templates/workspace-json.md +50 -0
- package/src/hooks/_template.py +129 -0
- package/src/hooks/active-hook.py +115 -0
- package/src/hooks/backlog-hook.py +107 -0
- package/src/hooks/base-pulse-check.py +206 -0
- package/src/hooks/psmm-injector.py +67 -0
- package/src/hooks/satellite-detection.py +131 -0
- package/src/packages/base-mcp/index.js +108 -0
- package/src/packages/base-mcp/package.json +10 -0
- package/src/packages/base-mcp/tools/surfaces.js +404 -0
- package/src/packages/carl-mcp/index.js +115 -0
- package/src/packages/carl-mcp/package.json +10 -0
- package/src/packages/carl-mcp/tools/decisions.js +269 -0
- package/src/packages/carl-mcp/tools/domains.js +361 -0
- package/src/packages/carl-mcp/tools/psmm.js +204 -0
- package/src/packages/carl-mcp/tools/staging.js +245 -0
- package/src/skill/base.md +111 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Convert an existing @-mentioned markdown file into a structured data surface. Analyzes the markdown structure, proposes a schema, migrates content, and generates all surface artifacts (JSON, hook, registration).
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<user-story>
|
|
6
|
+
As an AI builder, I want to convert my existing markdown tracking files into structured surfaces so Claude gets cheap passive awareness instead of expensive @-file parsing.
|
|
7
|
+
</user-story>
|
|
8
|
+
|
|
9
|
+
<when-to-use>
|
|
10
|
+
- /base:surface convert {file-path}
|
|
11
|
+
- "convert this file to a surface", "make this a data surface"
|
|
12
|
+
- User has a markdown file they @-mention regularly and wants it structured
|
|
13
|
+
</when-to-use>
|
|
14
|
+
|
|
15
|
+
<context>
|
|
16
|
+
@.base/hooks/_template.py
|
|
17
|
+
@.base/workspace.json
|
|
18
|
+
</context>
|
|
19
|
+
|
|
20
|
+
<steps>
|
|
21
|
+
|
|
22
|
+
<step name="read" priority="first">
|
|
23
|
+
## Step 1: Read & Analyze
|
|
24
|
+
|
|
25
|
+
1. Read the specified markdown file completely
|
|
26
|
+
2. Detect structure:
|
|
27
|
+
- **Headings** → potential categories or priority groups
|
|
28
|
+
- **Bold labels** (e.g., `**Status:**`) → field names
|
|
29
|
+
- **List items** → individual entries
|
|
30
|
+
- **Checkboxes** → checklist/progress fields
|
|
31
|
+
- **Dates** → timestamp fields
|
|
32
|
+
- **File paths** → location fields
|
|
33
|
+
- **Tables** → structured data (archived items, reference tables)
|
|
34
|
+
3. Identify patterns:
|
|
35
|
+
- How many distinct items?
|
|
36
|
+
- What fields recur across items?
|
|
37
|
+
- Are there priority/status groupings?
|
|
38
|
+
- Is there an archived/done section?
|
|
39
|
+
|
|
40
|
+
Present findings:
|
|
41
|
+
```
|
|
42
|
+
Detected structure in {file}:
|
|
43
|
+
Items found: {count}
|
|
44
|
+
Sections: {list of heading-based groups}
|
|
45
|
+
Recurring fields: {field names}
|
|
46
|
+
Archived section: {yes/no}
|
|
47
|
+
```
|
|
48
|
+
</step>
|
|
49
|
+
|
|
50
|
+
<step name="propose">
|
|
51
|
+
## Step 2: Propose Schema
|
|
52
|
+
|
|
53
|
+
Based on analysis, propose:
|
|
54
|
+
|
|
55
|
+
1. **Surface name** — infer from filename (e.g., ACTIVE.md → "active")
|
|
56
|
+
2. **Schema** — field names, types, required fields, ID prefix
|
|
57
|
+
3. **Sample conversion** — show 2-3 items converted to JSON
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
Proposed schema for "{name}":
|
|
61
|
+
ID prefix: {PREFIX}
|
|
62
|
+
Required: {fields}
|
|
63
|
+
Optional: {fields}
|
|
64
|
+
Priority levels: {if detected}
|
|
65
|
+
|
|
66
|
+
Sample conversion:
|
|
67
|
+
"{heading item}" →
|
|
68
|
+
{
|
|
69
|
+
"id": "PREFIX-001",
|
|
70
|
+
"title": "...",
|
|
71
|
+
"status": "...",
|
|
72
|
+
...
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Ask: "Does this schema look right? Adjust anything?"
|
|
77
|
+
|
|
78
|
+
**Wait for response.**
|
|
79
|
+
</step>
|
|
80
|
+
|
|
81
|
+
<step name="confirm">
|
|
82
|
+
## Step 3: Confirm
|
|
83
|
+
|
|
84
|
+
Apply any user adjustments to the schema. Lock it for generation.
|
|
85
|
+
|
|
86
|
+
If user is satisfied, confirm:
|
|
87
|
+
"Schema locked. I'll generate the surface and migrate {count} items."
|
|
88
|
+
</step>
|
|
89
|
+
|
|
90
|
+
<step name="generate">
|
|
91
|
+
## Step 4: Generate Artifacts
|
|
92
|
+
|
|
93
|
+
Same generation as surface-create Step 5:
|
|
94
|
+
- `.base/data/{name}.json` — with migrated items (not empty)
|
|
95
|
+
- `.base/hooks/{name}-hook.py` — from _template.py with appropriate grouping
|
|
96
|
+
- workspace.json surface registration
|
|
97
|
+
- settings.json hook entry
|
|
98
|
+
|
|
99
|
+
Include staleness detection with sensible defaults based on detected priority levels.
|
|
100
|
+
</step>
|
|
101
|
+
|
|
102
|
+
<step name="migrate">
|
|
103
|
+
## Step 5: Migrate Content
|
|
104
|
+
|
|
105
|
+
Parse every item from the markdown into JSON entries:
|
|
106
|
+
- Map heading groups to priority/category fields
|
|
107
|
+
- Map bold labels to field values
|
|
108
|
+
- Preserve checklists as arrays of {text, done} objects
|
|
109
|
+
- Preserve dates in ISO format
|
|
110
|
+
- Preserve file paths as location fields
|
|
111
|
+
- Map done/closed/archived sections to the archived array
|
|
112
|
+
|
|
113
|
+
Report:
|
|
114
|
+
```
|
|
115
|
+
Migration complete:
|
|
116
|
+
Items migrated: {count}
|
|
117
|
+
Archived items: {count}
|
|
118
|
+
Unmapped items: {count, if any — list them}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
If any items couldn't be auto-mapped, present them for manual resolution.
|
|
122
|
+
</step>
|
|
123
|
+
|
|
124
|
+
<step name="cleanup">
|
|
125
|
+
## Step 6: Clean Up
|
|
126
|
+
|
|
127
|
+
1. Check if the original file is @-referenced in CLAUDE.md
|
|
128
|
+
2. If found, offer: "Remove @{file} from CLAUDE.md? The surface hook replaces it."
|
|
129
|
+
3. Suggest: "Original file preserved at {path} for reference."
|
|
130
|
+
|
|
131
|
+
Do NOT delete the original markdown file — the user decides its fate.
|
|
132
|
+
</step>
|
|
133
|
+
|
|
134
|
+
</steps>
|
|
135
|
+
|
|
136
|
+
<verification>
|
|
137
|
+
After conversion:
|
|
138
|
+
- [ ] .base/data/{name}.json exists with migrated items
|
|
139
|
+
- [ ] Item count matches source markdown
|
|
140
|
+
- [ ] .base/hooks/{name}-hook.py exists and produces output
|
|
141
|
+
- [ ] workspace.json and settings.json updated
|
|
142
|
+
- [ ] Original markdown file is untouched
|
|
143
|
+
</verification>
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Create a new data surface through guided conversation. Generates: JSON data file, injection hook, workspace.json registration, and settings.json hook entry. The user answers questions; Claude generates everything.
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<user-story>
|
|
6
|
+
As an AI builder, I want to create custom data surfaces so Claude has structured, passive awareness of any domain I track — without manually wiring JSON files, hooks, and config.
|
|
7
|
+
</user-story>
|
|
8
|
+
|
|
9
|
+
<when-to-use>
|
|
10
|
+
- /base:surface create {name}
|
|
11
|
+
- "create a surface", "add a new surface", "I want to track X"
|
|
12
|
+
- User wants structured data with hook injection and MCP access
|
|
13
|
+
</when-to-use>
|
|
14
|
+
|
|
15
|
+
<context>
|
|
16
|
+
@.base/hooks/_template.py
|
|
17
|
+
@.base/workspace.json
|
|
18
|
+
</context>
|
|
19
|
+
|
|
20
|
+
<steps>
|
|
21
|
+
|
|
22
|
+
<step name="define" priority="first">
|
|
23
|
+
## Step 1: Define
|
|
24
|
+
|
|
25
|
+
Extract surface name from args or ask: "What should this surface be called? (lowercase, no spaces)"
|
|
26
|
+
|
|
27
|
+
**Validate:**
|
|
28
|
+
1. Name is lowercase, alphanumeric + hyphens only
|
|
29
|
+
2. Not already registered in workspace.json surfaces section
|
|
30
|
+
3. No reserved names: "active", "backlog", "psmm", "staging"
|
|
31
|
+
|
|
32
|
+
Ask: "What does this surface track? (one sentence)"
|
|
33
|
+
→ This becomes the `description` in workspace.json.
|
|
34
|
+
|
|
35
|
+
**Wait for response before proceeding.**
|
|
36
|
+
</step>
|
|
37
|
+
|
|
38
|
+
<step name="schema">
|
|
39
|
+
## Step 2: Schema
|
|
40
|
+
|
|
41
|
+
Ask: "What fields does each item need?"
|
|
42
|
+
|
|
43
|
+
Guide through these decisions (one at a time):
|
|
44
|
+
|
|
45
|
+
1. **Required fields** — What must every item have?
|
|
46
|
+
- Default minimum: `["title"]`
|
|
47
|
+
- Common additions: status, priority, category, assignee, due_date
|
|
48
|
+
|
|
49
|
+
2. **ID prefix** — Auto-suggest first 3 chars of name, uppercase.
|
|
50
|
+
- e.g., surface "clients" → prefix "CLI"
|
|
51
|
+
- User can override
|
|
52
|
+
|
|
53
|
+
3. **Priority/status enums** — If the surface has priority or status fields:
|
|
54
|
+
- Ask: "What priority levels?" (e.g., high, medium, low)
|
|
55
|
+
- Ask: "What status values?" (e.g., active, pending, done)
|
|
56
|
+
|
|
57
|
+
4. **Time rules** (optional) — If the surface benefits from review-by dates:
|
|
58
|
+
- Ask: "Should items have review-by deadlines? If so, how many days per priority level?"
|
|
59
|
+
- Default: none
|
|
60
|
+
|
|
61
|
+
Build the schema object from answers:
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"id_prefix": "CLI",
|
|
65
|
+
"required_fields": ["title", "status"],
|
|
66
|
+
"priority_levels": ["high", "medium", "low"],
|
|
67
|
+
"status_values": ["active", "pending", "done"]
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Wait for response before proceeding.**
|
|
72
|
+
</step>
|
|
73
|
+
|
|
74
|
+
<step name="injection">
|
|
75
|
+
## Step 3: Injection
|
|
76
|
+
|
|
77
|
+
Ask: "How should items appear in Claude's context each prompt?"
|
|
78
|
+
|
|
79
|
+
Guide through:
|
|
80
|
+
|
|
81
|
+
1. **Grouping** — How to organize items in the injection?
|
|
82
|
+
- By priority (default) | By status | By date | Flat (no grouping)
|
|
83
|
+
|
|
84
|
+
2. **Summary format** — What fields to show per line?
|
|
85
|
+
- Default: `- [ID] Title (status)`
|
|
86
|
+
- Can add: priority tag, due date, custom field
|
|
87
|
+
|
|
88
|
+
3. **Staleness thresholds** — Days before an item is flagged STALE per priority:
|
|
89
|
+
- Suggest defaults based on priority levels from Step 2
|
|
90
|
+
- e.g., high: 5d, medium: 10d, low: 30d
|
|
91
|
+
- User can adjust
|
|
92
|
+
|
|
93
|
+
4. **Behavioral mode:**
|
|
94
|
+
- Silent (default) — passive awareness, respond only when asked
|
|
95
|
+
- Proactive — mention items unprompted (rare, use for critical surfaces)
|
|
96
|
+
- Threshold — stay silent unless deadline/staleness threshold crossed
|
|
97
|
+
|
|
98
|
+
**Wait for response before proceeding.**
|
|
99
|
+
</step>
|
|
100
|
+
|
|
101
|
+
<step name="tools">
|
|
102
|
+
## Step 4: Tools (Informational)
|
|
103
|
+
|
|
104
|
+
Inform the user:
|
|
105
|
+
|
|
106
|
+
"All 7 BASE MCP tools work automatically with your new surface:
|
|
107
|
+
- `base_list_surfaces` — see all surfaces
|
|
108
|
+
- `base_get_surface("{name}")` — read all items
|
|
109
|
+
- `base_get_item("{name}", id)` — get specific item
|
|
110
|
+
- `base_add_item("{name}", data)` — add new item (validates required fields, auto-generates ID)
|
|
111
|
+
- `base_update_item("{name}", id, data)` — update fields (resets staleness clock)
|
|
112
|
+
- `base_archive_item("{name}", id)` — move to archived
|
|
113
|
+
- `base_search(query, "{name}")` — search items
|
|
114
|
+
|
|
115
|
+
No configuration needed — BASE MCP auto-discovers surfaces from workspace.json."
|
|
116
|
+
|
|
117
|
+
**Continue to generation.**
|
|
118
|
+
</step>
|
|
119
|
+
|
|
120
|
+
<step name="generate" priority="critical">
|
|
121
|
+
## Step 5: Generate
|
|
122
|
+
|
|
123
|
+
Create all artifacts:
|
|
124
|
+
|
|
125
|
+
**1. Data file:** `.base/data/{name}.json`
|
|
126
|
+
```json
|
|
127
|
+
{
|
|
128
|
+
"surface": "{name}",
|
|
129
|
+
"version": 1,
|
|
130
|
+
"last_modified": "{timestamp}",
|
|
131
|
+
"items": [],
|
|
132
|
+
"archived": []
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**2. Hook file:** `.base/hooks/{name}-hook.py`
|
|
137
|
+
- Read `.base/hooks/_template.py` as the starting point
|
|
138
|
+
- Customize SURFACE_NAME, grouping logic, summary format, staleness thresholds, behavioral directive
|
|
139
|
+
- Use the injection decisions from Step 3
|
|
140
|
+
- Include `from datetime import date` for staleness calculation
|
|
141
|
+
- Follow the _template.py contract exactly
|
|
142
|
+
|
|
143
|
+
**3. Registration:** Add to `.base/workspace.json` surfaces section:
|
|
144
|
+
```json
|
|
145
|
+
"{name}": {
|
|
146
|
+
"file": "data/{name}.json",
|
|
147
|
+
"description": "{description from Step 1}",
|
|
148
|
+
"hook": true,
|
|
149
|
+
"silent": true,
|
|
150
|
+
"schema": { ...schema from Step 2... }
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**4. Hook registration:** Add to `.claude/settings.json` UserPromptSubmit hooks:
|
|
155
|
+
```json
|
|
156
|
+
{
|
|
157
|
+
"type": "command",
|
|
158
|
+
"command": "python3 {absolute_workspace_path}/.base/hooks/{name}-hook.py"
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
Use absolute path resolved from workspace root.
|
|
162
|
+
|
|
163
|
+
**5. Report:**
|
|
164
|
+
```
|
|
165
|
+
Surface "{name}" created:
|
|
166
|
+
Data: .base/data/{name}.json (empty, ready for items)
|
|
167
|
+
Hook: .base/hooks/{name}-hook.py (will inject next prompt)
|
|
168
|
+
Schema: {id_prefix}-NNN, {required_fields}
|
|
169
|
+
Tools: base_get_item("{name}", id), base_add_item("{name}", data), etc.
|
|
170
|
+
|
|
171
|
+
Add your first item: base_add_item("{name}", {title: "..."})
|
|
172
|
+
```
|
|
173
|
+
</step>
|
|
174
|
+
|
|
175
|
+
</steps>
|
|
176
|
+
|
|
177
|
+
<verification>
|
|
178
|
+
After generation:
|
|
179
|
+
- [ ] .base/data/{name}.json exists and is valid JSON
|
|
180
|
+
- [ ] .base/hooks/{name}-hook.py exists and parses as valid Python
|
|
181
|
+
- [ ] workspace.json has the surface registration
|
|
182
|
+
- [ ] settings.json has the hook entry with absolute path
|
|
183
|
+
- [ ] Hook outputs correct XML when piped test input
|
|
184
|
+
</verification>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<purpose>
|
|
2
|
+
Display all registered data surfaces with item counts, hook status, and staleness summary.
|
|
3
|
+
</purpose>
|
|
4
|
+
|
|
5
|
+
<when-to-use>
|
|
6
|
+
- /base:surface list
|
|
7
|
+
- "what surfaces exist", "show surfaces", "list surfaces"
|
|
8
|
+
</when-to-use>
|
|
9
|
+
|
|
10
|
+
<steps>
|
|
11
|
+
|
|
12
|
+
<step name="read_and_display">
|
|
13
|
+
## Show Surfaces
|
|
14
|
+
|
|
15
|
+
1. Call `base_list_surfaces` to get all registered surfaces with item counts
|
|
16
|
+
2. For each surface, read the data file to count stale items (items with no `updated` field or `updated` older than threshold)
|
|
17
|
+
|
|
18
|
+
Display as:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Data Surfaces
|
|
22
|
+
═══════════════════════════════════════
|
|
23
|
+
|
|
24
|
+
| Surface | Items | Hook | Description |
|
|
25
|
+
|---------|-------|------|-------------|
|
|
26
|
+
| active | 12 | ✓ | Active work items, projects, and tasks |
|
|
27
|
+
| backlog | 8 | ✓ | Future work queue, ideas, and deferred tasks |
|
|
28
|
+
|
|
29
|
+
Total: {count} surfaces, {total_items} items
|
|
30
|
+
|
|
31
|
+
Create a new surface: /base:surface create {name}
|
|
32
|
+
Convert a file: /base:surface convert {path}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
If no surfaces registered:
|
|
36
|
+
```
|
|
37
|
+
No data surfaces registered.
|
|
38
|
+
Run /base:surface create {name} to create your first surface.
|
|
39
|
+
```
|
|
40
|
+
</step>
|
|
41
|
+
|
|
42
|
+
</steps>
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# ACTIVE.md Template
|
|
2
|
+
|
|
3
|
+
Output file: `.base/ACTIVE.md`
|
|
4
|
+
|
|
5
|
+
Symlink at workspace root: `ACTIVE.md → .base/ACTIVE.md` (for backward compatibility with hooks and rules that reference root-level ACTIVE.md)
|
|
6
|
+
|
|
7
|
+
```template
|
|
8
|
+
# Active Work
|
|
9
|
+
|
|
10
|
+
> **Working memory for Claude Code sessions.** Read at session start, update as work progresses.
|
|
11
|
+
> This is NOT documentation - it's task tracking. Obsidian handles the knowledge graph.
|
|
12
|
+
>
|
|
13
|
+
> **Update workflow:** Claude asks status questions → User responds via voice → Claude updates this file.
|
|
14
|
+
> **Not active?** → Move to `BACKLOG.md` for future work queue.
|
|
15
|
+
> **Graduation:** Backlog items move here (as TASKS or under a PROJECT) when they get attention.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## URGENT
|
|
20
|
+
|
|
21
|
+
[Projects with hard deadlines or critical momentum. Max 2-3 at a time.]
|
|
22
|
+
|
|
23
|
+
### {Project Name}
|
|
24
|
+
**Status:** [Current state — be specific]
|
|
25
|
+
**Location:** `{path/to/project/}`
|
|
26
|
+
**Deadline:** {YYYY-MM-DD}
|
|
27
|
+
**Next:** [Single most important next action]
|
|
28
|
+
**Blocked:** [What's preventing progress, or "None"]
|
|
29
|
+
**Notes:** [Context that helps a fresh session understand this project]
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## HIGH PRIORITY
|
|
34
|
+
|
|
35
|
+
[Projects in active development without hard deadlines.]
|
|
36
|
+
|
|
37
|
+
### {Project Name}
|
|
38
|
+
**Status:** [Current state]
|
|
39
|
+
**Location:** `{path/to/project/}`
|
|
40
|
+
**Target:** [Target date or milestone, if any]
|
|
41
|
+
**Next:** [Single most important next action]
|
|
42
|
+
**Blocked:** [What's preventing progress, or "None"]
|
|
43
|
+
**Notes:** [Context]
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## ONGOING
|
|
48
|
+
|
|
49
|
+
[Always-running work. No end date. Check in during groom.]
|
|
50
|
+
|
|
51
|
+
### {Project Name}
|
|
52
|
+
**Status:** [Current state]
|
|
53
|
+
**Location:** `{path/to/project/}`
|
|
54
|
+
**Next:** [What to do next or maintain]
|
|
55
|
+
**Notes:** [Context]
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## TASKS
|
|
60
|
+
|
|
61
|
+
> Standalone work items graduated from backlog. Bounded, not ongoing. Close when done.
|
|
62
|
+
|
|
63
|
+
### {Task Name}
|
|
64
|
+
**Status:** [In Progress | Blocked | Ready]
|
|
65
|
+
**Next:** [What needs to happen]
|
|
66
|
+
**Blocked:** [Dependencies, or "None"]
|
|
67
|
+
**Notes:** [Context. Include backlog origin if relevant.]
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## DEFERRED
|
|
72
|
+
|
|
73
|
+
[Paused work. Revisit during groom.]
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## DONE / CLOSED
|
|
78
|
+
|
|
79
|
+
| Project/Task | Outcome | Date |
|
|
80
|
+
|-------------|---------|------|
|
|
81
|
+
| {name} | {what happened} | {YYYY-MM-DD or Mon YYYY} |
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Quick Reference
|
|
86
|
+
|
|
87
|
+
| Project | Status | Priority |
|
|
88
|
+
|---------|--------|----------|
|
|
89
|
+
| {name} | {status} | **{URGENT/HIGH/MEDIUM/ONGOING}** |
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Field Documentation
|
|
93
|
+
|
|
94
|
+
| Field | Purpose | Update Cadence |
|
|
95
|
+
|-------|---------|---------------|
|
|
96
|
+
| Status | Current state of the project — be specific, not generic | Every session or when it changes |
|
|
97
|
+
| Location | Path to project folder or app directory | Set once, update on moves |
|
|
98
|
+
| Deadline | Hard deadline if one exists | Set once, update if it moves |
|
|
99
|
+
| Target | Soft target or milestone | Set once, update as needed |
|
|
100
|
+
| Next | THE single next action. Not a list. One thing. | Every session |
|
|
101
|
+
| Blocked | What's preventing progress. Forces clarity. | Update when blockers change |
|
|
102
|
+
| Notes | Context for a fresh Claude session to understand the project | Update when major shifts happen |
|
|
103
|
+
|
|
104
|
+
## Section Rules
|
|
105
|
+
|
|
106
|
+
| Section | What Goes Here | Graduation Path |
|
|
107
|
+
|---------|---------------|----------------|
|
|
108
|
+
| URGENT | Hard deadlines, critical momentum | → DONE when shipped |
|
|
109
|
+
| HIGH | Active development, no hard deadline | → DONE when shipped, or → DEFERRED if paused |
|
|
110
|
+
| ONGOING | No end date, maintain indefinitely | Never closes, just evolves |
|
|
111
|
+
| TASKS | Bounded work from backlog. Has a finish line. | → DONE when complete |
|
|
112
|
+
| DEFERRED | Paused. Revisit during groom. | → Back to active, or → DONE/killed |
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# BACKLOG.md Template
|
|
2
|
+
|
|
3
|
+
Output file: `.base/BACKLOG.md`
|
|
4
|
+
|
|
5
|
+
Symlink at workspace root: `BACKLOG.md → .base/BACKLOG.md` (for backward compatibility)
|
|
6
|
+
|
|
7
|
+
```template
|
|
8
|
+
# Backlog
|
|
9
|
+
|
|
10
|
+
> **Future work, ideas, and deferred tasks.** Not actively working on these - they're queued.
|
|
11
|
+
> For active work, see `ACTIVE.md`. For project details, see `projects/{name}/PLANNING.md`.
|
|
12
|
+
>
|
|
13
|
+
> **Graduation:** Items move to ACTIVE.md (as TASKS or PROJECTS) during groom when ready to work on.
|
|
14
|
+
> **Time-based rules:** Items have review-by dates. Past review-by = "decide or kill." Past staleness = auto-archive.
|
|
15
|
+
|
|
16
|
+
**Last reviewed:** {YYYY-MM-DD}
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Quick Capture
|
|
21
|
+
|
|
22
|
+
> Raw ideas. Process into proper entries during groom.
|
|
23
|
+
|
|
24
|
+
- {idea}
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## High Priority Queue
|
|
29
|
+
|
|
30
|
+
> Next up when capacity opens. Ready to start. Review-by: 7 days.
|
|
31
|
+
|
|
32
|
+
### {Item Name}
|
|
33
|
+
**Priority:** High
|
|
34
|
+
**Location:** `{path/}` (if applicable)
|
|
35
|
+
**Planning:** `{projects/{name}/PLANNING.md}` (if complex)
|
|
36
|
+
**Context:** [Why this matters, background info]
|
|
37
|
+
**Next Steps:**
|
|
38
|
+
- [ ] [First action]
|
|
39
|
+
- [ ] [Second action]
|
|
40
|
+
**Added:** {YYYY-MM-DD}
|
|
41
|
+
**Notes:** [Additional context]
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Medium Priority
|
|
46
|
+
|
|
47
|
+
> Important but not urgent. Review-by: 14 days.
|
|
48
|
+
|
|
49
|
+
### {Item Name}
|
|
50
|
+
**Priority:** Medium
|
|
51
|
+
**Location:** `{path/}`
|
|
52
|
+
**Context:** [Why this matters]
|
|
53
|
+
**Next Steps:**
|
|
54
|
+
- [ ] [First action]
|
|
55
|
+
**Added:** {YYYY-MM-DD}
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Low Priority / Someday
|
|
60
|
+
|
|
61
|
+
> Nice to have. May never happen. Review-by: 30 days.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Processing Rules
|
|
66
|
+
|
|
67
|
+
1. **Quick Capture** → dump raw idea, process during groom
|
|
68
|
+
2. **Groom Review** → convert captures to proper entries with context
|
|
69
|
+
3. **Time-based enforcement:**
|
|
70
|
+
- High: review-by 7 days from Added date
|
|
71
|
+
- Medium: review-by 14 days from Added date
|
|
72
|
+
- Low: review-by 30 days from Added date
|
|
73
|
+
- Staleness = 2x review-by → auto-archive with note
|
|
74
|
+
4. **Graduate** → move to ACTIVE.md TASKS (bounded) or PROJECT (complex)
|
|
75
|
+
5. **Kill** → delete if no longer relevant
|
|
76
|
+
6. **Archive** → keep for reference but remove from active backlog
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Field Documentation
|
|
80
|
+
|
|
81
|
+
| Field | Purpose | Required? |
|
|
82
|
+
|-------|---------|-----------|
|
|
83
|
+
| Priority | Determines review-by threshold (H:7d, M:14d, L:30d) | Yes |
|
|
84
|
+
| Location | Path to relevant code/docs | If applicable |
|
|
85
|
+
| Planning | Link to PLANNING.md if complex | If applicable |
|
|
86
|
+
| Context | Why this matters — enough for a fresh session to understand | Yes |
|
|
87
|
+
| Next Steps | Concrete actions, not vague goals | Yes (at least 1) |
|
|
88
|
+
| Added | Date item entered backlog — drives time-based rules | Yes |
|
|
89
|
+
| Blocked by | Other backlog items or projects this depends on | If applicable |
|
|
90
|
+
| Notes | Extra context, links, decisions | Optional |
|
|
91
|
+
|
|
92
|
+
## Graduation Criteria
|
|
93
|
+
|
|
94
|
+
An item is ready to graduate from backlog when:
|
|
95
|
+
- It has clear next steps defined
|
|
96
|
+
- The operator has capacity to work on it
|
|
97
|
+
- Any blockers have been resolved
|
|
98
|
+
- The operator explicitly says "let's do this" during groom
|
|
99
|
+
|
|
100
|
+
**Graduation is never automatic.** The groom flow asks: "Ready to work on any of these?" The operator decides.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# STATE.md Template
|
|
2
|
+
|
|
3
|
+
Output file: `.base/STATE.md`
|
|
4
|
+
|
|
5
|
+
```template
|
|
6
|
+
# BASE — Workspace State
|
|
7
|
+
|
|
8
|
+
**Workspace:** {workspace-name}
|
|
9
|
+
**Last Groom:** {YYYY-MM-DD}
|
|
10
|
+
**Groom Cadence:** {cadence} ({day})
|
|
11
|
+
**Next Groom Due:** {YYYY-MM-DD}
|
|
12
|
+
**Drift Score:** {0-N}
|
|
13
|
+
|
|
14
|
+
## Health
|
|
15
|
+
|
|
16
|
+
| Area | Status | Last Touched | Groom Due |
|
|
17
|
+
|------|--------|-------------|-----------|
|
|
18
|
+
| {area-name} | {Current|Stale|Critical} | {YYYY-MM-DD} | {YYYY-MM-DD} |
|
|
19
|
+
|
|
20
|
+
## Satellites
|
|
21
|
+
|
|
22
|
+
| Project | Engine | Phase | Last Activity |
|
|
23
|
+
|---------|--------|-------|--------------|
|
|
24
|
+
| {project-name} | {paul|custom} | {current-phase} | {YYYY-MM-DD} |
|
|
25
|
+
|
|
26
|
+
## Drift Indicators
|
|
27
|
+
|
|
28
|
+
- ACTIVE.md age: {N} days
|
|
29
|
+
- BACKLOG.md age: {N} days
|
|
30
|
+
- Backlog items past review-by: {N}
|
|
31
|
+
- Orphaned session contexts: {N}
|
|
32
|
+
- Untracked root files: {N}
|
|
33
|
+
- Satellites with stale state: {N}
|
|
34
|
+
|
|
35
|
+
## Last Audit
|
|
36
|
+
|
|
37
|
+
**Date:** {YYYY-MM-DD}
|
|
38
|
+
**Phases:** {N}
|
|
39
|
+
**Outcome:** [Brief summary of what was cleaned/changed]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Status Values
|
|
43
|
+
|
|
44
|
+
| Status | Meaning | Drift Contribution |
|
|
45
|
+
|--------|---------|-------------------|
|
|
46
|
+
| Current | Within groom cadence | 0 |
|
|
47
|
+
| Stale | Past groom cadence by 1-2x | Days overdue |
|
|
48
|
+
| Critical | Past groom cadence by 2x+ | Days overdue (weighted 2x) |
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Workspace Manifest Template
|
|
2
|
+
|
|
3
|
+
Output file: `.base/workspace.json`
|
|
4
|
+
|
|
5
|
+
```template
|
|
6
|
+
{
|
|
7
|
+
"workspace": "{workspace-name}",
|
|
8
|
+
"created": "{YYYY-MM-DD}",
|
|
9
|
+
"groom_cadence": "{weekly|bi-weekly|monthly}",
|
|
10
|
+
"groom_day": "{day-of-week}",
|
|
11
|
+
"areas": {
|
|
12
|
+
"{area-name}": {
|
|
13
|
+
"type": "{working-memory|directory|config-cross-ref|system-layer|custom}",
|
|
14
|
+
"description": "[Human-readable purpose of this area]",
|
|
15
|
+
"paths": ["{file-or-directory-paths}"],
|
|
16
|
+
"groom": "{weekly|bi-weekly|monthly}",
|
|
17
|
+
"audit": {
|
|
18
|
+
"strategy": "{staleness|classify|cross-reference|dead-code|pipeline-status}",
|
|
19
|
+
"config": {}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"satellites": {
|
|
24
|
+
"{project-name}": {
|
|
25
|
+
"path": "{relative-path-to-project}",
|
|
26
|
+
"engine": "{paul|custom|none}",
|
|
27
|
+
"state": "{path-to-state-file}",
|
|
28
|
+
"registered": "{YYYY-MM-DD}"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Field Documentation
|
|
35
|
+
|
|
36
|
+
| Field | Type | Description |
|
|
37
|
+
|-------|------|------------|
|
|
38
|
+
| workspace | string | Name of this workspace (typically the directory name) |
|
|
39
|
+
| created | date | When BASE was initialized in this workspace |
|
|
40
|
+
| groom_cadence | enum | Default grooming frequency for the workspace |
|
|
41
|
+
| groom_day | string | Preferred day for weekly grooming |
|
|
42
|
+
| areas | object | Map of tracked workspace areas |
|
|
43
|
+
| areas.*.type | enum | Classification of the area for audit strategy selection |
|
|
44
|
+
| areas.*.paths | array | Files or directories this area tracks |
|
|
45
|
+
| areas.*.groom | enum | Grooming frequency for this specific area (overrides default) |
|
|
46
|
+
| areas.*.audit.strategy | enum | Which audit strategy to apply (see audit-strategies.md) |
|
|
47
|
+
| areas.*.audit.config | object | Strategy-specific configuration |
|
|
48
|
+
| satellites | object | External projects tracked by BASE but managed by their own engines |
|
|
49
|
+
| satellites.*.engine | enum | What orchestration tool manages this project |
|
|
50
|
+
| satellites.*.state | string | Path to the project's state file for health checks |
|