@codyswann/lisa 4.22.9 → 4.22.10
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/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +127 -0
- package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +63 -8
- package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +36 -6
- package/all/copy-overwrite/scripts/lisa-postinstall.mjs +35 -13
- package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +11 -3
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +41 -8
- package/all/copy-overwrite/scripts/lisa-schema-validate.mjs +2 -2
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +2 -1
- package/cdk/package-lisa/package.lisa.json +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +24 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +59 -50
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/parity-safety-net.sh +36 -6
- package/nestjs/package-lisa/package.lisa.json +1 -1
- package/package.json +3 -3
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +10 -13
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +4 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +8 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +7 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/SKILL.md +5 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +8 -12
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +7 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +7 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +19 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +7 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +7 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +9 -12
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +7 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +7 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +6 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +7 -10
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +1 -1
- package/plugins/lisa/hooks/parity-safety-net.sh +36 -6
- package/plugins/lisa/hooks/threshold-ratchet-families.mjs +31 -7
- package/plugins/lisa/rules/reference/base-rules.md +1 -1
- package/plugins/lisa/rules/reference/config-resolution.md +5 -14
- package/plugins/lisa/scripts/install-remote-agent-aws.mjs +5 -1
- package/plugins/lisa/scripts/rollup-blocker-classification.mjs +18 -3
- package/plugins/lisa/skills/lisa-atlassian-access/SKILL.md +10 -13
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +4 -2
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
- package/plugins/lisa/skills/lisa-github-sync/SKILL.md +8 -3
- package/plugins/lisa/skills/lisa-jam-access/SKILL.md +7 -10
- package/plugins/lisa/skills/lisa-jira-journey/SKILL.md +5 -0
- package/plugins/lisa/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
- package/plugins/lisa/skills/lisa-jira-sync/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-linear-access/SKILL.md +8 -12
- package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
- package/plugins/lisa/skills/lisa-notion-access/SKILL.md +7 -10
- package/plugins/lisa/skills/lisa-posthog-access/SKILL.md +7 -10
- package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +19 -3
- package/plugins/lisa/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
- package/plugins/lisa/skills/lisa-sentry-access/SKILL.md +7 -10
- package/plugins/lisa/skills/lisa-setup-atlassian/SKILL.md +7 -10
- package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +9 -12
- package/plugins/lisa/skills/lisa-setup-notion/SKILL.md +7 -10
- package/plugins/lisa/skills/lisa-setup-remote-aws/SKILL.md +7 -2
- package/plugins/lisa/skills/lisa-setup-remote-env/SKILL.md +6 -1
- package/plugins/lisa/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
- package/plugins/lisa/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
- package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
- package/plugins/lisa/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
- package/plugins/lisa/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
- package/plugins/lisa/skills/lisa-sonarcloud-access/SKILL.md +7 -10
- package/plugins/lisa/skills/lisa-tracker-sync/SKILL.md +1 -1
- package/plugins/lisa-agy/hooks/parity-safety-net.sh +36 -6
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/install-remote-agent-aws.mjs +5 -1
- package/plugins/lisa-agy/scripts/rollup-blocker-classification.mjs +18 -3
- package/plugins/lisa-agy/skills/lisa-atlassian-access/SKILL.md +10 -13
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +4 -2
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
- package/plugins/lisa-agy/skills/lisa-github-sync/SKILL.md +8 -3
- package/plugins/lisa-agy/skills/lisa-jam-access/SKILL.md +7 -10
- package/plugins/lisa-agy/skills/lisa-jira-journey/SKILL.md +5 -0
- package/plugins/lisa-agy/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
- package/plugins/lisa-agy/skills/lisa-jira-sync/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-linear-access/SKILL.md +8 -12
- package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
- package/plugins/lisa-agy/skills/lisa-notion-access/SKILL.md +7 -10
- package/plugins/lisa-agy/skills/lisa-posthog-access/SKILL.md +7 -10
- package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +19 -3
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
- package/plugins/lisa-agy/skills/lisa-sentry-access/SKILL.md +7 -10
- package/plugins/lisa-agy/skills/lisa-setup-atlassian/SKILL.md +7 -10
- package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +9 -12
- package/plugins/lisa-agy/skills/lisa-setup-notion/SKILL.md +7 -10
- package/plugins/lisa-agy/skills/lisa-setup-remote-aws/SKILL.md +7 -2
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/SKILL.md +6 -1
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
- package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
- package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
- package/plugins/lisa-agy/skills/lisa-sonarcloud-access/SKILL.md +7 -10
- package/plugins/lisa-agy/skills/lisa-tracker-sync/SKILL.md +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-copilot/hooks/parity-safety-net.sh +36 -6
- package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +31 -7
- package/plugins/lisa-copilot/rules/reference/base-rules.md +1 -1
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +5 -14
- package/plugins/lisa-copilot/scripts/install-remote-agent-aws.mjs +5 -1
- package/plugins/lisa-copilot/scripts/rollup-blocker-classification.mjs +18 -3
- package/plugins/lisa-copilot/skills/lisa-atlassian-access/SKILL.md +10 -13
- package/plugins/lisa-copilot/skills/lisa-doctor/SKILL.md +4 -2
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
- package/plugins/lisa-copilot/skills/lisa-github-sync/SKILL.md +8 -3
- package/plugins/lisa-copilot/skills/lisa-jam-access/SKILL.md +7 -10
- package/plugins/lisa-copilot/skills/lisa-jira-journey/SKILL.md +5 -0
- package/plugins/lisa-copilot/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
- package/plugins/lisa-copilot/skills/lisa-jira-sync/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-linear-access/SKILL.md +8 -12
- package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
- package/plugins/lisa-copilot/skills/lisa-notion-access/SKILL.md +7 -10
- package/plugins/lisa-copilot/skills/lisa-posthog-access/SKILL.md +7 -10
- package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +19 -3
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
- package/plugins/lisa-copilot/skills/lisa-sentry-access/SKILL.md +7 -10
- package/plugins/lisa-copilot/skills/lisa-setup-atlassian/SKILL.md +7 -10
- package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +9 -12
- package/plugins/lisa-copilot/skills/lisa-setup-notion/SKILL.md +7 -10
- package/plugins/lisa-copilot/skills/lisa-setup-remote-aws/SKILL.md +7 -2
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/SKILL.md +6 -1
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
- package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
- package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
- package/plugins/lisa-copilot/skills/lisa-sonarcloud-access/SKILL.md +7 -10
- package/plugins/lisa-copilot/skills/lisa-tracker-sync/SKILL.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +36 -6
- package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +31 -7
- package/plugins/lisa-cursor/rules/base-rules-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +5 -14
- package/plugins/lisa-cursor/scripts/install-remote-agent-aws.mjs +5 -1
- package/plugins/lisa-cursor/scripts/rollup-blocker-classification.mjs +18 -3
- package/plugins/lisa-cursor/skills/lisa-atlassian-access/SKILL.md +10 -13
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +4 -2
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
- package/plugins/lisa-cursor/skills/lisa-github-sync/SKILL.md +8 -3
- package/plugins/lisa-cursor/skills/lisa-jam-access/SKILL.md +7 -10
- package/plugins/lisa-cursor/skills/lisa-jira-journey/SKILL.md +5 -0
- package/plugins/lisa-cursor/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
- package/plugins/lisa-cursor/skills/lisa-jira-sync/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-linear-access/SKILL.md +8 -12
- package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
- package/plugins/lisa-cursor/skills/lisa-notion-access/SKILL.md +7 -10
- package/plugins/lisa-cursor/skills/lisa-posthog-access/SKILL.md +7 -10
- package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +19 -3
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
- package/plugins/lisa-cursor/skills/lisa-sentry-access/SKILL.md +7 -10
- package/plugins/lisa-cursor/skills/lisa-setup-atlassian/SKILL.md +7 -10
- package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +9 -12
- package/plugins/lisa-cursor/skills/lisa-setup-notion/SKILL.md +7 -10
- package/plugins/lisa-cursor/skills/lisa-setup-remote-aws/SKILL.md +7 -2
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/SKILL.md +6 -1
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
- package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
- package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
- package/plugins/lisa-cursor/skills/lisa-sonarcloud-access/SKILL.md +7 -10
- package/plugins/lisa-cursor/skills/lisa-tracker-sync/SKILL.md +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/plugins/src/base/hooks/parity-safety-net.sh +36 -6
- package/plugins/src/base/hooks/threshold-ratchet-families.mjs +31 -7
- package/plugins/src/base/rules/reference/base-rules.md +1 -1
- package/plugins/src/base/rules/reference/config-resolution.md +5 -14
- package/plugins/src/base/scripts/install-remote-agent-aws.mjs +5 -1
- package/plugins/src/base/scripts/rollup-blocker-classification.mjs +18 -3
- package/plugins/src/base/skills/lisa-atlassian-access/SKILL.md +10 -13
- package/plugins/src/base/skills/lisa-doctor/SKILL.md +4 -2
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +29 -4
- package/plugins/src/base/skills/lisa-github-sync/SKILL.md +8 -3
- package/plugins/src/base/skills/lisa-jam-access/SKILL.md +7 -10
- package/plugins/src/base/skills/lisa-jira-journey/SKILL.md +5 -0
- package/plugins/src/base/skills/lisa-jira-journey/scripts/parse-plan.py +36 -2
- package/plugins/src/base/skills/lisa-jira-sync/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-linear-access/SKILL.md +8 -12
- package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-nightly-lower-code-complexity/SKILL.md +7 -1
- package/plugins/src/base/skills/lisa-notion-access/SKILL.md +7 -10
- package/plugins/src/base/skills/lisa-posthog-access/SKILL.md +7 -10
- package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +19 -3
- package/plugins/src/base/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +10 -6
- package/plugins/src/base/skills/lisa-sentry-access/SKILL.md +7 -10
- package/plugins/src/base/skills/lisa-setup-atlassian/SKILL.md +7 -10
- package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +9 -12
- package/plugins/src/base/skills/lisa-setup-notion/SKILL.md +7 -10
- package/plugins/src/base/skills/lisa-setup-remote-aws/SKILL.md +7 -2
- package/plugins/src/base/skills/lisa-setup-remote-env/SKILL.md +6 -1
- package/plugins/src/base/skills/lisa-setup-remote-env/assets/session-start.sh +19 -0
- package/plugins/src/base/skills/lisa-setup-remote-env/assets/setup.sh +1 -0
- package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +25 -4
- package/plugins/src/base/skills/lisa-setup-workstation/scripts/bounded-child.mjs +9 -0
- package/plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs +29 -21
- package/plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md +7 -10
- package/plugins/src/base/skills/lisa-tracker-sync/SKILL.md +1 -1
- package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +31 -7
- package/scripts/lisa-remote-env/session-start.sh +19 -0
- package/scripts/lisa-remote-env/setup.sh +1 -0
- package/scripts/two-channel-couplings.json +1 -1
- package/typescript/copy-contents/.husky/pre-push +1 -1
- package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +31 -7
- package/typescript/package-lisa/package.lisa.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// This file is managed by Lisa and IS replaced on each `lisa` run.
|
|
3
|
+
// Do not edit directly — durable changes belong upstream in Lisa.
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Run one shell command in its own process group and reap the whole group.
|
|
7
|
+
*
|
|
8
|
+
* Node's synchronous timeout signals only the direct child. A gate command is
|
|
9
|
+
* a tree (shell, package manager, test workers), so killing only the shell
|
|
10
|
+
* leaves descendants running against scratch state the caller then removes.
|
|
11
|
+
* This small asynchronous supervisor is invoked through a synchronous parent:
|
|
12
|
+
* it owns the process-group id, applies the deadline, terminates the group, and
|
|
13
|
+
* only then lets the parent continue.
|
|
14
|
+
* @module scripts/lib/process-tree-runner
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
18
|
+
|
|
19
|
+
import { invokedAsScript } from "./invoked-as-script.mjs";
|
|
20
|
+
|
|
21
|
+
const KILL_GRACE_MS = 750;
|
|
22
|
+
|
|
23
|
+
function parseArguments(argv) {
|
|
24
|
+
const timeoutArg = argv.find(value => value.startsWith("--timeout-ms="));
|
|
25
|
+
const separator = argv.indexOf("--");
|
|
26
|
+
const timeoutMs = Number(timeoutArg?.slice("--timeout-ms=".length));
|
|
27
|
+
const command = separator >= 0 ? argv.slice(separator + 1).join(" ") : "";
|
|
28
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || !command) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
"usage: process-tree-runner.mjs --timeout-ms=<positive-ms> -- <command>"
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return { command, timeoutMs };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function killTree(pid, signal) {
|
|
37
|
+
if (process.platform === "win32") {
|
|
38
|
+
// Windows has no negative-pid process groups. taskkill /T is the native
|
|
39
|
+
// tree primitive; /F is used only for the escalation.
|
|
40
|
+
const args = ["/pid", String(pid), "/T"];
|
|
41
|
+
if (signal === "SIGKILL") args.push("/F");
|
|
42
|
+
spawnSync("taskkill", args, { stdio: "ignore", timeout: KILL_GRACE_MS });
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
process.kill(-pid, signal);
|
|
47
|
+
} catch {
|
|
48
|
+
// ESRCH means the whole group already exited.
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export function supervise(command, timeoutMs) {
|
|
53
|
+
return new Promise((resolve, reject) => {
|
|
54
|
+
const shell =
|
|
55
|
+
process.platform === "win32"
|
|
56
|
+
? process.env.ComSpec || "cmd.exe"
|
|
57
|
+
: "/bin/sh";
|
|
58
|
+
const shellArgs =
|
|
59
|
+
process.platform === "win32"
|
|
60
|
+
? ["/d", "/s", "/c", command]
|
|
61
|
+
: ["-c", command];
|
|
62
|
+
const child = spawn(shell, shellArgs, {
|
|
63
|
+
detached: true,
|
|
64
|
+
env: process.env,
|
|
65
|
+
stdio: "inherit",
|
|
66
|
+
});
|
|
67
|
+
const pid = child.pid;
|
|
68
|
+
if (pid === undefined) {
|
|
69
|
+
reject(new Error("gate process tree did not start"));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let timedOut = false;
|
|
74
|
+
let settled = false;
|
|
75
|
+
const finish = (code, signal) => {
|
|
76
|
+
if (settled) return;
|
|
77
|
+
settled = true;
|
|
78
|
+
clearTimeout(deadline);
|
|
79
|
+
// A command may leave a background descendant after its direct shell
|
|
80
|
+
// exits. Reap that residue before returning a verdict too.
|
|
81
|
+
killTree(pid, "SIGTERM");
|
|
82
|
+
resolve({ code, signal });
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const deadline = setTimeout(() => {
|
|
86
|
+
timedOut = true;
|
|
87
|
+
killTree(pid, "SIGTERM");
|
|
88
|
+
setTimeout(() => {
|
|
89
|
+
killTree(pid, "SIGKILL");
|
|
90
|
+
// A signal-shaped result is the existing gate runner vocabulary for
|
|
91
|
+
// "no verdict". It also prevents an ordinary exit code such as 124
|
|
92
|
+
// from being confused with a user command that returned that code.
|
|
93
|
+
if (process.platform === "win32") {
|
|
94
|
+
process.exit(124);
|
|
95
|
+
} else {
|
|
96
|
+
process.kill(process.pid, "SIGKILL");
|
|
97
|
+
}
|
|
98
|
+
}, KILL_GRACE_MS);
|
|
99
|
+
}, timeoutMs);
|
|
100
|
+
|
|
101
|
+
child.once("error", error => {
|
|
102
|
+
clearTimeout(deadline);
|
|
103
|
+
killTree(pid, "SIGKILL");
|
|
104
|
+
reject(error);
|
|
105
|
+
});
|
|
106
|
+
child.once("close", (code, signal) => {
|
|
107
|
+
// On timeout, wait for the forced group reap above before this supervisor
|
|
108
|
+
// ends. Exiting on the direct shell's close is the race that used to leave
|
|
109
|
+
// its descendants alive.
|
|
110
|
+
if (!timedOut) finish(code, signal);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
async function main() {
|
|
116
|
+
const { command, timeoutMs } = parseArguments(process.argv.slice(2));
|
|
117
|
+
const result = await supervise(command, timeoutMs);
|
|
118
|
+
if (result.signal) {
|
|
119
|
+
process.exitCode = 128;
|
|
120
|
+
} else {
|
|
121
|
+
process.exitCode = result.code ?? 1;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (invokedAsScript(import.meta.url)) {
|
|
126
|
+
await main();
|
|
127
|
+
}
|
|
@@ -85,11 +85,45 @@ const DEPENDENCY_SECTIONS = [
|
|
|
85
85
|
* means: `^8` is `>=8.0.0 <9.0.0` and `1.x` is `>=1.0.0 <2.0.0`. Only the lower
|
|
86
86
|
* bound is read here, so the upper half costs nothing to ignore.
|
|
87
87
|
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
88
|
+
* This parser deliberately uses no version-shaped regular expression. The
|
|
89
|
+
* collision gate consumes dependency text supplied by a repository, so even a
|
|
90
|
+
* bounded-looking optional-group expression becomes an avoidable ReDoS review
|
|
91
|
+
* burden. A tiny left-to-right scanner is both clearer and constant-work per
|
|
92
|
+
* input character.
|
|
91
93
|
*/
|
|
92
|
-
|
|
94
|
+
function parseBranchVersion(branch) {
|
|
95
|
+
let cursor = branch.trimStart();
|
|
96
|
+
while (cursor.startsWith("v")) cursor = cursor.slice(1);
|
|
97
|
+
|
|
98
|
+
const operator = [">=", ">", "=", "^", "~"].find(candidate =>
|
|
99
|
+
cursor.startsWith(candidate)
|
|
100
|
+
);
|
|
101
|
+
if (operator) cursor = cursor.slice(operator.length);
|
|
102
|
+
cursor = cursor.trimStart();
|
|
103
|
+
|
|
104
|
+
let end = 0;
|
|
105
|
+
while (end < cursor.length) {
|
|
106
|
+
const character = cursor[end];
|
|
107
|
+
const digit = character >= "0" && character <= "9";
|
|
108
|
+
const next = cursor[end + 1];
|
|
109
|
+
const componentSeparator = character === "." && next >= "0" && next <= "9";
|
|
110
|
+
if (!digit && !componentSeparator) break;
|
|
111
|
+
end += 1;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const parts = cursor.slice(0, end).split(".");
|
|
115
|
+
if (
|
|
116
|
+
parts.length > 3 ||
|
|
117
|
+
parts.some(
|
|
118
|
+
part =>
|
|
119
|
+
part === "" ||
|
|
120
|
+
[...part].some(character => character < "0" || character > "9")
|
|
121
|
+
)
|
|
122
|
+
) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
return { operator, parts };
|
|
126
|
+
}
|
|
93
127
|
|
|
94
128
|
/**
|
|
95
129
|
* Lowest version a single disjunction branch permits.
|
|
@@ -104,13 +138,34 @@ const BRANCH_VERSION = /^[\sv=><~^]*(\d+)(?:\.(\d+))?(?:\.(\d+))?/;
|
|
|
104
138
|
function branchLowerBound(branch) {
|
|
105
139
|
const trimmed = branch.trim();
|
|
106
140
|
if (trimmed === "") return null;
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
141
|
+
const upperOperand = trimmed
|
|
142
|
+
.slice(trimmed.startsWith("<=") ? 2 : 1)
|
|
143
|
+
.trimStart();
|
|
144
|
+
if (
|
|
145
|
+
trimmed.startsWith("<") &&
|
|
146
|
+
upperOperand[0] >= "0" &&
|
|
147
|
+
upperOperand[0] <= "9"
|
|
148
|
+
) {
|
|
149
|
+
return [0, 0, 0];
|
|
150
|
+
}
|
|
151
|
+
const parsed = parseBranchVersion(trimmed);
|
|
152
|
+
if (!parsed) return null;
|
|
110
153
|
// An absent minor or patch is zero, not missing: `^8` is `>=8.0.0`. Number()
|
|
111
154
|
// of undefined is NaN, which would compare as neither higher nor lower than
|
|
112
155
|
// anything and quietly disable the comparison it feeds.
|
|
113
|
-
|
|
156
|
+
const lower = [...parsed.parts, "0", "0"].slice(0, 3).map(Number);
|
|
157
|
+
if (parsed.operator !== ">") return lower;
|
|
158
|
+
|
|
159
|
+
// npm expands a STRICT comparator on a partial version before comparing:
|
|
160
|
+
// `>1` is `>=2.0.0` and `>1.2` is `>=1.3.0`. Reading either as merely
|
|
161
|
+
// 1.0.0/1.2.0 invents versions the range does not permit and can report an
|
|
162
|
+
// adequate dependency line as weaker than its override.
|
|
163
|
+
const lastSpecified = parsed.parts.length - 1;
|
|
164
|
+
lower[lastSpecified] += 1;
|
|
165
|
+
for (let index = lastSpecified + 1; index < lower.length; index += 1) {
|
|
166
|
+
lower[index] = 0;
|
|
167
|
+
}
|
|
168
|
+
return lower;
|
|
114
169
|
}
|
|
115
170
|
|
|
116
171
|
/**
|
|
@@ -1067,8 +1067,38 @@ readonly AGENT_CREDENTIAL='(\.(claude|codex|cursor|copilot|gemini|antigravity)/[
|
|
|
1067
1067
|
# 15d. Dotenv files. `.env.example`, `.sample`, `.template`, `.dist` and
|
|
1068
1068
|
# `.schema` are checked-in documentation of which keys exist, never the values,
|
|
1069
1069
|
# so they are excluded — that collision is the one this rule most had to avoid.
|
|
1070
|
-
|
|
1071
|
-
|
|
1070
|
+
# Decide dotenv privacy per PATH, never by subtracting one command-wide match
|
|
1071
|
+
# from another. A command that names `.env.example` and `.env` contains both a
|
|
1072
|
+
# public path and a private one; seeing the former cannot authorize the latter.
|
|
1073
|
+
#
|
|
1074
|
+
# The one write-only shape this guard has always allowed remains explicit:
|
|
1075
|
+
# seeding a private dotenv destination from one public template. This is safe
|
|
1076
|
+
# because the private path is the destination, not a value being read back.
|
|
1077
|
+
has_private_dotenv_path() {
|
|
1078
|
+
dotenv_scan_status=0
|
|
1079
|
+
dotenv_candidates="$(printf '%s' "$normalized_command_str" \
|
|
1080
|
+
| grep -Eio -- '(^|[[:space:]='"$qc"'./])\.env(\.[[:alnum:]_-]+)?')" \
|
|
1081
|
+
|| dotenv_scan_status=$?
|
|
1082
|
+
if [ "$dotenv_scan_status" -gt 1 ]; then
|
|
1083
|
+
block "dotenv path classification failed; denying the credential-store read fail-closed."
|
|
1084
|
+
fi
|
|
1085
|
+
|
|
1086
|
+
while IFS= read -r candidate; do
|
|
1087
|
+
[ -n "$candidate" ] || continue
|
|
1088
|
+
candidate="$(printf '%s' "$candidate" \
|
|
1089
|
+
| tr '[:upper:]' '[:lower:]' \
|
|
1090
|
+
| grep -Eo -- '\.env(\.[[:alnum:]_-]+)?')"
|
|
1091
|
+
case "$candidate" in
|
|
1092
|
+
.env.example | .env.sample | .env.template | .env.dist | .env.schema | .env.defaults) ;;
|
|
1093
|
+
*) return 0 ;;
|
|
1094
|
+
esac
|
|
1095
|
+
done <<EOF
|
|
1096
|
+
$dotenv_candidates
|
|
1097
|
+
EOF
|
|
1098
|
+
return 1
|
|
1099
|
+
}
|
|
1100
|
+
|
|
1101
|
+
readonly SAFE_DOTENV_SEED='^[[:space:]]*(cp|mv)[[:space:]]+\.env\.(example|sample|template|dist|schema|defaults)[[:space:]]+\.env(\.[[:alnum:]_-]+)?[[:space:]]*$'
|
|
1072
1102
|
|
|
1073
1103
|
if matches "$SECRET_READ_VERB"; then
|
|
1074
1104
|
if matches "$SSH_PRIVATE_KEY"; then
|
|
@@ -1080,10 +1110,10 @@ if matches "$SECRET_READ_VERB"; then
|
|
|
1080
1110
|
if matches "$AGENT_CREDENTIAL"; then
|
|
1081
1111
|
block "reading, copying or transmitting a coding-agent or package-registry credential store. These tokens impersonate the operator to every service the agent can reach."
|
|
1082
1112
|
fi
|
|
1083
|
-
#
|
|
1084
|
-
#
|
|
1085
|
-
#
|
|
1086
|
-
if
|
|
1113
|
+
# A public path elsewhere in the command never exempts a private path. The
|
|
1114
|
+
# narrow public-template -> private-destination seed is write-only and remains
|
|
1115
|
+
# allowed; every other command containing a private dotenv path is refused.
|
|
1116
|
+
if has_private_dotenv_path && ! matches "$SAFE_DOTENV_SEED"; then
|
|
1087
1117
|
block "reading, copying or transmitting a dotenv file holding real values. \`.env.example\`, \`.env.sample\`, \`.env.template\` and \`.env.dist\` are readable, and WRITING a .env is unaffected — only reading one back is refused."
|
|
1088
1118
|
fi
|
|
1089
1119
|
# Fail-closed, narrowly. A read whose DIRECTORY is a known credential store
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
48
48
|
import { dirname, join } from "node:path";
|
|
49
49
|
|
|
50
|
-
import { boundedSpawnSync } from "./lib/bounded-spawn.mjs";
|
|
50
|
+
import { boundedSpawnSync, isChildTimeout } from "./lib/bounded-spawn.mjs";
|
|
51
51
|
import { invokedAsScript } from "./lib/invoked-as-script.mjs";
|
|
52
52
|
|
|
53
53
|
/**
|
|
@@ -148,18 +148,40 @@ export function runPostinstall(cwd = process.cwd(), env = process.env) {
|
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
151
|
+
let child;
|
|
152
|
+
try {
|
|
153
|
+
child = boundedSpawnSync(
|
|
154
|
+
process.execPath,
|
|
155
|
+
[LISA_ENTRY, "--yes", "--skip-git-check", "."],
|
|
156
|
+
{
|
|
157
|
+
cwd,
|
|
158
|
+
env: { ...env, LISA_BOOTSTRAP: "1" },
|
|
159
|
+
encoding: "utf8",
|
|
160
|
+
// Inherited, NOT captured-and-discarded. The whole point.
|
|
161
|
+
stdio: ["ignore", "inherit", "pipe"],
|
|
162
|
+
timeout: APPLY_BUDGET_MS,
|
|
163
|
+
}
|
|
164
|
+
);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
// A timeout is a failed APPLY, not a failed INSTALL. The bounded child
|
|
167
|
+
// deliberately throws so ordinary callers fail closed; this caller has a
|
|
168
|
+
// stronger, documented contract to leave a durable marker and let the
|
|
169
|
+
// package manager finish. Unknown throws still escape because converting a
|
|
170
|
+
// broken postinstall module into an apparent apply failure would hide the
|
|
171
|
+
// defect that needs fixing.
|
|
172
|
+
if (!isChildTimeout(error)) throw error;
|
|
173
|
+
child = {
|
|
174
|
+
error: Object.assign(
|
|
175
|
+
new Error(
|
|
176
|
+
"Lisa template apply exceeded its ten-minute deadline and was killed."
|
|
177
|
+
),
|
|
178
|
+
{ code: "ETIMEDOUT" }
|
|
179
|
+
),
|
|
180
|
+
status: null,
|
|
181
|
+
stderr:
|
|
182
|
+
"Lisa template apply exceeded its ten-minute deadline and was killed.\n",
|
|
183
|
+
};
|
|
184
|
+
}
|
|
163
185
|
|
|
164
186
|
const stderr = child.stderr ?? "";
|
|
165
187
|
if (stderr) process.stderr.write(stderr);
|
|
@@ -718,9 +718,17 @@ export function reconcileContexts({
|
|
|
718
718
|
if (record.ruleset !== undefined && entry.ruleset !== record.ruleset) {
|
|
719
719
|
return false;
|
|
720
720
|
}
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
721
|
+
// Configured ruleset policy defaults to GitHub Actions when it carries no
|
|
722
|
+
// explicit pin. That is the same default the writer applies, so comparison
|
|
723
|
+
// and repair converge. A gate-derived record names no ruleset and remains
|
|
724
|
+
// name-only: it never declared which app may satisfy it.
|
|
725
|
+
if (record.ruleset !== undefined) {
|
|
726
|
+
const expected = record.integration_id ?? ACTIONS_INTEGRATION_ID;
|
|
727
|
+
return entry.integration_id === expected;
|
|
728
|
+
}
|
|
729
|
+
return (
|
|
730
|
+
record.integration_id === undefined ||
|
|
731
|
+
entry.integration_id === record.integration_id
|
|
724
732
|
);
|
|
725
733
|
};
|
|
726
734
|
const unsatisfied = declarations.filter(
|
|
@@ -358,10 +358,9 @@ function normaliseExec(raw) {
|
|
|
358
358
|
* ## Two kinds that look eligible and are not
|
|
359
359
|
*
|
|
360
360
|
* `uncaptured` is NOT here, and the attempt to include it is what proves the
|
|
361
|
-
* distinction. Capture is
|
|
362
|
-
* so `uncaptured` is
|
|
363
|
-
*
|
|
364
|
-
* `lint` gate exiting 1. A gate that exited nonzero did measure something; the
|
|
361
|
+
* distinction. Capture is on by default (`LISA_GATES_CAPTURE=0` turns it off),
|
|
362
|
+
* so `uncaptured` is an explicit loss of diagnostic evidence rather than the
|
|
363
|
+
* ordinary outcome. A gate that exited nonzero did measure something; the
|
|
365
364
|
* runner merely did not keep the transcript. Missing evidence about a real
|
|
366
365
|
* failure is not the same claim as a captured transcript that describes no
|
|
367
366
|
* failure at all, which is what `undiagnosed` means.
|
|
@@ -888,6 +887,33 @@ const CAPTURE_TAIL_BYTES = 512 * 1024;
|
|
|
888
887
|
*/
|
|
889
888
|
const GATE_COMMAND_BUDGET_MS = 2 * 60 * 60 * 1000;
|
|
890
889
|
|
|
890
|
+
/** Extra ceiling for the supervisor to reap descendants after its deadline. */
|
|
891
|
+
const PROCESS_TREE_REAP_BUDGET_MS = 10_000;
|
|
892
|
+
|
|
893
|
+
/** The asynchronous supervisor used behind this synchronous gate API. */
|
|
894
|
+
const PROCESS_TREE_RUNNER = fileURLToPath(
|
|
895
|
+
new URL("./lib/process-tree-runner.mjs", import.meta.url)
|
|
896
|
+
);
|
|
897
|
+
|
|
898
|
+
/**
|
|
899
|
+
* Run a shell command under a process-tree deadline.
|
|
900
|
+
* @param {string} command Shell source.
|
|
901
|
+
* @param {object} options Child options passed to the supervisor.
|
|
902
|
+
* @returns {import("node:child_process").SpawnSyncReturns<string>} Result.
|
|
903
|
+
*/
|
|
904
|
+
function runProcessTree(command, options = {}) {
|
|
905
|
+
const timeout = options.timeout ?? GATE_COMMAND_BUDGET_MS;
|
|
906
|
+
const { shell: _shell, ...childOptions } = options;
|
|
907
|
+
return boundedSpawnSync(
|
|
908
|
+
process.execPath,
|
|
909
|
+
[PROCESS_TREE_RUNNER, `--timeout-ms=${timeout}`, "--", command],
|
|
910
|
+
{
|
|
911
|
+
...childOptions,
|
|
912
|
+
timeout: timeout + PROCESS_TREE_REAP_BUDGET_MS,
|
|
913
|
+
}
|
|
914
|
+
);
|
|
915
|
+
}
|
|
916
|
+
|
|
891
917
|
/**
|
|
892
918
|
* Convert a killed child into this file's no-verdict answer, or re-raise.
|
|
893
919
|
*
|
|
@@ -916,8 +942,7 @@ function killedOrRethrow(error) {
|
|
|
916
942
|
*/
|
|
917
943
|
function plainExec(command) {
|
|
918
944
|
try {
|
|
919
|
-
const child =
|
|
920
|
-
shell: true,
|
|
945
|
+
const child = runProcessTree(command, {
|
|
921
946
|
stdio: "inherit",
|
|
922
947
|
timeout: GATE_COMMAND_BUDGET_MS,
|
|
923
948
|
});
|
|
@@ -1015,9 +1040,17 @@ export function spawnExec(command) {
|
|
|
1015
1040
|
const statusPath = join(dir, "status");
|
|
1016
1041
|
// Newline-separated inside a group, so a command ending in a trailing
|
|
1017
1042
|
// comment or redirection still has `echo` run as its own statement.
|
|
1018
|
-
|
|
1043
|
+
// Paths travel as data, never as shell source. A TMPDIR containing a quote,
|
|
1044
|
+
// newline, dollar sign, or command substitution must not be able to break
|
|
1045
|
+
// this wrapper or execute content merely because mkdtemp inherited it.
|
|
1046
|
+
const script = `{\n${command}\necho $? > "$LISA_GATE_STATUS_PATH"\n} 2>&1 | tee "$LISA_GATE_LOG_PATH"\n`;
|
|
1019
1047
|
try {
|
|
1020
|
-
const child =
|
|
1048
|
+
const child = runProcessTree(script, {
|
|
1049
|
+
env: {
|
|
1050
|
+
...process.env,
|
|
1051
|
+
LISA_GATE_LOG_PATH: logPath,
|
|
1052
|
+
LISA_GATE_STATUS_PATH: statusPath,
|
|
1053
|
+
},
|
|
1021
1054
|
stdio: "inherit",
|
|
1022
1055
|
timeout: GATE_COMMAND_BUDGET_MS,
|
|
1023
1056
|
});
|
|
@@ -150,9 +150,9 @@ function resolveRef(ref, root) {
|
|
|
150
150
|
const defs = isSchemaObject(root.$defs) ? root.$defs : {};
|
|
151
151
|
const target =
|
|
152
152
|
match && Object.hasOwn(defs, match[1]) ? defs[match[1]] : undefined;
|
|
153
|
-
if (!target) {
|
|
153
|
+
if (!isSchemaObject(target)) {
|
|
154
154
|
throw new Error(
|
|
155
|
-
`unsupported or unresolvable $ref "${ref}" (only #/$defs/<name> is supported)`
|
|
155
|
+
`unsupported or unresolvable $ref "${ref}" (only #/$defs/<name> resolving to a subschema object is supported)`
|
|
156
156
|
);
|
|
157
157
|
}
|
|
158
158
|
return target;
|
|
@@ -536,7 +536,8 @@ function verifyLevel(config) {
|
|
|
536
536
|
throw new TrackingError(
|
|
537
537
|
`Unknown workItem.verify '${raw}'. Expected "trailer" (the default: ` +
|
|
538
538
|
`prove the Work-Item reference, contact no tracker) or "full" (also ` +
|
|
539
|
-
`prove the tracker item
|
|
539
|
+
`prove the tracker item exists and is open, has repo scope, is a leaf, ` +
|
|
540
|
+
`and carries the PR backlink)`
|
|
540
541
|
);
|
|
541
542
|
}
|
|
542
543
|
return value;
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"prepare": "husky install || true",
|
|
9
9
|
"test": "vitest run",
|
|
10
10
|
"test:unit": "vitest run --exclude='**/integration/**'",
|
|
11
|
-
"test:integration:lisa": "vitest run '.integration.' 'integration/'
|
|
11
|
+
"test:integration:lisa": "vitest run '.integration.' 'integration/'",
|
|
12
12
|
"test:cov": "vitest run --coverage",
|
|
13
13
|
"test:mutation": "node scripts/lisa-mutation.mjs",
|
|
14
14
|
"test:watch": "vitest",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA6tBjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAgoBjC,CAAC"}
|
|
@@ -287,6 +287,9 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
287
287
|
"19412df978489b6e0dfb8fd008d91895af9181bc1e6a7c9df616d9137da3e429",
|
|
288
288
|
"82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
|
|
289
289
|
]),
|
|
290
|
+
"scripts/lib/process-tree-runner.mjs": Object.freeze([
|
|
291
|
+
"fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
|
|
292
|
+
]),
|
|
290
293
|
"scripts/lisa-clean-git-env.sh": Object.freeze([
|
|
291
294
|
"d15af6f13eedbca41046070972380e69fc0af8f7d903aac12b8644389b9a0c91",
|
|
292
295
|
"e7121a0ee9e1bf7c01cd2ab55f563dd6d9ab75990739bb6ddf571a513efa10e9",
|
|
@@ -333,11 +336,13 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
333
336
|
"f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
|
|
334
337
|
]),
|
|
335
338
|
"scripts/lisa-floor-collisions.mjs": Object.freeze([
|
|
339
|
+
"04f9455319a501112902794874ca4889feff8c0d9c04cc07fb5720b09ed8fc92",
|
|
336
340
|
"16f609ebf97f4f52e462ed97a774c2b56a33a99865cc11a5c069fbbbb45b007c",
|
|
337
341
|
"2d11968f6852ab745cba939de03c6d6cb5f413975d2cfc8fc447bdd0b218e91a",
|
|
338
342
|
"3136d9c30b9f2945c555c0545fc9dac5ebf9135bda5e89330e351b4313ee8b89",
|
|
339
343
|
"3c7a0234b4f5609fce49e44711d2ec86af8cf7fb82b0831e4450e3347ecefe45",
|
|
340
344
|
"41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
|
|
345
|
+
"557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
|
|
341
346
|
"8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
|
|
342
347
|
"9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
|
|
343
348
|
"a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
|
|
@@ -533,6 +538,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
533
538
|
"1d4fbe135f1bb4e861d286a6512ed201d4522250dfe3f9eba6584bc5ff166a95",
|
|
534
539
|
"2b1ca7d317dea3af106df1a74b1718e3df9c18e76e9d9d769aa3271b7abf8a3f",
|
|
535
540
|
"388cf8847581d96a1ff8ea98290a33a5f96d67cdd502ea807a0b8d88efe90e19",
|
|
541
|
+
"450338257697a75a8fce9f06f3fc00bf3417947e50d601794da41f9c520a7cc3",
|
|
536
542
|
"64546813f168fb446f39e34bc674fd3af85b15bd5e7f4f6bf4503463e701a7b9",
|
|
537
543
|
"74b5b90fcf15dbeb14a69677cf74e339154421cd056fdaf603d1167b34a74105",
|
|
538
544
|
"772202ddd42d626625ff719666afbbe83445d8bae1bc7c0fb5ffdcb402be83f8",
|
|
@@ -589,6 +595,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
589
595
|
"eb3593f201f570db63a9568236446d4324ee8757cda5e234965f3278d653c7db",
|
|
590
596
|
]),
|
|
591
597
|
"scripts/lisa-postinstall.mjs": Object.freeze([
|
|
598
|
+
"3294f390878d7fdb74417e12e9d386027ea8baeb874c5cae56c6d44d1df6261d",
|
|
592
599
|
"45cf63bc37ef1115bc47e8212c709a7ec4dc09a9d7541297f0e2f090cbfb1fcc",
|
|
593
600
|
"864bfbdc0b089a9b97e7ff053716f52e813071faff0be220294767b65918967b",
|
|
594
601
|
"98fe3adf3192a72f40eb75757193ce866f0a6123387377f6041e54d938df8d96",
|
|
@@ -599,6 +606,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
599
606
|
"07542e977ed41f094d5a51cae512e4a3246fabe10d0f83676a176abc81d91624",
|
|
600
607
|
"1e8053bb51a01fda0e2489de231ea252473991138da150dbdff72c5292e1ce53",
|
|
601
608
|
"2512f61074d10216dee0aca748caaebad373e6bba2598bc089f30f977c7a6a83",
|
|
609
|
+
"395897d1dc3f0ac92d7c892eaa9b9ddf12078181bb9f5b228965478190b09a91",
|
|
602
610
|
"3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
|
|
603
611
|
"3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
|
|
604
612
|
"4b383ff960d7da53e0dd46e37632ef55c5a38b004fb4aabfe91a25a9fe02d88f",
|
|
@@ -629,6 +637,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
629
637
|
"6e419a489d0605cc0743af207ff4ff3428d8bcdfbabb7207d164593b9644dfa5",
|
|
630
638
|
"79055f89eb9c5bf1739867c12dc2d9e30320f86a2a3dd470300ba706c3c9d85e",
|
|
631
639
|
"94453bdae8ab3dd2eba0883c4b278027396090e0bdc8e2f102414abc6415912a",
|
|
640
|
+
"9b14c8864608e8ca390579048229bc0bbaba3094af0b536f1956085295c68af3",
|
|
632
641
|
"9fa363107aa5ff033f150ff1a1bb5550d286de383b3d1f7b6c2ac2947730c8f2",
|
|
633
642
|
"a58af06f1d677d82b780a6857916c1684a44649ba742b2b329d408057ae5700d",
|
|
634
643
|
"ba610745a8878bb9a21af249d6ab5b384fcf88e7c530db846f4f8163faba7a8e",
|
|
@@ -647,6 +656,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
647
656
|
"08cb25c2c49e0e5fd01e29861bbb8c90f612f9736ca2df86789fa72bd26d271e",
|
|
648
657
|
"2ace82daacdebbbb00a7eceb09fbe82cabec04330a083ca10417b2ee4e0a63eb",
|
|
649
658
|
"3119c557eb49776143f0a4a715a25a2918242baccf39b7660a63d376e4e79791",
|
|
659
|
+
"34d751e4ee98c14ae1c76ae14fe3da1ca913f70f40019a8423733f03ab64bb89",
|
|
650
660
|
"4a05a0ed70a274827fd2f0fd0c98890c66bee2fde70785b8379943ebe6650473",
|
|
651
661
|
"83c6e57e8168c5ae9fe538b23eec9016d0c959a4b5470d1ab160562ec2815de3",
|
|
652
662
|
"8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
|
|
@@ -665,6 +675,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
665
675
|
"238dc2da29938edd92518c2b08192d14c6f2751ed175c07d6e882814829b7b7e",
|
|
666
676
|
"2d9ca0841db9e75ddfd95e3a4d485fd01aa639a512ef648996f565b7991d8e2b",
|
|
667
677
|
"4c263fef48c03b3b6c623ea8a6cd55505bfaf28197e5072226ea35f9f3d26885",
|
|
678
|
+
"5a0b82045d9795284a109c28e5e9dd97a5488ff540bb7034b84077d1447ffd7c",
|
|
668
679
|
"5eb31c284e820a51312d4484f0669128007326af55ee515923fec33700d003a1",
|
|
669
680
|
"637741a9e5d2904aed24d48efd6bec1326c5573f718a13152807aa0e4b42f0a1",
|
|
670
681
|
"6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
|
|
@@ -721,6 +732,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
|
|
|
721
732
|
"cf99167b05d210afad01fb41fc4aed548c66ee0e9a7c4decb8afa1f180eb5640",
|
|
722
733
|
]),
|
|
723
734
|
"scripts/threshold-ratchet-families.mjs": Object.freeze([
|
|
735
|
+
"39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
|
|
724
736
|
"47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
|
|
725
737
|
"8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
|
|
726
738
|
"93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",
|
|
@@ -1002,6 +1014,9 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1002
1014
|
"19412df978489b6e0dfb8fd008d91895af9181bc1e6a7c9df616d9137da3e429",
|
|
1003
1015
|
"82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
|
|
1004
1016
|
]),
|
|
1017
|
+
"scripts/lib/process-tree-runner.mjs": Object.freeze([
|
|
1018
|
+
"fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
|
|
1019
|
+
]),
|
|
1005
1020
|
"scripts/lisa-clean-git-env.sh": Object.freeze([
|
|
1006
1021
|
"d15af6f13eedbca41046070972380e69fc0af8f7d903aac12b8644389b9a0c91",
|
|
1007
1022
|
"e7121a0ee9e1bf7c01cd2ab55f563dd6d9ab75990739bb6ddf571a513efa10e9",
|
|
@@ -1047,10 +1062,12 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1047
1062
|
"f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
|
|
1048
1063
|
]),
|
|
1049
1064
|
"scripts/lisa-floor-collisions.mjs": Object.freeze([
|
|
1065
|
+
"04f9455319a501112902794874ca4889feff8c0d9c04cc07fb5720b09ed8fc92",
|
|
1050
1066
|
"16f609ebf97f4f52e462ed97a774c2b56a33a99865cc11a5c069fbbbb45b007c",
|
|
1051
1067
|
"2d11968f6852ab745cba939de03c6d6cb5f413975d2cfc8fc447bdd0b218e91a",
|
|
1052
1068
|
"3c7a0234b4f5609fce49e44711d2ec86af8cf7fb82b0831e4450e3347ecefe45",
|
|
1053
1069
|
"41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
|
|
1070
|
+
"557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
|
|
1054
1071
|
"8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
|
|
1055
1072
|
"9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
|
|
1056
1073
|
"a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
|
|
@@ -1202,6 +1219,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1202
1219
|
"1bf3512bb94923a6cb25b1e7a619a3fc8e1336bffa16f499b459aaee3eaed66d",
|
|
1203
1220
|
"1d4fbe135f1bb4e861d286a6512ed201d4522250dfe3f9eba6584bc5ff166a95",
|
|
1204
1221
|
"388cf8847581d96a1ff8ea98290a33a5f96d67cdd502ea807a0b8d88efe90e19",
|
|
1222
|
+
"450338257697a75a8fce9f06f3fc00bf3417947e50d601794da41f9c520a7cc3",
|
|
1205
1223
|
"64546813f168fb446f39e34bc674fd3af85b15bd5e7f4f6bf4503463e701a7b9",
|
|
1206
1224
|
"74b5b90fcf15dbeb14a69677cf74e339154421cd056fdaf603d1167b34a74105",
|
|
1207
1225
|
"772202ddd42d626625ff719666afbbe83445d8bae1bc7c0fb5ffdcb402be83f8",
|
|
@@ -1249,6 +1267,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1249
1267
|
"eb3593f201f570db63a9568236446d4324ee8757cda5e234965f3278d653c7db",
|
|
1250
1268
|
]),
|
|
1251
1269
|
"scripts/lisa-postinstall.mjs": Object.freeze([
|
|
1270
|
+
"3294f390878d7fdb74417e12e9d386027ea8baeb874c5cae56c6d44d1df6261d",
|
|
1252
1271
|
"45cf63bc37ef1115bc47e8212c709a7ec4dc09a9d7541297f0e2f090cbfb1fcc",
|
|
1253
1272
|
"864bfbdc0b089a9b97e7ff053716f52e813071faff0be220294767b65918967b",
|
|
1254
1273
|
"98fe3adf3192a72f40eb75757193ce866f0a6123387377f6041e54d938df8d96",
|
|
@@ -1256,6 +1275,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1256
1275
|
]),
|
|
1257
1276
|
"scripts/lisa-reconcile-policy.mjs": Object.freeze([
|
|
1258
1277
|
"2512f61074d10216dee0aca748caaebad373e6bba2598bc089f30f977c7a6a83",
|
|
1278
|
+
"395897d1dc3f0ac92d7c892eaa9b9ddf12078181bb9f5b228965478190b09a91",
|
|
1259
1279
|
"3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
|
|
1260
1280
|
"3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
|
|
1261
1281
|
"5c6b8a6ff3010b11f78b70eda0e73e78e1155b634a781b8abec79e40ac286eb7",
|
|
@@ -1281,6 +1301,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1281
1301
|
"6e419a489d0605cc0743af207ff4ff3428d8bcdfbabb7207d164593b9644dfa5",
|
|
1282
1302
|
"79055f89eb9c5bf1739867c12dc2d9e30320f86a2a3dd470300ba706c3c9d85e",
|
|
1283
1303
|
"94453bdae8ab3dd2eba0883c4b278027396090e0bdc8e2f102414abc6415912a",
|
|
1304
|
+
"9b14c8864608e8ca390579048229bc0bbaba3094af0b536f1956085295c68af3",
|
|
1284
1305
|
"9fa363107aa5ff033f150ff1a1bb5550d286de383b3d1f7b6c2ac2947730c8f2",
|
|
1285
1306
|
"ba610745a8878bb9a21af249d6ab5b384fcf88e7c530db846f4f8163faba7a8e",
|
|
1286
1307
|
"beffca5715f5c1309efd95d7a4895a980ae48498501c0cff163820ed5530730f",
|
|
@@ -1296,6 +1317,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1296
1317
|
"08cb25c2c49e0e5fd01e29861bbb8c90f612f9736ca2df86789fa72bd26d271e",
|
|
1297
1318
|
"2ace82daacdebbbb00a7eceb09fbe82cabec04330a083ca10417b2ee4e0a63eb",
|
|
1298
1319
|
"3119c557eb49776143f0a4a715a25a2918242baccf39b7660a63d376e4e79791",
|
|
1320
|
+
"34d751e4ee98c14ae1c76ae14fe3da1ca913f70f40019a8423733f03ab64bb89",
|
|
1299
1321
|
"4a05a0ed70a274827fd2f0fd0c98890c66bee2fde70785b8379943ebe6650473",
|
|
1300
1322
|
"8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
|
|
1301
1323
|
"9dd145c0f9dac6ed252b13d32e130dbab964da6cd357981b58541780ecb2f981",
|
|
@@ -1312,6 +1334,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1312
1334
|
"238dc2da29938edd92518c2b08192d14c6f2751ed175c07d6e882814829b7b7e",
|
|
1313
1335
|
"2d9ca0841db9e75ddfd95e3a4d485fd01aa639a512ef648996f565b7991d8e2b",
|
|
1314
1336
|
"4c263fef48c03b3b6c623ea8a6cd55505bfaf28197e5072226ea35f9f3d26885",
|
|
1337
|
+
"5a0b82045d9795284a109c28e5e9dd97a5488ff540bb7034b84077d1447ffd7c",
|
|
1315
1338
|
"5eb31c284e820a51312d4484f0669128007326af55ee515923fec33700d003a1",
|
|
1316
1339
|
"6a8be8577242588f14ab52b25b2a22b6def53aefa9513b4d3d7c49f4d8027079",
|
|
1317
1340
|
"71ff42c2cb8ac7022e0066132476764dd745fb92bf19ccd395000b1fe319abc7",
|
|
@@ -1365,6 +1388,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
|
|
|
1365
1388
|
"cf99167b05d210afad01fb41fc4aed548c66ee0e9a7c4decb8afa1f180eb5640",
|
|
1366
1389
|
]),
|
|
1367
1390
|
"scripts/threshold-ratchet-families.mjs": Object.freeze([
|
|
1391
|
+
"39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
|
|
1368
1392
|
"47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
|
|
1369
1393
|
"8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
|
|
1370
1394
|
"93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",
|