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.
@@ -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(), RALPH_DIR, relativePath);
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 RalphError("Project not initialized", "NOT_INITIALIZED");
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 RalphError(`Milestone ${milestoneId} not found`, "NOT_FOUND");
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 RalphError(`Epic ${epicId} not found`, "NOT_FOUND");
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 RalphError(`Epic ${epicId} not found`, "NOT_FOUND");
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 RalphError(`Milestone ${epic.milestone} not found`, "NOT_FOUND");
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 RalphError(`Epic ${epicId} not found`, "NOT_FOUND");
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 RalphError(
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 RalphError(
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 Ralph project found. Run 'discover init' first.", "NOT_INITIALIZED");
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("Ralph Status"),
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 Ralph project found.", "NOT_INITIALIZED");
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("Ralph Board")];
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph"),
2784
- section.success(`Created .ralph/ directory`),
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 Ralph project found. Run 'discover init' first.", "NOT_INITIALIZED");
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 Ralph project found. Run 'discover init' first.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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 Ralph project found.", "NOT_INITIALIZED");
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.0",
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