smartlisa 0.1.0 → 0.1.3
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/plugin.json +9 -0
- package/README.md +25 -0
- package/dist/cli.js +37 -39
- package/package.json +8 -3
- package/skills/lisa/SKILL.md +67 -0
- package/skills/lisa/references/commands.md +201 -0
- package/skills/lisa/references/examples.md +277 -0
- package/skills/lisa-work/SKILL.md +98 -0
- package/skills/lisa-work/references/workflow.md +226 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "lisa",
|
|
3
|
+
"description": "Project planning with milestones, epics, and stories. Break down work, track progress, and implement with full context.",
|
|
4
|
+
"version": "0.1.3",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "Rodrigo Klosowski",
|
|
7
|
+
"url": "https://rklosowski.com/"
|
|
8
|
+
}
|
|
9
|
+
}
|
package/README.md
CHANGED
|
@@ -16,10 +16,35 @@ Lisa is the smart one. She breaks down complex projects into **Milestones → Ep
|
|
|
16
16
|
|
|
17
17
|
## Installation
|
|
18
18
|
|
|
19
|
+
### CLI Tool
|
|
20
|
+
|
|
19
21
|
```bash
|
|
20
22
|
npm install -g smartlisa
|
|
21
23
|
```
|
|
22
24
|
|
|
25
|
+
### Claude Code Skills
|
|
26
|
+
|
|
27
|
+
Lisa works as a Claude Code skill. Choose one installation method:
|
|
28
|
+
|
|
29
|
+
**Via Plugin (Recommended)**
|
|
30
|
+
```bash
|
|
31
|
+
/plugin install github:klosowsk/lisa
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**As Project Skills** (anyone cloning repo gets them)
|
|
35
|
+
```bash
|
|
36
|
+
# Copy to your project
|
|
37
|
+
cp -r path/to/lisa/skills/lisa your-project/.claude/skills/
|
|
38
|
+
cp -r path/to/lisa/skills/lisa-work your-project/.claude/skills/
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**As Personal Skills** (available in all your projects)
|
|
42
|
+
```bash
|
|
43
|
+
# Symlink to your personal skills directory
|
|
44
|
+
ln -s $(pwd)/skills/lisa ~/.claude/skills/lisa
|
|
45
|
+
ln -s $(pwd)/skills/lisa-work ~/.claude/skills/lisa-work
|
|
46
|
+
```
|
|
47
|
+
|
|
23
48
|
## Using with Claude Code
|
|
24
49
|
|
|
25
50
|
Lisa is a Claude Code skill. Just ask:
|
package/dist/cli.js
CHANGED
|
@@ -468,7 +468,6 @@ var LisaError = class extends Error {
|
|
|
468
468
|
this.name = "LisaError";
|
|
469
469
|
}
|
|
470
470
|
};
|
|
471
|
-
var RalphError = LisaError;
|
|
472
471
|
function generateId(prefix) {
|
|
473
472
|
return `${prefix}-${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 6)}`;
|
|
474
473
|
}
|
|
@@ -582,7 +581,6 @@ import * as fs from "fs/promises";
|
|
|
582
581
|
import * as path from "path";
|
|
583
582
|
import YAML from "yaml";
|
|
584
583
|
var LISA_DIR = ".lisa";
|
|
585
|
-
var RALPH_DIR = LISA_DIR;
|
|
586
584
|
var FileSystemStateAdapter = class {
|
|
587
585
|
rootDir;
|
|
588
586
|
lisaDir;
|
|
@@ -842,7 +840,7 @@ var StateManager = class {
|
|
|
842
840
|
// Path Helpers
|
|
843
841
|
// --------------------------------------------------------------------------
|
|
844
842
|
getPath(relativePath) {
|
|
845
|
-
return path2.join(this.adapter.getRootDir(),
|
|
843
|
+
return path2.join(this.adapter.getRootDir(), LISA_DIR, relativePath);
|
|
846
844
|
}
|
|
847
845
|
getEpicDir(epicId, slug) {
|
|
848
846
|
return this.getPath(path2.join(PATHS.epics.dir, `${epicId}-${slug}`));
|
|
@@ -1130,7 +1128,7 @@ var StateManager = class {
|
|
|
1130
1128
|
async assembleProjectContext() {
|
|
1131
1129
|
const project = await this.readProject();
|
|
1132
1130
|
if (!project) {
|
|
1133
|
-
throw new
|
|
1131
|
+
throw new LisaError("Project not initialized", "NOT_INITIALIZED");
|
|
1134
1132
|
}
|
|
1135
1133
|
return {
|
|
1136
1134
|
project,
|
|
@@ -1148,7 +1146,7 @@ var StateManager = class {
|
|
|
1148
1146
|
const index = await this.readMilestoneIndex();
|
|
1149
1147
|
const milestone = index?.milestones.find((m) => m.id === milestoneId);
|
|
1150
1148
|
if (!milestone) {
|
|
1151
|
-
throw new
|
|
1149
|
+
throw new LisaError(`Milestone ${milestoneId} not found`, "NOT_FOUND");
|
|
1152
1150
|
}
|
|
1153
1151
|
const milestoneDiscovery = await this.readMilestoneDiscovery(milestoneId);
|
|
1154
1152
|
const siblingEpics = [];
|
|
@@ -1182,18 +1180,18 @@ var StateManager = class {
|
|
|
1182
1180
|
const epicDirs = await this.listEpicDirs();
|
|
1183
1181
|
const epicDir = epicDirs.find((d) => d.startsWith(`${epicId}-`));
|
|
1184
1182
|
if (!epicDir) {
|
|
1185
|
-
throw new
|
|
1183
|
+
throw new LisaError(`Epic ${epicId} not found`, "NOT_FOUND");
|
|
1186
1184
|
}
|
|
1187
1185
|
const slug = epicDir.split("-").slice(1).join("-");
|
|
1188
1186
|
const epic = await this.readEpic(epicId, slug);
|
|
1189
1187
|
if (!epic) {
|
|
1190
|
-
throw new
|
|
1188
|
+
throw new LisaError(`Epic ${epicId} not found`, "NOT_FOUND");
|
|
1191
1189
|
}
|
|
1192
1190
|
const projectContext = await this.assembleProjectContext();
|
|
1193
1191
|
const index = await this.readMilestoneIndex();
|
|
1194
1192
|
const milestone = index?.milestones.find((m) => m.id === epic.milestone);
|
|
1195
1193
|
if (!milestone) {
|
|
1196
|
-
throw new
|
|
1194
|
+
throw new LisaError(`Milestone ${epic.milestone} not found`, "NOT_FOUND");
|
|
1197
1195
|
}
|
|
1198
1196
|
const milestoneDiscovery = await this.readMilestoneDiscovery(epic.milestone);
|
|
1199
1197
|
const epicDiscovery = await this.readEpicDiscovery(epicId, slug);
|
|
@@ -1232,19 +1230,19 @@ var StateManager = class {
|
|
|
1232
1230
|
const epicDirs = await this.listEpicDirs();
|
|
1233
1231
|
const epicDir = epicDirs.find((d) => d.startsWith(`${epicId}-`));
|
|
1234
1232
|
if (!epicDir) {
|
|
1235
|
-
throw new
|
|
1233
|
+
throw new LisaError(`Epic ${epicId} not found`, "NOT_FOUND");
|
|
1236
1234
|
}
|
|
1237
1235
|
const slug = epicDir.split("-").slice(1).join("-");
|
|
1238
1236
|
const prd = await this.readPrd(epicId, slug);
|
|
1239
1237
|
if (!prd) {
|
|
1240
|
-
throw new
|
|
1238
|
+
throw new LisaError(
|
|
1241
1239
|
`PRD not found for ${epicId}. Generate PRD first.`,
|
|
1242
1240
|
"MISSING_PRD"
|
|
1243
1241
|
);
|
|
1244
1242
|
}
|
|
1245
1243
|
const architecture = await this.readArchitecture(epicId, slug);
|
|
1246
1244
|
if (!architecture) {
|
|
1247
|
-
throw new
|
|
1245
|
+
throw new LisaError(
|
|
1248
1246
|
`Architecture not found for ${epicId}. Generate architecture first.`,
|
|
1249
1247
|
"MISSING_ARCH"
|
|
1250
1248
|
);
|
|
@@ -1746,7 +1744,7 @@ function getHowGuidance(storyId, hasArchitecture) {
|
|
|
1746
1744
|
// src/core/commands/status.ts
|
|
1747
1745
|
async function overview(state) {
|
|
1748
1746
|
if (!await state.isInitialized()) {
|
|
1749
|
-
return error("No
|
|
1747
|
+
return error("No Lisa project found. Run 'discover init' first.", "NOT_INITIALIZED");
|
|
1750
1748
|
}
|
|
1751
1749
|
const project = await state.readProject();
|
|
1752
1750
|
const index = await state.readMilestoneIndex();
|
|
@@ -1820,7 +1818,7 @@ async function overview(state) {
|
|
|
1820
1818
|
}
|
|
1821
1819
|
};
|
|
1822
1820
|
const sections = [
|
|
1823
|
-
section.header("
|
|
1821
|
+
section.header("Lisa Status"),
|
|
1824
1822
|
section.subheader(`Project: ${project.name}`),
|
|
1825
1823
|
section.dim(` Status: ${project.status}`),
|
|
1826
1824
|
section.dim(` Updated: ${timeAgo(project.updated)}`)
|
|
@@ -1902,7 +1900,7 @@ async function overview(state) {
|
|
|
1902
1900
|
}
|
|
1903
1901
|
async function board(state, options = {}) {
|
|
1904
1902
|
if (!await state.isInitialized()) {
|
|
1905
|
-
return error("No
|
|
1903
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
1906
1904
|
}
|
|
1907
1905
|
const allStories = [];
|
|
1908
1906
|
const epicDirs = await state.listEpicDirs();
|
|
@@ -1935,7 +1933,7 @@ async function board(state, options = {}) {
|
|
|
1935
1933
|
blocked: columns.blocked,
|
|
1936
1934
|
deferred: columns.deferred
|
|
1937
1935
|
};
|
|
1938
|
-
const sections = [section.header("
|
|
1936
|
+
const sections = [section.header("Lisa Board")];
|
|
1939
1937
|
if (allStories.length === 0) {
|
|
1940
1938
|
sections.push(section.info("No stories found."));
|
|
1941
1939
|
return success(data, sections);
|
|
@@ -2068,7 +2066,7 @@ async function story(state, options) {
|
|
|
2068
2066
|
}
|
|
2069
2067
|
async function context(state, options = {}) {
|
|
2070
2068
|
if (!await state.isInitialized()) {
|
|
2071
|
-
return error("No
|
|
2069
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
2072
2070
|
}
|
|
2073
2071
|
const { target, full, format } = options;
|
|
2074
2072
|
if (!target) {
|
|
@@ -2780,8 +2778,8 @@ async function init(state, options) {
|
|
|
2780
2778
|
const projectName = options.name || "Untitled Project";
|
|
2781
2779
|
const project = await state.initialize(projectName);
|
|
2782
2780
|
const sections = [
|
|
2783
|
-
section.header("Initializing
|
|
2784
|
-
section.success(`Created .
|
|
2781
|
+
section.header("Initializing Lisa"),
|
|
2782
|
+
section.success(`Created .lisa/ directory`),
|
|
2785
2783
|
section.success(`Project: ${project.name}`),
|
|
2786
2784
|
section.success(`ID: ${project.id}`),
|
|
2787
2785
|
section.blank(),
|
|
@@ -2806,7 +2804,7 @@ async function init(state, options) {
|
|
|
2806
2804
|
}
|
|
2807
2805
|
async function status(state) {
|
|
2808
2806
|
if (!await state.isInitialized()) {
|
|
2809
|
-
return error("No
|
|
2807
|
+
return error("No Lisa project found. Run 'discover init' first.", "NOT_INITIALIZED");
|
|
2810
2808
|
}
|
|
2811
2809
|
const context2 = await state.readDiscoveryContext();
|
|
2812
2810
|
const constraints = await state.readConstraints();
|
|
@@ -2874,7 +2872,7 @@ async function status(state) {
|
|
|
2874
2872
|
}
|
|
2875
2873
|
async function start(state, options = {}) {
|
|
2876
2874
|
if (!await state.isInitialized()) {
|
|
2877
|
-
return error("No
|
|
2875
|
+
return error("No Lisa project found. Run 'discover init' first.", "NOT_INITIALIZED");
|
|
2878
2876
|
}
|
|
2879
2877
|
const history = await state.readDiscoveryHistory();
|
|
2880
2878
|
const context2 = await state.readDiscoveryContext();
|
|
@@ -2956,7 +2954,7 @@ async function start(state, options = {}) {
|
|
|
2956
2954
|
}
|
|
2957
2955
|
async function addEntry(state, options) {
|
|
2958
2956
|
if (!await state.isInitialized()) {
|
|
2959
|
-
return error("No
|
|
2957
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
2960
2958
|
}
|
|
2961
2959
|
let history = await state.readDiscoveryHistory();
|
|
2962
2960
|
if (!history) {
|
|
@@ -2982,7 +2980,7 @@ async function addEntry(state, options) {
|
|
|
2982
2980
|
}
|
|
2983
2981
|
async function complete(state) {
|
|
2984
2982
|
if (!await state.isInitialized()) {
|
|
2985
|
-
return error("No
|
|
2983
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
2986
2984
|
}
|
|
2987
2985
|
const history = await state.readDiscoveryHistory();
|
|
2988
2986
|
if (!history) {
|
|
@@ -3041,7 +3039,7 @@ async function findMilestoneById(state, milestoneId) {
|
|
|
3041
3039
|
}
|
|
3042
3040
|
async function element(state, options) {
|
|
3043
3041
|
if (!await state.isInitialized()) {
|
|
3044
|
-
return error("No
|
|
3042
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3045
3043
|
}
|
|
3046
3044
|
const { elementType, elementId } = options;
|
|
3047
3045
|
if (elementType === "epic") {
|
|
@@ -3099,7 +3097,7 @@ async function element(state, options) {
|
|
|
3099
3097
|
}
|
|
3100
3098
|
async function addElementEntry(state, options) {
|
|
3101
3099
|
if (!await state.isInitialized()) {
|
|
3102
|
-
return error("No
|
|
3100
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3103
3101
|
}
|
|
3104
3102
|
const entry = {
|
|
3105
3103
|
timestamp: now(),
|
|
@@ -3157,7 +3155,7 @@ function updateElementDiscoveryFromEntry(discovery, entry, question) {
|
|
|
3157
3155
|
}
|
|
3158
3156
|
async function completeElement(state, options) {
|
|
3159
3157
|
if (!await state.isInitialized()) {
|
|
3160
|
-
return error("No
|
|
3158
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3161
3159
|
}
|
|
3162
3160
|
if (options.elementType === "epic") {
|
|
3163
3161
|
const epicInfo = await findEpicByIdOrSlug(state, options.elementId);
|
|
@@ -3461,7 +3459,7 @@ function getStoriesGuidance(ctx) {
|
|
|
3461
3459
|
// src/core/commands/plan.ts
|
|
3462
3460
|
async function showMilestones(state) {
|
|
3463
3461
|
if (!await state.isInitialized()) {
|
|
3464
|
-
return error("No
|
|
3462
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3465
3463
|
}
|
|
3466
3464
|
const index = await state.readMilestoneIndex();
|
|
3467
3465
|
const context2 = await state.readDiscoveryContext();
|
|
@@ -3531,7 +3529,7 @@ async function showMilestones(state) {
|
|
|
3531
3529
|
}
|
|
3532
3530
|
async function addMilestone(state, options) {
|
|
3533
3531
|
if (!await state.isInitialized()) {
|
|
3534
|
-
return error("No
|
|
3532
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3535
3533
|
}
|
|
3536
3534
|
let index = await state.readMilestoneIndex();
|
|
3537
3535
|
if (!index) {
|
|
@@ -3557,7 +3555,7 @@ async function addMilestone(state, options) {
|
|
|
3557
3555
|
}
|
|
3558
3556
|
async function showEpics(state, options = {}) {
|
|
3559
3557
|
if (!await state.isInitialized()) {
|
|
3560
|
-
return error("No
|
|
3558
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3561
3559
|
}
|
|
3562
3560
|
const index = await state.readMilestoneIndex();
|
|
3563
3561
|
if (!index?.milestones || index.milestones.length === 0) {
|
|
@@ -3661,7 +3659,7 @@ async function showEpics(state, options = {}) {
|
|
|
3661
3659
|
}
|
|
3662
3660
|
async function addEpic(state, options) {
|
|
3663
3661
|
if (!await state.isInitialized()) {
|
|
3664
|
-
return error("No
|
|
3662
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3665
3663
|
}
|
|
3666
3664
|
const index = await state.readMilestoneIndex();
|
|
3667
3665
|
if (!index) {
|
|
@@ -3737,7 +3735,7 @@ async function addEpic(state, options) {
|
|
|
3737
3735
|
}
|
|
3738
3736
|
async function planEpic(state, options) {
|
|
3739
3737
|
if (!await state.isInitialized()) {
|
|
3740
|
-
return error("No
|
|
3738
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
3741
3739
|
}
|
|
3742
3740
|
const ctx = await state.assembleEpicContext(options.epicId);
|
|
3743
3741
|
const epicDirs = await state.listEpicDirs();
|
|
@@ -4331,7 +4329,7 @@ function getDismissFeedbackGuidance(feedbackId) {
|
|
|
4331
4329
|
// src/core/commands/feedback.ts
|
|
4332
4330
|
async function markStory(state, options) {
|
|
4333
4331
|
if (!await state.isInitialized()) {
|
|
4334
|
-
return error("No
|
|
4332
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
4335
4333
|
}
|
|
4336
4334
|
const parsed = parseStoryId(options.storyId);
|
|
4337
4335
|
if (!parsed) {
|
|
@@ -4399,7 +4397,7 @@ async function markStory(state, options) {
|
|
|
4399
4397
|
}
|
|
4400
4398
|
async function addFeedback(state, options) {
|
|
4401
4399
|
if (!await state.isInitialized()) {
|
|
4402
|
-
return error("No
|
|
4400
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
4403
4401
|
}
|
|
4404
4402
|
const parsed = parseStoryId(options.storyId);
|
|
4405
4403
|
if (!parsed) {
|
|
@@ -4450,7 +4448,7 @@ async function addFeedback(state, options) {
|
|
|
4450
4448
|
}
|
|
4451
4449
|
async function listFeedback(state) {
|
|
4452
4450
|
if (!await state.isInitialized()) {
|
|
4453
|
-
return error("No
|
|
4451
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
4454
4452
|
}
|
|
4455
4453
|
const feedbackQueue = await state.readFeedbackQueue();
|
|
4456
4454
|
const stuckQueue = await state.readStuckQueue();
|
|
@@ -4516,7 +4514,7 @@ async function listFeedback(state) {
|
|
|
4516
4514
|
}
|
|
4517
4515
|
async function resolveFeedback(state, options) {
|
|
4518
4516
|
if (!await state.isInitialized()) {
|
|
4519
|
-
return error("No
|
|
4517
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
4520
4518
|
}
|
|
4521
4519
|
const feedbackQueue = await state.readFeedbackQueue();
|
|
4522
4520
|
if (!feedbackQueue) {
|
|
@@ -4558,7 +4556,7 @@ async function resolveFeedback(state, options) {
|
|
|
4558
4556
|
}
|
|
4559
4557
|
async function dismissFeedback(state, options) {
|
|
4560
4558
|
if (!await state.isInitialized()) {
|
|
4561
|
-
return error("No
|
|
4559
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
4562
4560
|
}
|
|
4563
4561
|
const feedbackQueue = await state.readFeedbackQueue();
|
|
4564
4562
|
if (!feedbackQueue) {
|
|
@@ -5032,7 +5030,7 @@ async function validateCoverageInternal(state) {
|
|
|
5032
5030
|
}
|
|
5033
5031
|
async function runFullValidation(state) {
|
|
5034
5032
|
if (!await state.isInitialized()) {
|
|
5035
|
-
return error("No
|
|
5033
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
5036
5034
|
}
|
|
5037
5035
|
const issues = [];
|
|
5038
5036
|
const sections = [section.header("Validation")];
|
|
@@ -5159,7 +5157,7 @@ async function runFullValidation(state) {
|
|
|
5159
5157
|
}
|
|
5160
5158
|
async function validateLinks(state) {
|
|
5161
5159
|
if (!await state.isInitialized()) {
|
|
5162
|
-
return error("No
|
|
5160
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
5163
5161
|
}
|
|
5164
5162
|
const linksResult = await validateLinksInternal(state);
|
|
5165
5163
|
await state.writeLinks(linksResult);
|
|
@@ -5195,7 +5193,7 @@ async function validateLinks(state) {
|
|
|
5195
5193
|
}
|
|
5196
5194
|
async function validateCoverage(state) {
|
|
5197
5195
|
if (!await state.isInitialized()) {
|
|
5198
|
-
return error("No
|
|
5196
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
5199
5197
|
}
|
|
5200
5198
|
const coverageResult = await validateCoverageInternal(state);
|
|
5201
5199
|
await state.writeCoverage(coverageResult);
|
|
@@ -5257,7 +5255,7 @@ async function validateCoverage(state) {
|
|
|
5257
5255
|
}
|
|
5258
5256
|
async function validateEpic(state, options) {
|
|
5259
5257
|
if (!await state.isInitialized()) {
|
|
5260
|
-
return error("No
|
|
5258
|
+
return error("No Lisa project found.", "NOT_INITIALIZED");
|
|
5261
5259
|
}
|
|
5262
5260
|
const epicDirs = await state.listEpicDirs();
|
|
5263
5261
|
const epicDir = epicDirs.find((d) => d.startsWith(`${options.epicId}-`));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "smartlisa",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "AI-powered planning system for Claude Code",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -38,9 +38,11 @@
|
|
|
38
38
|
},
|
|
39
39
|
"files": [
|
|
40
40
|
"dist",
|
|
41
|
-
".claude"
|
|
41
|
+
".claude-plugin",
|
|
42
|
+
"skills"
|
|
42
43
|
],
|
|
43
44
|
"scripts": {
|
|
45
|
+
"init:claude": "node scripts/init-claude.js",
|
|
44
46
|
"lisa": "tsx src/adapters/cli/index.ts",
|
|
45
47
|
"build": "node esbuild.config.js",
|
|
46
48
|
"build:watch": "node esbuild.config.js --watch",
|
|
@@ -53,7 +55,10 @@
|
|
|
53
55
|
"test": "vitest run",
|
|
54
56
|
"test:watch": "vitest",
|
|
55
57
|
"test:coverage": "vitest run --coverage",
|
|
56
|
-
"ci": "npm run typecheck && npm run lint && npm run test"
|
|
58
|
+
"ci": "npm run typecheck && npm run lint && npm run test",
|
|
59
|
+
"version:patch": "node scripts/bump-version.js patch",
|
|
60
|
+
"version:minor": "node scripts/bump-version.js minor",
|
|
61
|
+
"version:major": "node scripts/bump-version.js major"
|
|
57
62
|
},
|
|
58
63
|
"dependencies": {
|
|
59
64
|
"chalk": "^5.3.0",
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lisa
|
|
3
|
+
description: Plan and organize projects into milestones, epics, and stories. Use when breaking down work, creating roadmaps, planning features, asking "what should I work on?", "lisa status", "show me the board", organizing a project, or when user wants to scope and structure development work. Also triggers on "help me plan", "break this down", "create a roadmap", or "add milestone/epic/story".
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Lisa - Planning Mode
|
|
8
|
+
|
|
9
|
+
Plan and organize projects into milestones, epics, and stories.
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Check project status
|
|
15
|
+
lisa status
|
|
16
|
+
|
|
17
|
+
# Start a new project
|
|
18
|
+
lisa discover init "Project Name"
|
|
19
|
+
|
|
20
|
+
# View the board
|
|
21
|
+
lisa status board
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Workflow
|
|
25
|
+
|
|
26
|
+
### New Project
|
|
27
|
+
|
|
28
|
+
1. **Ask for project name** - Confirm what they're building
|
|
29
|
+
2. **Initialize**: `lisa discover init "Project Name"`
|
|
30
|
+
3. **Check for existing code** - Read key files to understand patterns
|
|
31
|
+
4. **Discovery conversation** - Natural Q&A about problem, vision, constraints
|
|
32
|
+
- For brownfield: suggest answers based on what you read
|
|
33
|
+
|
|
34
|
+
### Existing Project
|
|
35
|
+
|
|
36
|
+
1. **Check status**: `lisa status`
|
|
37
|
+
2. **View board**: `lisa status board`
|
|
38
|
+
3. **Add to plan** or **work on stories** as needed
|
|
39
|
+
|
|
40
|
+
## Commands Reference
|
|
41
|
+
|
|
42
|
+
| Action | Command |
|
|
43
|
+
|--------|---------|
|
|
44
|
+
| Project overview | `lisa status` |
|
|
45
|
+
| Kanban board | `lisa status board` |
|
|
46
|
+
| Story details | `lisa status show <id>` |
|
|
47
|
+
| Start discovery | `lisa discover init "Name"` |
|
|
48
|
+
| Continue discovery | `lisa discover` |
|
|
49
|
+
| View milestones | `lisa plan milestones` |
|
|
50
|
+
| Add milestone | `lisa plan add-milestone --name 'Name' --description 'Desc'` |
|
|
51
|
+
| Add epic | `lisa plan add-epic --milestone M1 --name 'Name' --description 'Desc'` |
|
|
52
|
+
| Generate stories | `lisa plan stories E1` |
|
|
53
|
+
| Mark progress | `lisa feedback mark <id> <status>` |
|
|
54
|
+
| Validate plan | `lisa validate` |
|
|
55
|
+
|
|
56
|
+
## ID Formats
|
|
57
|
+
|
|
58
|
+
| Type | Format | Example |
|
|
59
|
+
|------|--------|---------|
|
|
60
|
+
| Milestone | `M#` | `M1` |
|
|
61
|
+
| Epic | `E#` | `E1` |
|
|
62
|
+
| Story | `E#.S#` | `E1.S2` |
|
|
63
|
+
|
|
64
|
+
## References
|
|
65
|
+
|
|
66
|
+
- [commands.md](references/commands.md) - Full command reference
|
|
67
|
+
- [examples.md](references/examples.md) - Workflow examples
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Lisa Command Reference
|
|
2
|
+
|
|
3
|
+
Complete reference for all Lisa CLI commands. Use `--help` with any command for quick help.
|
|
4
|
+
|
|
5
|
+
## Discovery Commands
|
|
6
|
+
|
|
7
|
+
Gather project context through guided discovery sessions.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
lisa discover [subcommand] [options]
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
| Subcommand | Description |
|
|
14
|
+
|------------|-------------|
|
|
15
|
+
| *(none)* | Start or continue discovery session |
|
|
16
|
+
| `init <name>` | Initialize new project |
|
|
17
|
+
| `status` | Show discovery progress and gaps |
|
|
18
|
+
| `complete` | Mark discovery phase complete |
|
|
19
|
+
| `add-entry` | Add discovery entry manually |
|
|
20
|
+
| `epic <id>` | Start discovery for specific epic |
|
|
21
|
+
| `milestone <id>` | Start discovery for milestone |
|
|
22
|
+
|
|
23
|
+
### Discovery Options
|
|
24
|
+
|
|
25
|
+
| Option | Description |
|
|
26
|
+
|--------|-------------|
|
|
27
|
+
| `--quick` | Essentials only (problem, vision, success) |
|
|
28
|
+
| `--standard` | Balanced depth (default) |
|
|
29
|
+
| `--deep` | Comprehensive discovery |
|
|
30
|
+
|
|
31
|
+
### Add Entry Options
|
|
32
|
+
|
|
33
|
+
| Option | Description |
|
|
34
|
+
|--------|-------------|
|
|
35
|
+
| `--category <cat>` | Category: `problem`, `goals`, `users`, `constraints`, `scope`, `technical`, `risks`, `success` |
|
|
36
|
+
| `--question '<q>'` | The discovery question |
|
|
37
|
+
| `--answer '<a>'` | The answer/information |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Plan Commands
|
|
42
|
+
|
|
43
|
+
Create and manage roadmap artifacts.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
lisa plan [subcommand] [options]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
| Subcommand | Description |
|
|
50
|
+
|------------|-------------|
|
|
51
|
+
| *(none)* | Show milestones |
|
|
52
|
+
| `milestones` | List all milestones |
|
|
53
|
+
| `add-milestone` | Add new milestone |
|
|
54
|
+
| `epics [M1]` | List epics (optionally filter by milestone) |
|
|
55
|
+
| `add-epic` | Add new epic to milestone |
|
|
56
|
+
| `epic <id>` | View/plan specific epic |
|
|
57
|
+
| `stories <id>` | List stories for epic |
|
|
58
|
+
|
|
59
|
+
### Add Milestone Options
|
|
60
|
+
|
|
61
|
+
| Option | Description |
|
|
62
|
+
|--------|-------------|
|
|
63
|
+
| `--name '<name>'` | Milestone name (required) |
|
|
64
|
+
| `--description '<desc>'` | Milestone description (required) |
|
|
65
|
+
|
|
66
|
+
### Add Epic Options
|
|
67
|
+
|
|
68
|
+
| Option | Description |
|
|
69
|
+
|--------|-------------|
|
|
70
|
+
| `--milestone <M1>` | Parent milestone ID (required) |
|
|
71
|
+
| `--name '<name>'` | Epic name (required) |
|
|
72
|
+
| `--description '<desc>'` | Epic description (required) |
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Status Commands
|
|
77
|
+
|
|
78
|
+
View project state and story details.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
lisa status [subcommand] [options]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
| Subcommand | Description |
|
|
85
|
+
|------------|-------------|
|
|
86
|
+
| *(none)* | Project overview with phase and progress |
|
|
87
|
+
| `board [epic]` | Kanban board (optionally filter by epic) |
|
|
88
|
+
| `show <id>` | Detailed story information |
|
|
89
|
+
| `context [target]` | Context for project, milestone, epic, or story |
|
|
90
|
+
| `why <id>` | Explain story lineage (trace requirements) |
|
|
91
|
+
| `how <id>` | Implementation guidance |
|
|
92
|
+
|
|
93
|
+
### Status Options
|
|
94
|
+
|
|
95
|
+
| Option | Description |
|
|
96
|
+
|--------|-------------|
|
|
97
|
+
| `--full` | Full output without truncation |
|
|
98
|
+
| `--format json` | Output in JSON format |
|
|
99
|
+
|
|
100
|
+
### ID Formats
|
|
101
|
+
|
|
102
|
+
| Format | Example | Description |
|
|
103
|
+
|--------|---------|-------------|
|
|
104
|
+
| Milestone | `M1` | Milestone 1 |
|
|
105
|
+
| Epic | `E1` | Epic 1 |
|
|
106
|
+
| Story | `E1.S2` | Epic 1, Story 2 |
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Feedback Commands
|
|
111
|
+
|
|
112
|
+
Track progress and manage feedback items.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
lisa feedback [subcommand] [options]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
| Subcommand | Description |
|
|
119
|
+
|------------|-------------|
|
|
120
|
+
| *(none)* | List all pending feedback items |
|
|
121
|
+
| `mark <id> <status>` | Update story status |
|
|
122
|
+
| `add <id>` | Add feedback to story |
|
|
123
|
+
| `resolve <fb-id>` | Mark feedback as resolved |
|
|
124
|
+
| `dismiss <fb-id>` | Dismiss feedback without action |
|
|
125
|
+
|
|
126
|
+
### Story Statuses
|
|
127
|
+
|
|
128
|
+
| Status | Description |
|
|
129
|
+
|--------|-------------|
|
|
130
|
+
| `todo` | Not started |
|
|
131
|
+
| `assigned` | Assigned to someone |
|
|
132
|
+
| `in_progress` | Work in progress |
|
|
133
|
+
| `review` | In review |
|
|
134
|
+
| `done` | Completed |
|
|
135
|
+
| `blocked` | Blocked by dependency/issue |
|
|
136
|
+
| `deferred` | Postponed to later |
|
|
137
|
+
|
|
138
|
+
### Feedback Types
|
|
139
|
+
|
|
140
|
+
| Type | Description |
|
|
141
|
+
|------|-------------|
|
|
142
|
+
| `blocker` | Something blocking progress |
|
|
143
|
+
| `gap` | Missing information or requirement |
|
|
144
|
+
| `scope` | Scope change or clarification needed |
|
|
145
|
+
| `conflict` | Conflicting requirements |
|
|
146
|
+
| `question` | Question needing answer |
|
|
147
|
+
|
|
148
|
+
### Feedback Options
|
|
149
|
+
|
|
150
|
+
| Option | Description |
|
|
151
|
+
|--------|-------------|
|
|
152
|
+
| `--reason '<text>'` | Reason for status change (mark) |
|
|
153
|
+
| `--type <type>` | Feedback type (add) |
|
|
154
|
+
| `--message '<text>'` | Feedback message (add) |
|
|
155
|
+
| `--resolution '<text>'` | Resolution note (resolve) |
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## Validate Commands
|
|
160
|
+
|
|
161
|
+
Check plan integrity and coverage.
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
lisa validate [subcommand]
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
| Subcommand | Description |
|
|
168
|
+
|------------|-------------|
|
|
169
|
+
| *(none)* | Run full validation suite |
|
|
170
|
+
| `links` | Check all cross-references |
|
|
171
|
+
| `coverage` | Check requirement coverage |
|
|
172
|
+
| `epic <id>` | Validate specific epic |
|
|
173
|
+
|
|
174
|
+
### What Gets Validated
|
|
175
|
+
|
|
176
|
+
- All story IDs reference valid epics
|
|
177
|
+
- All epic IDs reference valid milestones
|
|
178
|
+
- No orphaned or dangling references
|
|
179
|
+
- Requirements have implementing stories
|
|
180
|
+
- Stories have acceptance criteria
|
|
181
|
+
- Epic scope is complete and consistent
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Global Options
|
|
186
|
+
|
|
187
|
+
Available on all commands:
|
|
188
|
+
|
|
189
|
+
| Option | Description |
|
|
190
|
+
|--------|-------------|
|
|
191
|
+
| `--help`, `-h` | Show help for command |
|
|
192
|
+
| `--full` | Show full output without truncation |
|
|
193
|
+
| `--format json` | Output in JSON format |
|
|
194
|
+
|
|
195
|
+
## Examples
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
lisa status --help
|
|
199
|
+
lisa discover --deep
|
|
200
|
+
lisa feedback mark E1.S2 done
|
|
201
|
+
```
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# Lisa Workflow Examples
|
|
2
|
+
|
|
3
|
+
Practical examples for common planning scenarios.
|
|
4
|
+
|
|
5
|
+
## Example 1: Starting a New Project
|
|
6
|
+
|
|
7
|
+
User says: "Help me plan a todo app"
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# 1. Initialize the project
|
|
11
|
+
lisa discover init "Todo App"
|
|
12
|
+
|
|
13
|
+
# 2. Start discovery (ask about problem, users, goals)
|
|
14
|
+
lisa discover
|
|
15
|
+
|
|
16
|
+
# 3. Check discovery progress
|
|
17
|
+
lisa discover status
|
|
18
|
+
|
|
19
|
+
# 4. For comprehensive planning, use deep mode
|
|
20
|
+
lisa discover --deep
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Key points:**
|
|
24
|
+
- Always ask user for the project name before initializing
|
|
25
|
+
- Discovery is iterative - run it multiple times to fill gaps
|
|
26
|
+
- Check status to see what's missing
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Example 2: Brownfield Project (Existing Codebase)
|
|
31
|
+
|
|
32
|
+
User says: "Help me plan features for my existing app"
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# 1. Initialize with existing codebase
|
|
36
|
+
lisa discover init "My Existing App"
|
|
37
|
+
|
|
38
|
+
# 2. Analyze the codebase first
|
|
39
|
+
lisa discover codebase
|
|
40
|
+
|
|
41
|
+
# 3. Continue with regular discovery
|
|
42
|
+
lisa discover
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Key points:**
|
|
46
|
+
- Run `codebase` analysis before general discovery
|
|
47
|
+
- This captures existing patterns, tech stack, and structure
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Example 3: Creating the Roadmap
|
|
52
|
+
|
|
53
|
+
User says: "Break this into milestones and epics"
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# 1. Check discovery is sufficient
|
|
57
|
+
lisa discover status
|
|
58
|
+
|
|
59
|
+
# 2. Generate/view milestones
|
|
60
|
+
lisa plan milestones
|
|
61
|
+
|
|
62
|
+
# 3. Add milestones manually if needed
|
|
63
|
+
lisa plan add-milestone \
|
|
64
|
+
--name 'MVP' \
|
|
65
|
+
--description 'Core todo CRUD functionality'
|
|
66
|
+
|
|
67
|
+
lisa plan add-milestone \
|
|
68
|
+
--name 'Collaboration' \
|
|
69
|
+
--description 'Shared lists and real-time sync'
|
|
70
|
+
|
|
71
|
+
# 4. Generate epics for milestone
|
|
72
|
+
lisa plan epics M1
|
|
73
|
+
|
|
74
|
+
# 5. Add epics manually if needed
|
|
75
|
+
lisa plan add-epic \
|
|
76
|
+
--milestone M1 \
|
|
77
|
+
--name 'Task Management' \
|
|
78
|
+
--description 'Create, edit, delete, complete tasks'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Key points:**
|
|
82
|
+
- Focus on one milestone at a time with `plan epics M1`
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Example 4: Generating Stories
|
|
87
|
+
|
|
88
|
+
User says: "Generate stories for the authentication epic"
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 1. View epic details
|
|
92
|
+
lisa plan epic E1
|
|
93
|
+
|
|
94
|
+
# 2. Generate stories for the epic
|
|
95
|
+
lisa plan stories E1
|
|
96
|
+
|
|
97
|
+
# 3. View the generated stories
|
|
98
|
+
lisa status board E1
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Example 5: Working on Stories
|
|
104
|
+
|
|
105
|
+
User says: "What should I work on?" or "Show me story E1.S2"
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# View the kanban board
|
|
109
|
+
lisa status board
|
|
110
|
+
|
|
111
|
+
# Get details on a specific story
|
|
112
|
+
lisa status show E1.S2
|
|
113
|
+
|
|
114
|
+
# Understand why this story exists
|
|
115
|
+
lisa status why E1.S2
|
|
116
|
+
|
|
117
|
+
# Get implementation guidance
|
|
118
|
+
lisa status how E1.S2
|
|
119
|
+
|
|
120
|
+
# Get full context for implementation
|
|
121
|
+
lisa status context E1.S2 --full
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Example 6: Tracking Progress
|
|
127
|
+
|
|
128
|
+
User says: "I finished E1.S2" or "E1.S3 is blocked"
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Mark story as done
|
|
132
|
+
lisa feedback mark E1.S2 done
|
|
133
|
+
|
|
134
|
+
# Mark story as blocked with reason
|
|
135
|
+
lisa feedback mark E1.S3 blocked \
|
|
136
|
+
--reason "Waiting for API documentation"
|
|
137
|
+
|
|
138
|
+
# Start working on a story
|
|
139
|
+
lisa feedback mark E1.S4 in_progress
|
|
140
|
+
|
|
141
|
+
# Mark for review
|
|
142
|
+
lisa feedback mark E1.S4 review
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Example 7: Adding Feedback
|
|
148
|
+
|
|
149
|
+
User says: "There's a problem with this story" or "I have a question"
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
# Report a blocker
|
|
153
|
+
lisa feedback add E1.S2 \
|
|
154
|
+
--type blocker \
|
|
155
|
+
--message "API endpoint returns wrong format"
|
|
156
|
+
|
|
157
|
+
# Ask a question
|
|
158
|
+
lisa feedback add E1.S3 \
|
|
159
|
+
--type question \
|
|
160
|
+
--message "Should we support pagination?"
|
|
161
|
+
|
|
162
|
+
# Report scope issue
|
|
163
|
+
lisa feedback add E2.S1 \
|
|
164
|
+
--type scope \
|
|
165
|
+
--message "This needs to handle bulk operations too"
|
|
166
|
+
|
|
167
|
+
# View all pending feedback
|
|
168
|
+
lisa feedback
|
|
169
|
+
|
|
170
|
+
# Resolve feedback
|
|
171
|
+
lisa feedback resolve fb-abc123 \
|
|
172
|
+
--resolution "Added pagination support"
|
|
173
|
+
|
|
174
|
+
# Dismiss feedback (not actionable)
|
|
175
|
+
lisa feedback dismiss fb-xyz789
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Example 8: Validation
|
|
181
|
+
|
|
182
|
+
User says: "Validate my plan" or "Check for issues"
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
# Run full validation
|
|
186
|
+
lisa validate
|
|
187
|
+
|
|
188
|
+
# Check just cross-references
|
|
189
|
+
lisa validate links
|
|
190
|
+
|
|
191
|
+
# Check requirement coverage
|
|
192
|
+
lisa validate coverage
|
|
193
|
+
|
|
194
|
+
# Validate specific epic
|
|
195
|
+
lisa validate epic E1
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Example 9: Quick Status Check
|
|
201
|
+
|
|
202
|
+
User says: "Lisa status" or "What's the project state?"
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
# Project overview
|
|
206
|
+
lisa status
|
|
207
|
+
|
|
208
|
+
# Kanban board
|
|
209
|
+
lisa status board
|
|
210
|
+
|
|
211
|
+
# Context for a specific item
|
|
212
|
+
lisa status context E1 --full
|
|
213
|
+
lisa status context M1
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
---
|
|
217
|
+
|
|
218
|
+
## Workflow Decision Tree
|
|
219
|
+
|
|
220
|
+
```
|
|
221
|
+
User request → What phase are we in?
|
|
222
|
+
|
|
223
|
+
No .lisa/ directory?
|
|
224
|
+
→ Ask for project name
|
|
225
|
+
→ lisa discover init "Name"
|
|
226
|
+
|
|
227
|
+
Discovery incomplete?
|
|
228
|
+
→ lisa discover
|
|
229
|
+
→ lisa discover status
|
|
230
|
+
|
|
231
|
+
No milestones?
|
|
232
|
+
→ lisa plan milestones
|
|
233
|
+
|
|
234
|
+
No epics?
|
|
235
|
+
→ lisa plan epics M1
|
|
236
|
+
|
|
237
|
+
No stories?
|
|
238
|
+
→ lisa plan stories E1
|
|
239
|
+
|
|
240
|
+
Working on implementation?
|
|
241
|
+
→ lisa status how E1.S2
|
|
242
|
+
→ lisa feedback mark E1.S2 in_progress
|
|
243
|
+
|
|
244
|
+
Need to validate?
|
|
245
|
+
→ lisa validate
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## Common Patterns
|
|
251
|
+
|
|
252
|
+
### Pattern: Starting a conversation about planning
|
|
253
|
+
|
|
254
|
+
1. Check if `.lisa/` exists
|
|
255
|
+
2. If not, ask user: "What would you like to name this project?"
|
|
256
|
+
3. Initialize and start discovery
|
|
257
|
+
|
|
258
|
+
### Pattern: User asks "what's next?"
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
lisa status
|
|
262
|
+
lisa status board
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Pattern: User completed work
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
lisa feedback mark <story-id> done
|
|
269
|
+
lisa status board # Show updated board
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Pattern: User is stuck
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
lisa status how <story-id> # Implementation guidance
|
|
276
|
+
lisa status why <story-id> # Context and reasoning
|
|
277
|
+
```
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lisa-work
|
|
3
|
+
description: Implement Lisa stories with full context. Use when asked to "work on E1.S2", "implement this story", "start working on", "help me build", "pick up a task", "next story", or when implementing specific stories from the Lisa plan. Also triggers on "implement E1.S1", "let's code this story", or "start the next task".
|
|
4
|
+
user-invocable: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Lisa - Implementation Mode
|
|
8
|
+
|
|
9
|
+
Implement stories with full context, architecture, and acceptance criteria.
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Work on a specific story
|
|
15
|
+
/lisa-work E1.S2
|
|
16
|
+
|
|
17
|
+
# See available stories and pick one
|
|
18
|
+
/lisa-work
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
### Phase 1: Story Selection
|
|
24
|
+
|
|
25
|
+
**If story ID provided** (e.g., `/lisa-work E1.S2`):
|
|
26
|
+
- Validate the story exists
|
|
27
|
+
- Load its context directly
|
|
28
|
+
|
|
29
|
+
**If no story ID** (e.g., `/lisa-work`):
|
|
30
|
+
1. Run `lisa status board` to see available stories
|
|
31
|
+
2. Ask the user which story to work on
|
|
32
|
+
3. Recommend stories that are `todo` with dependencies `done`
|
|
33
|
+
|
|
34
|
+
### Phase 2: Load Context
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
lisa status context E1.S2 --full
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Phase 3: Mark In Progress
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
lisa feedback mark E1.S2 in_progress
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Phase 4: Present Working Context
|
|
47
|
+
|
|
48
|
+
Summarize for the user:
|
|
49
|
+
- **Story**: Title, description
|
|
50
|
+
- **Acceptance Criteria**: As a checklist
|
|
51
|
+
- **Architecture**: Relevant patterns
|
|
52
|
+
- **Dependencies**: Status of prerequisites
|
|
53
|
+
|
|
54
|
+
### Phase 5: Implement
|
|
55
|
+
|
|
56
|
+
- Follow acceptance criteria as a checklist
|
|
57
|
+
- Reference architecture for patterns
|
|
58
|
+
- Never mention story IDs in code comments
|
|
59
|
+
|
|
60
|
+
**If blocked:**
|
|
61
|
+
```bash
|
|
62
|
+
lisa feedback mark E1.S2 blocked --reason "Describe the issue"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### Phase 6: Complete
|
|
66
|
+
|
|
67
|
+
1. Ask user to confirm all criteria are met
|
|
68
|
+
2. Only after explicit approval:
|
|
69
|
+
```bash
|
|
70
|
+
lisa feedback mark E1.S2 done --reason "Brief summary"
|
|
71
|
+
```
|
|
72
|
+
3. Offer next steps
|
|
73
|
+
|
|
74
|
+
**Important:** Never mark done without user confirmation.
|
|
75
|
+
|
|
76
|
+
## Commands Reference
|
|
77
|
+
|
|
78
|
+
| Action | Command |
|
|
79
|
+
|--------|---------|
|
|
80
|
+
| View board | `lisa status board` |
|
|
81
|
+
| Full context | `lisa status context <id> --full` |
|
|
82
|
+
| Why it exists | `lisa status why <id>` |
|
|
83
|
+
| Mark in progress | `lisa feedback mark <id> in_progress` |
|
|
84
|
+
| Mark blocked | `lisa feedback mark <id> blocked --reason "..."` |
|
|
85
|
+
| Mark done | `lisa feedback mark <id> done --reason "..."` |
|
|
86
|
+
| Add feedback | `lisa feedback add <id> --type <type> --message "..."` |
|
|
87
|
+
|
|
88
|
+
## Story Status Flow
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
todo → in_progress → review → done
|
|
92
|
+
↓
|
|
93
|
+
blocked
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## References
|
|
97
|
+
|
|
98
|
+
- [workflow.md](references/workflow.md) - Detailed workflow and error handling
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Lisa Work - Detailed Implementation Workflow
|
|
2
|
+
|
|
3
|
+
Step-by-step guide for implementing stories with `/lisa-work`.
|
|
4
|
+
|
|
5
|
+
## Story Selection Flow
|
|
6
|
+
|
|
7
|
+
### With Story ID: `/lisa-work E1.S2`
|
|
8
|
+
|
|
9
|
+
1. Validate the story exists:
|
|
10
|
+
```bash
|
|
11
|
+
lisa status show E1.S2
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
2. If not found, show error and suggest:
|
|
15
|
+
```bash
|
|
16
|
+
lisa status board
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Without Story ID: `/lisa-work`
|
|
20
|
+
|
|
21
|
+
1. Get the current board:
|
|
22
|
+
```bash
|
|
23
|
+
lisa status board
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. Present available stories to the user, highlighting:
|
|
27
|
+
- Stories with status `todo`
|
|
28
|
+
- Stories whose dependencies are all `done`
|
|
29
|
+
|
|
30
|
+
3. Ask: "Which story would you like to work on?"
|
|
31
|
+
|
|
32
|
+
4. Recommend the best candidate:
|
|
33
|
+
- First `todo` story with no pending dependencies
|
|
34
|
+
- Lowest epic number, then lowest story number
|
|
35
|
+
|
|
36
|
+
## Context Loading
|
|
37
|
+
|
|
38
|
+
### Primary Context
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
lisa status context E1.S2 --full
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
This returns:
|
|
45
|
+
- Story details (title, description, acceptance criteria)
|
|
46
|
+
- Epic information
|
|
47
|
+
- Milestone context
|
|
48
|
+
- Architecture reference
|
|
49
|
+
- Project-level discovery context
|
|
50
|
+
|
|
51
|
+
### Implementation Guidance
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
lisa status how E1.S2
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
This returns:
|
|
58
|
+
- Implementation checklist based on acceptance criteria
|
|
59
|
+
- Architecture reference snippets
|
|
60
|
+
- Stack context (tech stack, patterns)
|
|
61
|
+
- Dependency status
|
|
62
|
+
|
|
63
|
+
### Story Rationale (Optional)
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
lisa status why E1.S2
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Use this when the user wants to understand:
|
|
70
|
+
- Why this story exists
|
|
71
|
+
- What requirements it fulfills
|
|
72
|
+
- How it connects to the epic/milestone goals
|
|
73
|
+
|
|
74
|
+
## Working Context Presentation
|
|
75
|
+
|
|
76
|
+
After loading context, present it in this format:
|
|
77
|
+
|
|
78
|
+
```markdown
|
|
79
|
+
## Working on: E1.S2 - [Story Title]
|
|
80
|
+
|
|
81
|
+
**Epic:** E1 - [Epic Name]
|
|
82
|
+
**Status:** in_progress
|
|
83
|
+
|
|
84
|
+
### Description
|
|
85
|
+
[Story description from context]
|
|
86
|
+
|
|
87
|
+
### Acceptance Criteria
|
|
88
|
+
- [ ] First criterion
|
|
89
|
+
- [ ] Second criterion
|
|
90
|
+
- [ ] Third criterion
|
|
91
|
+
|
|
92
|
+
### Architecture Notes
|
|
93
|
+
[Relevant sections from architecture.md]
|
|
94
|
+
|
|
95
|
+
### Dependencies
|
|
96
|
+
- E1.S1: done - [Title]
|
|
97
|
+
|
|
98
|
+
### Ready to implement!
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## During Implementation
|
|
102
|
+
|
|
103
|
+
### Tracking Progress
|
|
104
|
+
|
|
105
|
+
As you work through acceptance criteria:
|
|
106
|
+
- Check off each criterion as it's completed
|
|
107
|
+
- Reference architecture for patterns
|
|
108
|
+
- Ask clarifying questions if needed
|
|
109
|
+
|
|
110
|
+
### Handling Issues
|
|
111
|
+
|
|
112
|
+
**Blocked by external dependency:**
|
|
113
|
+
```bash
|
|
114
|
+
lisa feedback mark E1.S2 blocked --reason "Waiting for API endpoint"
|
|
115
|
+
lisa feedback add E1.S2 --type blocker --message "Need /api/users endpoint"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Missing information:**
|
|
119
|
+
```bash
|
|
120
|
+
lisa feedback add E1.S2 --type gap --message "Architecture doesn't specify error handling"
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**Scope question:**
|
|
124
|
+
```bash
|
|
125
|
+
lisa feedback add E1.S2 --type question --message "Should this support pagination?"
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Feedback Types
|
|
129
|
+
|
|
130
|
+
| Type | Use When |
|
|
131
|
+
|------|----------|
|
|
132
|
+
| `blocker` | Something external is blocking progress |
|
|
133
|
+
| `gap` | Missing information or requirement |
|
|
134
|
+
| `scope` | Scope change or clarification needed |
|
|
135
|
+
| `conflict` | Conflicting requirements found |
|
|
136
|
+
| `question` | Need answer to proceed |
|
|
137
|
+
|
|
138
|
+
## Completing Work
|
|
139
|
+
|
|
140
|
+
### Review Before Closing
|
|
141
|
+
|
|
142
|
+
**Never mark a story done without explicit user confirmation.**
|
|
143
|
+
|
|
144
|
+
1. When all acceptance criteria appear complete, ask:
|
|
145
|
+
> "All acceptance criteria look complete. Would you like to review the changes before marking E1.S2 as done?"
|
|
146
|
+
|
|
147
|
+
2. Wait for user response:
|
|
148
|
+
- **"Yes, mark it done"** → proceed to mark done
|
|
149
|
+
- **"Let me review"** → help them review the changes
|
|
150
|
+
- **"Not yet, I found an issue"** → continue implementation
|
|
151
|
+
|
|
152
|
+
### Marking Done (After User Approval)
|
|
153
|
+
|
|
154
|
+
Only after explicit user confirmation:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
lisa feedback mark E1.S2 done --reason "Implemented all acceptance criteria"
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Next Steps
|
|
161
|
+
|
|
162
|
+
After completion, offer:
|
|
163
|
+
1. Work on the next story
|
|
164
|
+
2. View the updated board
|
|
165
|
+
3. Take a break
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
lisa status board
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Error Handling
|
|
172
|
+
|
|
173
|
+
### Story Not Found
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
Error: Story E1.S99 not found.
|
|
177
|
+
|
|
178
|
+
Available stories:
|
|
179
|
+
lisa status board
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Epic Not Found
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
Error: Epic E99 not found.
|
|
186
|
+
|
|
187
|
+
Check available epics:
|
|
188
|
+
lisa plan epics
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### No Stories Available
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
No todo stories found.
|
|
195
|
+
|
|
196
|
+
Options:
|
|
197
|
+
- Generate stories: lisa plan stories E1
|
|
198
|
+
- Check board: lisa status board
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Dependencies Not Complete
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
Warning: E1.S2 depends on E1.S1 which is still 'todo'.
|
|
205
|
+
|
|
206
|
+
Recommendation:
|
|
207
|
+
- Work on E1.S1 first
|
|
208
|
+
- Or proceed with caution (may need rework)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Context Loading Failure
|
|
212
|
+
|
|
213
|
+
```
|
|
214
|
+
Error: Architecture not found for E1.
|
|
215
|
+
|
|
216
|
+
Generate artifacts first:
|
|
217
|
+
lisa plan epic E1
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Tips for Effective Implementation
|
|
221
|
+
|
|
222
|
+
1. **Read the architecture first** - Understand patterns before coding
|
|
223
|
+
2. **Check dependencies** - Ensure prerequisite stories are done
|
|
224
|
+
3. **Work through criteria sequentially** - Don't skip around
|
|
225
|
+
4. **Mark blocked early** - Don't spin on issues
|
|
226
|
+
5. **Add feedback for plan gaps** - Help improve future stories
|