@codyswann/lisa 2.199.0 → 2.201.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.
Files changed (83) hide show
  1. package/dist/cli/index.d.ts +6 -0
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +30 -3
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/sync-cmd.d.ts +21 -0
  6. package/dist/cli/sync-cmd.d.ts.map +1 -0
  7. package/dist/cli/sync-cmd.js +43 -0
  8. package/dist/cli/sync-cmd.js.map +1 -0
  9. package/dist/cli/ui-cmd.d.ts +35 -0
  10. package/dist/cli/ui-cmd.d.ts.map +1 -0
  11. package/dist/cli/ui-cmd.js +104 -0
  12. package/dist/cli/ui-cmd.js.map +1 -0
  13. package/dist/sync/config-sync.d.ts +42 -0
  14. package/dist/sync/config-sync.d.ts.map +1 -0
  15. package/dist/sync/config-sync.js +272 -0
  16. package/dist/sync/config-sync.js.map +1 -0
  17. package/dist/sync/json-path.d.ts +58 -0
  18. package/dist/sync/json-path.d.ts.map +1 -0
  19. package/dist/sync/json-path.js +107 -0
  20. package/dist/sync/json-path.js.map +1 -0
  21. package/dist/sync/registry.d.ts +64 -0
  22. package/dist/sync/registry.d.ts.map +1 -0
  23. package/dist/sync/registry.js +207 -0
  24. package/dist/sync/registry.js.map +1 -0
  25. package/package.json +2 -1
  26. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  28. package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +56 -0
  29. package/plugins/lisa/skills/lisa-doctor/SKILL.md +56 -0
  30. package/plugins/lisa-agy/plugin.json +1 -1
  31. package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +56 -0
  32. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  35. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +56 -0
  39. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +56 -0
  41. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-expo-agy/plugin.json +1 -1
  44. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  48. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  49. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  54. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  59. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  64. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-rails-agy/plugin.json +1 -1
  69. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  74. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  79. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/src/base/skills/lisa-doctor/SKILL.md +56 -0
  82. package/ui/README.md +180 -0
  83. package/ui/index.html +5396 -0
