@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
@@ -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 and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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"
@@ -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"
@@ -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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.199.0",
3
+ "version": "2.201.0",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
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:
package/ui/README.md ADDED
@@ -0,0 +1,180 @@
1
+ # Lisa Console (UI prototype)
2
+
3
+ A self-contained, zero-build prototype of the Lisa settings console. It catalogs
4
+ every configuration surface Lisa exposes to host projects and presents it as a
5
+ navigable, editable-looking settings UI.
6
+
7
+ **Prototype scope:** every control is interactive (toggles, selects, inputs,
8
+ tabs, dirty-state tracking, save bar), but edits are not persisted — "Save"
9
+ only clears the in-memory dirty state. Reading real values IS wired up: see
10
+ `lisa ui` below.
11
+
12
+ ## Run it
13
+
14
+ The real entrypoint is the CLI, which populates and syncs the project's
15
+ `.lisa.config.json` first (see `lisa sync`), then serves the console with the
16
+ merged live config injected — controls whose config key exists show the
17
+ project's actual values:
18
+
19
+ ```bash
20
+ lisa ui [path] [--port 4780] [--no-sync]
21
+ ```
22
+
23
+ The page is also fully standalone (no build step, no dependencies) — without
24
+ live config it falls back to Lisa's shipped defaults:
25
+
26
+ ```bash
27
+ open ui/index.html
28
+ ```
29
+
30
+ ## Config sync (`lisa sync`)
31
+
32
+ `lisa sync [path] [--dry-run] [--json]` makes `.lisa.config.json` (with the
33
+ gitignored `.lisa.config.local.json` overlay) the source of truth for every
34
+ setting in `src/sync/registry.ts`:
35
+
36
+ - **Populate** — a completely missing config value is absorbed from its
37
+ mirrored artifact file when one exists (e.g. `vitest.thresholds.json`),
38
+ otherwise filled with Lisa's built-in default. Vendor sections are only
39
+ populated when the project uses that vendor.
40
+ - **Sync** — config values are written back into every mirrored artifact file
41
+ that exists on disk (config wins). Sync never scaffolds an artifact file
42
+ into a stack that doesn't use it.
43
+ - **Provenance** — pure-default populations are recorded under
44
+ `_lisaSync.populated`, so when a later Lisa version changes a default, sync
45
+ can update values that are *still the default* while never touching values
46
+ a human chose.
47
+ - **Required keys** (`tracker`, `jira.project`, `github.org`, …) can't be
48
+ invented; sync reports them (exit code 1) and points at the setup skill.
49
+
50
+ Mirrored artifacts today: `vitest.thresholds.json` / `jest.thresholds.json`
51
+ (`quality.testCoverage`), `eslint.thresholds.json` (`quality.lintBudgets`),
52
+ `mutation.gate.json` (`quality.mutation.gate`), and the `thresholds` key of
53
+ `stryker.conf.json` (`quality.mutation.strykerThresholds`).
54
+
55
+ **Provider-neutral monitoring keys.** The observability audit spans Sentry,
56
+ AWS CloudWatch Alarms, AWS X-Ray, and future providers, so
57
+ `monitor.thresholds` uses vendor-free names: `minEvents24h` (default **1**)
58
+ and `faultRatePct` replace the legacy `sentryMinEvents24h` /
59
+ `xrayFaultRatePct`. The Monitoring section shows which providers are
60
+ connected (detected from credentials and instrumentation, not configured by
61
+ hand). The runtime `lisa-monitor` skill still reads the legacy keys —
62
+ renaming them in `config-resolution.md` and the skill is a tracked
63
+ follow-up.
64
+
65
+ ## Starter provenance & sync (planned — documented, not wired)
66
+
67
+ The **Starter templates** section of the console documents this contract; no
68
+ engine exists yet. A project records which starter repo(s) it was generated
69
+ from (`lisa setup-project` already knows them — `src/cli/starters.ts`) and
70
+ stays connected to them in both directions:
71
+
72
+ ```jsonc
73
+ "starter": {
74
+ "templates": [
75
+ {
76
+ "repo": "CodySwannGT/expostarter", // origin starter
77
+ "ref": "main", // ref compared on each sync
78
+ "lastSync": { "sha": "8c1f2ab", "at": "2026-07-01" },
79
+ "paths": ["**"] // optional glob scope
80
+ }
81
+ ],
82
+ "sync": {
83
+ "auto": false, // scheduled sync via a lisa-auto cron
84
+ "strategy": "pull-request", // or "direct-when-clean"
85
+ "upstreamProposals": true, // open issues in the starter repo
86
+ "proposalLabel": "starter-upstream-proposal"
87
+ }
88
+ }
89
+ ```
90
+
91
+ **Downstream sync (starter → project).** A sync diffs the starter's tracked
92
+ ref since `lastSync.sha` and applies the changes to the host project,
93
+ respecting Lisa template semantics (create-only files the project now owns
94
+ are never clobbered; a `paths` scope limits what applies). Clean applications
95
+ land per `strategy`; conflicts always open a PR. `lastSync` is updated after
96
+ every successful run. Multiple templates are supported — e.g. an app starter
97
+ plus an infrastructure starter, each with its own path scope.
98
+
99
+ **Upstreaming (project → starter).** During a sync (or a standalone scan),
100
+ Lisa looks for *generic* additions the host project made — shared utilities,
101
+ dependency/security bumps, CI workflow fixes, config hardening with no
102
+ project-specific identifiers — and opens an issue in the starter repo,
103
+ labeled `proposalLabel`, containing detailed instructions on what was changed
104
+ and how to apply it to the starter. Anything referencing project names,
105
+ product features, secrets, or business logic is never proposed.
106
+
107
+ When the engine lands, `starter.*` should join the `lisa sync` registry so
108
+ the section above governs it like every other setting.
109
+
110
+ ## Health (planned — documented, not wired)
111
+
112
+ The **Health** section answers two questions with different lifecycles:
113
+
114
+ **Is Lisa on the latest version?** — always-on status. Lisa's CLI already
115
+ checks npm on every invocation; the console surfaces the result permanently
116
+ as the top-bar chip (green dot `up to date`, amber when behind) and in the
117
+ Health section's version card. When behind, `lisa update` prints (or runs
118
+ with `--yes`) the package-manager update command.
119
+
120
+ **Is the project completely in band?** — on-demand scan behind the
121
+ "Run health check" button (plus an optional scheduled cadence via
122
+ `health.schedule` that files a ticket when drift is found). "In band" means
123
+ every Lisa-managed surface matches what the installed Lisa version would
124
+ emit. The check is a mix of deterministic and agentic verification,
125
+ packaged as one skill (working name `/lisa:health`) so the console button,
126
+ the cron, and the CLI share a single implementation:
127
+
128
+ - **Deterministic layer** (fast, exact — reuses what exists today):
129
+ `lisa doctor`, template diffing for copy-overwrite/managed-block files,
130
+ `package.json` governance (force/defaults/merge conformance),
131
+ `lisa sync --dry-run` (config fully populated, artifacts in sync), git
132
+ hooks installed and unmodified, plugins enabled and version-current, CI
133
+ workflow drift vs the stack template, rulesets present.
134
+ - **Agentic layer** (judges what a diff can't): whether local overrides
135
+ (`eslint.config.local.ts`, grandfathered globs) still serve their original
136
+ purpose, whether detected drift looks intentional or accidental, whether
137
+ skipped CI jobs and disabled gates have a recorded justification.
138
+
139
+ Results render as a per-check table (pass / warn / fail, with the layer that
140
+ produced each finding), and the last full check's date + verdict stays
141
+ visible in the section.
142
+
143
+ ## What it catalogs
144
+
145
+ | Section | Source of truth in this repo |
146
+ | --- | --- |
147
+ | Setup checklist (install → sync → tracker/PRD → repo governance → secrets → automations) | `lisa apply`, `lisa sync`, `/lisa:setup:*` skills |
148
+ | Health (version status + planned in-band scan) | `lisa doctor`, `lisa sync --dry-run`, planned `/lisa:health` skill |
149
+ | Core workflow (the delivery-loop slash commands and their automations) | `plugins/src/base/commands/lisa/`, `plugins/src/base/skills/` |
150
+ | Starter templates (provenance + planned two-way sync) | `src/cli/starters.ts`, planned `starter.*` config |
151
+ | General (`harness`, `tracker`, `source`, `repo`, package manager) | `src/core/config.ts`, `plugins/src/base/rules/reference/config-resolution.md` |
152
+ | Project types (8 stacks + template strategies) | `src/detection/`, `src/strategies/`, `<stack>/` template dirs |
153
+ | Coding agents (claude/codex/cursor/agy/copilot/opencode/fleet) | `src/core/lisa.ts`, `scripts/generate-*-plugin-artifacts.mjs` |
154
+ | Work tracker (JIRA / GitHub Issues / Linear) | `config-resolution.md`, `lisa-setup-*` skills |
155
+ | PRD source (Notion / Confluence / Linear / GitHub) | `config-resolution.md`, `lisa-setup-*` skills |
156
+ | Deploy & environments (`deploy.*`, `github.environments`) | `scripts/lisa-github-environments.sh` |
157
+ | Automations (intake/repair/exploratory crons) | `lisa-setup-automations` skill |
158
+ | Intake & monitoring thresholds | `.lisa.config.json` `intake.*` / `monitor.*` |
159
+ | Linting (custom plugins, budgets, oxlint, ast-grep) | `eslint-plugin-*/`, `src/configs/eslint/`, `sgconfig.yml` |
160
+ | Testing & coverage (runners, floors, mutation gates) | `src/configs/{vitest,jest}/`, `*.thresholds.json` |
161
+ | Git hooks (Husky / Lefthook) | `typescript/copy-contents/.husky/`, `rails/copy-overwrite/lefthook.yml` |
162
+ | CI quality gates (quality.yml jobs + inputs) | `.github/workflows/quality.yml` |
163
+ | Verification & QA (exploration mutation policy, ZAP) | `lisa-use-the-product` skill |
164
+ | GitHub repository (settings, rulesets, labels, secrets) | `scripts/lisa-github-repo-setup.sh`, `all/github-rulesets/` |
165
+ | Plugins & MCP (Lisa + curated third-party + servers) | `.claude/settings.json`, `plugins/src/` |
166
+ | Advanced (wiki source, usage pricing, Play Store) | `config-resolution.md` |
167
+
168
+ Values shown are Lisa's real defaults (as of the version in the top bar), with
169
+ a fictional demo project (`acme/acme-app`, typescript + expo, JIRA + Notion)
170
+ supplying example identifiers.
171
+
172
+ ## Implementation notes
173
+
174
+ - Single `index.html`: inline CSS (token-based light/dark theming with a
175
+ manual toggle) and vanilla JS. The catalog lives in a declarative `DATA`
176
+ structure at the top of the script; rendering is generic per block type
177
+ (`card`/`rows`, `table`, `tabs`, `stacks`, `hooks`, `flow`, `tiles`,
178
+ `callout`), so adding a setting is a data edit, not a DOM edit.
179
+ - Search box filters rows/cards within the active section.
180
+ - URL hash routes to a section (e.g. `ui/index.html#linting`).