@codyswann/lisa 4.62.3 → 4.63.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 (99) hide show
  1. package/dist/cli/index.d.ts.map +1 -1
  2. package/dist/cli/index.js +2 -10
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/cli/ui-cmd.d.ts +24 -0
  5. package/dist/cli/ui-cmd.d.ts.map +1 -1
  6. package/dist/cli/ui-cmd.js +40 -13
  7. package/dist/cli/ui-cmd.js.map +1 -1
  8. package/dist/cli/ui-health.d.ts.map +1 -1
  9. package/dist/cli/ui-health.js +1 -40
  10. package/dist/cli/ui-health.js.map +1 -1
  11. package/dist/cli/ui-request-origin.d.ts +8 -0
  12. package/dist/cli/ui-request-origin.d.ts.map +1 -0
  13. package/dist/cli/ui-request-origin.js +41 -0
  14. package/dist/cli/ui-request-origin.js.map +1 -0
  15. package/dist/cli/ui-starter-sync.d.ts +17 -0
  16. package/dist/cli/ui-starter-sync.d.ts.map +1 -0
  17. package/dist/cli/ui-starter-sync.js +75 -0
  18. package/dist/cli/ui-starter-sync.js.map +1 -0
  19. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  20. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  21. package/dist/core/upstream-evidence-manifest.js +25 -4
  22. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  23. package/package.json +4 -4
  24. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  26. package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +20 -0
  27. package/plugins/lisa/.codex-plugin/skills/lisa-starter-sync/SKILL.md +35 -0
  28. package/plugins/lisa/.codex-plugin/skills/lisa-starter-sync/agents/openai.yaml +4 -0
  29. package/plugins/lisa/commands/starter-sync.md +6 -0
  30. package/plugins/lisa/scripts/automation-status-expected-fleet.mjs +15 -0
  31. package/plugins/lisa/skills/lisa-setup-automations/SKILL.md +20 -0
  32. package/plugins/lisa/skills/lisa-starter-sync/SKILL.md +35 -0
  33. package/plugins/lisa/skills/lisa-starter-sync/agents/openai.yaml +4 -0
  34. package/plugins/lisa-agy/commands/lisa/starter-sync.md +6 -0
  35. package/plugins/lisa-agy/plugin.json +1 -1
  36. package/plugins/lisa-agy/scripts/automation-status-expected-fleet.mjs +15 -0
  37. package/plugins/lisa-agy/skills/lisa-setup-automations/SKILL.md +20 -0
  38. package/plugins/lisa-agy/skills/lisa-starter-sync/SKILL.md +35 -0
  39. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  42. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-copilot/commands/lisa/starter-sync.md +6 -0
  46. package/plugins/lisa-copilot/scripts/automation-status-expected-fleet.mjs +15 -0
  47. package/plugins/lisa-copilot/skills/lisa-setup-automations/SKILL.md +20 -0
  48. package/plugins/lisa-copilot/skills/lisa-starter-sync/SKILL.md +35 -0
  49. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-cursor/commands/lisa/starter-sync.md +6 -0
  51. package/plugins/lisa-cursor/scripts/automation-status-expected-fleet.mjs +15 -0
  52. package/plugins/lisa-cursor/skills/lisa-setup-automations/SKILL.md +20 -0
  53. package/plugins/lisa-cursor/skills/lisa-starter-sync/SKILL.md +35 -0
  54. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo-agy/plugin.json +1 -1
  57. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  62. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  67. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  72. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  77. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-rails-agy/plugin.json +1 -1
  82. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  87. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  92. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/src/base/commands/starter-sync.md +6 -0
  95. package/plugins/src/base/scripts/automation-status-expected-fleet.mjs +15 -0
  96. package/plugins/src/base/skills/lisa-setup-automations/SKILL.md +20 -0
  97. package/plugins/src/base/skills/lisa-starter-sync/SKILL.md +35 -0
  98. package/ui/README.md +30 -0
  99. package/ui/index.html +129 -12
