@codyswann/lisa 4.58.1 → 4.59.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 (71) hide show
  1. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  2. package/dist/core/project-config-starter.d.ts +48 -0
  3. package/dist/core/project-config-starter.d.ts.map +1 -0
  4. package/dist/core/project-config-starter.js +113 -0
  5. package/dist/core/project-config-starter.js.map +1 -0
  6. package/dist/core/project-config.d.ts +3 -0
  7. package/dist/core/project-config.d.ts.map +1 -1
  8. package/dist/core/project-config.js +3 -0
  9. package/dist/core/project-config.js.map +1 -1
  10. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  11. package/dist/core/upstream-evidence-manifest.js +6 -2
  12. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  13. package/dist/sync/config-sync.d.ts.map +1 -1
  14. package/dist/sync/config-sync.js +7 -0
  15. package/dist/sync/config-sync.js.map +1 -1
  16. package/dist/sync/registry.d.ts.map +1 -1
  17. package/dist/sync/registry.js +13 -0
  18. package/dist/sync/registry.js.map +1 -1
  19. package/package.json +4 -4
  20. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  21. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  22. package/plugins/lisa-agy/plugin.json +1 -1
  23. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  26. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-expo-agy/plugin.json +1 -1
  33. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  43. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  48. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  53. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-rails-agy/plugin.json +1 -1
  58. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  63. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  68. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  70. package/ui/README.md +11 -9
  71. package/ui/index.html +76 -8
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "4.58.1",
3
+ "version": "4.59.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"
package/ui/README.md CHANGED
@@ -248,12 +248,14 @@ untouched. The runtime keeps accepting those deprecated aliases, prefers the
248
248
  provider-neutral key when both are present, and `lisa doctor` warns until a
249
249
  project finishes migrating.
250
250
 
251
- ## Starter provenance & sync (planned — documented, not wired)
251
+ ## Starter provenance and sync preferences
252
252
 
253
- The **Starter templates** section of the console documents this contract; no
254
- engine exists yet. A project records which starter repo(s) it was generated
255
- from (`lisa setup-project` already knows them — `src/cli/starters.ts`) and
256
- stays connected to them in both directions:
253
+ The **Starter templates** section reads independent entries from the project's
254
+ `starter.templates` array. Missing entries render an empty state. `lisa sync`
255
+ populates the registered configuration defaults with `_lisaSync.populated`
256
+ provenance; it does not stamp origins or run a starter synchronization engine.
257
+ Automatic sync and upstream proposals default to off. The proposed engine
258
+ described below remains planned.
257
259
 
