@codyswann/lisa 3.26.1 → 3.26.3
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/check-state-classification.mjs +31 -0
- package/all/copy-overwrite/scripts/lisa-gates.mjs +10 -1
- package/all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh +54 -38
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +4 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +23 -23
- package/package.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/scripts/markdown-to-adf.mjs +23 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
- package/plugins/lisa/hooks/block-managed-file-edits.sh +54 -38
- package/plugins/lisa/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
- package/plugins/lisa/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
- package/plugins/lisa/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
- package/plugins/lisa/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
- package/plugins/lisa/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
- package/plugins/lisa/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
- package/plugins/lisa/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
- package/plugins/lisa/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
- package/plugins/lisa/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
- package/plugins/lisa/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
- package/plugins/lisa/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
- package/plugins/lisa/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
- package/plugins/lisa/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
- package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
- package/plugins/lisa/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
- package/plugins/lisa-agy/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
- package/plugins/lisa-agy/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
- package/plugins/lisa-agy/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
- package/plugins/lisa-agy/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
- package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
- 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-managed-file-edits.sh +54 -38
- package/plugins/lisa-copilot/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
- package/plugins/lisa-copilot/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
- package/plugins/lisa-copilot/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
- package/plugins/lisa-copilot/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
- package/plugins/lisa-copilot/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
- package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/block-managed-file-edits.sh +54 -38
- package/plugins/lisa-cursor/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
- package/plugins/lisa-cursor/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
- package/plugins/lisa-cursor/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
- package/plugins/lisa-cursor/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
- package/plugins/lisa-cursor/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
- package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
- 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-managed-file-edits.sh +54 -38
- package/plugins/src/base/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +23 -1
- package/plugins/src/base/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +31 -2
- package/plugins/src/base/skills/lisa-remote-dispatch/scripts/dispatch.mjs +30 -2
- package/plugins/src/base/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +25 -1
- package/plugins/src/base/skills/lisa-secrets-access/scripts/inspect-vault.mjs +23 -1
- package/plugins/src/base/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +24 -1
- package/plugins/src/base/skills/lisa-secrets-access/scripts/read-secret-note.mjs +25 -2
- package/plugins/src/base/skills/lisa-secrets-access/scripts/resolve-secret.mjs +25 -2
- package/plugins/src/base/skills/lisa-secrets-access/scripts/rotate-secret.mjs +25 -2
- package/plugins/src/base/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +25 -1
- package/plugins/src/base/skills/lisa-secrets-access/scripts/validate-config.mjs +25 -2
- package/plugins/src/base/skills/lisa-setup-automations/scripts/generate-workflow.mjs +31 -2
- package/plugins/src/base/skills/lisa-setup-local-env/scripts/local-env.mjs +24 -2
- package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +23 -1
- package/plugins/src/base/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +25 -2
- package/scripts/generate-agy-plugin-artifacts.mjs +2 -1
- package/scripts/generate-copilot-plugin-artifacts.mjs +2 -1
- package/scripts/generate-cursor-plugin-artifacts.mjs +2 -1
- package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +14 -3
|
@@ -115,6 +115,28 @@ function main() {
|
|
|
115
115
|
console.log(`\n${rows.length} secret(s). Values are never printed.`);
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Whether this module is the one node was asked to run.
|
|
120
|
+
*
|
|
121
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
122
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
123
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
124
|
+
*
|
|
125
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
126
|
+
* with no `lib/` sibling to import from once installed.
|
|
127
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
128
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
129
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
130
|
+
*/
|
|
131
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
132
|
+
if (!argv1) return false;
|
|
133
|
+
try {
|
|
134
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
135
|
+
} catch {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (invokedAsScript(import.meta.url)) {
|
|
119
141
|
main();
|
|
120
142
|
}
|
package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs
CHANGED
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
} from "node:fs";
|
|
31
31
|
import { homedir } from "node:os";
|
|
32
32
|
import { join } from "node:path";
|
|
33
|
+
import { fileURLToPath } from "node:url";
|
|
33
34
|
|
|
34
35
|
import {
|
|
35
36
|
BOOTSTRAP_KEY,
|
|
@@ -454,7 +455,29 @@ function main() {
|
|
|
454
455
|
}
|
|
455
456
|
}
|
|
456
457
|
|
|
457
|
-
|
|
458
|
+
/**
|
|
459
|
+
* Whether this module is the one node was asked to run.
|
|
460
|
+
*
|
|
461
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
462
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
463
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
464
|
+
*
|
|
465
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
466
|
+
* with no `lib/` sibling to import from once installed.
|
|
467
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
468
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
469
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
470
|
+
*/
|
|
471
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
472
|
+
if (!argv1) return false;
|
|
473
|
+
try {
|
|
474
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
475
|
+
} catch {
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
if (invokedAsScript(import.meta.url)) {
|
|
458
481
|
try {
|
|
459
482
|
main();
|
|
460
483
|
} catch (err) {
|
|
@@ -13,7 +13,8 @@
|
|
|
13
13
|
* @module read-secret-note
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
16
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
17
|
+
import { fileURLToPath } from "node:url";
|
|
17
18
|
|
|
18
19
|
import { materializedPaths, readConfig } from "./surfaces.mjs";
|
|
19
20
|
|
|
@@ -72,7 +73,29 @@ function main() {
|
|
|
72
73
|
console.log(noteFor(name, loadNotes(notesFile)));
|
|
73
74
|
}
|
|
74
75
|
|
|
75
|
-
|
|
76
|
+
/**
|
|
77
|
+
* Whether this module is the one node was asked to run.
|
|
78
|
+
*
|
|
79
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
80
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
81
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
82
|
+
*
|
|
83
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
84
|
+
* with no `lib/` sibling to import from once installed.
|
|
85
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
86
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
87
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
88
|
+
*/
|
|
89
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
90
|
+
if (!argv1) return false;
|
|
91
|
+
try {
|
|
92
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
93
|
+
} catch {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (invokedAsScript(import.meta.url)) {
|
|
76
99
|
try {
|
|
77
100
|
main();
|
|
78
101
|
} catch (err) {
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
* @module resolve-secret
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
30
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
31
|
+
import { fileURLToPath } from "node:url";
|
|
31
32
|
|
|
32
33
|
import { parseEnv } from "./envfile.mjs";
|
|
33
34
|
import { validateNote } from "./note-format.mjs";
|
|
@@ -252,7 +253,29 @@ function main() {
|
|
|
252
253
|
);
|
|
253
254
|
}
|
|
254
255
|
|
|
255
|
-
|
|
256
|
+
/**
|
|
257
|
+
* Whether this module is the one node was asked to run.
|
|
258
|
+
*
|
|
259
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
260
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
261
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
262
|
+
*
|
|
263
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
264
|
+
* with no `lib/` sibling to import from once installed.
|
|
265
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
266
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
267
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
268
|
+
*/
|
|
269
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
270
|
+
if (!argv1) return false;
|
|
271
|
+
try {
|
|
272
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
273
|
+
} catch {
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (invokedAsScript(import.meta.url)) {
|
|
256
279
|
try {
|
|
257
280
|
main();
|
|
258
281
|
} catch (err) {
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
* @module rotate-secret
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
-
import { readFileSync } from "node:fs";
|
|
30
|
+
import { readFileSync, realpathSync } from "node:fs";
|
|
31
|
+
import { fileURLToPath } from "node:url";
|
|
31
32
|
import { hostname } from "node:os";
|
|
32
33
|
|
|
33
34
|
import {
|
|
@@ -264,7 +265,29 @@ function main() {
|
|
|
264
265
|
);
|
|
265
266
|
}
|
|
266
267
|
|
|
267
|
-
|
|
268
|
+
/**
|
|
269
|
+
* Whether this module is the one node was asked to run.
|
|
270
|
+
*
|
|
271
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
272
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
273
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
274
|
+
*
|
|
275
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
276
|
+
* with no `lib/` sibling to import from once installed.
|
|
277
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
278
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
279
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
280
|
+
*/
|
|
281
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
282
|
+
if (!argv1) return false;
|
|
283
|
+
try {
|
|
284
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
285
|
+
} catch {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (invokedAsScript(import.meta.url)) {
|
|
268
291
|
try {
|
|
269
292
|
main();
|
|
270
293
|
} catch (err) {
|
|
@@ -48,6 +48,8 @@
|
|
|
48
48
|
*/
|
|
49
49
|
|
|
50
50
|
import { execFileSync } from "node:child_process";
|
|
51
|
+
import { fileURLToPath } from "node:url";
|
|
52
|
+
import { realpathSync } from "node:fs";
|
|
51
53
|
|
|
52
54
|
import { ENV_KEY, fetchAll } from "./providers.mjs";
|
|
53
55
|
import { readConfig } from "./surfaces.mjs";
|
|
@@ -471,7 +473,29 @@ function main() {
|
|
|
471
473
|
);
|
|
472
474
|
}
|
|
473
475
|
|
|
474
|
-
|
|
476
|
+
/**
|
|
477
|
+
* Whether this module is the one node was asked to run.
|
|
478
|
+
*
|
|
479
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
480
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
481
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
482
|
+
*
|
|
483
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
484
|
+
* with no `lib/` sibling to import from once installed.
|
|
485
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
486
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
487
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
488
|
+
*/
|
|
489
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
490
|
+
if (!argv1) return false;
|
|
491
|
+
try {
|
|
492
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
493
|
+
} catch {
|
|
494
|
+
return false;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
if (invokedAsScript(import.meta.url)) {
|
|
475
499
|
try {
|
|
476
500
|
main();
|
|
477
501
|
} catch (err) {
|
|
@@ -16,7 +16,8 @@
|
|
|
16
16
|
* @module validate-config
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
19
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
20
|
+
import { fileURLToPath } from "node:url";
|
|
20
21
|
import { join } from "node:path";
|
|
21
22
|
|
|
22
23
|
import { SURFACES as SURFACE_CAPABILITIES } from "./surfaces.mjs";
|
|
@@ -517,7 +518,29 @@ function main() {
|
|
|
517
518
|
throw new Error(`${problems.length} configuration problem(s)`);
|
|
518
519
|
}
|
|
519
520
|
|
|
520
|
-
|
|
521
|
+
/**
|
|
522
|
+
* Whether this module is the one node was asked to run.
|
|
523
|
+
*
|
|
524
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
525
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
526
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
527
|
+
*
|
|
528
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
529
|
+
* with no `lib/` sibling to import from once installed.
|
|
530
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
531
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
532
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
533
|
+
*/
|
|
534
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
535
|
+
if (!argv1) return false;
|
|
536
|
+
try {
|
|
537
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
538
|
+
} catch {
|
|
539
|
+
return false;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
if (invokedAsScript(import.meta.url)) {
|
|
521
544
|
try {
|
|
522
545
|
main();
|
|
523
546
|
} catch (err) {
|
package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/scripts/generate-workflow.mjs
CHANGED
|
@@ -17,7 +17,14 @@
|
|
|
17
17
|
* @module generate-workflow
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
existsSync,
|
|
22
|
+
mkdirSync,
|
|
23
|
+
readFileSync,
|
|
24
|
+
writeFileSync,
|
|
25
|
+
realpathSync,
|
|
26
|
+
} from "node:fs";
|
|
27
|
+
import { fileURLToPath } from "node:url";
|
|
21
28
|
import { dirname, join } from "node:path";
|
|
22
29
|
|
|
23
30
|
/** Where a generated loop workflow lands. */
|
|
@@ -249,7 +256,29 @@ function main() {
|
|
|
249
256
|
}
|
|
250
257
|
}
|
|
251
258
|
|
|
252
|
-
|
|
259
|
+
/**
|
|
260
|
+
* Whether this module is the one node was asked to run.
|
|
261
|
+
*
|
|
262
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
263
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
264
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
265
|
+
*
|
|
266
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
267
|
+
* with no `lib/` sibling to import from once installed.
|
|
268
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
269
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
270
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
271
|
+
*/
|
|
272
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
273
|
+
if (!argv1) return false;
|
|
274
|
+
try {
|
|
275
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
276
|
+
} catch {
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (invokedAsScript(import.meta.url)) {
|
|
253
282
|
try {
|
|
254
283
|
main();
|
|
255
284
|
} catch (err) {
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* @module local-env
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
|
-
import { existsSync } from "node:fs";
|
|
26
|
+
import { existsSync, realpathSync } from "node:fs";
|
|
27
27
|
import { dirname, resolve } from "node:path";
|
|
28
28
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
29
29
|
|
|
@@ -159,7 +159,29 @@ export async function run(argv) {
|
|
|
159
159
|
return 0;
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
|
|
162
|
+
/**
|
|
163
|
+
* Whether this module is the one node was asked to run.
|
|
164
|
+
*
|
|
165
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
166
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
167
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
168
|
+
*
|
|
169
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
170
|
+
* with no `lib/` sibling to import from once installed.
|
|
171
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
172
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
173
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
174
|
+
*/
|
|
175
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
176
|
+
if (!argv1) return false;
|
|
177
|
+
try {
|
|
178
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
179
|
+
} catch {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (invokedAsScript(import.meta.url)) {
|
|
163
185
|
const argv = {
|
|
164
186
|
installTools: process.argv.includes("--install-tools"),
|
|
165
187
|
dryRun: process.argv.includes("--dry-run"),
|
package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs
CHANGED
|
@@ -1519,7 +1519,29 @@ async function main() {
|
|
|
1519
1519
|
console.log(`\nRemote environment ${dryRun ? "plan complete" : "ready"}.`);
|
|
1520
1520
|
}
|
|
1521
1521
|
|
|
1522
|
-
|
|
1522
|
+
/**
|
|
1523
|
+
* Whether this module is the one node was asked to run.
|
|
1524
|
+
*
|
|
1525
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
1526
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
1527
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
1528
|
+
*
|
|
1529
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
1530
|
+
* with no `lib/` sibling to import from once installed.
|
|
1531
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
1532
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
1533
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
1534
|
+
*/
|
|
1535
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
1536
|
+
if (!argv1) return false;
|
|
1537
|
+
try {
|
|
1538
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
1539
|
+
} catch {
|
|
1540
|
+
return false;
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
|
|
1544
|
+
if (invokedAsScript(import.meta.url)) {
|
|
1523
1545
|
// Awaited rather than called bare: main is async, so a synchronous try/catch
|
|
1524
1546
|
// would let a rejected promise escape as an unhandled rejection and exit 0 —
|
|
1525
1547
|
// reporting a prepared environment that was never prepared.
|
package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs
CHANGED
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { execFileSync } from "node:child_process";
|
|
25
|
-
import {
|
|
25
|
+
import { fileURLToPath } from "node:url";
|
|
26
|
+
import { existsSync, readFileSync, statSync, realpathSync } from "node:fs";
|
|
26
27
|
import { join } from "node:path";
|
|
27
28
|
|
|
28
29
|
import { probe, readRemoteEnvConfig } from "./setup-remote-env.mjs";
|
|
@@ -213,7 +214,29 @@ function main() {
|
|
|
213
214
|
console.log("\nRemote environment verified without revealing any value.");
|
|
214
215
|
}
|
|
215
216
|
|
|
216
|
-
|
|
217
|
+
/**
|
|
218
|
+
* Whether this module is the one node was asked to run.
|
|
219
|
+
*
|
|
220
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
221
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
222
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
223
|
+
*
|
|
224
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
225
|
+
* with no `lib/` sibling to import from once installed.
|
|
226
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
227
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
228
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
229
|
+
*/
|
|
230
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
231
|
+
if (!argv1) return false;
|
|
232
|
+
try {
|
|
233
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
234
|
+
} catch {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
if (invokedAsScript(import.meta.url)) {
|
|
217
240
|
try {
|
|
218
241
|
main();
|
|
219
242
|
} catch (err) {
|
|
@@ -11,20 +11,29 @@
|
|
|
11
11
|
# would stop agents editing files they are supposed to own, which is worse than
|
|
12
12
|
# the problem being solved.
|
|
13
13
|
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
14
|
+
# The name `copy-overwrite` is misleading, and two successive versions of this
|
|
15
|
+
# guard got the consequence wrong by trusting it. MEASURED, by mutating four
|
|
16
|
+
# files in a scratch project and running a real `lisa apply` against them:
|
|
16
17
|
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
# everything else (`.json` configs and friends)
|
|
22
|
-
# — replaced wholesale on the next apply, which runs on every install.
|
|
23
|
-
# The edit vanishes.
|
|
18
|
+
# scripts/lisa-gates.mjs (ledger-tracked) → SURVIVED
|
|
19
|
+
# .lintstagedrc.json (untracked, JSON) → SURVIVED
|
|
20
|
+
# .prettierignore (untracked, text) → SURVIVED
|
|
21
|
+
# .yamllint (untracked, text) → SURVIVED
|
|
24
22
|
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
23
|
+
# Summary line: `Overwritten: 0 files` / `Out of date: 3 files (managed
|
|
24
|
+
# templates changed; NOT updated)`.
|
|
25
|
+
#
|
|
26
|
+
# copy-overwrite overwrites an UNMODIFIED copy — it refreshes. It does not
|
|
27
|
+
# overwrite a host-edited one, in any population tested. So the harm is the same
|
|
28
|
+
# for both, and it is not deletion:
|
|
29
|
+
#
|
|
30
|
+
# THE FILE SILENTLY FORKS. It keeps looking current while every upstream fix
|
|
31
|
+
# stops reaching it. Nothing is lost, which is exactly what makes it invisible.
|
|
32
|
+
#
|
|
33
|
+
# Ledger membership changes the MESSAGE apply prints, not the outcome — tracked
|
|
34
|
+
# files get a provenance verdict naming the fork and offering
|
|
35
|
+
# `lisa-guard-capabilities:`; untracked ones get a bare "Out of date" warning.
|
|
36
|
+
# The refusal branches on that so the reader sees the words apply will use.
|
|
28
37
|
#
|
|
29
38
|
# Measured, not hypothetical. Nothing enforced this, so downstream copies were
|
|
30
39
|
# edited and then silently diverged: `classify-maestro-failures.mjs` reached
|
|
@@ -174,12 +183,12 @@ managed_source() {
|
|
|
174
183
|
|
|
175
184
|
# Whether a destination is a ledger-tracked Lisa-owned guard.
|
|
176
185
|
#
|
|
177
|
-
#
|
|
178
|
-
#
|
|
179
|
-
#
|
|
180
|
-
#
|
|
181
|
-
#
|
|
182
|
-
#
|
|
186
|
+
# Both populations are PRESERVED once edited (measured — see the header). What
|
|
187
|
+
# membership changes is what apply prints and what the escape hatch is: a tracked
|
|
188
|
+
# guard gets a provenance verdict and can declare `lisa-guard-capabilities:`,
|
|
189
|
+
# while an untracked template gets a bare "Out of date" line and `.lisaignore`.
|
|
190
|
+
# The refusal quotes the words the reader will actually see, so it has to know
|
|
191
|
+
# which side it is on.
|
|
183
192
|
ledger_tracked() {
|
|
184
193
|
local rel="$1"
|
|
185
194
|
local ledger="$package_root/dist/core/lisa-owned-hash-ledger.js"
|
|
@@ -193,15 +202,21 @@ refuse() {
|
|
|
193
202
|
local rel="$3"
|
|
194
203
|
local consequence
|
|
195
204
|
if ledger_tracked "$rel"; then
|
|
196
|
-
consequence="
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
205
|
+
consequence="\`lisa apply\` will KEEP your edit — this is a Lisa-owned guard,
|
|
206
|
+
and apply says so: \"its contents match no Lisa release, so Lisa cannot tell
|
|
207
|
+
whether it is out of date or deliberately stronger. Kept yours.\"
|
|
208
|
+
|
|
209
|
+
That is the trap. Nothing is deleted; the file silently FORKS. It keeps looking
|
|
210
|
+
current while every upstream fix stops reaching it. One repository in this fleet
|
|
211
|
+
carries 243 lines of divergence nobody knew about, in a guard that had quietly
|
|
212
|
+
stopped receiving fixes."
|
|
201
213
|
else
|
|
202
|
-
consequence="
|
|
203
|
-
|
|
204
|
-
|
|
214
|
+
consequence="\`lisa apply\` will KEEP your edit and report the file as
|
|
215
|
+
\"Out of date, not updated\" on every run from now on.
|
|
216
|
+
|
|
217
|
+
That is the trap. Nothing is deleted; the file silently FORKS, stops receiving
|
|
218
|
+
upstream changes, and adds a permanent warning line that the next person learns
|
|
219
|
+
to scroll past."
|
|
205
220
|
fi
|
|
206
221
|
cat >&2 <<EOF
|
|
207
222
|
BLOCKED: refusing to write \`$target\`.
|
|
@@ -228,20 +243,21 @@ WHERE IT GOES INSTEAD — take the first one that fits:
|
|
|
228
243
|
shipped file.
|
|
229
244
|
|
|
230
245
|
4. This project has deliberately FORKED this file and means to keep its own
|
|
231
|
-
version.
|
|
232
|
-
the
|
|
246
|
+
version. Apply already preserves the edit either way, so what is left to
|
|
247
|
+
choose is whether the fork stays VISIBLE. Keeping it visible is the point:
|
|
233
248
|
|
|
234
|
-
- **A Lisa-owned guard (hash-tracked).** Do NOT add it to \`.lisaignore\`.
|
|
235
|
-
|
|
236
|
-
silences the standoff \`lisa doctor\` reports on every run, replacing a
|
|
237
|
-
warning with the line "Enforcement guards match the installed Lisa
|
|
249
|
+
- **A Lisa-owned guard (hash-tracked).** Do NOT add it to \`.lisaignore\`.
|
|
250
|
+
Apply preserves your version regardless, so ignoring it buys nothing — and
|
|
251
|
+
it silences the standoff \`lisa doctor\` reports on every run, replacing a
|
|
252
|
+
true warning with the line "Enforcement guards match the installed Lisa
|
|
238
253
|
version", which is then false. A visible, resolvable fork becomes a silent
|
|
239
|
-
permanent one.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
- **Any other template.** \`.lisaignore\`
|
|
243
|
-
|
|
244
|
-
|
|
254
|
+
permanent one. Instead declare what your version defends with a
|
|
255
|
+
\`lisa-guard-capabilities:\` line; apply then classifies it \`host-ahead\`
|
|
256
|
+
and says so by name, rather than reporting that it cannot tell.
|
|
257
|
+
- **Any other template.** \`.lisaignore\` records the divergence where the
|
|
258
|
+
next person can see it and stops the recurring "Out of date" line. It does
|
|
259
|
+
not preserve the file — apply already does — so use it to DECLARE a fork
|
|
260
|
+
you have decided on, never to quiet one you have not.
|
|
245
261
|
|
|
246
262
|
5. You believe this file should not be Lisa-managed at all. That is a real
|
|
247
263
|
argument and it belongs upstream, not in a local edit that will be erased.
|
|
@@ -202,7 +202,29 @@ function parseInline(text) {
|
|
|
202
202
|
return nodes.length > 0 ? nodes : [{ type: "text", text: "" }];
|
|
203
203
|
}
|
|
204
204
|
|
|
205
|
-
|
|
205
|
+
/**
|
|
206
|
+
* Whether this module is the one node was asked to run.
|
|
207
|
+
*
|
|
208
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
209
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
210
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
211
|
+
*
|
|
212
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
213
|
+
* with no `lib/` sibling to import from once installed.
|
|
214
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
215
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
216
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
217
|
+
*/
|
|
218
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
219
|
+
if (!argv1) return false;
|
|
220
|
+
try {
|
|
221
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
222
|
+
} catch {
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
if (invokedAsScript(import.meta.url)) {
|
|
206
228
|
let input = "";
|
|
207
229
|
process.stdin.setEncoding("utf8");
|
|
208
230
|
process.stdin.on("data", chunk => {
|
|
@@ -22,7 +22,14 @@
|
|
|
22
22
|
* @module detect-tooling
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
existsSync,
|
|
27
|
+
readFileSync,
|
|
28
|
+
readdirSync,
|
|
29
|
+
statSync,
|
|
30
|
+
realpathSync,
|
|
31
|
+
} from "node:fs";
|
|
32
|
+
import { fileURLToPath } from "node:url";
|
|
26
33
|
import { join } from "node:path";
|
|
27
34
|
|
|
28
35
|
import { commandsIn } from "./commands.mjs";
|
|
@@ -583,7 +590,29 @@ export function proposedEntries(proposal) {
|
|
|
583
590
|
};
|
|
584
591
|
}
|
|
585
592
|
|
|
586
|
-
|
|
593
|
+
/**
|
|
594
|
+
* Whether this module is the one node was asked to run.
|
|
595
|
+
*
|
|
596
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
597
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
598
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
599
|
+
*
|
|
600
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
601
|
+
* with no `lib/` sibling to import from once installed.
|
|
602
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
603
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
604
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
605
|
+
*/
|
|
606
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
607
|
+
if (!argv1) return false;
|
|
608
|
+
try {
|
|
609
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
610
|
+
} catch {
|
|
611
|
+
return false;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
if (invokedAsScript(import.meta.url)) {
|
|
587
616
|
const proposals = detectTooling();
|
|
588
617
|
if (process.argv.includes("--json")) {
|
|
589
618
|
console.log(JSON.stringify(proposals, null, 2));
|