@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.
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/project-config-starter.d.ts +48 -0
- package/dist/core/project-config-starter.d.ts.map +1 -0
- package/dist/core/project-config-starter.js +113 -0
- package/dist/core/project-config-starter.js.map +1 -0
- package/dist/core/project-config.d.ts +3 -0
- package/dist/core/project-config.d.ts.map +1 -1
- package/dist/core/project-config.js +3 -0
- package/dist/core/project-config.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +6 -2
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/sync/config-sync.d.ts.map +1 -1
- package/dist/sync/config-sync.js +7 -0
- package/dist/sync/config-sync.js.map +1 -1
- package/dist/sync/registry.d.ts.map +1 -1
- package/dist/sync/registry.js +13 -0
- package/dist/sync/registry.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/ui/README.md +11 -9
- package/ui/index.html +76 -8
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
|
|
251
|
+
## Starter provenance and sync preferences
|
|
252
252
|
|
|
253
|
-
The **Starter templates** section
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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":
|
|
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
|
-
|
|
294
|
-
|
|
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/
|
|
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/
|
|
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>
|
|
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
|
|
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
|
|
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");
|