package/ui/index.html CHANGED
@@ -1848,6 +1848,14 @@
1848
1848
  <div class="toast" id="toast"></div>
1849
1849
  <script>
1850
1850
  "use strict";
1851
+ // The launch fragment is never sent to the HTTP server. Keep the capability
1852
+ // only in this page's memory and remove it before normal section routing.
1853
+ const starterSyncCapability = (() => {
1854
+ const match = /^#lisa-token=([a-f0-9]{64})$/u.exec(location.hash);
1855
+ if (match)
1856
+ history.replaceState(null, "", location.pathname + location.search);
1857
+ return match ? match[1] : null;
1858
+ })();
1851
1859
  document.title = "Lisa Console — Project Settings";
1852
1860
 
1853
1861
  /* ------------------------------------------------------------------ *
@@ -7703,7 +7711,7 @@
7703
7711
  type: "callout",
7704
7712
  staticCopy: "published starter-sync scope",
7705
7713
  variant: "warn",
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.",
7714
+ text: "<b>Starter provenance.</b> Entries and preferences come from project configuration. Sync now checks for starter updates and applies them using the selected strategy. Automatic sync requires scheduler setup after saving. Upstream proposals are not yet connected to this console.",
7707
7715
  },
7708
7716
  {
7709
7717
  type: "flow",
@@ -7791,7 +7799,7 @@
7791
7799
  {
7792
7800
  key: "starter.sync.auto",
7793
7801
  label: "Automatic sync",
7794
- desc: "On: check the upstream starter on a schedule (a lisa-auto cron) and apply new changes without being asked. Off: sync only runs manually.",
7802
+ desc: "On: check the starter daily using the runtime scheduler. After saving, run setup-automations to create or remove the schedule. Off: sync only runs manually.",
7795
7803
  control: tog(false),
7796
7804
  },
7797
7805
  {
@@ -7811,8 +7819,10 @@
7811
7819
  control: {
7812
7820
  type: "button",
7813
7821
  label: "Sync now",
7814
- disabled: true,
7815
- reason: "read-only: starter sync has not shipped yet",
7822
+ action: "run-starter-sync",
7823
+ id: "runStarterSyncButton",
7824
+ statusId: "starterSyncStatus",
7825
+ statusMessage: "Ready to check for starter updates",
7816
7826
  },
7817
7827
  },
7818
7828
  ],
@@ -11619,15 +11629,18 @@
11619
11629
  b.title = control.reason;
11620
11630
  b.setAttribute("aria-describedby", id + "-reason");
11621
11631
  }
11622
- } else {
11623
- b.addEventListener("click", () => {
11624
- if (control.action === "run-health") {
11625
- void runHealthCheck();
11626
- return;
11627
- }
11628
- showToast(control.toast || "Prototype action");
11629
- });
11630
11632
  }
11633
+ b.addEventListener("click", () => {
11634
+ if (control.action === "run-starter-sync") {
11635
+ void runStarterSyncFromConsole(control);
11636
+ return;
11637
+ }
11638
+ if (control.action === "run-health") {
11639
+ void runHealthCheck();
11640
+ return;
11641
+ }
11642
+ showToast(control.toast || "Prototype action");
11643
+ });
11631
11644
  wrap.appendChild(b);
11632
11645
  if (control.statusId) {
11633
11646
  const status = el(
@@ -11639,6 +11652,8 @@
11639
11652
  )
11640
11653
  );
11641
11654
  status.id = control.statusId;
11655
+ if (control.action === "run-starter-sync")
11656
+ paintStarterSyncStatus(status, control);
11642
11657
  status.setAttribute(
11643
11658
  "role",
11644
11659
  control.statusRole === "alert" ? "alert" : "status"
@@ -13609,6 +13624,108 @@
13609
13624
  return request;
13610
13625
  }
13611
13626
 
13627
+ /** Render only text and a validated PR URL from the real landing result. */
13628
+ function paintStarterSyncStatus(status, control) {
13629
+ status.textContent = control.statusMessage;
13630
+ if (control.resultUrl) {
13631
+ const link = document.createElement("a");
13632
+ link.href = control.resultUrl;
13633
+ link.textContent = "View pull request";
13634
+ link.target = "_blank";
13635
+ link.rel = "noopener noreferrer";
13636
+ status.append(" ", link);
13637
+ }
13638
+ }
13639
+
13640
+ /** Call the existing landing path, preserving its three distinct outcomes. */
13641
+ async function runStarterSyncFromConsole(control) {
13642
+ if (control.disabled) return;
13643
+ const update = (message, failed = false) => {
13644
+ control.statusMessage = message;
13645
+ control.statusRole = failed ? "alert" : "status";
13646
+ const button = document.getElementById(control.id);
13647
+ const status = document.getElementById(control.statusId);
13648
+ if (button) button.disabled = !!control.disabled;
13649
+ if (status) {
13650
+ status.setAttribute("role", control.statusRole);
13651
+ status.setAttribute("aria-live", failed ? "assertive" : "polite");
13652
+ paintStarterSyncStatus(status, control);
13653
+ }
13654
+ };
13655
+ control.resultUrl = null;
13656
+ if (!lisaLiveMode) {
13657
+ update("Open this project with lisa ui to run starter sync.", true);
13658
+ return;
13659
+ }
13660
+ if (!starterSyncCapability) {
13661
+ update(
13662
+ "Open the console using its terminal launch link to authorize starter sync.",
13663
+ true
13664
+ );
13665
+ return;
13666
+ }
13667
+ if (saving || dirty.size > 0) {
13668
+ update("Save or discard pending settings before syncing.", true);
13669
+ return;
13670
+ }
13671
+ control.disabled = true;
13672
+ update(
13673
+ "Checking the starter and running the configured landing strategy…"
13674
+ );
13675
+ try {
13676
+ const response = await fetch("/api/starter-sync", {
13677
+ method: "POST",
13678
+ cache: "no-store",
13679
+ headers: { "x-lisa-starter-token": starterSyncCapability },
13680
+ });
13681
+ const result = await response.json();
13682
+ if (!response.ok || result.state === "failed")
13683
+ throw new Error(
13684
+ result.error ||
13685
+ "Starter sync failed. Check the Lisa console terminal for details."
13686
+ );
13687
+ if (result.state === "current") {
13688
+ update("Nothing to do — the starter is already current.");
13689
+ } else if (
13690
+ result.state === "committed" &&
13691
+ typeof result.commit === "string" &&
13692
+ result.commit
13693
+ ) {
13694
+ update("Starter changes committed: " + result.commit);
13695
+ } else if (
13696
+ result.state === "pull-request" &&
13697
+ typeof result.url === "string"
13698
+ ) {
13699
+ const url = new URL(result.url);
13700
+ if (url.protocol !== "https:" || url.username || url.password)
13701
+ throw new Error(
13702
+ "Starter sync returned an invalid pull request URL."
13703
+ );
13704
+ control.resultUrl = url.href;
13705
+ update(
13706
+ "Starter update pull request is open for review. The project's baseline has not advanced." +
13707
+ (result.worktree
13708
+ ? " Changes were retained at " + result.worktree + "."
13709
+ : "")
13710
+ );
13711
+ } else {
13712
+ throw new Error(
13713
+ "The server did not return a recognized starter-sync outcome."
13714
+ );
13715
+ }
13716
+ } catch (error) {
13717
+ update(
13718
+ "Starter sync failed: " +
13719
+ (error instanceof Error ? error.message : String(error)),
13720
+ true
13721
+ );
13722
+ } finally {
13723
+ control.disabled = false;
13724
+ const button = document.getElementById(control.id);
13725
+ if (button) button.disabled = false;
13726
+ }
13727
+ }
13728
+
13612
13729
  /** Run exactly one deterministic Health v1 check through the local server. */
13613
13730
  async function runHealthCheck() {
13614
13731
  const button = document.getElementById("runHealthCheckButton");