@@ -0,0 +1,207 @@
1
+ const WHEN_TRACKER_JIRA = "tracker=jira";
2
+ const WHEN_TRACKER_GITHUB = "tracker=github";
3
+ const WHEN_SOURCE_GITHUB = "source=github";
4
+ const WHEN_TRACKER_LINEAR = "tracker=linear";
5
+ const WHEN_SOURCE_LINEAR = "source=linear";
6
+ const WHEN_SOURCE_NOTION = "source=notion";
7
+ const COVERAGE_DEFAULTS = {
8
+ global: { statements: 70, branches: 70, functions: 70, lines: 70 },
9
+ };
10
+ const BUILD_LABEL_DEFAULTS = {
11
+ ready: "status:ready",
12
+ claimed: "status:in-progress",
13
+ blocked: "status:blocked",
14
+ human_needed: "human-needed",
15
+ done: {
16
+ dev: "status:on-dev",
17
+ staging: "status:on-stg",
18
+ production: "status:done",
19
+ },
20
+ };
21
+ const PRD_LABEL_DEFAULTS = {
22
+ draft: "prd-draft",
23
+ ready: "prd-ready",
24
+ in_review: "prd-in-review",
25
+ blocked: "prd-blocked",
26
+ ticketed: "prd-ticketed",
27
+ shipped: "prd-shipped",
28
+ verified: "prd-verified",
29
+ sentinel: "prd-intake-feedback",
30
+ };
31
+ /**
32
+ * All settings `lisa sync` manages. Local-only keys (`atlassian.email`,
33
+ * `intake.assignee`, `jira.verified_workflow_hash`, secret paths) are
34
+ * deliberately absent — sync never populates the committed file with values
35
+ * that belong in `.lisa.config.local.json`.
36
+ */
37
+ export const SYNC_REGISTRY = [
38
+ {
39
+ key: "harness",
40
+ defaultValue: "claude",
41
+ description: "Target coding-agent harness(es)",
42
+ },
43
+ {
44
+ key: "quality.testCoverage",
45
+ defaultValue: COVERAGE_DEFAULTS,
46
+ artifacts: [
47
+ { file: "vitest.thresholds.json", pointer: "" },
48
+ { file: "jest.thresholds.json", pointer: "" },
49
+ ],
50
+ description: "Test coverage floors (statements/branches/functions/lines)",
51
+ },
52
+ {
53
+ key: "quality.lintBudgets",
54
+ defaultValue: {
55
+ cognitiveComplexity: 10,
56
+ maxLines: 300,
57
+ maxLinesPerFunction: 75,
58
+ },
59
+ artifacts: [{ file: "eslint.thresholds.json", pointer: "" }],
60
+ description: "Lint complexity and size budgets",
61
+ },
62
+ {
63
+ key: "quality.mutation.gate",
64
+ defaultValue: { enabled: false, since: "main" },
65
+ artifacts: [{ file: "mutation.gate.json", pointer: "" }],
66
+ description: "Diff-only mutation testing gate",
67
+ },
68
+ {
69
+ key: "quality.mutation.strykerThresholds",
70
+ defaultValue: { high: 80, low: 60, break: 60 },
71
+ artifacts: [{ file: "stryker.conf.json", pointer: "thresholds" }],
72
+ description: "Stryker mutation-score thresholds",
73
+ },
74
+ {
75
+ key: "intake.repair",
76
+ defaultValue: { staleAfterHours: 2, maxCandidates: 100 },
77
+ description: "Repair-intake stall window and candidate cap",
78
+ },
79
+ {
80
+ key: "monitor",
81
+ defaultValue: {
82
+ maxCandidates: 20,
83
+ gapTiers: "core",
84
+ backoffHours: 24,
85
+ // Provider-neutral threshold names: the audit spans Sentry, CloudWatch,
86
+ // X-Ray, and future providers, so no key is prefixed with a vendor. The
87
+ // lisa-monitor skill still reads the legacy sentryMinEvents24h /
88
+ // xrayFaultRatePct keys — renaming those (config-resolution.md + skill)
89
+ // is a tracked follow-up; see ui/README.md.
90
+ thresholds: {
91
+ minEvents24h: 1,
92
+ errorRateSpikeMultiplier: 2,
93
+ p95LatencyMs: 1000,
94
+ faultRatePct: 5,
95
+ },
96
+ },
97
+ description: "Observability audit caps and alert thresholds",
98
+ },
99
+ {
100
+ key: "jira.workflow",
101
+ defaultValue: {
102
+ ready: "Ready",
103
+ claimed: "In Progress",
104
+ review: "Code Review",
105
+ blocked: "Blocked",
106
+ done: { dev: "On Dev", staging: "On Stg", production: "Done" },
107
+ },
108
+ relevantWhen: ["jira", WHEN_TRACKER_JIRA],
109
+ description: "JIRA workflow status names per lifecycle role",
110
+ },
111
+ {
112
+ key: "jira.labels",
113
+ defaultValue: { human_needed: "Human Needed" },
114
+ relevantWhen: ["jira", WHEN_TRACKER_JIRA],
115
+ description: "JIRA marker labels",
116
+ },
117
+ {
118
+ key: "github.labels",
119
+ defaultValue: { build: BUILD_LABEL_DEFAULTS, prd: PRD_LABEL_DEFAULTS },
120
+ relevantWhen: ["github", WHEN_TRACKER_GITHUB, WHEN_SOURCE_GITHUB],
121
+ description: "GitHub build and PRD lifecycle labels",
122
+ },
123
+ {
124
+ key: "linear.labels",
125
+ defaultValue: {
126
+ build: { ...BUILD_LABEL_DEFAULTS, review: "status:code-review" },
127
+ prd: PRD_LABEL_DEFAULTS,
128
+ },
129
+ relevantWhen: ["linear", WHEN_TRACKER_LINEAR, WHEN_SOURCE_LINEAR],
130
+ description: "Linear build and PRD lifecycle labels",
131
+ },
132
+ {
133
+ key: "notion.statusProperty",
134
+ defaultValue: "Status",
135
+ relevantWhen: ["notion", WHEN_SOURCE_NOTION],
136
+ description: "Notion database property that drives the PRD lifecycle",
137
+ },
138
+ {
139
+ key: "notion.values",
140
+ defaultValue: {
141
+ draft: "Draft",
142
+ ready: "Ready",
143
+ in_review: "In Review",
144
+ blocked: "Blocked",
145
+ ticketed: "Ticketed",
146
+ shipped: "Shipped",
147
+ verified: "Verified",
148
+ },
149
+ relevantWhen: ["notion", WHEN_SOURCE_NOTION],
150
+ description: "Notion status option names per lifecycle role",
151
+ },
152
+ {
153
+ key: "wiki.ttlSeconds",
154
+ defaultValue: 300,
155
+ relevantWhen: ["wiki"],
156
+ description: "Remote wiki mirror refresh TTL",
157
+ },
158
+ ];
159
+ /**
160
+ * Keys sync can never default: they identify external systems and must come
161
+ * from a human (via the matching `/lisa:setup:*` skill). Sync reports them
162
+ * when missing instead of inventing values.
163
+ */
164
+ export const REQUIRED_KEYS = [
165
+ { key: "tracker", setupHint: "/lisa:setup:jira | github | linear" },
166
+ {
167
+ key: "jira.project",
168
+ relevantWhen: [WHEN_TRACKER_JIRA],
169
+ setupHint: "/lisa:setup:jira",
170
+ },
171
+ {
172
+ key: "atlassian.cloudId",
173
+ relevantWhen: [WHEN_TRACKER_JIRA, "source=confluence"],
174
+ setupHint: "/lisa:setup:atlassian",
175
+ },
176
+ {
177
+ key: "github.org",
178
+ relevantWhen: [WHEN_TRACKER_GITHUB, WHEN_SOURCE_GITHUB],
179
+ setupHint: "/lisa:setup:github",
180
+ },
181
+ {
182
+ key: "github.repo",
183
+ relevantWhen: [WHEN_TRACKER_GITHUB, WHEN_SOURCE_GITHUB],
184
+ setupHint: "/lisa:setup:github",
185
+ },
186
+ {
187
+ key: "linear.workspace",
188
+ relevantWhen: [WHEN_TRACKER_LINEAR, WHEN_SOURCE_LINEAR],
189
+ setupHint: "/lisa:setup:linear",
190
+ },
191
+ {
192
+ key: "linear.teamKey",
193
+ relevantWhen: [WHEN_TRACKER_LINEAR],
194
+ setupHint: "/lisa:setup:linear",
195
+ },
196
+ {
197
+ key: "notion.workspaceId",
198
+ relevantWhen: [WHEN_SOURCE_NOTION],
199
+ setupHint: "/lisa:setup:notion",
200
+ },
201
+ {
202
+ key: "notion.prdDatabaseId",
203
+ relevantWhen: [WHEN_SOURCE_NOTION],
204
+ setupHint: "/lisa:setup:notion",
205
+ },
206
+ ];
207
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/sync/registry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -49,6 +49,7 @@
49
49
  ],
