@codyswann/lisa 1.16.0 → 1.18.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.
@@ -15,6 +15,10 @@
15
15
  # Marker files: $PLANS_DIR/.active-plan-<session-id> contain the absolute path to the
16
16
  # active plan file. Stale markers (>24h) are cleaned up on each invocation.
17
17
  #
18
+ # Dedup: Session ID dedup is scoped to the ## Sessions section only, not the entire
19
+ # file. This prevents false positives when session IDs appear elsewhere in plan content
20
+ # (e.g., scratchpad directory paths like /private/tmp/claude-501/.../SESSION_ID/...).
21
+ #
18
22
  # Debug logging: All key decisions are logged to $PLANS_DIR/.track-plan-debug.log for
19
23
  # diagnostics if session IDs land in the wrong plan file.
20
24
  #
@@ -123,9 +127,11 @@ if [[ ! -f "$PLAN_FILE" ]]; then
123
127
  exit 0
124
128
  fi
125
129
 
126
- # Check if session ID already exists in the file (dedup)
127
- if grep -qF "$SESSION_ID" "$PLAN_FILE" 2>/dev/null; then
128
- log_debug "dedup: session ID already in $PLAN_FILE (resolved via $RESOLUTION_METHOD), skipping write"
130
+ # Check if session ID already exists in the ## Sessions section (dedup)
131
+ # Only search within the Sessions section to avoid false positives from session IDs
132
+ # appearing in plan content (e.g., scratchpad paths contain session IDs)
133
+ if sed -n '/^## Sessions$/,$p' "$PLAN_FILE" 2>/dev/null | grep -qF "$SESSION_ID"; then
134
+ log_debug "dedup: session ID already in $PLAN_FILE sessions section (resolved via $RESOLUTION_METHOD), skipping write"
129
135
  exit 0
130
136
  fi
131
137
 
