@jevitate/cli 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-cli.d.ts +3 -1
- package/dist/ai-cli.js +60 -16
- package/dist/ai-cli.js.map +1 -1
- package/dist/approval-provenance.d.ts +136 -0
- package/dist/approval-provenance.js +317 -0
- package/dist/approval-provenance.js.map +1 -0
- package/dist/author-journey-cli.js +4 -2
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +30544 -20851
- package/dist/browser-cli.d.ts +10 -0
- package/dist/browser-cli.js +50 -0
- package/dist/browser-cli.js.map +1 -0
- package/dist/build-info.generated.js +2 -2
- package/dist/builtin-analyzers.d.ts +7 -0
- package/dist/builtin-analyzers.js +19 -0
- package/dist/builtin-analyzers.js.map +1 -0
- package/dist/campaign-cli.d.ts +6 -0
- package/dist/campaign-cli.js +9 -4
- package/dist/campaign-cli.js.map +1 -1
- package/dist/catalog-analysis.d.ts +70 -0
- package/dist/catalog-analysis.js +507 -0
- package/dist/catalog-analysis.js.map +1 -0
- package/dist/catalog-api.d.ts +73 -0
- package/dist/catalog-api.js +97 -0
- package/dist/catalog-api.js.map +1 -0
- package/dist/catalog-cli.d.ts +12 -0
- package/dist/catalog-cli.js +224 -0
- package/dist/catalog-cli.js.map +1 -0
- package/dist/catalog-review.d.ts +29 -0
- package/dist/catalog-review.js +290 -0
- package/dist/catalog-review.js.map +1 -0
- package/dist/catalog.d.ts +133 -0
- package/dist/catalog.js +352 -0
- package/dist/catalog.js.map +1 -0
- package/dist/change-context.d.ts +44 -0
- package/dist/change-context.js +203 -0
- package/dist/change-context.js.map +1 -0
- package/dist/check-api.d.ts +1 -1
- package/dist/check-api.js +68 -9
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +5 -1
- package/dist/check-cli.js +64 -10
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.d.ts +16 -1
- package/dist/check-execute.js +78 -31
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.d.ts +14 -0
- package/dist/check-plan.js +28 -2
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.js +6 -3
- package/dist/check-suite.js.map +1 -1
- package/dist/check-types.d.ts +51 -6
- package/dist/check-types.js +8 -0
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.js +85 -5
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +22 -2
- package/dist/cli-shared.js +34 -5
- package/dist/cli-shared.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +15 -0
- package/dist/demo-aspect-api.js +26 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +64 -5
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/exit-codes.d.ts +6 -3
- package/dist/exit-codes.js +13 -3
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.d.ts +3 -1
- package/dist/explore-adversarial.js +4 -4
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-author.js +5 -2
- package/dist/explore-author.js.map +1 -1
- package/dist/explore-cli.js +145 -9
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +6 -2
- package/dist/explore-coverage.js +7 -6
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +3 -1
- package/dist/explore-feature.js +5 -5
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +37 -6
- package/dist/explore-goal.js +69 -50
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-shared.d.ts +12 -7
- package/dist/explore-shared.js +9 -1
- package/dist/explore-shared.js.map +1 -1
- package/dist/findings-filing.d.ts +6 -0
- package/dist/findings-filing.js +15 -1
- package/dist/findings-filing.js.map +1 -1
- package/dist/goal-run-flags.d.ts +2 -0
- package/dist/goal-run-flags.js +8 -1
- package/dist/goal-run-flags.js.map +1 -1
- package/dist/heal-probe-guard.d.ts +9 -0
- package/dist/heal-probe-guard.js +113 -0
- package/dist/heal-probe-guard.js.map +1 -0
- package/dist/host-health-run.d.ts +32 -1
- package/dist/host-health-run.js +38 -1
- package/dist/host-health-run.js.map +1 -1
- package/dist/http-5xx-outcome.d.ts +8 -3
- package/dist/http-5xx-outcome.js +5 -15
- package/dist/http-5xx-outcome.js.map +1 -1
- package/dist/init-cli.d.ts +7 -0
- package/dist/init-cli.js +79 -9
- package/dist/init-cli.js.map +1 -1
- package/dist/init-codeowners.d.ts +39 -0
- package/dist/init-codeowners.js +91 -0
- package/dist/init-codeowners.js.map +1 -0
- package/dist/init-keys.d.ts +3 -1
- package/dist/init-keys.js +20 -8
- package/dist/init-keys.js.map +1 -1
- package/dist/init-skills.d.ts +85 -7
- package/dist/init-skills.js +303 -36
- package/dist/init-skills.js.map +1 -1
- package/dist/jev-advisor.d.ts +72 -0
- package/dist/jev-advisor.js +172 -0
- package/dist/jev-advisor.js.map +1 -0
- package/dist/journey-api.d.ts +76 -5
- package/dist/journey-api.js +238 -29
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.js +257 -23
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-heal.d.ts +74 -0
- package/dist/journey-heal.js +180 -0
- package/dist/journey-heal.js.map +1 -0
- package/dist/journey-network-checks.d.ts +5 -1
- package/dist/journey-network-checks.js +15 -4
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.js +2 -2
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-proposal-store.d.ts +100 -0
- package/dist/journey-proposal-store.js +342 -0
- package/dist/journey-proposal-store.js.map +1 -0
- package/dist/journey-result-record.d.ts +40 -0
- package/dist/journey-result-record.js +28 -0
- package/dist/journey-result-record.js.map +1 -0
- package/dist/journey-review-api.d.ts +19 -0
- package/dist/journey-review-api.js +53 -0
- package/dist/journey-review-api.js.map +1 -0
- package/dist/journey-review-store.d.ts +16 -0
- package/dist/journey-review-store.js +95 -0
- package/dist/journey-review-store.js.map +1 -0
- package/dist/journey-review.d.ts +54 -0
- package/dist/journey-review.js +538 -0
- package/dist/journey-review.js.map +1 -0
- package/dist/journey-verify.js +14 -1
- package/dist/journey-verify.js.map +1 -1
- package/dist/key-report.d.ts +20 -5
- package/dist/key-report.js +32 -9
- package/dist/key-report.js.map +1 -1
- package/dist/kill-signal.js +10 -2
- package/dist/kill-signal.js.map +1 -1
- package/dist/launch-armed.js +5 -1
- package/dist/launch-armed.js.map +1 -1
- package/dist/load-cli.js +4 -2
- package/dist/load-cli.js.map +1 -1
- package/dist/log-classes.d.ts +73 -0
- package/dist/log-classes.js +167 -0
- package/dist/log-classes.js.map +1 -0
- package/dist/log-correlation.d.ts +29 -10
- package/dist/log-correlation.js +44 -21
- package/dist/log-correlation.js.map +1 -1
- package/dist/login-cli.d.ts +17 -0
- package/dist/login-cli.js +161 -0
- package/dist/login-cli.js.map +1 -0
- package/dist/logs-cli.js +3 -1
- package/dist/logs-cli.js.map +1 -1
- package/dist/mcp-api.d.ts +6 -1
- package/dist/mcp-api.js +110 -16
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-runner.d.ts +2 -0
- package/dist/mcp-cli-runner.js +3 -1
- package/dist/mcp-cli-runner.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +5 -0
- package/dist/mcp-cli-tools.js +178 -23
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mission-cli.js +8 -4
- package/dist/mission-cli.js.map +1 -1
- package/dist/mission-journal.d.ts +4 -1
- package/dist/mission-journal.js +9 -3
- package/dist/mission-journal.js.map +1 -1
- package/dist/mission-queue-cli.js +21 -2
- package/dist/mission-queue-cli.js.map +1 -1
- package/dist/mission-queue-runner.d.ts +6 -0
- package/dist/mission-queue-runner.js +33 -3
- package/dist/mission-queue-runner.js.map +1 -1
- package/dist/multi-run-cli.d.ts +7 -1
- package/dist/multi-run-cli.js +10 -3
- package/dist/multi-run-cli.js.map +1 -1
- package/dist/multi-run.d.ts +44 -8
- package/dist/multi-run.js +118 -25
- package/dist/multi-run.js.map +1 -1
- package/dist/persona-login.d.ts +256 -0
- package/dist/persona-login.js +884 -0
- package/dist/persona-login.js.map +1 -0
- package/dist/pre-approval.d.ts +98 -0
- package/dist/pre-approval.js +175 -0
- package/dist/pre-approval.js.map +1 -0
- package/dist/program.js +12 -0
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +2 -1
- package/dist/project-dir.js +3 -1
- package/dist/project-dir.js.map +1 -1
- package/dist/readiness.d.ts +29 -0
- package/dist/readiness.js +291 -0
- package/dist/readiness.js.map +1 -0
- package/dist/regression-cli.js +4 -2
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.d.ts +25 -2
- package/dist/report-api.js +34 -5
- package/dist/report-api.js.map +1 -1
- package/dist/report-cli.js +8 -1
- package/dist/report-cli.js.map +1 -1
- package/dist/resource-preflight.js +5 -3
- package/dist/resource-preflight.js.map +1 -1
- package/dist/result-schema.d.ts +12 -0
- package/dist/result-schema.js +8 -0
- package/dist/result-schema.js.map +1 -1
- package/dist/run-index.d.ts +4 -2
- package/dist/run-index.js +3 -1
- package/dist/run-index.js.map +1 -1
- package/dist/run-key-preflight.d.ts +2 -1
- package/dist/run-key-preflight.js +3 -2
- package/dist/run-key-preflight.js.map +1 -1
- package/dist/run-metadata.d.ts +29 -0
- package/dist/run-metadata.js +48 -0
- package/dist/run-metadata.js.map +1 -0
- package/dist/run-tags-cli.d.ts +14 -0
- package/dist/run-tags-cli.js +41 -0
- package/dist/run-tags-cli.js.map +1 -0
- package/dist/self-heal-adapter.d.ts +43 -27
- package/dist/self-heal-adapter.js +196 -62
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/site-cli.d.ts +1 -1
- package/dist/site-cli.js +24 -1
- package/dist/site-cli.js.map +1 -1
- package/dist/source-cli.js +9 -5
- package/dist/source-cli.js.map +1 -1
- package/dist/suite-explore-options.d.ts +14 -0
- package/dist/suite-explore-options.js +8 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +289 -0
- package/dist/sweep-api.js +859 -0
- package/dist/sweep-api.js.map +1 -0
- package/dist/sweep-cli.d.ts +9 -0
- package/dist/sweep-cli.js +117 -0
- package/dist/sweep-cli.js.map +1 -0
- package/dist/target-config.d.ts +5 -2
- package/dist/target-config.js +15 -0
- package/dist/target-config.js.map +1 -1
- package/dist/ux-cli.js +3 -1
- package/dist/ux-cli.js.map +1 -1
- package/dist/ux-usability.d.ts +9 -3
- package/dist/ux-usability.js +8 -5
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-cli.js +4 -2
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +9 -9
- package/skills/jevitate-ci-check/SKILL.md +9 -1
- package/skills/jevitate-demo/SKILL.md +5 -2
- package/skills/jevitate-getting-started/SKILL.md +14 -1
- package/skills/jevitate-mission-scope/SKILL.md +2 -2
- package/skills/jevitate-run-journey/SKILL.md +42 -9
- package/skills/jevitate-test-campaign/SKILL.md +26 -5
package/dist/goal-run-flags.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ export declare const GOAL_RUN_OPTIONS: {
|
|
|
30
30
|
readonly jobWaitMs: () => Option;
|
|
31
31
|
readonly deny: () => Option;
|
|
32
32
|
readonly paid: () => Option;
|
|
33
|
+
readonly allowControl: () => Option;
|
|
33
34
|
readonly allowDestructive: () => Option;
|
|
34
35
|
readonly dialogs: () => Option;
|
|
35
36
|
readonly readRpc: () => Option;
|
|
@@ -62,6 +63,7 @@ export interface GoalRunFlags extends EmulationFlags, ScreenshotsFlags {
|
|
|
62
63
|
jobWaitMs?: string | number;
|
|
63
64
|
deny: string[];
|
|
64
65
|
paid: string[];
|
|
66
|
+
allowControl?: string[];
|
|
65
67
|
allowDestructive?: boolean;
|
|
66
68
|
dialogs?: string;
|
|
67
69
|
readRpc: string[];
|
package/dist/goal-run-flags.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* validate the same setup and an author run can reproduce what a goal run needed.
|
|
6
6
|
*/
|
|
7
7
|
import { Option } from "commander";
|
|
8
|
-
import { parseSecretField, validateDenyPatterns, } from "@jevitate/explore";
|
|
8
|
+
import { parseSecretField, validateAllowControlPatterns, validateDenyPatterns, } from "@jevitate/explore";
|
|
9
9
|
import { intArg, nonNegativeIntArg, positiveIntArg } from "./cli-args.js";
|
|
10
10
|
import { LITERAL_SECRET_WARNING, resolveSecretArgs } from "./secret-args.js";
|
|
11
11
|
import { secretCommandRunner } from "./secret-command.js";
|
|
@@ -64,6 +64,11 @@ export const GOAL_RUN_OPTIONS = {
|
|
|
64
64
|
"vocabulary — the budget guard sees it, hang replays never repeat it, and a goal that asks for it may still click it")
|
|
65
65
|
.default([])
|
|
66
66
|
.argParser(collect),
|
|
67
|
+
allowControl: () => new Option("--allow-control <regex>", "#428: exempt a control whose accessible name matches this regex (case-sensitive; /src/i for case-insensitive) from the soft " +
|
|
68
|
+
"built-in 'may cost money' name heuristic only — e.g. --allow-control \"^Generate Your First Key$\" (repeatable). It never lifts " +
|
|
69
|
+
"--deny, --paid, destructive, session-end, read-only or origin rules; every use is recorded in the result's safetyOverrides")
|
|
70
|
+
.default([])
|
|
71
|
+
.argParser(collect),
|
|
67
72
|
allowDestructive: () => new Option("--allow-destructive", "let missions click session-ending, destructive and paid controls (a --deny pattern still holds). A goal run already may click one its goal asks for"),
|
|
68
73
|
dialogs: () => new Option("--dialogs <policy>", "native window.confirm/prompt dialogs: dismiss (default) or accept. accept still dismisses one whose message names a session-ending, " +
|
|
69
74
|
"destructive or paid action the run may not take (without --allow-destructive or a goal asking for it); every dialog is logged"),
|
|
@@ -156,6 +161,7 @@ export function targetFlagsFromFlags(o, dialogs) {
|
|
|
156
161
|
apiPrefixes: o.apiPrefix ?? [],
|
|
157
162
|
deny: o.deny ?? [],
|
|
158
163
|
paid: o.paid ?? [],
|
|
164
|
+
allowControl: o.allowControl ?? [],
|
|
159
165
|
readRpc: o.readRpc ?? [],
|
|
160
166
|
...(o.allowDestructive === true ? { allowDestructive: true } : {}),
|
|
161
167
|
...(dialogs === undefined ? {} : { dialogs }),
|
|
@@ -183,6 +189,7 @@ export function resolveGoalRunFlags(o, url, deps = {}) {
|
|
|
183
189
|
const conversation = conversationFromFlags(o);
|
|
184
190
|
validateDenyPatterns(o.deny);
|
|
185
191
|
validateDenyPatterns(o.paid, "--paid");
|
|
192
|
+
validateAllowControlPatterns(o.allowControl ?? []);
|
|
186
193
|
const emulation = emulationFromFlags(o);
|
|
187
194
|
const secretFields = secretFieldsFromFlags(o, env);
|
|
188
195
|
const typeFixtures = o.typeFixture.length === 0 ? [] : loadTypeFixtures(o.typeFixture);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal-run-flags.js","sourceRoot":"","sources":["../src/goal-run-flags.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goal-run-flags.js","sourceRoot":"","sources":["../src/goal-run-flags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Page } from "playwright";
|
|
2
|
+
import type { HealWriteGuard } from "@jevitate/runtime";
|
|
3
|
+
export interface HealProbeGuard {
|
|
4
|
+
readonly guard: HealWriteGuard;
|
|
5
|
+
/** Unroutes the HTTP handler (the WebSocket proxy stays transparent until the context closes). */
|
|
6
|
+
dispose(): Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/** Installs the guard on the page's BrowserContext (HTTP routes + WebSocket proxy), unarmed. */
|
|
9
|
+
export declare function installHealProbeGuard(page: Page): Promise<HealProbeGuard>;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { monitorFor } from "@jevitate/explore";
|
|
2
|
+
/**
|
|
3
|
+
* #453 (Q2, review): the write guard a guarded click/fill heal probe runs under. Stricter than the
|
|
4
|
+
* find-out `ReadOnlyGuard` on purpose — a probe clicks a control the model or the change evidence
|
|
5
|
+
* PROPOSED, so nothing it sends may reach a server:
|
|
6
|
+
* - NO exemptions: every request whose method is not GET/HEAD/OPTIONS is aborted while a probe is
|
|
7
|
+
* armed — whatever its origin (third-party, credential-free included) and whatever its path
|
|
8
|
+
* (`/token`, `/oauth/…`, `/refresh` included). A navigation with a body is such a request.
|
|
9
|
+
* - BrowserContext level: `context.route` sees every page of the context, so a popup or new tab the
|
|
10
|
+
* click opens is guarded too.
|
|
11
|
+
* - WebSockets: every socket of the context is proxied (`context.routeWebSocket`, installed before
|
|
12
|
+
* the run so sockets opened earlier are covered); a frame the page sends while a probe is armed is
|
|
13
|
+
* dropped and counted as a blocked write.
|
|
14
|
+
* - Service workers: a request a service worker answers or sends itself may never reach
|
|
15
|
+
* `context.route`. The simplest fail-closed rule: a probe is never run while a service worker is
|
|
16
|
+
* registered for the page (`unguardable`), and one registered DURING the probe rejects it.
|
|
17
|
+
* Any blocked request rejects the candidate `write-attempted` (the runner adjudicates). Outside an
|
|
18
|
+
* armed probe every request and frame passes through untouched.
|
|
19
|
+
*/
|
|
20
|
+
const READ_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
|
|
21
|
+
/** How long an armed probe's window stays open for the writes its action triggers (network settle). */
|
|
22
|
+
const SETTLE_MS = 5_000;
|
|
23
|
+
/** Origin + path of a URL (never its query — it can carry a token). */
|
|
24
|
+
function endpoint(url) {
|
|
25
|
+
try {
|
|
26
|
+
const u = new URL(url);
|
|
27
|
+
return u.origin === "null" ? u.protocol : `${u.origin}${u.pathname}`;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return url.split(/[?#]/)[0] ?? url;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** Service workers registered for the page (their scopes), read in the page. */
|
|
34
|
+
async function registeredServiceWorkers(page, context) {
|
|
35
|
+
const scopes = new Set(context.serviceWorkers().map((w) => endpoint(w.url())));
|
|
36
|
+
if (!page.isClosed()) {
|
|
37
|
+
// BROWSER CODE
|
|
38
|
+
const inPage = await page.evaluate(async () => {
|
|
39
|
+
const sw = navigator.serviceWorker;
|
|
40
|
+
if (sw === undefined)
|
|
41
|
+
return [];
|
|
42
|
+
const regs = await sw.getRegistrations();
|
|
43
|
+
return regs.map((r) => r.scope);
|
|
44
|
+
});
|
|
45
|
+
for (const s of inPage)
|
|
46
|
+
scopes.add(endpoint(s));
|
|
47
|
+
}
|
|
48
|
+
return [...scopes];
|
|
49
|
+
}
|
|
50
|
+
/** Installs the guard on the page's BrowserContext (HTTP routes + WebSocket proxy), unarmed. */
|
|
51
|
+
export async function installHealProbeGuard(page) {
|
|
52
|
+
const context = page.context();
|
|
53
|
+
const monitor = monitorFor(page);
|
|
54
|
+
let armed = false;
|
|
55
|
+
let blocked = [];
|
|
56
|
+
const onRequest = async (route, request) => {
|
|
57
|
+
const method = request.method().toUpperCase();
|
|
58
|
+
if (!armed || READ_METHODS.has(method)) {
|
|
59
|
+
await route.fallback().catch(() => undefined);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
blocked.push({ method, url: endpoint(request.url()) });
|
|
63
|
+
await route.abort("blockedbyclient").catch(() => undefined);
|
|
64
|
+
};
|
|
65
|
+
const onSocket = (ws) => {
|
|
66
|
+
const server = ws.connectToServer();
|
|
67
|
+
ws.onMessage((message) => {
|
|
68
|
+
if (armed) {
|
|
69
|
+
blocked.push({ method: "WEBSOCKET", url: endpoint(ws.url()) });
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
server.send(message);
|
|
73
|
+
});
|
|
74
|
+
server.onMessage((message) => ws.send(message));
|
|
75
|
+
};
|
|
76
|
+
await context.route("**/*", onRequest);
|
|
77
|
+
await context.routeWebSocket(/.*/, onSocket);
|
|
78
|
+
const guard = {
|
|
79
|
+
unguardable: async () => {
|
|
80
|
+
const workers = await registeredServiceWorkers(page, context);
|
|
81
|
+
return workers.length === 0 ? null : `a service worker is registered for this page (${workers.join(", ")}) — requests it handles may bypass the write guard`;
|
|
82
|
+
},
|
|
83
|
+
armAt: async () => {
|
|
84
|
+
blocked = [];
|
|
85
|
+
await monitor.instrument().catch(() => undefined);
|
|
86
|
+
armed = true;
|
|
87
|
+
},
|
|
88
|
+
disarm: async () => {
|
|
89
|
+
if (!armed)
|
|
90
|
+
return [];
|
|
91
|
+
try {
|
|
92
|
+
await monitor.waitSettled({ ceilingMs: SETTLE_MS }).catch(() => undefined);
|
|
93
|
+
const workers = await registeredServiceWorkers(page, context).catch(() => ["(unknown)"]);
|
|
94
|
+
for (const w of workers)
|
|
95
|
+
blocked.push({ method: "SERVICE-WORKER", url: w });
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
armed = false;
|
|
99
|
+
}
|
|
100
|
+
const out = blocked;
|
|
101
|
+
blocked = [];
|
|
102
|
+
return out;
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
guard,
|
|
107
|
+
dispose: async () => {
|
|
108
|
+
armed = false;
|
|
109
|
+
await context.unroute("**/*", onRequest).catch(() => undefined);
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=heal-probe-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heal-probe-guard.js","sourceRoot":"","sources":["../src/heal-probe-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,30 @@ import { type ResourceGovernor } from "@jevitate/playwright";
|
|
|
8
8
|
* result's `hostHealth`. `injected` is the test seam (a deterministic fake host).
|
|
9
9
|
*/
|
|
10
10
|
export declare function startHostHealth(injected?: HostHealthSampler): Promise<HostHealthSampler>;
|
|
11
|
+
/** The browser handle a run's CDP probe needs (structurally a Playwright `Page`). */
|
|
12
|
+
interface CdpPage {
|
|
13
|
+
context(): {
|
|
14
|
+
browser(): {
|
|
15
|
+
newBrowserCDPSession(): Promise<{
|
|
16
|
+
send(method: string): Promise<unknown>;
|
|
17
|
+
}>;
|
|
18
|
+
} | null;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* #452: gives the run's sampler its CDP probe — the round-trip of a cheap browser-level command
|
|
23
|
+
* (`Browser.getVersion`, answered by the browser process itself, so it measures the browser being
|
|
24
|
+
* scheduled, not the page's JS). Measured in REAL time (`process.hrtime`): it is a latency of the real
|
|
25
|
+
* pipe, so a skipped test clock must not inflate it. A browser that cannot give a CDP session simply
|
|
26
|
+
* contributes no reading.
|
|
27
|
+
*/
|
|
28
|
+
export declare function attachCdpProbe(health: HostHealthSampler, page: CdpPage): void;
|
|
29
|
+
/** The failure to report: a `host-starved` verdict (#452) explains the stall before the engine's own failure does. */
|
|
30
|
+
export declare function failureWithHostStarved<F extends {
|
|
31
|
+
kind: string;
|
|
32
|
+
}>(host: {
|
|
33
|
+
readonly failure?: F | undefined;
|
|
34
|
+
}, own: F | undefined): F | undefined;
|
|
11
35
|
/** What every result carries from the sampler, and the degraded-environment verdict rule applied. */
|
|
12
36
|
export interface HostHealthVerdict<O extends string> {
|
|
13
37
|
readonly outcome: O | "inconclusive";
|
|
@@ -22,4 +46,11 @@ export interface HostHealthVerdict<O extends string> {
|
|
|
22
46
|
* Takes the closing sample and applies the run-level rule: most steps starved → `inconclusive`
|
|
23
47
|
* (`degraded-environment`), never `clean` (see `degradedEnvironmentOutcome`).
|
|
24
48
|
*/
|
|
25
|
-
export declare function finishHostHealth<O extends string>(health: HostHealthSampler, outcome: O, opts?: Parameters<typeof degradedEnvironmentOutcome>[2]
|
|
49
|
+
export declare function finishHostHealth<O extends string>(health: HostHealthSampler, outcome: O, opts?: Parameters<typeof degradedEnvironmentOutcome>[2] & {
|
|
50
|
+
/** #452: the run's own engine failure, so a stall on a starved host is classified `host-starved`. */
|
|
51
|
+
readonly failure?: {
|
|
52
|
+
readonly kind: string;
|
|
53
|
+
readonly message: string;
|
|
54
|
+
};
|
|
55
|
+
}, governor?: ResourceGovernor): Promise<HostHealthVerdict<O>>;
|
|
56
|
+
export {};
|
package/dist/host-health-run.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { HostHealthSampler, degradedEnvironmentOutcome } from "@jevitate/explore";
|
|
1
|
+
import { HostHealthSampler, degradedEnvironmentOutcome, hostStarvedFailure } from "@jevitate/explore";
|
|
2
2
|
import { sharedResourceGovernor } from "@jevitate/playwright";
|
|
3
3
|
import { clock } from "@jevitate/domain";
|
|
4
4
|
/** When each run's sampler started (#205: the window the governor's summary covers). */
|
|
@@ -15,6 +15,32 @@ export async function startHostHealth(injected) {
|
|
|
15
15
|
await health.sample();
|
|
16
16
|
return health;
|
|
17
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* #452: gives the run's sampler its CDP probe — the round-trip of a cheap browser-level command
|
|
20
|
+
* (`Browser.getVersion`, answered by the browser process itself, so it measures the browser being
|
|
21
|
+
* scheduled, not the page's JS). Measured in REAL time (`process.hrtime`): it is a latency of the real
|
|
22
|
+
* pipe, so a skipped test clock must not inflate it. A browser that cannot give a CDP session simply
|
|
23
|
+
* contributes no reading.
|
|
24
|
+
*/
|
|
25
|
+
export function attachCdpProbe(health, page) {
|
|
26
|
+
let session;
|
|
27
|
+
health.attachCdpProbe(async () => {
|
|
28
|
+
const browser = page.context().browser();
|
|
29
|
+
if (browser == null)
|
|
30
|
+
return undefined;
|
|
31
|
+
session ??= browser.newBrowserCDPSession().catch(() => undefined);
|
|
32
|
+
const s = await session;
|
|
33
|
+
if (s === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
const t0 = process.hrtime.bigint();
|
|
36
|
+
await s.send("Browser.getVersion");
|
|
37
|
+
return Number(process.hrtime.bigint() - t0) / 1e6;
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** The failure to report: a `host-starved` verdict (#452) explains the stall before the engine's own failure does. */
|
|
41
|
+
export function failureWithHostStarved(host, own) {
|
|
42
|
+
return host.failure !== undefined && host.failure.kind === "host-starved" ? host.failure : own;
|
|
43
|
+
}
|
|
18
44
|
/**
|
|
19
45
|
* Takes the closing sample and applies the run-level rule: most steps starved → `inconclusive`
|
|
20
46
|
* (`degraded-environment`), never `clean` (see `degradedEnvironmentOutcome`).
|
|
@@ -23,6 +49,17 @@ export async function finishHostHealth(health, outcome, opts = {}, governor = sh
|
|
|
23
49
|
await health.sample();
|
|
24
50
|
// #205: what resource governance did during this run (cap, slot, throttling, memory) rides along.
|
|
25
51
|
const hostHealth = { ...health.summary(), resources: governor.snapshot(runStarts.get(health) ?? 0) };
|
|
52
|
+
// #452: a run that STALLED while the host showed starvation is `inconclusive` / `host-starved`, with the
|
|
53
|
+
// measurements; a confirmed finding (defects-found, a hang) keeps its outcome.
|
|
54
|
+
const starved = hostStarvedFailure(opts.failure, hostHealth);
|
|
55
|
+
if (starved !== undefined) {
|
|
56
|
+
const keeps = outcome === "defects-found" || outcome === "hang" || outcome === "intermittent";
|
|
57
|
+
return {
|
|
58
|
+
outcome: keeps ? outcome : "inconclusive",
|
|
59
|
+
failure: starved,
|
|
60
|
+
fields: { hostHealth, environmentDegraded: health.findings() },
|
|
61
|
+
};
|
|
62
|
+
}
|
|
26
63
|
const verdict = degradedEnvironmentOutcome(outcome, hostHealth, opts);
|
|
27
64
|
return {
|
|
28
65
|
outcome: verdict.outcome,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-health-run.js","sourceRoot":"","sources":["../src/host-health-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"host-health-run.js","sourceRoot":"","sources":["../src/host-health-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { Http5xxDefect } from "@jevitate/explore";
|
|
2
|
+
/**
|
|
3
|
+
* How an HTTP 5xx hard-signal defect (#208, `Http5xxOracle`) is worded on a run's `reason`. It
|
|
4
|
+
* counts like every other defect: coverage/exploratory and feature runs with their own defects, and
|
|
5
|
+
* a goal run through `defectOutcome` — `goalMissionOutcome` (#423) makes a `succeeded` goal
|
|
6
|
+
* `defects-found` while its `goalOutcome` stays the goal's own (`assertionPassed`/`checks` too).
|
|
7
|
+
*/
|
|
3
8
|
/** `PUT /api/profile → 500` for each defect (first three), for a one-line `reason`. */
|
|
4
9
|
export declare function describeHttp5xx(defects: readonly Http5xxDefect[]): string;
|
|
5
|
-
/** The `reason` of a goal run
|
|
10
|
+
/** The `reason` of a goal run whose only finding is an HTTP 5xx (#208). */
|
|
6
11
|
export declare function http5xxGoalReason(defects: readonly Http5xxDefect[], assertionPassed: boolean): string;
|
package/dist/http-5xx-outcome.js
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* How an HTTP 5xx hard-signal defect (#208, `Http5xxOracle`)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* over a thin run's `inconclusive`, exactly like a declared-invariant defect);
|
|
7
|
-
* - a goal run's own `GoalBasedOutcome`: `defects-found` over `succeeded` / `exhausted` /
|
|
8
|
-
* `blocked`. A goal whose checks held but whose run hit a server error is NOT a success: the
|
|
9
|
-
* checks' verdict stays on the result (`assertionPassed`, `checks`), and `reason` says both.
|
|
10
|
-
* A broken run (`inconclusive` / `crashed`) and a hang keep their outcome; the defect is still
|
|
11
|
-
* listed in `defects`, and `reason` names it.
|
|
2
|
+
* How an HTTP 5xx hard-signal defect (#208, `Http5xxOracle`) is worded on a run's `reason`. It
|
|
3
|
+
* counts like every other defect: coverage/exploratory and feature runs with their own defects, and
|
|
4
|
+
* a goal run through `defectOutcome` — `goalMissionOutcome` (#423) makes a `succeeded` goal
|
|
5
|
+
* `defects-found` while its `goalOutcome` stays the goal's own (`assertionPassed`/`checks` too).
|
|
12
6
|
*/
|
|
13
|
-
const BROKEN_GOAL_OUTCOMES = new Set(["inconclusive", "crashed", "hang", "intermittent"]);
|
|
14
|
-
export function applyHttp5xxGoalOutcome(outcome, defects) {
|
|
15
|
-
return defects.length > 0 && !BROKEN_GOAL_OUTCOMES.has(outcome) ? "defects-found" : outcome;
|
|
16
|
-
}
|
|
17
7
|
/** `PUT /api/profile → 500` for each defect (first three), for a one-line `reason`. */
|
|
18
8
|
export function describeHttp5xx(defects) {
|
|
19
9
|
const shown = defects.slice(0, 3).map((d) => {
|
|
@@ -30,7 +20,7 @@ export function describeHttp5xx(defects) {
|
|
|
30
20
|
const more = defects.length > 3 ? ` (+${defects.length - 3} more)` : "";
|
|
31
21
|
return `${shown.join(", ")}${more}`;
|
|
32
22
|
}
|
|
33
|
-
/** The `reason` of a goal run
|
|
23
|
+
/** The `reason` of a goal run whose only finding is an HTTP 5xx (#208). */
|
|
34
24
|
export function http5xxGoalReason(defects, assertionPassed) {
|
|
35
25
|
const n = defects.length;
|
|
36
26
|
const found = `${n} HTTP 5xx defect${n === 1 ? "" : "s"} found: ${describeHttp5xx(defects)}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-5xx-outcome.js","sourceRoot":"","sources":["../src/http-5xx-outcome.ts"],"names":[],"mappings":"AAEA
|
|
1
|
+
{"version":3,"file":"http-5xx-outcome.js","sourceRoot":"","sources":["../src/http-5xx-outcome.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,uFAAuF;AACvF,MAAM,UAAU,eAAe,CAAC,OAAiC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC;QAC7B,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QACD,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,IAAI,MAAM,CAAC,EAAE,MAAM,IAAI,KAAK,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACxE,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,OAAiC,EAAE,eAAwB;IAC3F,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACzB,MAAM,KAAK,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7F,OAAO,eAAe,CAAC,CAAC,CAAC,GAAG,KAAK,6EAA6E,CAAC,CAAC,CAAC,KAAK,CAAC;AACzH,CAAC"}
|
package/dist/init-cli.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
|
+
import { type InstallReport, type UninstallReport } from "./init-skills.js";
|
|
2
3
|
import { type CliDeps } from "./cli-shared.js";
|
|
3
4
|
/** Registers `jevitate init` (API keys, skills/MCP wiring, the repo's .jevitate/). */
|
|
4
5
|
export declare function registerInitCommands(program: Command, deps: CliDeps): void;
|
|
6
|
+
/**
|
|
7
|
+
* #431: the skill-install/uninstall actions a person must see — a file left alone because they
|
|
8
|
+
* edited it, or refused because its markers are broken (with the fix) — and, for uninstall, what
|
|
9
|
+
* was removed. `create`/`update`/`unchanged` stay in the count line above (and in --json).
|
|
10
|
+
*/
|
|
11
|
+
export declare function skillReportLines(reports: readonly (InstallReport | UninstallReport)[]): string[];
|
package/dist/init-cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { envCredentialStore, FEATURE_KEYS } from "@jevitate/ai-core";
|
|
1
|
+
import { envCredentialStore, FEATURE_KEYS, featureReady, jevProviderOverride } from "@jevitate/ai-core";
|
|
2
2
|
import { loadLocalCredentials } from "./credentials-file.js";
|
|
3
3
|
import { ok, fail } from "./envelope.js";
|
|
4
4
|
import { initProjectDir } from "./project-dir.js";
|
|
@@ -6,7 +6,9 @@ import { KeyCheckError, credentialInputs, enteredKeyCheck, realSecureIO } from "
|
|
|
6
6
|
import { keySources, realVerifyFetch, shadowWarnings, verifyFeatureKeys } from "./key-report.js";
|
|
7
7
|
import { collectAllMissingKeys } from "./init-keys.js";
|
|
8
8
|
import { formatInitKeysHuman } from "./cli-output.js";
|
|
9
|
-
import { detectRuntimes, resolveInstallTargetPaths, installSkills } from "./init-skills.js";
|
|
9
|
+
import { detectRuntimes, resolveInstallTargetPaths, installSkills, uninstallSkills } from "./init-skills.js";
|
|
10
|
+
import { currentEngineInfo } from "./engine.js";
|
|
11
|
+
import { CodeownersArgsError, installCodeowners, parseOwners } from "./init-codeowners.js";
|
|
10
12
|
import { registerMcp, resolveMcpTargetPaths } from "./init-mcp.js";
|
|
11
13
|
import { initNextSteps, environmentHint } from "./init-next-steps.js";
|
|
12
14
|
import { loadManifest } from "@jevitate/skills";
|
|
@@ -27,14 +29,48 @@ export function registerInitCommands(program, deps) {
|
|
|
27
29
|
.option("--force", "overwrite a user-modified installed skill file/block or MCP config entry")
|
|
28
30
|
.option("--dry-run", "report planned skill-install/mcp-register actions without writing")
|
|
29
31
|
.option("--skip-project", "skip creating the repo's .jevitate/ (journeys, regressions, baselines, logs)")
|
|
32
|
+
.option("--claude-md", "#431: also keep a marked jevitate block in the project's CLAUDE.md pointing at the installed skills (Claude Code only)")
|
|
33
|
+
.option("--codeowners <owners>", "#437: write/merge a marked CODEOWNERS block (.github/CODEOWNERS, or the repo's existing one) making .jevitate/journeys/, personas.json and jobs.json need these owners' review (\"@org/team @user\"); enable code-owner review in branch protection")
|
|
34
|
+
.option("--uninstall", "#431: remove the skill files and marked AGENTS.md/CLAUDE.md blocks jevitate installed (user-modified ones are skipped unless --force); keys, MCP registration and .jevitate/ are left alone")
|
|
30
35
|
.action(async function () {
|
|
31
|
-
const { json, skipKeys, skipSkills, skipMcp, skipProject, targets, force, dryRun, replaceKeys, verify } = this.opts();
|
|
36
|
+
const { json, skipKeys, skipSkills, skipMcp, skipProject, targets, force, dryRun, replaceKeys, verify, claudeMd, uninstall, codeowners } = this.opts();
|
|
32
37
|
try {
|
|
38
|
+
// #431: --uninstall only removes what the skill installer wrote, with the same never-clobber
|
|
39
|
+
// rules; it never touches keys, MCP configs or the repo's .jevitate/.
|
|
40
|
+
if (uninstall === true) {
|
|
41
|
+
const runtimes = targets
|
|
42
|
+
? targets.split(",").map((t) => t.trim()).filter((t) => t.length > 0)
|
|
43
|
+
: detectRuntimes(deps.init?.detection);
|
|
44
|
+
const paths = resolveInstallTargetPaths(deps.init?.detection);
|
|
45
|
+
const statePath = deps.init?.statePath ?? resolveDataDir(["skills-install-state.json"]);
|
|
46
|
+
const removed = await uninstallSkills(runtimes, loadManifest(), paths, statePath, {
|
|
47
|
+
...(force === true ? { force: true } : {}),
|
|
48
|
+
...(dryRun === true ? { dryRun: true } : {}),
|
|
49
|
+
...(claudeMd === true ? { claudeMd: true } : {}),
|
|
50
|
+
});
|
|
51
|
+
if (json) {
|
|
52
|
+
emitJson(program, ok({ uninstalled: removed }));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
const out = program.configureOutput().writeOut;
|
|
56
|
+
out?.(dryRun === true ? "jevitate: dry run — nothing was removed\n" : "jevitate skills uninstalled\n");
|
|
57
|
+
for (const line of skillReportLines(removed))
|
|
58
|
+
out?.(`${line}\n`);
|
|
59
|
+
process.exitCode = 0;
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (codeowners !== undefined)
|
|
64
|
+
parseOwners(codeowners); // refused (exit 64) before anything is written
|
|
33
65
|
const data = { initialized: true };
|
|
34
66
|
// The repo's own .jevitate/ (0.2.0 layout): Journeys, regressions and baselines live with the
|
|
35
67
|
// app's code; logs stay local. Secrets and machine state stay in ~/.jevitate.
|
|
36
68
|
if (!skipProject)
|
|
37
69
|
data.project = initProjectDir(deps.init?.detection?.cwd?.() ?? process.cwd(), { ...(dryRun === true ? { dryRun: true } : {}) });
|
|
70
|
+
// #437: the enforcement layer for approvals — code-owner review of .jevitate/ (with branch protection on the forge).
|
|
71
|
+
if (codeowners !== undefined) {
|
|
72
|
+
data.codeowners = await installCodeowners(deps.init?.detection?.cwd?.() ?? process.cwd(), codeowners, { ...(dryRun === true ? { dryRun: true } : {}) });
|
|
73
|
+
}
|
|
38
74
|
if (!skipKeys) {
|
|
39
75
|
// SECURITY: reuses the existing, already-guardrailed credential
|
|
40
76
|
// collection. The report holds only key NAMES (required/collected/missing),
|
|
@@ -51,8 +87,11 @@ export function registerInitCommands(program, deps) {
|
|
|
51
87
|
const fetchFn = deps.ai?.verifyFetch ?? realVerifyFetch;
|
|
52
88
|
// #291: each entered key is checked with its provider BEFORE it is stored.
|
|
53
89
|
const gate = enteredKeyCheck(fetchFn);
|
|
90
|
+
// #429: JEVITATE_JEV_PROVIDER pins which key judgment needs (an unknown value fails init).
|
|
91
|
+
const jevProvider = jevProviderOverride(deps.ai?.env ?? process.env);
|
|
54
92
|
const keys = await collectAllMissingKeys(store, io, {
|
|
55
93
|
interactive,
|
|
94
|
+
...(jevProvider === undefined ? {} : { jevProvider }),
|
|
56
95
|
...(replaceKeys === true ? { replace: true } : {}),
|
|
57
96
|
...(verify ? { check: gate.check } : {}),
|
|
58
97
|
});
|
|
@@ -62,11 +101,11 @@ export function registerInitCommands(program, deps) {
|
|
|
62
101
|
const nowStore = envCredentialStore(env, nowLocal);
|
|
63
102
|
for (const feature of Object.keys(keys)) {
|
|
64
103
|
const r = keys[feature];
|
|
65
|
-
const sources = keySources(feature, env, verify ? nowLocal : { ...localConfig, ...Object.fromEntries(r.collected.map((k) => [k, "set"])) });
|
|
104
|
+
const sources = keySources(feature, env, verify ? nowLocal : { ...localConfig, ...Object.fromEntries(r.collected.map((k) => [k, "set"])) }, jevProvider);
|
|
66
105
|
const warnings = shadowWarnings(r.collected, sources);
|
|
67
106
|
r.sources = sources;
|
|
68
107
|
if (verify)
|
|
69
|
-
r.verification = await verifyFeatureKeys(feature, nowStore, fetchFn, gate.verdicts);
|
|
108
|
+
r.verification = await verifyFeatureKeys(feature, nowStore, fetchFn, gate.verdicts, jevProvider);
|
|
70
109
|
if (warnings.length > 0)
|
|
71
110
|
r.warnings = warnings;
|
|
72
111
|
}
|
|
@@ -83,7 +122,12 @@ export function registerInitCommands(program, deps) {
|
|
|
83
122
|
const paths = resolveInstallTargetPaths(deps.init?.detection);
|
|
84
123
|
const statePath = deps.init?.statePath ?? resolveDataDir(["skills-install-state.json"]);
|
|
85
124
|
const skills = loadManifest();
|
|
86
|
-
data.skills = await installSkills(runtimes, skills, paths, statePath, {
|
|
125
|
+
data.skills = await installSkills(runtimes, skills, paths, statePath, {
|
|
126
|
+
force,
|
|
127
|
+
dryRun,
|
|
128
|
+
jevitateVersion: currentEngineInfo().version,
|
|
129
|
+
...(claudeMd === true ? { claudeMd: true } : {}),
|
|
130
|
+
});
|
|
87
131
|
}
|
|
88
132
|
if (!skipMcp) {
|
|
89
133
|
// Register the `jevitate mcp` server for each detected/selected
|
|
@@ -108,7 +152,8 @@ export function registerInitCommands(program, deps) {
|
|
|
108
152
|
? Object.values(data.keys).every((r) => (r.missing ?? []).length === 0 && !(r.verification ?? []).some((v) => v.status === "invalid"))
|
|
109
153
|
: (() => {
|
|
110
154
|
const store = envCredentialStore(deps.ai?.env ?? process.env, deps.ai?.localConfig ?? loadLocalCredentials());
|
|
111
|
-
|
|
155
|
+
const jevProvider = jevProviderOverride(deps.ai?.env ?? process.env);
|
|
156
|
+
return Object.keys(FEATURE_KEYS).every((f) => featureReady(f, store, jevProvider));
|
|
112
157
|
})();
|
|
113
158
|
const projectDir = data.project?.dir ?? null;
|
|
114
159
|
data.nextSteps = initNextSteps({
|
|
@@ -131,8 +176,11 @@ export function registerInitCommands(program, deps) {
|
|
|
131
176
|
// []` that reads as "missing" when every key was already set.
|
|
132
177
|
if (data.keys)
|
|
133
178
|
out?.(`${formatInitKeysHuman(data.keys)}\n`);
|
|
134
|
-
if (data.skills)
|
|
179
|
+
if (data.skills) {
|
|
135
180
|
out?.(`skills: ${data.skills.length} target/skill pairs ${dryRun === true ? "would be processed" : "processed"}\n`);
|
|
181
|
+
for (const line of skillReportLines(data.skills))
|
|
182
|
+
out?.(`${line}\n`);
|
|
183
|
+
}
|
|
136
184
|
if (data.mcp)
|
|
137
185
|
out?.(`mcp: ${data.mcp.length} harness config(s) ${dryRun === true ? "would be processed" : "processed"}\n`);
|
|
138
186
|
const project = data.project;
|
|
@@ -141,6 +189,11 @@ export function registerInitCommands(program, deps) {
|
|
|
141
189
|
? `project: ${project.reason ?? "none"}\n`
|
|
142
190
|
: `project: ${project.dir} (${project.created.length} ${dryRun === true ? "would create" : "created"})\n`);
|
|
143
191
|
}
|
|
192
|
+
const owners = data.codeowners;
|
|
193
|
+
if (owners !== undefined) {
|
|
194
|
+
out?.(`codeowners: ${owners.path} (${dryRun === true && owners.action !== "unchanged" ? `would ${owners.action}` : owners.action}) — ${owners.owners.join(" ")}\n`);
|
|
195
|
+
out?.(` note: ${owners.note}\n`);
|
|
196
|
+
}
|
|
144
197
|
out?.(`next steps${data.project?.dir == null ? "" : " (app URLs: .jevitate/environments.json)"}:\n`);
|
|
145
198
|
for (const line of data.nextSteps)
|
|
146
199
|
out?.(` ${line}\n`);
|
|
@@ -148,9 +201,26 @@ export function registerInitCommands(program, deps) {
|
|
|
148
201
|
}
|
|
149
202
|
}
|
|
150
203
|
catch (err) {
|
|
151
|
-
const code = err instanceof KeyCheckError ? err.code : "E_INIT";
|
|
204
|
+
const code = err instanceof KeyCheckError || err instanceof CodeownersArgsError ? err.code : "E_INIT";
|
|
152
205
|
emitCommandResult(program, fail(code, String(err instanceof Error ? err.message : err)), { json: json === true, command: "init" });
|
|
153
206
|
}
|
|
154
207
|
});
|
|
155
208
|
}
|
|
209
|
+
/**
|
|
210
|
+
* #431: the skill-install/uninstall actions a person must see — a file left alone because they
|
|
211
|
+
* edited it, or refused because its markers are broken (with the fix) — and, for uninstall, what
|
|
212
|
+
* was removed. `create`/`update`/`unchanged` stay in the count line above (and in --json).
|
|
213
|
+
*/
|
|
214
|
+
export function skillReportLines(reports) {
|
|
215
|
+
const lines = [];
|
|
216
|
+
for (const r of reports) {
|
|
217
|
+
if (r.action === "skip-user-modified")
|
|
218
|
+
lines.push(` skipped ${r.path}: you edited it (re-run with --force to replace it)`);
|
|
219
|
+
else if (r.action === "refuse-malformed")
|
|
220
|
+
lines.push(` refused ${r.path}: ${r.reason ?? "its JEVITATE SKILLS markers are malformed"}`);
|
|
221
|
+
else if (r.action === "remove" || r.action === "force-remove")
|
|
222
|
+
lines.push(` removed ${r.path}`);
|
|
223
|
+
}
|
|
224
|
+
return lines;
|
|
225
|
+
}
|
|
156
226
|
//# sourceMappingURL=init-cli.js.map
|