50
50
  "files": [
51
51
  "dist",
52
+ "ui",
52
53
  "all",
53
54
  "typescript",
54
55
  "npm-package",
@@ -94,7 +95,7 @@
94
95
  "ws": ">=8.20.1"
95
96
  },
96
97
  "name": "@codyswann/lisa",
97
- "version": "2.199.0",
98
+ "version": "2.201.0",
98
99
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
99
100
  "main": "dist/index.js",
100
101
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -291,6 +291,62 @@ without turning the base doctor into a second `lisa-wiki-doctor`.
291
291
  - Never require a wiki plugin surface when `wiki/` is absent.
292
292
  - Never let wiki-specific checks downgrade unrelated non-wiki repositories.
293
293
 
294
+ ### Upstream Lisa change-history diagnosis
295
+
296
+ A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
297
+ upstream** since this project last updated. Doctor must distinguish them instead of blaming the
298
+ project by default. Whenever findings need explanation — and always before proposing repairs —
299
+ pull Lisa's own git history and read what actually changed:
300
+
301
+ 1. **Resolve the version window.** Determine the project's installed Lisa version (the
302
+ `@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
303
+ runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
304
+ check's cached result).
305
+ 2. **Pull the upstream history for that window** (read-only; no clone required when `gh` is
306
+ available):
307
+
308
+ ```bash
309
+ gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
310
+ --paginate --slurp \
311
+ --jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
312
+ ```
313
+
314
+ `--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
315
+ array before `--jq` runs — without `--slurp`, `--jq` applies per page and prints one JSON object
316
+ per page instead of one merged result. `total_commits` and `files` only need the first page
317
+ (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
318
+
319
+ The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
320
+ on the first page, capped at 300 total — a large version window can silently drop commits or
321
+ files. If `total_commits` or the file count looks truncated, re-run with the
322
+ `application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
323
+ to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
324
+ still can't be established, say so in the finding and mark it `WARN` rather than attributing
325
+ drift with unverified confidence.
326
+
327
+ Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
328
+ path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
329
+ window, so treat its output as best-effort context only, not authoritative attribution; a shallow
330
+ clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
331
+ <paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
332
+ the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
333
+ only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
334
+ observability note — never fail the audit because history was unavailable or incomplete.
335
+ 3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
336
+ generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
337
+ `plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
338
+ config factories (`src/configs/`). A finding about a lint rule failure reads the lint-config
339
+ commits, not the whole log.
340
+ 4. **Attribute the finding.** When the upstream history shows Lisa changed the contract (a
341
+ tightened lint rule, a renamed check context, a new required config key), say so in `Observed:`
342
+ with the commit subject/version, and let `Remediation:` point at the sanctioned adoption path
343
+ (e.g. `lisa update` + re-apply, a documented config opt-out) rather than hand-editing managed
344
+ files. When history shows no relevant upstream change, the project drifted — remediate on the
345
+ project side.
346
+
347
+ This history pull is part of doctor's read-only contract: it reads Lisa's repository, never writes
348
+ to it, and repair suggestions stay suggestions.
349
+
294
350
  ## Output contract
295
351
 
296
352
  The final report must:
@@ -291,6 +291,62 @@ without turning the base doctor into a second `lisa-wiki-doctor`.
291
291
  - Never require a wiki plugin surface when `wiki/` is absent.
292
292
  - Never let wiki-specific checks downgrade unrelated non-wiki repositories.
293
293
 
294
+ ### Upstream Lisa change-history diagnosis
295
+
296
+ A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
297
+ upstream** since this project last updated. Doctor must distinguish them instead of blaming the
298
+ project by default. Whenever findings need explanation — and always before proposing repairs —
299
+ pull Lisa's own git history and read what actually changed:
300
+
301
+ 1. **Resolve the version window.** Determine the project's installed Lisa version (the
302
+ `@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
303
+ runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
304
+ check's cached result).
305
+ 2. **Pull the upstream history for that window** (read-only; no clone required when `gh` is
306
+ available):
307
+
308
+ ```bash
309
+ gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
310
+ --paginate --slurp \
311
+ --jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
312
+ ```
313
+
314
+ `--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
315
+ array before `--jq` runs — without `--slurp`, `--jq` applies per page and prints one JSON object
316
+ per page instead of one merged result. `total_commits` and `files` only need the first page
317
+ (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
318
+
319
+ The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
320
+ on the first page, capped at 300 total — a large version window can silently drop commits or
321
+ files. If `total_commits` or the file count looks truncated, re-run with the
322
+ `application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
323
+ to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
324
+ still can't be established, say so in the finding and mark it `WARN` rather than attributing
325
+ drift with unverified confidence.
326
+
327
+ Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
328
+ path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
329
+ window, so treat its output as best-effort context only, not authoritative attribution; a shallow
330
+ clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
331
+ <paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
332
+ the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
333
+ only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
334
+ observability note — never fail the audit because history was unavailable or incomplete.
335
+ 3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
336
+ generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
337
+ `plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
338
+ config factories (`src/configs/`). A finding about a lint rule failure reads the lint-config
339
+ commits, not the whole log.
340
+ 4. **Attribute the finding.** When the upstream history shows Lisa changed the contract (a
341
+ tightened lint rule, a renamed check context, a new required config key), say so in `Observed:`
342
+ with the commit subject/version, and let `Remediation:` point at the sanctioned adoption path
343
+ (e.g. `lisa update` + re-apply, a documented config opt-out) rather than hand-editing managed
344
+ files. When history shows no relevant upstream change, the project drifted — remediate on the
345
+ project side.
346
+
347
+ This history pull is part of doctor's read-only contract: it reads Lisa's repository, never writes
348
+ to it, and repair suggestions stay suggestions.
349
+
294
350
  ## Output contract
295
351
 
296
352
  The final report must:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -291,6 +291,62 @@ without turning the base doctor into a second `lisa-wiki-doctor`.
291
291
  - Never require a wiki plugin surface when `wiki/` is absent.
292
292
  - Never let wiki-specific checks downgrade unrelated non-wiki repositories.
293
293
 
294
+ ### Upstream Lisa change-history diagnosis
295
+
296
+ A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
297
+ upstream** since this project last updated. Doctor must distinguish them instead of blaming the
298
+ project by default. Whenever findings need explanation — and always before proposing repairs —
299
+ pull Lisa's own git history and read what actually changed:
300
+
301
+ 1. **Resolve the version window.** Determine the project's installed Lisa version (the
302
+ `@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
303
+ runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
304
+ check's cached result).
305
+ 2. **Pull the upstream history for that window** (read-only; no clone required when `gh` is
306
+ available):
307
+
308
+ ```bash
309
+ gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
310
+ --paginate --slurp \
311
+ --jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
312
+ ```
313
+
314
+ `--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
315
+ array before `--jq` runs — without `--slurp`, `--jq` applies per page and prints one JSON object
316
+ per page instead of one merged result. `total_commits` and `files` only need the first page
317
+ (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
318
+
319
+ The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
320
+ on the first page, capped at 300 total — a large version window can silently drop commits or
321
+ files. If `total_commits` or the file count looks truncated, re-run with the
322
+ `application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
323
+ to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
324
+ still can't be established, say so in the finding and mark it `WARN` rather than attributing
325
+ drift with unverified confidence.
326
+
327
+ Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
328
+ path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
329
+ window, so treat its output as best-effort context only, not authoritative attribution; a shallow
330
+ clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
331
+ <paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
332
+ the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
333
+ only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
334
+ observability note — never fail the audit because history was unavailable or incomplete.
335
+ 3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
336
+ generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
337
+ `plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
338
+ config factories (`src/configs/`). A finding about a lint rule failure reads the lint-config
339
+ commits, not the whole log.
340
+ 4. **Attribute the finding.** When the upstream history shows Lisa changed the contract (a
341
+ tightened lint rule, a renamed check context, a new required config key), say so in `Observed:`
342
+ with the commit subject/version, and let `Remediation:` point at the sanctioned adoption path
343
+ (e.g. `lisa update` + re-apply, a documented config opt-out) rather than hand-editing managed
344
+ files. When history shows no relevant upstream change, the project drifted — remediate on the
345
+ project side.
346
+
347
+ This history pull is part of doctor's read-only contract: it reads Lisa's repository, never writes
348
+ to it, and repair suggestions stay suggestions.
349
+
294
350
  ## Output contract
295
351
 
296
352
  The final report must:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -291,6 +291,62 @@ without turning the base doctor into a second `lisa-wiki-doctor`.
291
291
  - Never require a wiki plugin surface when `wiki/` is absent.
292
292
  - Never let wiki-specific checks downgrade unrelated non-wiki repositories.
293
293
 
294
+ ### Upstream Lisa change-history diagnosis
295
+
296
+ A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
297
+ upstream** since this project last updated. Doctor must distinguish them instead of blaming the
298
+ project by default. Whenever findings need explanation — and always before proposing repairs —
299
+ pull Lisa's own git history and read what actually changed:
300
+
301
+ 1. **Resolve the version window.** Determine the project's installed Lisa version (the
302
+ `@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
303
+ runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
304
+ check's cached result).
305
+ 2. **Pull the upstream history for that window** (read-only; no clone required when `gh` is
306
+ available):
307
+
308
+ ```bash
309
+ gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
310
+ --paginate --slurp \
311
+ --jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
312
+ ```
313
+
314
+ `--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
315
+ array before `--jq` runs — without `--slurp`, `--jq` applies per page and prints one JSON object
316
+ per page instead of one merged result. `total_commits` and `files` only need the first page
317
+ (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
318
+
319
+ The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
320
+ on the first page, capped at 300 total — a large version window can silently drop commits or
321
+ files. If `total_commits` or the file count looks truncated, re-run with the
322
+ `application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
323
+ to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
324
+ still can't be established, say so in the finding and mark it `WARN` rather than attributing
325
+ drift with unverified confidence.
326
+
327
+ Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
328
+ path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
329
+ window, so treat its output as best-effort context only, not authoritative attribution; a shallow
330
+ clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
331
+ <paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
332
+ the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
333
+ only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
334
+ observability note — never fail the audit because history was unavailable or incomplete.
335
+ 3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
336
+ generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
337
+ `plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
338
+ config factories (`src/configs/`). A finding about a lint rule failure reads the lint-config
339
+ commits, not the whole log.
340
+ 4. **Attribute the finding.** When the upstream history shows Lisa changed the contract (a
341
+ tightened lint rule, a renamed check context, a new required config key), say so in `Observed:`
342
+ with the commit subject/version, and let `Remediation:` point at the sanctioned adoption path
343
+ (e.g. `lisa update` + re-apply, a documented config opt-out) rather than hand-editing managed
344
+ files. When history shows no relevant upstream change, the project drifted — remediate on the
345
+ project side.
346
+
347
+ This history pull is part of doctor's read-only contract: it reads Lisa's repository, never writes
348
+ to it, and repair suggestions stay suggestions.
349
+
294
350
  ## Output contract
295
351
 
296
352
  The final report must:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -291,6 +291,62 @@ without turning the base doctor into a second `lisa-wiki-doctor`.
291
291
  - Never require a wiki plugin surface when `wiki/` is absent.
292
292
  - Never let wiki-specific checks downgrade unrelated non-wiki repositories.
293
293
 
294
+ ### Upstream Lisa change-history diagnosis
295
+
296
+ A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
297
+ upstream** since this project last updated. Doctor must distinguish them instead of blaming the
298
+ project by default. Whenever findings need explanation — and always before proposing repairs —
299
+ pull Lisa's own git history and read what actually changed:
300
+
301
+ 1. **Resolve the version window.** Determine the project's installed Lisa version (the
302
+ `@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
303
+ runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
304
+ check's cached result).
305
+ 2. **Pull the upstream history for that window** (read-only; no clone required when `gh` is
306
+ available):
307
+
308
+ ```bash
309
+ gh api "repos/CodySwannGT/lisa/compare/v<installed>...v<latest>" \
310
+ --paginate --slurp \
311
+ --jq '{total_commits: .[0].total_commits, files: [.[0].files[]?.filename], commits: [.[].commits[]? | .commit.message | split("\n")[0]]}'
312
+ ```
313
+
314
+ `--paginate` fetches every page of commits, and `--slurp` gathers those pages into a single
315
+ array before `--jq` runs — without `--slurp`, `--jq` applies per page and prints one JSON object
316
+ per page instead of one merged result. `total_commits` and `files` only need the first page
317
+ (files are capped at 300 and not repeated on later pages); `commits` flattens across all pages.
318
+
319
+ The compare endpoint paginates commits (250 without `--paginate`) and only lists changed files
320
+ on the first page, capped at 300 total — a large version window can silently drop commits or
321
+ files. If `total_commits` or the file count looks truncated, re-run with the
322
+ `application/vnd.github.diff` accept header (`gh api ... -H "Accept: application/vnd.github.diff"`)
323
+ to pull the full patch text, or fall back to the shallow-clone `git log` below. When completeness
324
+ still can't be established, say so in the finding and mark it `WARN` rather than attributing
325
+ drift with unverified confidence.
326
+
327
+ Fallbacks, in order: `gh api repos/CodySwannGT/lisa/commits?path=<template-path>` for a
328
+ path-scoped view — note this endpoint has no way to bound results to the `v<installed>..v<latest>`
329
+ window, so treat its output as best-effort context only, not authoritative attribution; a shallow
330
+ clone (`git clone --filter=blob:none --no-checkout` then `git log v<installed>..v<latest> --
331
+ <paths>`), which *is* bounded to the window and should be preferred for definitive attribution; or
332
+ the local marketplace/plugin cache checkout when the runtime has one. If none are reachable, or
333
+ only the unbounded path-scoped fallback is reachable, report the gap as a `WARN`-level
334
+ observability note — never fail the audit because history was unavailable or incomplete.
335
+ 3. **Scope the reading to what the finding touches.** Filter the commit list to the paths that
336
+ generate the failing surface: the detected stacks' template dirs (`typescript/`, `expo/`, …),
337
+ `plugins/src/base/` for skills/hooks/rules, `scripts/` for governance scripts, and the shipped
338
+ config factories (`src/configs/`). A finding about a lint rule failure reads the lint-config
339
+ commits, not the whole log.
340
+ 4. **Attribute the finding.** When the upstream history shows Lisa changed the contract (a
341
+ tightened lint rule, a renamed check context, a new required config key), say so in `Observed:`
342
+ with the commit subject/version, and let `Remediation:` point at the sanctioned adoption path
343
+ (e.g. `lisa update` + re-apply, a documented config opt-out) rather than hand-editing managed
344
+ files. When history shows no relevant upstream change, the project drifted — remediate on the
345
+ project side.
346
+
347
+ This history pull is part of doctor's read-only contract: it reads Lisa's repository, never writes
348
+ to it, and repair suggestions stay suggestions.
349
+
294
350
  ## Output contract
295
351
 
296
352
  The final report must:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"