258
260
  ```jsonc
259
261
  "starter": {
@@ -268,7 +270,7 @@ stays connected to them in both directions:
268
270
  "sync": {
269
271
  "auto": false, // scheduled sync via a lisa-auto cron
270
272
  "strategy": "pull-request", // or "direct-when-clean"
271
- "upstreamProposals": true, // open issues in the starter repo
273
+ "upstreamProposals": false, // off until the classifier is validated
272
274
  "proposalLabel": "starter-upstream-proposal"
273
275
  }
274
276
  }
@@ -290,8 +292,8 @@ labeled `proposalLabel`, containing detailed instructions on what was changed
290
292
  and how to apply it to the starter. Anything referencing project names,
291
293
  product features, secrets, or business logic is never proposed.
292
294
 
293
- When the engine lands, `starter.*` should join the `lisa sync` registry so
294
- the section above governs it like every other setting.
295
+ `starter.templates` and `starter.sync` use the shared sync registry and config
296
+ reader. Changing these settings does not execute the planned engine.
295
297
 
296
298
  ## Health (shared skill and CLI available)
297
299
 
@@ -382,7 +384,7 @@ browser payload; the server exposes names and boolean presence only.
382
384
  | Health (version status + in-band scan) | `lisa doctor`, `lisa sync --dry-run`, `lisa health`, `/lisa:health` skill |
383
385
  | Doctor (what each check proves, where, and whether it blocks a merge) | `all/copy-overwrite/scripts/lisa-gates.mjs`, `.lisa.config.json`, `package.json`, `.husky/`, `.github/workflows/`, branch protection |
384
386
  | Core workflow (the delivery-loop slash commands and their automations) | `plugins/src/base/commands/lisa/`, `plugins/src/base/skills/` |
385
- | Starter templates (provenance + planned two-way sync) | `src/cli/starters.ts`, planned `starter.*` config |
387
+ | Starter templates (provenance + planned two-way sync) | `src/core/project-config-starter.ts`, `src/sync/registry.ts` |
386
388
  | General (`harness`, `tracker`, `source`, `repo`, package manager) | `src/core/config.ts`, `plugins/src/base/rules/reference/config-resolution.md` |
387
389
  | Project types (8 stacks + template strategies) | `src/detection/`, `src/strategies/`, `<stack>/` template dirs |
388
390
  | Coding agents (claude/codex/cursor/agy/copilot/opencode/fleet) | `src/core/lisa.ts`, `scripts/generate-*-plugin-artifacts.mjs` |
package/ui/index.html CHANGED
@@ -1882,6 +1882,13 @@
1882
1882
  * lies such as `"false"` → on and `{}` → `[object Object]`.
1883
1883
  */
1884
1884
  function hydrateControl(control, value) {
1885
+ if (
1886
+ control.format === "paths" &&
1887
+ Array.isArray(value) &&
1888
+ value.every(item => typeof item === "string")
1889
+ ) {
1890
+ return { ...control, value: value.join(", ") || "(empty scope)" };
1891
+ }
1885
1892
  if (control.type === "toggle" && typeof value === "boolean") {
1886
1893
  return { ...control, value };
1887
1894
  }
@@ -7690,13 +7697,13 @@
7690
7697
  DATA.sections.starters = {
7691
7698
  title: "Starter templates",
7692
7699
  desc: "Which starter repo(s) this project was generated from, and how it stays connected to them — pulling upstream starter improvements down into the project, and proposing generic project additions back up to the starter.",
7693
- src: ".lisa.config.json starter.* · src/cli/starters.ts",
7700
+ src: ".lisa.config.json starter.* · src/core/project-config-starter.ts",
7694
7701
  blocks: [
7695
7702
  {
7696
7703
  type: "callout",
7697
7704
  staticCopy: "published starter-sync scope",
7698
7705
  variant: "warn",
7699
- text: "<b>Planned feature.</b> This page documents the starter-sync contract and its settings; the sync engine and upstream-proposal flow are not wired up yet. Controls here preview the intended behavior.",
7706
+ text: "<b>Starter provenance.</b> Entries and preferences come from project configuration. The sync engine and upstream-proposal flow are planned; changing a preference does not run either operation.",
7700
7707
  },
7701
7708
  {
7702
7709
  type: "flow",
@@ -10917,7 +10924,7 @@
10917
10924
  if (
10918
10925
  !node ||
10919
10926
  typeof node !== "object" ||
10920
- Array.isArray(node) ||
10927
+ (Array.isArray(node) && !/^(0|[1-9]\d*)$/.test(segment)) ||
10921
10928
  !Object.hasOwn(node, segment)
10922
10929
  ) {
10923
10930
  return { present: false, value: undefined };
@@ -11062,7 +11069,7 @@
11062
11069
  const $savebar = document.getElementById("savebar");
11063
11070
  const $toast = document.getElementById("toast");
11064
11071
  const dirty = new Map();
11065
- const initialControls = new Map();
11072
+ const initialControls = new WeakMap();
11066
11073
  let saving = false;
11067
11074
  let lisaLiveMode = false;
11068
11075
  let lisaCatalogAudit = null;
@@ -11231,7 +11238,7 @@
11231
11238
  /** Restore config controls without resetting separately loaded probe results. */
11232
11239
  function restoreConfigControls() {
11233
11240
  forEachConfigRow(row => {
11234
- const original = initialControls.get(row.key);
11241
+ const original = initialControls.get(row);
11235
11242
  if (!original) return;
11236
11243
  const entry = lisaLiveMode
11237
11244
  ? liveConfigEntry(window.LISA_LIVE_CONFIG, row.key)
@@ -12815,9 +12822,72 @@
12815
12822
  DATA.sections.remote.blocks[0].rows = variableRows;
12816
12823
  DATA.sections.remote.blocks[1].rows = startupRows;
12817
12824
  }
12825
+ function configureStarterTemplates(config) {
12826
+ const entries = config?.starter?.templates;
12827
+ const templates = Array.isArray(entries) ? entries : [];
12828
+ const cards = templates.map((entry, index) => {
12829
+ const key = `starter.templates.${index}`;
12830
+ return {
12831
+ card: `Template ${index + 1}`,
12832
+ note: key,
12833
+ rows: [
12834
+ {
12835
+ key: `${key}.repo`,
12836
+ label: "Starter repository",
12837
+ control: stat("", "mono"),
12838
+ },
12839
+ {
12840
+ key: `${key}.ref`,
12841
+ label: "Tracked ref",
12842
+ control: stat("", "mono"),
12843
+ },
12844
+ {
12845
+ key: `${key}.lastSync.sha`,
12846
+ label: "Last synced commit",
12847
+ control: stat("", "mono"),
12848
+ },
12849
+ {
12850
+ key: `${key}.lastSync.at`,
12851
+ label: "Last synced at",
12852
+ control: stat("", "mono"),
12853
+ },
12854
+ ...(entry && Object.hasOwn(entry, "paths")
12855
+ ? [
12856
+ {
12857
+ key: `${key}.paths`,
12858
+ label: "Path scope",
12859
+ control: { ...stat("", "mono"), format: "paths" },
12860
+ },
12861
+ ]
12862
+ : []),
12863
+ ],
12864
+ };
12865
+ });
12866
+ if (cards.length === 0) {
12867
+ cards.push({
12868
+ type: "callout",
12869
+ liveSource: "config:starter.templates",
12870
+ variant: "info",
12871
+ text:
12872
+ entries === undefined || Array.isArray(entries)
12873
+ ? "No starter templates recorded for this project."
12874
+ : "Starter templates are unavailable: expected a configuration array.",
12875
+ });
12876
+ }
12877
+ const blocks = DATA.sections.starters.blocks;
12878
+ const firstTemplate = blocks.findIndex(block =>
12879
+ block.note?.startsWith("starter.templates[")
12880
+ );
12881
+ DATA.sections.starters.blocks = blocks.flatMap((block, index) => {
12882
+ if (!block.note?.startsWith("starter.templates[")) return [block];
12883
+ return index === firstTemplate ? cards : [];
12884
+ });
12885
+ }
12886
+
12818
12887
  function hydrateFromLiveConfig() {
12819
12888
  lisaLiveMode = Object.hasOwn(window, "LISA_LIVE_CONFIG");
12820
12889
  const cfg = lisaLiveMode ? window.LISA_LIVE_CONFIG : {};
12890
+ if (lisaLiveMode) configureStarterTemplates(cfg);
12821
12891
  lisaCatalogAudit = auditUiCatalog(DATA);
12822
12892
  if (lisaLiveMode) {
12823
12893
  lisaCatalogPreparation = prepareUiCatalogForLive(DATA, cfg);
@@ -14122,9 +14192,7 @@
14122
14192
 
14123
14193
  /* --- boot (deferred so an injected live-config tag after this script is seen) --- */
14124
14194
  function boot() {
14125
- forEachConfigRow(row =>
14126
- initialControls.set(row.key, { ...row.control })
14127
- );
14195
+ forEachConfigRow(row => initialControls.set(row, { ...row.control }));
14128
14196
  hydrateFromLiveConfig();
14129
14197
  if (lisaLiveMode) {
14130
14198
  document.getElementById("saveBtn").removeAttribute("title");