@@ -0,0 +1,37 @@
1
+ # Lisa-Managed Files
2
+
3
+ The following files are managed by Lisa and will be overwritten on every `lisa` run. Never edit them directly. Where a local override exists, edit that instead.
4
+
5
+ ## Files with local overrides (edit the override, not the managed file)
6
+
7
+ | Managed File (do not edit) | Local Override (edit this instead) |
8
+ |---|---|
9
+ | `eslint.config.ts` | `eslint.config.local.ts` |
10
+ | `jest.config.ts` | `jest.config.local.ts` |
11
+ | `tsconfig.json` | `tsconfig.local.json` |
12
+ | `eslint.ignore.config.json` | `eslint.config.local.ts` |
13
+ | `eslint.thresholds.json` | Edit directly (create-only, Lisa won't overwrite) |
14
+ | `jest.thresholds.json` | Edit directly (create-only, Lisa won't overwrite) |
15
+ | `.claude/rules/coding-philosophy.md` | `.claude/rules/PROJECT_RULES.md` |
16
+ | `.claude/rules/plan.md` | `.claude/rules/PROJECT_RULES.md` |
17
+ | `.claude/rules/verfication.md` | `.claude/rules/PROJECT_RULES.md` |
18
+
19
+ ## Files and directories with NO local override (do not edit at all)
20
+
21
+ - `CLAUDE.md`, `HUMAN.md`, `.safety-net.json`
22
+ - `.prettierrc.json`, `.prettierignore`, `.lintstagedrc.json`, `.versionrc`, `.nvmrc`
23
+ - `.yamllint`, `.gitleaksignore`, `commitlint.config.cjs`, `sgconfig.yml`, `knip.json`
24
+ - `eslint.base.ts`, `eslint.typescript.ts`, `eslint.expo.ts`, `eslint.nestjs.ts`, `eslint.cdk.ts`, `eslint.slow.config.ts`
25
+ - `jest.base.ts`, `jest.typescript.ts`, `jest.expo.ts`, `jest.nestjs.ts`, `jest.cdk.ts`
26
+ - `tsconfig.base.json`, `tsconfig.typescript.json`, `tsconfig.expo.json`, `tsconfig.nestjs.json`, `tsconfig.cdk.json`
27
+ - `tsconfig.eslint.json`, `tsconfig.build.json`, `tsconfig.spec.json`
28
+ - `eslint-plugin-code-organization/*`, `eslint-plugin-component-structure/*`, `eslint-plugin-ui-standards/*`
29
+ - `.claude/settings.json`, `.claude/hooks/*`, `.claude/skills/*`, `.claude/commands/*`, `.claude/agents/*`
30
+ - `.claude/README.md`, `.claude/REFERENCE.md`
31
+ - `.github/workflows/quality.yml`, `.github/workflows/release.yml`, `.github/workflows/claude.yml`
32
+ - `.github/workflows/build.yml`, `.github/workflows/lighthouse.yml` (Expo)
33
+ - `.github/workflows/load-test.yml`, `.github/workflows/zap-baseline.yml` (NestJS)
34
+ - `.github/dependabot.yml`, `.github/GITHUB_ACTIONS.md`, `.github/k6/*`
35
+ - `lighthouserc.js`, `.mcp.json`, `.easignore.extra` (Expo)
36
+ - `scripts/zap-baseline.sh`, `.zap/*`
37
+ - `ast-grep/*`
@@ -10,7 +10,7 @@ When making a plan:
10
10
  - Always make sure you understand the correct versions of third party libraries
11
11
  - Always save the plan with a name befitting the actual plan contents
12
12
  - Always look for code that can be reused for implementation
13
- - The plan MUST including written instructions to create a task list using TaskCreate for each task. The list should contain items related to the plan and specify that subagents should handle as many in parallel as possible. The following should always be included in the task list
13
+ - The plan MUST include written instructions to create a task list using TaskCreate for each task (following the Task Creation Specification below). The list should contain items related to the plan and specify that subagents should handle as many in parallel as possible. The following should always be included in the task list
14
14
  - update/add/remove tests, containing the tests that need to get updated, added or removed
15
15
  - update/add/remove documentation (jsdocs, markdown files, etc), containing the documentation that need to get updated, added or removed
16
16
  - archive the plan (to be completed after all other tasks have been completed). This task should explcitly say to:
@@ -27,3 +27,53 @@ When making a plan:
27
27
  - If referencing a ticket (jira, linear, etc), always add a comment to the ticket with the finalized plan
28
28
  - The `## Sessions` section in plan files is auto-maintained by the `track-plan-sessions.sh` hook — do not manually edit it
29
29
 
30
+ ## Task Creation Specification
31
+
32
+ When plans include TaskCreate instructions, each task must use this format:
33
+
34
+ ### Parameters
35
+
36
+ - **subject**: Imperative form (e.g., "Add logout button to header")
37
+ - **activeForm**: Present continuous form (e.g., "Adding logout button to header")
38
+
39
+ ### Description Template
40
+
41
+ Every task description must be a markdown document with these sections:
42
+
43
+ **Type:** Bug | Task | Epic | Story
44
+
45
+ **Description:** Clear description based on type (Bug: symptoms/root cause; Story: Gherkin Given/When/Then; Task: clear goal; Epic: goal with sub-tasks)
46
+
47
+ **Acceptance Criteria:** Checkbox list of completion criteria
48
+
49
+ **Relevant Research:** Code references, patterns, architecture constraints extracted from research
50
+
51
+ **Skills to Invoke:** `/coding-philosophy` is always required, plus other applicable skills
52
+
53
+ **Implementation Details:** Files to modify, functions to implement, edge cases
54
+
55
+ **Testing Requirements:** Unit tests (with `describe/it` structure), Integration tests, E2E tests (or "N/A")
56
+
57
+ **Verification:** Every task MUST have empirical verification (see `verfication.md` for types). Include: verification type, proof command, and expected output.
58
+
59
+ **Learnings:** On task completion, use `TaskUpdate` to save discoveries: `metadata: { learnings: ["Learning 1", ...] }`
60
+
61
+ ### Metadata
62
+
63
+ ```json
64
+ {
65
+ "plan": "<plan-name>",
66
+ "type": "bug|task|epic|story",
67
+ "skills": ["/coding-philosophy", ...],
68
+ "verification": {
69
+ "type": "test|ui-recording|test-coverage|api-test|manual-check|documentation",
70
+ "command": "the proof command",
71
+ "expected": "what success looks like"
72
+ }
73
+ }
74
+ ```
75
+
76
+ ### Task Sizing
77
+
78
+ Each task must be small enough to have a **single, specific verification**. Ask: "Can I prove this is done with ONE command?" Split tasks that require multiple verifications.
79
+
@@ -0,0 +1,103 @@
1
+ /**
2
+ * This file is managed by Lisa.
3
+ * Do not edit directly — changes will be overwritten on the next `lisa` run.
4
+ */
5
+
6
+ /**
7
+ * ESLint 9 Flat Config - Slow Rules Only (NestJS)
8
+ *
9
+ * This configuration runs ONLY slow linting rules that are disabled in the
10
+ * main eslint.config.ts for performance. Run this periodically via `lint:slow`
11
+ * rather than on every lint pass.
12
+ *
13
+ * Rules included:
14
+ * - import/namespace - Type checks all namespace imports (slow)
15
+ * - import/no-cycle - Detects circular dependencies (very slow)
16
+ *
17
+ * NestJS-specific adjustments:
18
+ * - sonarjs/deprecation disabled (NestJS ecosystem APIs evolve frequently)
19
+ * - import/no-cycle disabled for *.module.ts (NestJS forwardRef pattern)
20
+ *
21
+ * @see https://github.com/import-js/eslint-plugin-import
22
+ * @module eslint.slow.config
23
+ */
24
+ import importPlugin from "eslint-plugin-import";
25
+ import sonarjsPlugin from "eslint-plugin-sonarjs";
26
+ import tseslint from "typescript-eslint";
27
+
28
+ import ignoreConfig from "./eslint.ignore.config.json" with { type: "json" };
29
+
30
+ const ignorePatterns = ignoreConfig.ignores || [];
31
+
32
+ // Get the TypeScript flat config from the import plugin
33
+ const importTypescriptConfig = importPlugin.flatConfigs.typescript;
34
+
35
+ export default [
36
+ // Use same ignores as main config, plus ignore all non-TS files
37
+ // This prevents errors from inline eslint directives in JS files
38
+ // that reference rules not loaded in this minimal config
39
+ // Also ignore template files in type-specific directories that don't have tsconfig
40
+ {
41
+ ignores: [
42
+ ...ignorePatterns,
43
+ "**/*.js",
44
+ "**/*.mjs",
45
+ "**/*.cjs",
46
+ "**/*.jsx",
47
+ "**/__tests__/**",
48
+ "cdk/**",
49
+ "expo/**",
50
+ "nestjs/**",
51
+ "typescript/**",
52
+ "npm-package/**",
53
+ ],
54
+ },
55
+
56
+ // TypeScript files - slow import rules only
57
+ {
58
+ files: ["**/*.ts", "**/*.tsx"],
59
+ linterOptions: {
60
+ // Ignore inline eslint-disable comments since they reference rules
61
+ // from the main config that aren't loaded in this minimal config
62
+ noInlineConfig: true,
63
+ },
64
+ languageOptions: {
65
+ parser: tseslint.parser,
66
+ parserOptions: {
67
+ project: "tsconfig.eslint.json",
68
+ },
69
+ },
70
+ plugins: {
71
+ ...(importTypescriptConfig?.plugins ?? {}),
72
+ sonarjs: sonarjsPlugin,
73
+ },
74
+ settings: {
75
+ ...(importTypescriptConfig?.settings ?? {}),
76
+ "import/resolver": {
77
+ ...((importTypescriptConfig?.settings?.["import/resolver"] as Record<
78
+ string,
79
+ unknown
80
+ >) ?? {}),
81
+ typescript: true,
82
+ },
83
+ },
84
+ rules: {
85
+ // ONLY slow rules - everything else runs in the main config
86
+ "import/namespace": "error",
87
+ "import/no-cycle": "error",
88
+
89
+ // NestJS ecosystem APIs evolve frequently with deprecation notices
90
+ // that are not immediately actionable (e.g., OpenAI SDK, MCP SDK)
91
+ "sonarjs/deprecation": "off",
92
+ },
93
+ },
94
+
95
+ // NestJS module files use forwardRef() to handle circular dependencies
96
+ // at runtime. ESLint's import/no-cycle doesn't understand this pattern.
97
+ {
98
+ files: ["**/*.module.ts"],
99
+ rules: {
100
+ "import/no-cycle": "off",
101
+ },
102
+ },
103
+ ];
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "extends": ["./tsconfig.nestjs.json", "./tsconfig.local.json"],
3
3
  "include": ["src/**/*"],
4
- "exclude": ["node_modules", ".build"]
4
+ "exclude": ["node_modules", ".build", "dist", "**/*.test.ts", "**/*.spec.ts"]
5
5
  }
package/package.json CHANGED
@@ -85,7 +85,7 @@
85
85
  },
86
86
  "resolutions": {},
87
87
  "name": "@codyswann/lisa",
88
- "version": "1.16.0",
88
+ "version": "1.18.0",
89
89
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
90
90
  "main": "dist/index.js",
91
91
  "bin": {