@jevitate/cli 0.1.0 → 0.2.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 +23 -0
- package/dist/ai-cli.js +40 -30
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.d.ts +4 -0
- package/dist/author-journey-cli.js +109 -0
- package/dist/author-journey-cli.js.map +1 -0
- package/dist/bin.js +58077 -22454
- package/dist/bin.js.map +1 -1
- package/dist/browser-run-options.d.ts +58 -0
- package/dist/browser-run-options.js +106 -0
- package/dist/browser-run-options.js.map +1 -0
- package/dist/build-info.generated.d.ts +2 -0
- package/dist/build-info.generated.js +10 -0
- package/dist/build-info.generated.js.map +1 -0
- package/dist/check-api.d.ts +5 -0
- package/dist/check-api.js +233 -0
- package/dist/check-api.js.map +1 -0
- package/dist/check-budget.d.ts +26 -0
- package/dist/check-budget.js +89 -0
- package/dist/check-budget.js.map +1 -0
- package/dist/check-cli.d.ts +31 -0
- package/dist/check-cli.js +109 -0
- package/dist/check-cli.js.map +1 -0
- package/dist/check-execute.d.ts +25 -0
- package/dist/check-execute.js +385 -0
- package/dist/check-execute.js.map +1 -0
- package/dist/check-plan.d.ts +113 -0
- package/dist/check-plan.js +448 -0
- package/dist/check-plan.js.map +1 -0
- package/dist/check-suite.d.ts +171 -0
- package/dist/check-suite.js +515 -0
- package/dist/check-suite.js.map +1 -0
- package/dist/check-types.d.ts +181 -0
- package/dist/check-types.js +35 -0
- package/dist/check-types.js.map +1 -0
- package/dist/cli-args.d.ts +26 -0
- package/dist/cli-args.js +50 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-output.d.ts +102 -0
- package/dist/cli-output.js +516 -0
- package/dist/cli-output.js.map +1 -0
- package/dist/cli-reference.d.ts +3 -0
- package/dist/cli-reference.js +81 -0
- package/dist/cli-reference.js.map +1 -0
- package/dist/cli-refusal.d.ts +12 -0
- package/dist/cli-refusal.js +52 -0
- package/dist/cli-refusal.js.map +1 -0
- package/dist/cli-shared.d.ts +330 -0
- package/dist/cli-shared.js +492 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli-surface.d.ts +33 -0
- package/dist/cli-surface.js +48 -0
- package/dist/cli-surface.js.map +1 -0
- package/dist/conversation-options.d.ts +15 -0
- package/dist/conversation-options.js +10 -0
- package/dist/conversation-options.js.map +1 -0
- package/dist/credentials-file.d.ts +15 -0
- package/dist/credentials-file.js +56 -0
- package/dist/credentials-file.js.map +1 -0
- package/dist/data-dir.d.ts +1 -1
- package/dist/data-dir.js +1 -1
- package/dist/defect-evidence.d.ts +141 -0
- package/dist/defect-evidence.js +502 -0
- package/dist/defect-evidence.js.map +1 -0
- package/dist/demo-aspect-api.d.ts +209 -0
- package/dist/demo-aspect-api.js +397 -0
- package/dist/demo-aspect-api.js.map +1 -0
- package/dist/demo-aspect-cli.d.ts +3 -0
- package/dist/demo-aspect-cli.js +241 -0
- package/dist/demo-aspect-cli.js.map +1 -0
- package/dist/demo-capture.d.ts +108 -0
- package/dist/demo-capture.js +438 -0
- package/dist/demo-capture.js.map +1 -0
- package/dist/engine.d.ts +35 -0
- package/dist/engine.js +25 -0
- package/dist/engine.js.map +1 -0
- package/dist/environments.d.ts +155 -0
- package/dist/environments.js +364 -0
- package/dist/environments.js.map +1 -0
- package/dist/exit-codes.d.ts +46 -0
- package/dist/exit-codes.js +91 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/explore-adversarial.d.ts +137 -0
- package/dist/explore-adversarial.js +218 -0
- package/dist/explore-adversarial.js.map +1 -0
- package/dist/explore-api.d.ts +7 -187
- package/dist/explore-api.js +7 -301
- package/dist/explore-api.js.map +1 -1
- package/dist/explore-author.d.ts +79 -0
- package/dist/explore-author.js +86 -0
- package/dist/explore-author.js.map +1 -0
- package/dist/explore-cli.d.ts +7 -0
- package/dist/explore-cli.js +963 -0
- package/dist/explore-cli.js.map +1 -0
- package/dist/explore-coverage.d.ts +158 -0
- package/dist/explore-coverage.js +240 -0
- package/dist/explore-coverage.js.map +1 -0
- package/dist/explore-feature.d.ts +127 -0
- package/dist/explore-feature.js +220 -0
- package/dist/explore-feature.js.map +1 -0
- package/dist/explore-goal.d.ts +253 -0
- package/dist/explore-goal.js +374 -0
- package/dist/explore-goal.js.map +1 -0
- package/dist/explore-shared.d.ts +152 -0
- package/dist/explore-shared.js +129 -0
- package/dist/explore-shared.js.map +1 -0
- package/dist/explore-specs.d.ts +53 -0
- package/dist/explore-specs.js +333 -0
- package/dist/explore-specs.js.map +1 -0
- package/dist/findings-filing.d.ts +64 -0
- package/dist/findings-filing.js +108 -0
- package/dist/findings-filing.js.map +1 -0
- package/dist/fixture-auth.d.ts +52 -0
- package/dist/fixture-auth.js +82 -0
- package/dist/fixture-auth.js.map +1 -0
- package/dist/fixture-cli.d.ts +70 -0
- package/dist/fixture-cli.js +178 -0
- package/dist/fixture-cli.js.map +1 -0
- package/dist/github-issue-filer.d.ts +62 -0
- package/dist/github-issue-filer.js +188 -0
- package/dist/github-issue-filer.js.map +1 -0
- package/dist/host-health-run.d.ts +24 -0
- package/dist/host-health-run.js +27 -0
- package/dist/host-health-run.js.map +1 -0
- package/dist/http-5xx-outcome.d.ts +6 -0
- package/dist/http-5xx-outcome.js +39 -0
- package/dist/http-5xx-outcome.js.map +1 -0
- package/dist/inbox-cli.d.ts +7 -0
- package/dist/inbox-cli.js +197 -0
- package/dist/inbox-cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init-cli.d.ts +4 -0
- package/dist/init-cli.js +127 -0
- package/dist/init-cli.js.map +1 -0
- package/dist/init-keys.d.ts +19 -2
- package/dist/init-keys.js +15 -4
- package/dist/init-keys.js.map +1 -1
- package/dist/init-next-steps.d.ts +35 -0
- package/dist/init-next-steps.js +79 -0
- package/dist/init-next-steps.js.map +1 -0
- package/dist/invariants-file.d.ts +34 -0
- package/dist/invariants-file.js +68 -0
- package/dist/invariants-file.js.map +1 -0
- package/dist/invariants-validate.d.ts +30 -0
- package/dist/invariants-validate.js +105 -0
- package/dist/invariants-validate.js.map +1 -0
- package/dist/journey-annotate-api.d.ts +76 -0
- package/dist/journey-annotate-api.js +256 -0
- package/dist/journey-annotate-api.js.map +1 -0
- package/dist/journey-annotate-cli.d.ts +9 -0
- package/dist/journey-annotate-cli.js +179 -0
- package/dist/journey-annotate-cli.js.map +1 -0
- package/dist/journey-api.d.ts +79 -2
- package/dist/journey-api.js +136 -19
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +4 -0
- package/dist/journey-cli.js +370 -0
- package/dist/journey-cli.js.map +1 -0
- package/dist/journey-demo-api.d.ts +112 -0
- package/dist/journey-demo-api.js +392 -0
- package/dist/journey-demo-api.js.map +1 -0
- package/dist/journey-demo-cli.d.ts +10 -0
- package/dist/journey-demo-cli.js +155 -0
- package/dist/journey-demo-cli.js.map +1 -0
- package/dist/kill-signal.d.ts +193 -0
- package/dist/kill-signal.js +284 -0
- package/dist/kill-signal.js.map +1 -0
- package/dist/launch-armed.d.ts +37 -0
- package/dist/launch-armed.js +31 -0
- package/dist/launch-armed.js.map +1 -0
- package/dist/ledger-api.d.ts +106 -0
- package/dist/ledger-api.js +237 -0
- package/dist/ledger-api.js.map +1 -0
- package/dist/ledger-cli.d.ts +18 -0
- package/dist/ledger-cli.js +107 -0
- package/dist/ledger-cli.js.map +1 -0
- package/dist/load-api.d.ts +29 -11
- package/dist/load-api.js +23 -15
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.d.ts +4 -0
- package/dist/load-cli.js +97 -0
- package/dist/load-cli.js.map +1 -0
- package/dist/log-correlation.d.ts +147 -0
- package/dist/log-correlation.js +325 -0
- package/dist/log-correlation.js.map +1 -0
- package/dist/log-lines.d.ts +131 -0
- package/dist/log-lines.js +389 -0
- package/dist/log-lines.js.map +1 -0
- package/dist/log-sources.d.ts +71 -0
- package/dist/log-sources.js +235 -0
- package/dist/log-sources.js.map +1 -0
- package/dist/logs-cli.d.ts +3 -0
- package/dist/logs-cli.js +51 -0
- package/dist/logs-cli.js.map +1 -0
- package/dist/logs-retention.d.ts +28 -0
- package/dist/logs-retention.js +84 -0
- package/dist/logs-retention.js.map +1 -0
- package/dist/mcp-api.d.ts +89 -1
- package/dist/mcp-api.js +472 -18
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +38 -0
- package/dist/mcp-args.js +131 -0
- package/dist/mcp-args.js.map +1 -0
- package/dist/mcp-cli-bridge.d.ts +34 -0
- package/dist/mcp-cli-bridge.js +62 -0
- package/dist/mcp-cli-bridge.js.map +1 -0
- package/dist/mcp-cli-runner.d.ts +29 -0
- package/dist/mcp-cli-runner.js +44 -0
- package/dist/mcp-cli-runner.js.map +1 -0
- package/dist/mcp-cli-tools.d.ts +125 -0
- package/dist/mcp-cli-tools.js +680 -0
- package/dist/mcp-cli-tools.js.map +1 -0
- package/dist/mcp-paths.d.ts +28 -0
- package/dist/mcp-paths.js +76 -0
- package/dist/mcp-paths.js.map +1 -0
- package/dist/mission-actors.d.ts +40 -0
- package/dist/mission-actors.js +72 -0
- package/dist/mission-actors.js.map +1 -0
- package/dist/mission-api.d.ts +35 -0
- package/dist/mission-api.js +58 -2
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.d.ts +4 -0
- package/dist/mission-cli.js +247 -0
- package/dist/mission-cli.js.map +1 -0
- package/dist/mission-exit.d.ts +22 -0
- package/dist/mission-exit.js +26 -0
- package/dist/mission-exit.js.map +1 -0
- package/dist/mission-fixtures.d.ts +225 -0
- package/dist/mission-fixtures.js +828 -0
- package/dist/mission-fixtures.js.map +1 -0
- package/dist/mission-journal.d.ts +60 -0
- package/dist/mission-journal.js +115 -0
- package/dist/mission-journal.js.map +1 -0
- package/dist/mission-queue-cli.d.ts +10 -0
- package/dist/mission-queue-cli.js +198 -0
- package/dist/mission-queue-cli.js.map +1 -0
- package/dist/mission-queue-runner.d.ts +126 -0
- package/dist/mission-queue-runner.js +397 -0
- package/dist/mission-queue-runner.js.map +1 -0
- package/dist/multi-run-cli.d.ts +37 -0
- package/dist/multi-run-cli.js +110 -0
- package/dist/multi-run-cli.js.map +1 -0
- package/dist/multi-run.d.ts +339 -0
- package/dist/multi-run.js +619 -0
- package/dist/multi-run.js.map +1 -0
- package/dist/openrouter-call.d.ts +22 -0
- package/dist/openrouter-call.js +63 -0
- package/dist/openrouter-call.js.map +1 -0
- package/dist/profile-cli.d.ts +4 -0
- package/dist/profile-cli.js +57 -0
- package/dist/profile-cli.js.map +1 -0
- package/dist/program.d.ts +3 -75
- package/dist/program.js +119 -1921
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +96 -0
- package/dist/project-dir.js +220 -0
- package/dist/project-dir.js.map +1 -0
- package/dist/record-api.d.ts +10 -6
- package/dist/record-api.js +39 -28
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.d.ts +4 -0
- package/dist/record-cli.js +64 -0
- package/dist/record-cli.js.map +1 -0
- package/dist/recording-cli.d.ts +4 -0
- package/dist/recording-cli.js +248 -0
- package/dist/recording-cli.js.map +1 -0
- package/dist/regression-api.d.ts +101 -0
- package/dist/regression-api.js +384 -5
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.d.ts +4 -0
- package/dist/regression-cli.js +232 -0
- package/dist/regression-cli.js.map +1 -0
- package/dist/report-api.d.ts +146 -0
- package/dist/report-api.js +430 -0
- package/dist/report-api.js.map +1 -0
- package/dist/report-cli.d.ts +12 -0
- package/dist/report-cli.js +147 -0
- package/dist/report-cli.js.map +1 -0
- package/dist/result-schema.d.ts +22 -0
- package/dist/result-schema.js +28 -0
- package/dist/result-schema.js.map +1 -0
- package/dist/run-index.d.ts +29 -0
- package/dist/run-index.js +70 -0
- package/dist/run-index.js.map +1 -0
- package/dist/run-screenshots.d.ts +123 -0
- package/dist/run-screenshots.js +229 -0
- package/dist/run-screenshots.js.map +1 -0
- package/dist/runtime-env.d.ts +8 -0
- package/dist/runtime-env.js +22 -0
- package/dist/runtime-env.js.map +1 -0
- package/dist/secret-args.d.ts +23 -0
- package/dist/secret-args.js +45 -0
- package/dist/secret-args.js.map +1 -0
- package/dist/serve-cli.d.ts +4 -0
- package/dist/serve-cli.js +95 -0
- package/dist/serve-cli.js.map +1 -0
- package/dist/server-log-verify.d.ts +34 -0
- package/dist/server-log-verify.js +115 -0
- package/dist/server-log-verify.js.map +1 -0
- package/dist/session-check.d.ts +14 -0
- package/dist/session-check.js +44 -0
- package/dist/session-check.js.map +1 -0
- package/dist/site-cli.d.ts +4 -0
- package/dist/site-cli.js +127 -0
- package/dist/site-cli.js.map +1 -0
- package/dist/site-gate-cli.d.ts +28 -0
- package/dist/site-gate-cli.js +58 -0
- package/dist/site-gate-cli.js.map +1 -0
- package/dist/source-api.js +18 -3
- package/dist/source-api.js.map +1 -1
- package/dist/source-cli.d.ts +4 -0
- package/dist/source-cli.js +284 -0
- package/dist/source-cli.js.map +1 -0
- package/dist/source-run-api.d.ts +27 -1
- package/dist/source-run-api.js +22 -11
- package/dist/source-run-api.js.map +1 -1
- package/dist/storage-state-snapshot.d.ts +50 -0
- package/dist/storage-state-snapshot.js +87 -0
- package/dist/storage-state-snapshot.js.map +1 -0
- package/dist/suite-explore-options.d.ts +289 -0
- package/dist/suite-explore-options.js +140 -0
- package/dist/suite-explore-options.js.map +1 -0
- package/dist/target-config.d.ts +109 -0
- package/dist/target-config.js +216 -0
- package/dist/target-config.js.map +1 -0
- package/dist/transcript-file.d.ts +12 -0
- package/dist/transcript-file.js +23 -0
- package/dist/transcript-file.js.map +1 -0
- package/dist/ui-api.d.ts +3 -0
- package/dist/ui-api.js +7 -1
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.d.ts +43 -0
- package/dist/usability-capture.js +326 -0
- package/dist/usability-capture.js.map +1 -0
- package/dist/usage-config.d.ts +36 -0
- package/dist/usage-config.js +114 -0
- package/dist/usage-config.js.map +1 -0
- package/dist/ux-api.d.ts +3 -75
- package/dist/ux-api.js +3 -220
- package/dist/ux-api.js.map +1 -1
- package/dist/ux-cli.d.ts +4 -0
- package/dist/ux-cli.js +102 -0
- package/dist/ux-cli.js.map +1 -0
- package/dist/ux-config.d.ts +29 -0
- package/dist/ux-config.js +103 -0
- package/dist/ux-config.js.map +1 -0
- package/dist/ux-evidence.d.ts +54 -0
- package/dist/ux-evidence.js +197 -0
- package/dist/ux-evidence.js.map +1 -0
- package/dist/ux-review.d.ts +112 -0
- package/dist/ux-review.js +151 -0
- package/dist/ux-review.js.map +1 -0
- package/dist/ux-usability.d.ts +238 -0
- package/dist/ux-usability.js +494 -0
- package/dist/ux-usability.js.map +1 -0
- package/dist/verify-fix-api.d.ts +173 -0
- package/dist/verify-fix-api.js +454 -0
- package/dist/verify-fix-api.js.map +1 -0
- package/dist/verify-fix-cli.d.ts +4 -0
- package/dist/verify-fix-cli.js +110 -0
- package/dist/verify-fix-cli.js.map +1 -0
- package/package.json +19 -14
- package/skills/jevitate-ci-check/SKILL.md +77 -0
- package/skills/jevitate-demo/SKILL.md +61 -0
- package/skills/jevitate-explore/SKILL.md +88 -87
- package/skills/jevitate-getting-started/SKILL.md +88 -0
- package/skills/jevitate-load-test/SKILL.md +11 -2
- package/skills/jevitate-mission-scope/SKILL.md +19 -11
- package/skills/jevitate-record/SKILL.md +23 -5
- package/skills/jevitate-run-journey/SKILL.md +61 -17
- package/skills/jevitate-sources/SKILL.md +57 -14
- package/skills/jevitate-ux-review/SKILL.md +106 -16
- package/skills/jevitate-verify-fix/SKILL.md +76 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type AnnotationChange, type AnnotationDraft, type IntentCoverage, type Journey } from "@jevitate/journey";
|
|
2
|
+
import { type GenerationPort } from "@jevitate/ai-core";
|
|
3
|
+
import { type RunJourneyProgrammaticallyOptions } from "./journey-api.js";
|
|
4
|
+
export declare class AnnotationDraftNotFoundError extends Error {
|
|
5
|
+
readonly code = "E_JOURNEY_ANNOTATIONS_NOT_FOUND";
|
|
6
|
+
}
|
|
7
|
+
export declare class InvalidAnnotationDraftError extends Error {
|
|
8
|
+
readonly code = "E_INVALID_ANNOTATIONS_DRAFT";
|
|
9
|
+
}
|
|
10
|
+
/** The Journey changed after the draft was made — approving would annotate steps it never saw. */
|
|
11
|
+
export declare class StaleAnnotationDraftError extends Error {
|
|
12
|
+
readonly code = "E_JOURNEY_ANNOTATIONS_STALE";
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Where a Journey's draft lives: `<journeys>/.drafts/<id>.annotations.json` (`<ns>/<id>` for a shared
|
|
16
|
+
* Journey). A dot-folder, so `journey list` and namespace discovery never read it as a Journey.
|
|
17
|
+
*/
|
|
18
|
+
export declare function annotationDraftPath(journeysDir: string, id: string): string;
|
|
19
|
+
/** The Journey's content hash — what a draft is bound to. */
|
|
20
|
+
export declare function journeyContentHash(journey: Journey): string;
|
|
21
|
+
export interface AnnotateJourneyOptions extends Omit<RunJourneyProgrammaticallyOptions, "interpreter" | "policy" | "selfHealer"> {
|
|
22
|
+
/** The generation gateway that drafts the text (`--real` / `--fake-ai`). */
|
|
23
|
+
gen: GenerationPort;
|
|
24
|
+
/** Testing seam for the draft's timestamp. */
|
|
25
|
+
now?: () => string;
|
|
26
|
+
}
|
|
27
|
+
export interface AnnotateJourneyResult {
|
|
28
|
+
readonly id: string;
|
|
29
|
+
readonly draftPath: string;
|
|
30
|
+
readonly replay: AnnotationDraft["replay"];
|
|
31
|
+
readonly drafted: {
|
|
32
|
+
readonly objectives: number;
|
|
33
|
+
readonly expectedResults: number;
|
|
34
|
+
readonly goal: boolean;
|
|
35
|
+
readonly successCriteria: number;
|
|
36
|
+
};
|
|
37
|
+
/** What approving the draft would change (the same diff `--approve` shows). */
|
|
38
|
+
readonly proposed: AnnotationChange[];
|
|
39
|
+
readonly coverage: IntentCoverage;
|
|
40
|
+
/** #251 `--screenshots`: the replay's masked screenshots and their `index.md`. */
|
|
41
|
+
readonly screenshotPaths?: string[];
|
|
42
|
+
readonly screenshotIndex?: string;
|
|
43
|
+
readonly screenshotsSkipped?: Array<{
|
|
44
|
+
readonly step: number;
|
|
45
|
+
readonly reason: string;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Replays the Journey through `runJourneyProgrammatically` (the same session, site policy, fixtures
|
|
50
|
+
* and fail-closed policy as `journey run`) with an observing interpreter, then drafts. A replay that
|
|
51
|
+
* stops early still drafts the steps it reached (`replay.outcome: "stopped"`).
|
|
52
|
+
*
|
|
53
|
+
* Environments (#247): every browser/session option `journey run` takes rides in `opts` and is
|
|
54
|
+
* handed to `runJourneyProgrammatically` unchanged — including `environment` (`--env`/`--base-url`,
|
|
55
|
+
* resolved by `resolveJourneyEnvironment`), so the replay is rebased and allowlisted exactly as a run.
|
|
56
|
+
*/
|
|
57
|
+
export declare function annotateJourney(opts: AnnotateJourneyOptions): Promise<AnnotateJourneyResult>;
|
|
58
|
+
export interface ApproveAnnotationsResult {
|
|
59
|
+
readonly id: string;
|
|
60
|
+
readonly draftPath: string;
|
|
61
|
+
readonly changes: AnnotationChange[];
|
|
62
|
+
readonly coverage: IntentCoverage;
|
|
63
|
+
}
|
|
64
|
+
/** Reads and validates a Journey's draft (not found / invalid are typed refusals). */
|
|
65
|
+
export declare function readAnnotationDraft(dir: string, id: string): Promise<{
|
|
66
|
+
draft: AnnotationDraft;
|
|
67
|
+
draftPath: string;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* The human approval gate (like `journey promote`): applies the reviewed draft to the Journey and
|
|
71
|
+
* removes the draft. Refuses — writing nothing — when the Journey changed since the draft was made
|
|
72
|
+
* (its content hash differs) or the draft names steps the Journey does not have.
|
|
73
|
+
*/
|
|
74
|
+
export declare function approveJourneyAnnotations(dir: string, id: string): Promise<ApproveAnnotationsResult>;
|
|
75
|
+
/** `journey run`'s informational intent line (#246): how many steps say why. Never fails a run. */
|
|
76
|
+
export declare function journeyIntentCoverage(dir: string, id: string): Promise<IntentCoverage | undefined>;
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { AnnotationDraftMismatchError, AnnotationDraftSchema, FsJourneyStore, applyAnnotationDraft, describeStep, flatJourneySteps, intentCoverage, secretParamValues, } from "@jevitate/journey";
|
|
4
|
+
import { assertNoSecretInPayload, redactText, redactUrl } from "@jevitate/ai-core";
|
|
5
|
+
import { contentHash } from "@jevitate/domain";
|
|
6
|
+
import { BrowseTheWebToken } from "@jevitate/screenplay";
|
|
7
|
+
import { runJourneyProgrammatically, UnknownJourneyError } from "./journey-api.js";
|
|
8
|
+
/**
|
|
9
|
+
* #246 — `jevitate journey annotate`: replay a Journey, capture redacted before/after page evidence
|
|
10
|
+
* per step, and ask the generation gateway to DRAFT each step's objective / expected result (and the
|
|
11
|
+
* Journey's goal / success criteria when missing). The draft goes to a sidecar file and NEVER into
|
|
12
|
+
* the Journey: `approveJourneyAnnotations` writes it only on an explicit human approval, and only
|
|
13
|
+
* while the Journey is unchanged since the draft (content hash).
|
|
14
|
+
*/
|
|
15
|
+
/** Visible text kept per page for the model (redacted first, then bounded). */
|
|
16
|
+
const EVIDENCE_TEXT_CHARS = 1500;
|
|
17
|
+
export class AnnotationDraftNotFoundError extends Error {
|
|
18
|
+
code = "E_JOURNEY_ANNOTATIONS_NOT_FOUND";
|
|
19
|
+
}
|
|
20
|
+
export class InvalidAnnotationDraftError extends Error {
|
|
21
|
+
code = "E_INVALID_ANNOTATIONS_DRAFT";
|
|
22
|
+
}
|
|
23
|
+
/** The Journey changed after the draft was made — approving would annotate steps it never saw. */
|
|
24
|
+
export class StaleAnnotationDraftError extends Error {
|
|
25
|
+
code = "E_JOURNEY_ANNOTATIONS_STALE";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Where a Journey's draft lives: `<journeys>/.drafts/<id>.annotations.json` (`<ns>/<id>` for a shared
|
|
29
|
+
* Journey). A dot-folder, so `journey list` and namespace discovery never read it as a Journey.
|
|
30
|
+
*/
|
|
31
|
+
export function annotationDraftPath(journeysDir, id) {
|
|
32
|
+
const parts = id.split("/");
|
|
33
|
+
return join(journeysDir, ".drafts", ...parts.slice(0, -1), `${parts[parts.length - 1] ?? id}.annotations.json`);
|
|
34
|
+
}
|
|
35
|
+
/** The Journey's content hash — what a draft is bound to. */
|
|
36
|
+
export function journeyContentHash(journey) {
|
|
37
|
+
return contentHash(journey);
|
|
38
|
+
}
|
|
39
|
+
async function loadJourney(dir, id) {
|
|
40
|
+
const journey = await new FsJourneyStore(dir).get(id);
|
|
41
|
+
if (journey === null)
|
|
42
|
+
throw new UnknownJourneyError(`unknown journey '${id}'`);
|
|
43
|
+
return journey;
|
|
44
|
+
}
|
|
45
|
+
/** BROWSER CODE — the page's main heading (else its title) and visible text. */
|
|
46
|
+
function readPage() {
|
|
47
|
+
const h1 = document.querySelector("h1");
|
|
48
|
+
const heading = (h1?.innerText ?? h1?.textContent ?? "").trim() || (document.title ?? "");
|
|
49
|
+
return { heading, text: document.body?.innerText ?? "" };
|
|
50
|
+
}
|
|
51
|
+
/** Redacted page evidence (never throws: an unreadable page is empty evidence). */
|
|
52
|
+
async function capture(actor, secrets) {
|
|
53
|
+
const page = actor.ability(BrowseTheWebToken).session.page;
|
|
54
|
+
const raw = await page.evaluate(readPage).catch(() => ({ heading: "", text: "" }));
|
|
55
|
+
const scrub = (s) => redactText(s, secrets);
|
|
56
|
+
return {
|
|
57
|
+
url: scrub(redactUrl(page.url())),
|
|
58
|
+
heading: scrub(raw.heading.replace(/\s+/g, " ").trim()).slice(0, 300),
|
|
59
|
+
// Redact the WHOLE text before bounding it, so a cut never splits a secret past the redactor.
|
|
60
|
+
text: scrub(raw.text.replace(/[ \t]+/g, " ").replace(/\n{3,}/g, "\n\n").trim()).slice(0, EVIDENCE_TEXT_CHARS),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Replays the Journey through `runJourneyProgrammatically` (the same session, site policy, fixtures
|
|
65
|
+
* and fail-closed policy as `journey run`) with an observing interpreter, then drafts. A replay that
|
|
66
|
+
* stops early still drafts the steps it reached (`replay.outcome: "stopped"`).
|
|
67
|
+
*
|
|
68
|
+
* Environments (#247): every browser/session option `journey run` takes rides in `opts` and is
|
|
69
|
+
* handed to `runJourneyProgrammatically` unchanged — including `environment` (`--env`/`--base-url`,
|
|
70
|
+
* resolved by `resolveJourneyEnvironment`), so the replay is rebased and allowlisted exactly as a run.
|
|
71
|
+
*/
|
|
72
|
+
export async function annotateJourney(opts) {
|
|
73
|
+
const journey = await loadJourney(opts.dir, opts.id);
|
|
74
|
+
const journeyHash = journeyContentHash(journey);
|
|
75
|
+
const secrets = secretParamValues(journey, opts.params);
|
|
76
|
+
const flat = flatJourneySteps(journey);
|
|
77
|
+
const before = new Map();
|
|
78
|
+
const after = new Map();
|
|
79
|
+
const observer = {
|
|
80
|
+
beforeStep: async ({ actor, index }) => {
|
|
81
|
+
before.set(index, await capture(actor, secrets));
|
|
82
|
+
},
|
|
83
|
+
afterStep: async ({ actor, index, outcome }) => {
|
|
84
|
+
after.set(index, outcome === "done" ? await capture(actor, secrets) : null);
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
const { gen, now, ...runOpts } = opts;
|
|
88
|
+
const run = await runJourneyProgrammatically({ ...runOpts, observer });
|
|
89
|
+
const reachedSteps = before.size;
|
|
90
|
+
const replay = run.outcome === "quarantined"
|
|
91
|
+
? { outcome: "stopped", reachedSteps, totalSteps: flat.length, reason: redactText(run.reason, secrets).slice(0, 2000) }
|
|
92
|
+
: { outcome: "completed", reachedSteps, totalSteps: flat.length };
|
|
93
|
+
const m = journey.metadata;
|
|
94
|
+
const context = redactText(m.goal ?? [m.name, m.description, journey.recording.intent].filter((s) => s !== undefined && s !== "").join(" — "), secrets);
|
|
95
|
+
const clean = (s) => {
|
|
96
|
+
const t = s === null || s === undefined ? "" : redactText(s, secrets).trim();
|
|
97
|
+
return t === "" ? undefined : t;
|
|
98
|
+
};
|
|
99
|
+
let provenance;
|
|
100
|
+
const steps = [];
|
|
101
|
+
const stepLines = [];
|
|
102
|
+
for (const s of flat) {
|
|
103
|
+
const described = redactText(describeStep(s.recorded.step), secrets);
|
|
104
|
+
const b = before.get(s.index);
|
|
105
|
+
const needObjective = (s.recorded.objective ?? "").trim() === "";
|
|
106
|
+
const needExpected = (s.recorded.expectedResult ?? "").trim() === "";
|
|
107
|
+
let objective = s.recorded.objective;
|
|
108
|
+
if (b !== undefined && (needObjective || needExpected)) {
|
|
109
|
+
const a = after.get(s.index) ?? null;
|
|
110
|
+
const input = { journey: context, stepNumber: s.index + 1, totalSteps: flat.length, step: described, before: b, after: a };
|
|
111
|
+
assertNoSecretInPayload(input, secrets); // fail closed: nothing secret reaches a model
|
|
112
|
+
const { output, provenance: p } = await gen.generate("journey.step", input);
|
|
113
|
+
provenance = p;
|
|
114
|
+
const draftObjective = needObjective ? clean(output.objective) : undefined;
|
|
115
|
+
const draftExpected = needExpected ? clean(output.expectedResult) : undefined;
|
|
116
|
+
objective = draftObjective ?? objective;
|
|
117
|
+
if (draftObjective !== undefined || draftExpected !== undefined) {
|
|
118
|
+
steps.push({
|
|
119
|
+
index: s.index,
|
|
120
|
+
step: described.slice(0, 1000),
|
|
121
|
+
...(draftObjective === undefined ? {} : { objective: draftObjective }),
|
|
122
|
+
...(draftExpected === undefined ? {} : { expectedResult: draftExpected }),
|
|
123
|
+
evidence: {
|
|
124
|
+
before: { url: b.url, heading: b.heading },
|
|
125
|
+
after: a === null ? null : { url: a.url, heading: a.heading },
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
stepLines.push(`${s.index + 1}. ${described}${objective === undefined ? "" : ` — ${redactText(objective, secrets)}`}`.slice(0, 1200));
|
|
131
|
+
}
|
|
132
|
+
let goal;
|
|
133
|
+
let successCriteria;
|
|
134
|
+
const needGoal = (m.goal ?? "").trim() === "";
|
|
135
|
+
const needCriteria = (m.successCriteria ?? []).length === 0;
|
|
136
|
+
if (needGoal || needCriteria) {
|
|
137
|
+
const lastReached = [...before.keys()].sort((x, y) => y - x)[0];
|
|
138
|
+
const finalPage = lastReached === undefined ? null : (after.get(lastReached) ?? before.get(lastReached) ?? null);
|
|
139
|
+
const input = {
|
|
140
|
+
name: redactText(m.name, secrets).slice(0, 500),
|
|
141
|
+
...(m.description === undefined ? {} : { description: redactText(m.description, secrets).slice(0, 2000) }),
|
|
142
|
+
...(journey.recording.intent === undefined ? {} : { intent: redactText(journey.recording.intent, secrets).slice(0, 2000) }),
|
|
143
|
+
steps: stepLines.slice(0, 200),
|
|
144
|
+
finalPage,
|
|
145
|
+
};
|
|
146
|
+
assertNoSecretInPayload(input, secrets);
|
|
147
|
+
const { output, provenance: p } = await gen.generate("journey.goal", input);
|
|
148
|
+
provenance = p;
|
|
149
|
+
if (needGoal)
|
|
150
|
+
goal = clean(output.goal);
|
|
151
|
+
if (needCriteria) {
|
|
152
|
+
const criteria = output.successCriteria.map((c) => clean(c)).filter((c) => c !== undefined);
|
|
153
|
+
if (criteria.length > 0)
|
|
154
|
+
successCriteria = criteria;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
const draft = AnnotationDraftSchema.parse({
|
|
158
|
+
kind: "jevitate.journey-annotations.draft",
|
|
159
|
+
version: 1,
|
|
160
|
+
journeyId: opts.id,
|
|
161
|
+
journeyHash,
|
|
162
|
+
createdAtIso: (now ?? (() => new Date().toISOString()))(),
|
|
163
|
+
provenance: provenance === undefined
|
|
164
|
+
? { adapter: "none", model: "none", promptVersion: "none" }
|
|
165
|
+
: { adapter: provenance.adapter, model: provenance.model, promptVersion: provenance.promptVersion },
|
|
166
|
+
replay,
|
|
167
|
+
...(goal === undefined ? {} : { goal }),
|
|
168
|
+
...(successCriteria === undefined ? {} : { successCriteria }),
|
|
169
|
+
steps,
|
|
170
|
+
});
|
|
171
|
+
assertNoSecretInPayload(draft, secrets, "journey annotation draft"); // the last line: never at rest
|
|
172
|
+
const draftPath = annotationDraftPath(opts.dir, opts.id);
|
|
173
|
+
await mkdir(dirname(draftPath), { recursive: true, mode: 0o700 });
|
|
174
|
+
await writeFile(draftPath, `${JSON.stringify(draft, null, 2)}\n`, { mode: 0o600 });
|
|
175
|
+
return {
|
|
176
|
+
id: opts.id,
|
|
177
|
+
draftPath,
|
|
178
|
+
replay,
|
|
179
|
+
drafted: {
|
|
180
|
+
objectives: steps.filter((s) => s.objective !== undefined).length,
|
|
181
|
+
expectedResults: steps.filter((s) => s.expectedResult !== undefined).length,
|
|
182
|
+
goal: goal !== undefined,
|
|
183
|
+
successCriteria: successCriteria?.length ?? 0,
|
|
184
|
+
},
|
|
185
|
+
proposed: applyAnnotationDraft(journey, draft).changes,
|
|
186
|
+
coverage: intentCoverage(journey),
|
|
187
|
+
...(run.screenshotPaths === undefined ? {} : { screenshotPaths: run.screenshotPaths }),
|
|
188
|
+
...(run.screenshotIndex === undefined ? {} : { screenshotIndex: run.screenshotIndex }),
|
|
189
|
+
...(run.screenshotsSkipped === undefined ? {} : { screenshotsSkipped: run.screenshotsSkipped }),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/** Reads and validates a Journey's draft (not found / invalid are typed refusals). */
|
|
193
|
+
export async function readAnnotationDraft(dir, id) {
|
|
194
|
+
const draftPath = annotationDraftPath(dir, id);
|
|
195
|
+
let raw;
|
|
196
|
+
try {
|
|
197
|
+
raw = await readFile(draftPath, "utf8");
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
if (err.code === "ENOENT") {
|
|
201
|
+
throw new AnnotationDraftNotFoundError(`no annotation draft for journey '${id}' (${draftPath}) — run \`jevitate journey annotate ${id}\` first`);
|
|
202
|
+
}
|
|
203
|
+
throw err;
|
|
204
|
+
}
|
|
205
|
+
let parsed;
|
|
206
|
+
try {
|
|
207
|
+
parsed = JSON.parse(raw);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
throw new InvalidAnnotationDraftError(`${draftPath} is not JSON: ${err instanceof Error ? err.message : String(err)}`);
|
|
211
|
+
}
|
|
212
|
+
const result = AnnotationDraftSchema.safeParse(parsed);
|
|
213
|
+
if (!result.success) {
|
|
214
|
+
throw new InvalidAnnotationDraftError(`${draftPath} is not a valid annotation draft: ${result.error.issues.map((i) => `${i.path.join(".")}: ${i.message}`).join("; ")}`);
|
|
215
|
+
}
|
|
216
|
+
if (result.data.journeyId !== id) {
|
|
217
|
+
throw new InvalidAnnotationDraftError(`${draftPath} is a draft for journey '${result.data.journeyId}', not '${id}'`);
|
|
218
|
+
}
|
|
219
|
+
return { draft: result.data, draftPath };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* The human approval gate (like `journey promote`): applies the reviewed draft to the Journey and
|
|
223
|
+
* removes the draft. Refuses — writing nothing — when the Journey changed since the draft was made
|
|
224
|
+
* (its content hash differs) or the draft names steps the Journey does not have.
|
|
225
|
+
*/
|
|
226
|
+
export async function approveJourneyAnnotations(dir, id) {
|
|
227
|
+
const journey = await loadJourney(dir, id);
|
|
228
|
+
const { draft, draftPath } = await readAnnotationDraft(dir, id);
|
|
229
|
+
if (journeyContentHash(journey) !== draft.journeyHash) {
|
|
230
|
+
throw new StaleAnnotationDraftError(`journey '${id}' changed after this draft was made (${draftPath}) — re-run \`jevitate journey annotate ${id}\` to draft against the current Journey`);
|
|
231
|
+
}
|
|
232
|
+
let applied;
|
|
233
|
+
try {
|
|
234
|
+
applied = applyAnnotationDraft(journey, draft);
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
if (err instanceof AnnotationDraftMismatchError)
|
|
238
|
+
throw new InvalidAnnotationDraftError(err.message);
|
|
239
|
+
throw err;
|
|
240
|
+
}
|
|
241
|
+
if (applied.changes.length > 0)
|
|
242
|
+
await new FsJourneyStore(dir).put(applied.journey);
|
|
243
|
+
await rm(draftPath, { force: true });
|
|
244
|
+
return { id, draftPath, changes: applied.changes, coverage: intentCoverage(applied.journey) };
|
|
245
|
+
}
|
|
246
|
+
/** `journey run`'s informational intent line (#246): how many steps say why. Never fails a run. */
|
|
247
|
+
export async function journeyIntentCoverage(dir, id) {
|
|
248
|
+
try {
|
|
249
|
+
const journey = await new FsJourneyStore(dir).get(id);
|
|
250
|
+
return journey === null ? undefined : intentCoverage(journey);
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return undefined;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=journey-annotate-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-annotate-api.js","sourceRoot":"","sources":["../src/journey-annotate-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type CliDeps } from "./cli-shared.js";
|
|
3
|
+
/**
|
|
4
|
+
* #246 — `jevitate journey annotate <id>`: replay the Journey and DRAFT its intent (each step's
|
|
5
|
+
* objective / expected result, the goal and success criteria when missing) into a sidecar file;
|
|
6
|
+
* `--approve` is the human gate that writes a reviewed draft into the Journey (refused when the
|
|
7
|
+
* Journey changed since the draft). The model never edits a Journey on its own.
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerJourneyAnnotateCommand(journey: Command, program: Command, deps: CliDeps): void;
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { ParamValidationError, formatAnnotationChanges } from "@jevitate/journey";
|
|
3
|
+
import { MissingCredentialError, SecretLeakError } from "@jevitate/ai-core";
|
|
4
|
+
import { SiteGateRefusedError } from "@jevitate/runtime";
|
|
5
|
+
import { ok, fail } from "./envelope.js";
|
|
6
|
+
import { UnknownJourneyError, JourneyRequiresAuthError } from "./journey-api.js";
|
|
7
|
+
import { formatScreenshotsLine, parseScreenshotsArg } from "./run-screenshots.js";
|
|
8
|
+
import { annotateJourney, approveJourneyAnnotations, AnnotationDraftNotFoundError, InvalidAnnotationDraftError, StaleAnnotationDraftError, } from "./journey-annotate-api.js";
|
|
9
|
+
import { withSiteGate } from "./site-gate-cli.js";
|
|
10
|
+
import { buildMissionFixtures, checkSetupRefs, withFixtureFlags } from "./fixture-cli.js";
|
|
11
|
+
import { FixtureSetupError, FixtureSpecError, UnboundSetupRefError } from "./mission-fixtures.js";
|
|
12
|
+
import { withEngine } from "./engine.js";
|
|
13
|
+
import { EXIT_CODES } from "./exit-codes.js";
|
|
14
|
+
import { environmentFromFlags, isEnvironmentError, withEnvironmentFlags } from "./environments.js";
|
|
15
|
+
import { resolveDbPath, resolveJourneysDir, withBrowserLaunchFlags, withScreenshotsFlag, browserOption, withEmulationFlags, emulationFromFlags, collectParam, emitJson, emitUsageLine, environmentSeams, GatewaySelectionError, buildGenerationGateway, } from "./cli-shared.js";
|
|
16
|
+
/**
|
|
17
|
+
* #246 — `jevitate journey annotate <id>`: replay the Journey and DRAFT its intent (each step's
|
|
18
|
+
* objective / expected result, the goal and success criteria when missing) into a sidecar file;
|
|
19
|
+
* `--approve` is the human gate that writes a reviewed draft into the Journey (refused when the
|
|
20
|
+
* Journey changed since the draft). The model never edits a Journey on its own.
|
|
21
|
+
*/
|
|
22
|
+
export function registerJourneyAnnotateCommand(journey, program, deps) {
|
|
23
|
+
withScreenshotsFlag(withEnvironmentFlags(withBrowserLaunchFlags(withEmulationFlags(withFixtureFlags(journey.command("annotate <id>"))))))
|
|
24
|
+
.description("draft each step's objective/expected result (and the goal/success criteria when missing) by replaying the Journey; " +
|
|
25
|
+
"writes a reviewable draft, never the Journey — `--approve` applies a reviewed draft (human gate)")
|
|
26
|
+
.option("--dir <path>", "journeys directory (default: the repo's .jevitate/journeys; outside a repo ~/.jevitate/journeys)")
|
|
27
|
+
.option("--param <kv>", "param as key=value (repeatable)", collectParam, {})
|
|
28
|
+
.option("--storage-state <file>", "Playwright storageState JSON to start the replay authenticated; must exist")
|
|
29
|
+
.option("--real", "draft with the live OpenRouter generation gateway (requires keys)", false)
|
|
30
|
+
.option("--fake-ai", "draft with the deterministic fake generator (pipeline smoke only)", false)
|
|
31
|
+
.option("--approve", "apply the reviewed draft to the Journey (shows the diff; refused if the Journey changed since the draft)", false)
|
|
32
|
+
.option("--json", "emit a JSON envelope")
|
|
33
|
+
.action(async function (id) {
|
|
34
|
+
const ownFixtureFlags = this.opts();
|
|
35
|
+
const { dir, param, storageState: storageStateFlag, real, fakeAi, approve, json, env: envName, baseUrl, screenshots: screenshotsFlag, ...emulationFlags } = this.opts();
|
|
36
|
+
const out = program.configureOutput().writeOut;
|
|
37
|
+
const journeysDir = resolveJourneysDir(deps, dir);
|
|
38
|
+
if (approve === true) {
|
|
39
|
+
if (real === true ||
|
|
40
|
+
fakeAi === true ||
|
|
41
|
+
Object.keys(param).length > 0 ||
|
|
42
|
+
storageStateFlag !== undefined ||
|
|
43
|
+
envName !== undefined ||
|
|
44
|
+
baseUrl !== undefined ||
|
|
45
|
+
screenshotsFlag !== undefined) {
|
|
46
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", "--approve applies an existing draft: it replays nothing, so it takes no --real/--fake-ai/--param/--storage-state/--env/--base-url/--screenshots"));
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const result = await approveJourneyAnnotations(journeysDir, id);
|
|
51
|
+
if (json) {
|
|
52
|
+
emitJson(program, ok(result));
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
out?.(formatAnnotationChanges(result.changes));
|
|
56
|
+
out?.(`applied ${result.changes.length} change(s) to journey '${id}' (${result.coverage.withObjective}/${result.coverage.steps} steps now have an objective)\n`);
|
|
57
|
+
process.exitCode = EXIT_CODES.ok;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (err instanceof UnknownJourneyError)
|
|
62
|
+
emitJson(program, fail("E_UNKNOWN_JOURNEY", err.message));
|
|
63
|
+
else if (err instanceof AnnotationDraftNotFoundError || err instanceof InvalidAnnotationDraftError || err instanceof StaleAnnotationDraftError) {
|
|
64
|
+
emitJson(program, fail(err.code, err.message));
|
|
65
|
+
}
|
|
66
|
+
else
|
|
67
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// #247: --env/--base-url choose where the replay runs — the same resolver as `journey run`
|
|
72
|
+
// (unknown env / bad file / secret in environments.json → 64, nothing opened).
|
|
73
|
+
let environment;
|
|
74
|
+
try {
|
|
75
|
+
environment = environmentFromFlags({ ...(envName === undefined ? {} : { env: envName }), ...(baseUrl === undefined ? {} : { baseUrl }) }, environmentSeams(deps));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
if (!isEnvironmentError(err))
|
|
79
|
+
throw err;
|
|
80
|
+
emitJson(program, fail(err.code, err.message));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// The environment's fixtures/hooks apply when the flags name none (hooks still need --allow-shell-hooks).
|
|
84
|
+
const fixtureFlags = {
|
|
85
|
+
...ownFixtureFlags,
|
|
86
|
+
...(ownFixtureFlags.before === undefined && environment?.hooks?.before !== undefined ? { before: environment.hooks.before } : {}),
|
|
87
|
+
...(ownFixtureFlags.after === undefined && environment?.hooks?.after !== undefined ? { after: environment.hooks.after } : {}),
|
|
88
|
+
};
|
|
89
|
+
// --storage-state wins; else the environment's own session (~/.jevitate/targets.json[<origin>]).
|
|
90
|
+
const storageState = storageStateFlag ?? environment?.storageState;
|
|
91
|
+
if (storageState !== undefined && !existsSync(storageState)) {
|
|
92
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", `storage state not found: ${storageState}`));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let emulation;
|
|
96
|
+
let screenshots;
|
|
97
|
+
try {
|
|
98
|
+
emulation = emulationFromFlags(emulationFlags);
|
|
99
|
+
screenshots = parseScreenshotsArg(screenshotsFlag);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_ARGS", err instanceof Error ? err.message : String(err)));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
let gateway;
|
|
106
|
+
try {
|
|
107
|
+
gateway = await buildGenerationGateway(deps, { real: real ?? false, fakeAi: fakeAi ?? false });
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
if (err instanceof MissingCredentialError || err instanceof GatewaySelectionError)
|
|
111
|
+
emitJson(program, fail("E_AI_SETUP_REQUIRED", err.message));
|
|
112
|
+
else
|
|
113
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
const result = await withSiteGate(resolveDbPath(deps), (siteGate) => annotateJourney({
|
|
118
|
+
...(siteGate === undefined ? {} : { siteGate }),
|
|
119
|
+
dir: journeysDir,
|
|
120
|
+
id,
|
|
121
|
+
params: param,
|
|
122
|
+
gen: gateway.gen,
|
|
123
|
+
browserPortFactory: deps.explore?.browserPortFactory,
|
|
124
|
+
...browserOption(this.opts()),
|
|
125
|
+
...(emulation === undefined ? {} : { emulation }),
|
|
126
|
+
...(screenshots === undefined ? {} : { screenshots }),
|
|
127
|
+
...(storageState !== undefined ? { storageState } : {}),
|
|
128
|
+
...(environment === undefined ? {} : { environment }),
|
|
129
|
+
fixtures: (site) => {
|
|
130
|
+
const fx = buildMissionFixtures(fixtureFlags, {
|
|
131
|
+
allowlist: environment === undefined ? [site] : environment.allowedOrigins,
|
|
132
|
+
baseUrl: site,
|
|
133
|
+
...(storageState !== undefined ? { storageState } : {}),
|
|
134
|
+
...(environment?.fixtures === undefined ? {} : { targetFixtures: environment.fixtures }),
|
|
135
|
+
});
|
|
136
|
+
checkSetupRefs({ "--param": Object.values(param) }, fx);
|
|
137
|
+
return fx;
|
|
138
|
+
},
|
|
139
|
+
}));
|
|
140
|
+
const data = withEngine({ ...result, usage: gateway.usage.snapshot() });
|
|
141
|
+
// A replay that stopped early drafted only the steps it reached: the command did not finish its work.
|
|
142
|
+
const exit = result.replay.outcome === "completed" ? EXIT_CODES.ok : EXIT_CODES.inconclusive;
|
|
143
|
+
if (json) {
|
|
144
|
+
emitJson(program, ok(data));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
const r = result.replay;
|
|
148
|
+
out?.(`drafted annotations for journey '${id}' (${r.reachedSteps}/${r.totalSteps} steps replayed${r.outcome === "stopped" ? `; stopped: ${r.reason ?? "unknown"}` : ""}): ` +
|
|
149
|
+
`${result.drafted.objectives} objective(s), ${result.drafted.expectedResults} expected result(s)` +
|
|
150
|
+
`${result.drafted.goal ? ", a goal" : ""}${result.drafted.successCriteria > 0 ? `, ${result.drafted.successCriteria} success criterion(s)` : ""}\n`);
|
|
151
|
+
out?.(formatAnnotationChanges(result.proposed));
|
|
152
|
+
out?.(`draft: ${result.draftPath}\nreview or edit it, then apply it: jevitate journey annotate ${id} --approve\n`);
|
|
153
|
+
if (result.screenshotIndex !== undefined)
|
|
154
|
+
out?.(formatScreenshotsLine(result));
|
|
155
|
+
emitUsageLine(program, data);
|
|
156
|
+
}
|
|
157
|
+
process.exitCode = exit;
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
if (err instanceof SiteGateRefusedError || isEnvironmentError(err))
|
|
161
|
+
emitJson(program, fail(err.code, err.message));
|
|
162
|
+
else if (err instanceof UnknownJourneyError)
|
|
163
|
+
emitJson(program, fail("E_UNKNOWN_JOURNEY", err.message));
|
|
164
|
+
else if (err instanceof JourneyRequiresAuthError)
|
|
165
|
+
emitJson(program, fail("E_JOURNEY_REQUIRES_AUTH", err.message));
|
|
166
|
+
else if (err instanceof ParamValidationError)
|
|
167
|
+
emitJson(program, fail("E_INVALID_PARAMS", err.message));
|
|
168
|
+
else if (err instanceof FixtureSpecError || err instanceof UnboundSetupRefError)
|
|
169
|
+
emitJson(program, fail(err.code, err.message));
|
|
170
|
+
else if (err instanceof FixtureSetupError)
|
|
171
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", err.message));
|
|
172
|
+
else if (err instanceof SecretLeakError)
|
|
173
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE_SECRET", err.message));
|
|
174
|
+
else
|
|
175
|
+
emitJson(program, fail("E_JOURNEY_ANNOTATE", String(err instanceof Error ? err.message : err)));
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=journey-annotate-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"journey-annotate-cli.js","sourceRoot":"","sources":["../src/journey-annotate-cli.ts"],"names":[],"mappings":"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"}
|