@codyswann/lisa 3.4.0 → 3.5.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/README.md +22 -0
- package/all/copy-contents/gitignore +7 -0
- package/all/copy-overwrite/scripts/lisa-command-envelope.mjs +44 -4
- package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +31 -0
- package/all/copy-overwrite/scripts/lisa-schema-validate.mjs +125 -47
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +24 -2
- package/cdk/merge/.oxlintrc.json +1 -1
- package/dist/cli/apply.d.ts.map +1 -1
- package/dist/cli/apply.js +48 -13
- package/dist/cli/apply.js.map +1 -1
- package/dist/cli/doctor-apply-freshness.d.ts +29 -0
- package/dist/cli/doctor-apply-freshness.d.ts.map +1 -0
- package/dist/cli/doctor-apply-freshness.js +194 -0
- package/dist/cli/doctor-apply-freshness.js.map +1 -0
- package/dist/cli/doctor-learnings-merge-driver.d.ts +23 -0
- package/dist/cli/doctor-learnings-merge-driver.d.ts.map +1 -0
- package/dist/cli/doctor-learnings-merge-driver.js +73 -0
- package/dist/cli/doctor-learnings-merge-driver.js.map +1 -0
- package/dist/cli/doctor-readiness-workflows.js +2 -2
- package/dist/cli/doctor-readiness-workflows.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +13 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/ui-ci-quality-jobs-parse.js +2 -2
- package/dist/cli/ui-ci-quality-jobs-parse.js.map +1 -1
- package/dist/cli/ui-deploy-pipeline-model.d.ts +4 -0
- package/dist/cli/ui-deploy-pipeline-model.d.ts.map +1 -1
- package/dist/cli/ui-deploy-pipeline-model.js +2 -2
- package/dist/cli/ui-deploy-pipeline-model.js.map +1 -1
- package/dist/codex/agent-transformer.js +2 -2
- package/dist/codex/agent-transformer.js.map +1 -1
- package/dist/codex/command-skill-transformer.js +3 -3
- package/dist/codex/command-skill-transformer.js.map +1 -1
- package/dist/codex/scripts/block-no-verify.sh +53 -4
- package/dist/core/apply-receipt.d.ts +68 -0
- package/dist/core/apply-receipt.d.ts.map +1 -0
- package/dist/core/apply-receipt.js +107 -0
- package/dist/core/apply-receipt.js.map +1 -0
- package/dist/core/learnings-merge-driver-install.d.ts +34 -0
- package/dist/core/learnings-merge-driver-install.d.ts.map +1 -1
- package/dist/core/learnings-merge-driver-install.js +36 -0
- package/dist/core/learnings-merge-driver-install.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +62 -39
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.d.ts +33 -0
- package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.js +47 -5
- package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
- package/dist/migrations/ensure-oxlint-base-configs.d.ts +42 -0
- package/dist/migrations/ensure-oxlint-base-configs.d.ts.map +1 -0
- package/dist/migrations/ensure-oxlint-base-configs.js +212 -0
- package/dist/migrations/ensure-oxlint-base-configs.js.map +1 -0
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/opencode/command-transformer.js +3 -3
- package/dist/opencode/command-transformer.js.map +1 -1
- package/dist/utils/yaml.d.ts +54 -0
- package/dist/utils/yaml.d.ts.map +1 -0
- package/dist/utils/yaml.js +124 -0
- package/dist/utils/yaml.js.map +1 -0
- package/expo/copy-overwrite/scripts/bdd/baseline.mjs +104 -19
- package/expo/copy-overwrite/scripts/bdd/contract.mjs +20 -1
- package/expo/copy-overwrite/scripts/bdd/discover.mjs +53 -10
- package/expo/copy-overwrite/scripts/bdd/parse.mjs +25 -3
- package/expo/copy-overwrite/scripts/bdd/render.mjs +2 -1
- package/expo/copy-overwrite/scripts/bdd/report.mjs +26 -12
- package/expo/copy-overwrite/scripts/bdd/validate.mjs +2 -2
- package/expo/copy-overwrite/scripts/bdd/waivers.mjs +19 -4
- package/expo/copy-overwrite/scripts/bdd-matrix.mjs +2 -2
- package/expo/copy-overwrite/scripts/check-bdd-coverage.mjs +58 -16
- package/expo/create-only/.github/required-checks.json +10 -4
- package/expo/merge/.oxlintrc.json +1 -1
- package/harper-fabric/merge/.oxlintrc.json +1 -1
- package/nestjs/create-only/.github/required-checks.json +57 -0
- package/nestjs/merge/.oxlintrc.json +1 -1
- package/package.json +1 -1
- package/phaser/merge/.oxlintrc.json +1 -1
- 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 +7 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +37 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +7 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +40 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +44 -3
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +56 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa/hooks/block-no-verify.agy.sh +53 -4
- package/plugins/lisa/hooks/block-no-verify.sh +31 -0
- package/plugins/lisa/rules/eager/credential-substrate-precedence.md +3 -1
- package/plugins/lisa/rules/eager/tracked-work.md +1 -1
- package/plugins/lisa/rules/reference/credential-substrate-precedence.md +20 -0
- package/plugins/lisa/rules/reference/tracked-work.md +4 -2
- package/plugins/lisa/skills/lisa-atlassian-access/SKILL.md +7 -0
- package/plugins/lisa/skills/lisa-implement/SKILL.md +1 -1
- package/plugins/lisa/skills/lisa-jam-access/SKILL.md +37 -2
- package/plugins/lisa/skills/lisa-notion-access/SKILL.md +7 -0
- package/plugins/lisa/skills/lisa-posthog-access/SKILL.md +40 -3
- package/plugins/lisa/skills/lisa-sentry-access/SKILL.md +44 -3
- package/plugins/lisa/skills/lisa-sonarcloud-access/SKILL.md +56 -0
- package/plugins/lisa/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa-agy/hooks/block-no-verify.agy.sh +53 -4
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-atlassian-access/SKILL.md +7 -0
- package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +1 -1
- package/plugins/lisa-agy/skills/lisa-jam-access/SKILL.md +37 -2
- package/plugins/lisa-agy/skills/lisa-notion-access/SKILL.md +7 -0
- package/plugins/lisa-agy/skills/lisa-posthog-access/SKILL.md +40 -3
- package/plugins/lisa-agy/skills/lisa-sentry-access/SKILL.md +44 -3
- package/plugins/lisa-agy/skills/lisa-sonarcloud-access/SKILL.md +56 -0
- package/plugins/lisa-agy/skills/lisa-track/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/block-no-verify.sh +31 -0
- package/plugins/lisa-copilot/rules/eager/credential-substrate-precedence.md +3 -1
- package/plugins/lisa-copilot/rules/eager/tracked-work.md +1 -1
- package/plugins/lisa-copilot/rules/reference/credential-substrate-precedence.md +20 -0
- package/plugins/lisa-copilot/rules/reference/tracked-work.md +4 -2
- package/plugins/lisa-copilot/skills/lisa-atlassian-access/SKILL.md +7 -0
- package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +1 -1
- package/plugins/lisa-copilot/skills/lisa-jam-access/SKILL.md +37 -2
- package/plugins/lisa-copilot/skills/lisa-notion-access/SKILL.md +7 -0
- package/plugins/lisa-copilot/skills/lisa-posthog-access/SKILL.md +40 -3
- package/plugins/lisa-copilot/skills/lisa-sentry-access/SKILL.md +44 -3
- package/plugins/lisa-copilot/skills/lisa-sonarcloud-access/SKILL.md +56 -0
- package/plugins/lisa-copilot/skills/lisa-track/SKILL.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-no-verify.sh +31 -0
- package/plugins/lisa-cursor/rules/credential-substrate-precedence-reference.mdc +20 -0
- package/plugins/lisa-cursor/rules/credential-substrate-precedence.mdc +3 -1
- package/plugins/lisa-cursor/rules/tracked-work-reference.mdc +4 -2
- package/plugins/lisa-cursor/rules/tracked-work.mdc +1 -1
- package/plugins/lisa-cursor/skills/lisa-atlassian-access/SKILL.md +7 -0
- package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +1 -1
- package/plugins/lisa-cursor/skills/lisa-jam-access/SKILL.md +37 -2
- package/plugins/lisa-cursor/skills/lisa-notion-access/SKILL.md +7 -0
- package/plugins/lisa-cursor/skills/lisa-posthog-access/SKILL.md +40 -3
- package/plugins/lisa-cursor/skills/lisa-sentry-access/SKILL.md +44 -3
- package/plugins/lisa-cursor/skills/lisa-sonarcloud-access/SKILL.md +56 -0
- package/plugins/lisa-cursor/skills/lisa-track/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/block-no-verify.agy.sh +53 -4
- package/plugins/src/base/hooks/block-no-verify.sh +31 -0
- package/plugins/src/base/rules/eager/credential-substrate-precedence.md +3 -1
- package/plugins/src/base/rules/eager/tracked-work.md +1 -1
- package/plugins/src/base/rules/reference/credential-substrate-precedence.md +20 -0
- package/plugins/src/base/rules/reference/tracked-work.md +4 -2
- package/plugins/src/base/skills/lisa-atlassian-access/SKILL.md +7 -0
- package/plugins/src/base/skills/lisa-implement/SKILL.md +1 -1
- package/plugins/src/base/skills/lisa-jam-access/SKILL.md +37 -2
- package/plugins/src/base/skills/lisa-notion-access/SKILL.md +7 -0
- package/plugins/src/base/skills/lisa-posthog-access/SKILL.md +40 -3
- package/plugins/src/base/skills/lisa-sentry-access/SKILL.md +44 -3
- package/plugins/src/base/skills/lisa-sonarcloud-access/SKILL.md +56 -0
- package/plugins/src/base/skills/lisa-track/SKILL.md +1 -1
- package/scripts/install-claude-plugins.sh +5 -1
- package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +298 -26
- package/typescript/create-only/.github/required-checks.json +11 -6
- package/typescript/create-only/.github/workflows/required-checks-drift.yml +84 -0
- package/typescript/merge/.oxlintrc.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-skill-transformer.js","sourceRoot":"","sources":["../../src/codex/command-skill-transformer.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"command-skill-transformer.js","sourceRoot":"","sources":["../../src/codex/command-skill-transformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -85,16 +85,65 @@ def disables_verification(token):
|
|
|
85
85
|
and NO_VERIFY.startswith(token)
|
|
86
86
|
)
|
|
87
87
|
|
|
88
|
+
# The only relocations that keep a repo's own hooks in play. Anything else —
|
|
89
|
+
# including "" and /dev/null, which are simply the two most obvious members of
|
|
90
|
+
# the blocked set rather than special cases — is refused.
|
|
91
|
+
PERMITTED_HOOKS_PATHS = {".husky", ".githooks"}
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def is_permitted_hooks_path(value):
|
|
95
|
+
"""Whether a core.hooksPath value relocates hooks rather than disabling them.
|
|
96
|
+
|
|
97
|
+
Args:
|
|
98
|
+
value: The raw core.hooksPath value as it appeared on the command line.
|
|
99
|
+
|
|
100
|
+
Returns:
|
|
101
|
+
True if the path is an established in-repo hooks directory.
|
|
102
|
+
"""
|
|
103
|
+
cleaned = value.strip().strip("'\"")
|
|
104
|
+
if cleaned.startswith("./"):
|
|
105
|
+
cleaned = cleaned[2:]
|
|
106
|
+
return cleaned.rstrip("/") in PERMITTED_HOOKS_PATHS
|
|
107
|
+
|
|
108
|
+
|
|
88
109
|
for i, token in enumerate(normalized_tokens):
|
|
89
110
|
if disables_verification(token):
|
|
90
111
|
sys.exit(1)
|
|
91
112
|
if token == "HUSKY=0" or token.startswith("HUSKY_SKIP_HOOKS="):
|
|
92
113
|
sys.exit(1)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
114
|
+
# Allowlist the destinations, do not denylist the disabling ones: hooks are
|
|
115
|
+
# disabled just as completely by any directory that happens to contain none
|
|
116
|
+
# (`-c core.hooksPath=/tmp/empty`), so the set that DISABLES hooks is
|
|
117
|
+
# unbounded while the set that legitimately relocates them is tiny. Matched
|
|
118
|
+
# case-insensitively because git config names are.
|
|
119
|
+
lowered = token.lower()
|
|
120
|
+
if lowered.startswith("core.hookspath="):
|
|
121
|
+
if not is_permitted_hooks_path(token.split("=", 1)[1]):
|
|
122
|
+
sys.exit(1)
|
|
123
|
+
if lowered == "core.hookspath" and i + 1 < len(normalized_tokens):
|
|
124
|
+
if not is_permitted_hooks_path(normalized_tokens[i + 1]):
|
|
125
|
+
sys.exit(1)
|
|
126
|
+
# `--config-env=core.hooksPath=SOMEVAR` reads the path out of the named env
|
|
127
|
+
# var, so it is not in the command at all and cannot be allowlisted.
|
|
128
|
+
if lowered.startswith("--config-env="):
|
|
129
|
+
spec = token.split("=", 1)[1]
|
|
130
|
+
if spec.split("=", 1)[0].strip().lower() == "core.hookspath":
|
|
131
|
+
sys.exit(1)
|
|
132
|
+
# git also accepts `--config-env <name>=<envvar>` as two tokens. Guarding
|
|
133
|
+
# only the `=` spelling let the trailing `core.hooksPath=.husky` fall
|
|
134
|
+
# through to the allowlist above, which reads `.husky` as a path — but here
|
|
135
|
+
# it names an ENVIRONMENT VARIABLE, which can hold /dev/null. Checked at the
|
|
136
|
+
# `--config-env` token, which the loop reaches first.
|
|
137
|
+
if lowered == "--config-env" and i + 1 < len(normalized_tokens):
|
|
138
|
+
spec = normalized_tokens[i + 1]
|
|
139
|
+
if spec.split("=", 1)[0].strip().strip("'\"").lower() == "core.hookspath":
|
|
96
140
|
sys.exit(1)
|
|
97
|
-
|
|
141
|
+
# `GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=core.hooksPath
|
|
142
|
+
# GIT_CONFIG_VALUE_0=/dev/null git ...` sets the same command-scope config
|
|
143
|
+
# via env-var-style assignments. The index is arbitrary below
|
|
144
|
+
# GIT_CONFIG_COUNT, so it is matched as `\d+` rather than pinned to 0.
|
|
145
|
+
key_match = re.match(r"git_config_key_\d+=(.*)$", lowered, re.DOTALL)
|
|
146
|
+
if key_match and key_match.group(1).strip().strip("'\"") == "core.hookspath":
|
|
98
147
|
sys.exit(1)
|
|
99
148
|
|
|
100
149
|
sys.exit(0)
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** Directory-relative location of the receipt, for messages and gitignores. */
|
|
2
|
+
export declare const APPLY_RECEIPT_DISPLAY_PATH = ".lisa/apply-receipt.json";
|
|
3
|
+
/**
|
|
4
|
+
* Receipt schema version. Bump only alongside a reader change — an unknown
|
|
5
|
+
* version is treated as no receipt at all rather than being misread.
|
|
6
|
+
*/
|
|
7
|
+
export declare const APPLY_RECEIPT_SCHEMA_VERSION = 1;
|
|
8
|
+
/**
|
|
9
|
+
* How complete the recorded apply was.
|
|
10
|
+
*
|
|
11
|
+
* `postinstall-safe` is the `--skip-git-check` path a package manager runs. It
|
|
12
|
+
* deliberately skips every agent emit (Codex, Claude, agy, Copilot, OpenCode)
|
|
13
|
+
* and the Sonar integration, because those rewrite host-owned files that must
|
|
14
|
+
* not change under an install. That is the right behaviour and the wrong
|
|
15
|
+
* silence: it means no `bun install` at any version can migrate `.codex/config.toml`
|
|
16
|
+
* — including the deprecated `codex_hooks` key — so a repo can sit on the
|
|
17
|
+
* newest Lisa and still be missing work only a full `lisa apply` performs.
|
|
18
|
+
* Recording the mode is what lets doctor say so.
|
|
19
|
+
*
|
|
20
|
+
* `unknown` covers receipts written before this field existed.
|
|
21
|
+
*/
|
|
22
|
+
export type ApplyMode = "full" | "postinstall-safe" | "unknown";
|
|
23
|
+
/** The persisted `.lisa/apply-receipt.json` shape. */
|
|
24
|
+
export interface ApplyReceipt {
|
|
25
|
+
readonly schema_version: number;
|
|
26
|
+
/** Lisa version that completed the apply. */
|
|
27
|
+
readonly lisa_version: string;
|
|
28
|
+
/** ISO timestamp of that apply. */
|
|
29
|
+
readonly applied_at: string;
|
|
30
|
+
/** Harness the apply emitted artifacts for. */
|
|
31
|
+
readonly harness: string;
|
|
32
|
+
/** Whether that apply was a full one or the postinstall-safe subset. */
|
|
33
|
+
readonly apply_mode: ApplyMode;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve the single path every reader and writer uses.
|
|
37
|
+
* @param root - Project root
|
|
38
|
+
* @returns Absolute path to the receipt
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveApplyReceiptPath(root: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Read the receipt, returning null when it is missing, unparseable, or written
|
|
43
|
+
* by a schema this build does not understand.
|
|
44
|
+
* @param root - Project root
|
|
45
|
+
* @returns The receipt, or null when there is no usable one
|
|
46
|
+
*/
|
|
47
|
+
export declare function readApplyReceipt(root: string): Promise<ApplyReceipt | null>;
|
|
48
|
+
/**
|
|
49
|
+
* Record that an apply completed successfully.
|
|
50
|
+
*
|
|
51
|
+
* Written atomically (temp file plus rename) so a reader never sees a partial
|
|
52
|
+
* document, and never throws: a receipt that could not be written must not turn
|
|
53
|
+
* a successful apply into a failed one. The cost of a silently missing receipt
|
|
54
|
+
* is one spurious doctor warning; the cost of throwing here is breaking installs.
|
|
55
|
+
* @param root - Project root that was applied to
|
|
56
|
+
* @param details - What completed
|
|
57
|
+
* @param details.lisaVersion - Lisa version that ran the apply
|
|
58
|
+
* @param details.harness - Harness the apply emitted for
|
|
59
|
+
* @param details.applyMode - Whether this was a full or postinstall-safe apply
|
|
60
|
+
* @param now - Clock, injectable for tests
|
|
61
|
+
* @returns True when the receipt was persisted
|
|
62
|
+
*/
|
|
63
|
+
export declare function recordSuccessfulApply(root: string, details: {
|
|
64
|
+
readonly lisaVersion: string;
|
|
65
|
+
readonly harness: string;
|
|
66
|
+
readonly applyMode: ApplyMode;
|
|
67
|
+
}, now?: () => Date): Promise<boolean>;
|
|
68
|
+
//# sourceMappingURL=apply-receipt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-receipt.d.ts","sourceRoot":"","sources":["../../src/core/apply-receipt.ts"],"names":[],"mappings":"AA2BA,+EAA+E;AAC/E,eAAO,MAAM,0BAA0B,6BAA6B,CAAC;AAErE;;;GAGG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;AAEhE,sDAAsD;AACtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,6CAA6C;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,mCAAmC;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;CAChC;AAYD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAkB9B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B,EACD,GAAG,GAAE,MAAM,IAAuB,GACjC,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable record that `lisa apply` actually succeeded here.
|
|
3
|
+
*
|
|
4
|
+
* The postinstall bootstrap is loud but non-fatal by design (see
|
|
5
|
+
* `migrations/ensure-lisa-postinstall`), and the detached reconciliation
|
|
6
|
+
* trampoline runs with `stdio: "ignore"` because it outlives the terminal that
|
|
7
|
+
* started it. Both are correct, and both mean a failed apply can leave no trace
|
|
8
|
+
* anyone will ever read. geminisportsai/frontend-v2 went months that way
|
|
9
|
+
* (CodySwannGT/lisa#2467).
|
|
10
|
+
*
|
|
11
|
+
* So success — not failure — is what gets recorded. A receipt is written only
|
|
12
|
+
* on a completed, non-dry-run apply, which makes absence and staleness both
|
|
13
|
+
* self-evident: no receipt means no apply has ever finished here, and an old
|
|
14
|
+
* version stamp means none has finished since that version. `lisa doctor` reads
|
|
15
|
+
* it (see `cli/doctor-apply-freshness`), so the failure is findable long after
|
|
16
|
+
* the install output has scrolled away, without anyone re-running apply by hand.
|
|
17
|
+
*
|
|
18
|
+
* The receipt is machine-local and gitignored: it describes this checkout, not
|
|
19
|
+
* the project. Committing it would churn on every version bump and conflict
|
|
20
|
+
* between developers on different Lisa versions, and a committed receipt would
|
|
21
|
+
* lie about a fresh clone that has never installed.
|
|
22
|
+
* @module core/apply-receipt
|
|
23
|
+
*/
|
|
24
|
+
import { mkdir, rename, writeFile } from "node:fs/promises";
|
|
25
|
+
import * as path from "node:path";
|
|
26
|
+
import { readJsonOrNull } from "../utils/json-utils.js";
|
|
27
|
+
/** Directory-relative location of the receipt, for messages and gitignores. */
|
|
28
|
+
export const APPLY_RECEIPT_DISPLAY_PATH = ".lisa/apply-receipt.json";
|
|
29
|
+
/**
|
|
30
|
+
* Receipt schema version. Bump only alongside a reader change — an unknown
|
|
31
|
+
* version is treated as no receipt at all rather than being misread.
|
|
32
|
+
*/
|
|
33
|
+
export const APPLY_RECEIPT_SCHEMA_VERSION = 1;
|
|
34
|
+
/**
|
|
35
|
+
* Narrow a persisted mode value, treating anything unrecognised — including a
|
|
36
|
+
* receipt written before the field existed — as `unknown` rather than guessing.
|
|
37
|
+
* @param value - Raw value from the receipt
|
|
38
|
+
* @returns A known apply mode
|
|
39
|
+
*/
|
|
40
|
+
function toApplyMode(value) {
|
|
41
|
+
return value === "full" || value === "postinstall-safe" ? value : "unknown";
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Resolve the single path every reader and writer uses.
|
|
45
|
+
* @param root - Project root
|
|
46
|
+
* @returns Absolute path to the receipt
|
|
47
|
+
*/
|
|
48
|
+
export function resolveApplyReceiptPath(root) {
|
|
49
|
+
return path.join(root, ".lisa", "apply-receipt.json");
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Read the receipt, returning null when it is missing, unparseable, or written
|
|
53
|
+
* by a schema this build does not understand.
|
|
54
|
+
* @param root - Project root
|
|
55
|
+
* @returns The receipt, or null when there is no usable one
|
|
56
|
+
*/
|
|
57
|
+
export async function readApplyReceipt(root) {
|
|
58
|
+
const parsed = await readJsonOrNull(resolveApplyReceiptPath(root));
|
|
59
|
+
if (parsed?.schema_version !== APPLY_RECEIPT_SCHEMA_VERSION ||
|
|
60
|
+
typeof parsed.lisa_version !== "string" ||
|
|
61
|
+
typeof parsed.applied_at !== "string") {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
schema_version: parsed.schema_version,
|
|
66
|
+
lisa_version: parsed.lisa_version,
|
|
67
|
+
applied_at: parsed.applied_at,
|
|
68
|
+
harness: typeof parsed.harness === "string" ? parsed.harness : "unknown",
|
|
69
|
+
apply_mode: toApplyMode(parsed.apply_mode),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Record that an apply completed successfully.
|
|
74
|
+
*
|
|
75
|
+
* Written atomically (temp file plus rename) so a reader never sees a partial
|
|
76
|
+
* document, and never throws: a receipt that could not be written must not turn
|
|
77
|
+
* a successful apply into a failed one. The cost of a silently missing receipt
|
|
78
|
+
* is one spurious doctor warning; the cost of throwing here is breaking installs.
|
|
79
|
+
* @param root - Project root that was applied to
|
|
80
|
+
* @param details - What completed
|
|
81
|
+
* @param details.lisaVersion - Lisa version that ran the apply
|
|
82
|
+
* @param details.harness - Harness the apply emitted for
|
|
83
|
+
* @param details.applyMode - Whether this was a full or postinstall-safe apply
|
|
84
|
+
* @param now - Clock, injectable for tests
|
|
85
|
+
* @returns True when the receipt was persisted
|
|
86
|
+
*/
|
|
87
|
+
export async function recordSuccessfulApply(root, details, now = () => new Date()) {
|
|
88
|
+
const receipt = {
|
|
89
|
+
schema_version: APPLY_RECEIPT_SCHEMA_VERSION,
|
|
90
|
+
lisa_version: details.lisaVersion,
|
|
91
|
+
applied_at: now().toISOString(),
|
|
92
|
+
harness: details.harness,
|
|
93
|
+
apply_mode: details.applyMode,
|
|
94
|
+
};
|
|
95
|
+
const receiptPath = resolveApplyReceiptPath(root);
|
|
96
|
+
try {
|
|
97
|
+
await mkdir(path.dirname(receiptPath), { recursive: true });
|
|
98
|
+
const tempPath = `${receiptPath}.tmp`;
|
|
99
|
+
await writeFile(tempPath, `${JSON.stringify(receipt, null, 2)}\n`, "utf8");
|
|
100
|
+
await rename(tempPath, receiptPath);
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=apply-receipt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-receipt.js","sourceRoot":"","sources":["../../src/core/apply-receipt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,0BAA0B,CAAC;AAErE;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AA+B9C;;;;;GAKG;AACH,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,kBAAkB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY;IAEZ,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,uBAAuB,CAAC,IAAI,CAAC,CAC9B,CAAC;IACF,IACE,MAAM,EAAE,cAAc,KAAK,4BAA4B;QACvD,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;QACvC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,EACrC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO,EAAE,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QACxE,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,OAIC,EACD,MAAkB,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;IAElC,MAAM,OAAO,GAAiB;QAC5B,cAAc,EAAE,4BAA4B;QAC5C,YAAY,EAAE,OAAO,CAAC,WAAW;QACjC,UAAU,EAAE,GAAG,EAAE,CAAC,WAAW,EAAE;QAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,SAAS;KAC9B,CAAC;IACF,MAAM,WAAW,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,GAAG,WAAW,MAAM,CAAC;QACtC,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3E,MAAM,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -32,6 +32,40 @@ export interface MergeDriverInstallDependencies {
|
|
|
32
32
|
* @returns True when the directory is inside a git working tree
|
|
33
33
|
*/
|
|
34
34
|
export declare function canInstallLearningsMergeDriver(projectRoot: string): Promise<boolean>;
|
|
35
|
+
/**
|
|
36
|
+
* Registration state of the driver command for one checkout.
|
|
37
|
+
*
|
|
38
|
+
* `unregistered` is the state this whole module exists to make visible: the
|
|
39
|
+
* `.gitattributes` mapping is committed, so every clone believes the ledger is
|
|
40
|
+
* union-merged, while the command that performs the union lives only in local
|
|
41
|
+
* git config. A clone that never ran apply is degraded, not broken — and says
|
|
42
|
+
* nothing about it.
|
|
43
|
+
*/
|
|
44
|
+
export type MergeDriverRegistration = "registered" | "unregistered" | "not-a-repository" | "git-unavailable";
|
|
45
|
+
/**
|
|
46
|
+
* Report whether the driver command is registered for this checkout.
|
|
47
|
+
*
|
|
48
|
+
* Read-only, and deliberately scope-agnostic: registration is written to local
|
|
49
|
+
* config, but git resolves a merge driver from any config scope, so a global
|
|
50
|
+
* registration counts. Asking with `--local` would report a working driver as
|
|
51
|
+
* missing.
|
|
52
|
+
* @param projectRoot - Project directory to inspect
|
|
53
|
+
* @returns Closed registration state
|
|
54
|
+
*/
|
|
55
|
+
export declare function probeLearningsMergeDriverRegistration(projectRoot: string): Promise<MergeDriverRegistration>;
|
|
56
|
+
/**
|
|
57
|
+
* Report whether git resolves one path's `merge` attribute to this driver.
|
|
58
|
+
*
|
|
59
|
+
* Asks git rather than parsing `.gitattributes`, because the answer depends on
|
|
60
|
+
* pattern precedence and on every attributes source git consults (the working
|
|
61
|
+
* tree file, `.git/info/attributes`, a configured `core.attributesFile`).
|
|
62
|
+
* Reading the root file alone would claim a mapping the repository may not
|
|
63
|
+
* actually have — or miss one it does.
|
|
64
|
+
* @param projectRoot - Project directory to inspect
|
|
65
|
+
* @param ledgerPath - Project-relative path to the learnings ledger
|
|
66
|
+
* @returns True when the path is mapped to the learnings merge driver
|
|
67
|
+
*/
|
|
68
|
+
export declare function isLearningsPathMappedToDriver(projectRoot: string, ledgerPath: string): Promise<boolean>;
|
|
35
69
|
/**
|
|
36
70
|
* Register the union merge driver in one project's local git config.
|
|
37
71
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-merge-driver-install.d.ts","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"AAiCA;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChE,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAuFD;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE,8BAAmC,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAkDnC"}
|
|
1
|
+
{"version":3,"file":"learnings-merge-driver-install.d.ts","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"AAiCA;;;;;;;;GAQG;AACH,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChE,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,wEAAwE;AACxE,MAAM,WAAW,8BAA8B;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAuFD;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CAClD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAElB;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAC/B,YAAY,GACZ,cAAc,GACd,kBAAkB,GAClB,iBAAiB,CAAC;AAEtB;;;;;;;;;GASG;AACH,wBAAsB,qCAAqC,CACzD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CASlC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED;;;;;;;;GAQG;AACH,wBAAsB,2BAA2B,CAC/C,WAAW,EAAE,MAAM,EACnB,YAAY,GAAE,8BAAmC,GAChD,OAAO,CAAC,wBAAwB,CAAC,CAkDnC"}
|
|
@@ -107,6 +107,42 @@ function resolveLisaInvocation() {
|
|
|
107
107
|
export async function canInstallLearningsMergeDriver(projectRoot) {
|
|
108
108
|
return (await probeRepository(projectRoot)) === "repository";
|
|
109
109
|
}
|
|
110
|
+
/**
|
|
111
|
+
* Report whether the driver command is registered for this checkout.
|
|
112
|
+
*
|
|
113
|
+
* Read-only, and deliberately scope-agnostic: registration is written to local
|
|
114
|
+
* config, but git resolves a merge driver from any config scope, so a global
|
|
115
|
+
* registration counts. Asking with `--local` would report a working driver as
|
|
116
|
+
* missing.
|
|
117
|
+
* @param projectRoot - Project directory to inspect
|
|
118
|
+
* @returns Closed registration state
|
|
119
|
+
*/
|
|
120
|
+
export async function probeLearningsMergeDriverRegistration(projectRoot) {
|
|
121
|
+
const probe = await probeRepository(projectRoot);
|
|
122
|
+
if (probe !== "repository") {
|
|
123
|
+
// Both non-repository outcomes are already registration states; narrowing
|
|
124
|
+
// hands them through unchanged rather than restating the literals.
|
|
125
|
+
return probe;
|
|
126
|
+
}
|
|
127
|
+
const current = await tryGit(["config", "--get", DRIVER_KEY], projectRoot);
|
|
128
|
+
return current.ok && current.stdout !== "" ? "registered" : "unregistered";
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Report whether git resolves one path's `merge` attribute to this driver.
|
|
132
|
+
*
|
|
133
|
+
* Asks git rather than parsing `.gitattributes`, because the answer depends on
|
|
134
|
+
* pattern precedence and on every attributes source git consults (the working
|
|
135
|
+
* tree file, `.git/info/attributes`, a configured `core.attributesFile`).
|
|
136
|
+
* Reading the root file alone would claim a mapping the repository may not
|
|
137
|
+
* actually have — or miss one it does.
|
|
138
|
+
* @param projectRoot - Project directory to inspect
|
|
139
|
+
* @param ledgerPath - Project-relative path to the learnings ledger
|
|
140
|
+
* @returns True when the path is mapped to the learnings merge driver
|
|
141
|
+
*/
|
|
142
|
+
export async function isLearningsPathMappedToDriver(projectRoot, ledgerPath) {
|
|
143
|
+
const result = await tryGit(["check-attr", "merge", "--", ledgerPath], projectRoot);
|
|
144
|
+
return (result.ok && result.stdout.endsWith(`merge: ${LEARNINGS_MERGE_DRIVER_NAME}`));
|
|
145
|
+
}
|
|
110
146
|
/**
|
|
111
147
|
* Register the union merge driver in one project's local git config.
|
|
112
148
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"learnings-merge-driver-install.js","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EACL,kCAAkC,EAClC,2BAA2B,EAC3B,gCAAgC,GACjC,MAAM,6BAA6B,CAAC;AAErC,MAAM,eAAe,GAAsB;IACzC,IAAI,EAAE,+BAA+B;CACtC,CAAC;AACF,MAAM,UAAU,GAAG,SAAS,2BAA2B,SAAS,CAAC;AACjE,MAAM,QAAQ,GAAG,SAAS,2BAA2B,OAAO,CAAC;AAC7D,MAAM,cAAc,GAAG,6BAA6B,CAAC;AASrD,MAAM,OAAO,GAAoB,kBAAkB,CAAC;AA4BpD;;;;;;;;;;GAUG;AACH,KAAK,UAAU,MAAM,CAAC,IAAuB,EAAE,GAAW;IACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACxD,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;YAC7C,GAAG;YACH,GAAG,EAAE,eAAe;SACrB,CAAC,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK;YAC5D,CAAC,CAAC,KAAK,CAAC,IAAI;YACZ,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,eAAe,CAAC,WAAmB;IAChD,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,CAAC,WAAW,EAAE,uBAAuB,CAAC,EACtC,WAAW,CACZ,CAAC;IACF,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,OAAO,CAAC;IACzD,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,qBAAqB;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,WAAmB;IAEnB,OAAO,CAAC,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC,KAAK,YAAY,CAAC;AAC/D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,WAAmB,EACnB,eAA+C,EAAE;IAEjD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IACjD,IAAI,KAAK,KAAK,iBAAiB,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,8BAA8B,cAAc,2DAA2D;SAChH,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,4CAA4C;SACrD,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,IAAI,qBAAqB,EAAE,CAAC;IACtE,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,4CAA4C,cAAc,EAAE;SACrE,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,gCAAgC,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,MAAM,CAC1B,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,EAC1C,WAAW,CACZ,CAAC;IACF,IAAI,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC7C,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,GAAG,2BAA2B,kCAAkC;SACzE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,CACV,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,kCAAkC,CAAC,EACnE,WAAW,CACZ,CAAC;IACF,MAAM,GAAG,GAAG,MAAM,MAAM,CACtB,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAC1C,WAAW,CACZ,CAAC;IACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,sCAAsC,cAAc,EAAE;SAC/D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,kBAAkB,2BAA2B,eAAe;KACrE,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"learnings-merge-driver-install.js","sourceRoot":"","sources":["../../src/core/learnings-merge-driver-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgyEpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAi/NjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|