@jevitate/cli 0.16.1 → 0.18.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 +55 -5
- package/dist/author-journey-cli.js +11 -8
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +3126 -1078
- package/dist/build-info.generated.js +3 -3
- package/dist/catalog-api.d.ts +22 -0
- package/dist/catalog-api.js +49 -0
- package/dist/catalog-api.js.map +1 -1
- package/dist/catalog-cli.js +59 -37
- package/dist/catalog-cli.js.map +1 -1
- package/dist/cli-shared.d.ts +6 -1
- package/dist/cli-shared.js +11 -2
- package/dist/cli-shared.js.map +1 -1
- package/dist/exit-codes.js +9 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/journey-anchor-cli.js +16 -8
- package/dist/journey-anchor-cli.js.map +1 -1
- package/dist/journey-annotate-cli.js +10 -5
- package/dist/journey-annotate-cli.js.map +1 -1
- package/dist/journey-api.d.ts +10 -0
- package/dist/journey-api.js +23 -2
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-bundle.d.ts +83 -0
- package/dist/journey-bundle.js +252 -0
- package/dist/journey-bundle.js.map +1 -0
- package/dist/journey-chain.d.ts +105 -0
- package/dist/journey-chain.js +331 -0
- package/dist/journey-chain.js.map +1 -0
- package/dist/journey-cli/anchors.js +11 -6
- package/dist/journey-cli/anchors.js.map +1 -1
- package/dist/journey-cli/chain.d.ts +8 -0
- package/dist/journey-cli/chain.js +113 -0
- package/dist/journey-cli/chain.js.map +1 -0
- package/dist/journey-cli/find.js +10 -5
- package/dist/journey-cli/find.js.map +1 -1
- package/dist/journey-cli/lint.js +13 -9
- package/dist/journey-cli/lint.js.map +1 -1
- package/dist/journey-cli/list.js +10 -5
- package/dist/journey-cli/list.js.map +1 -1
- package/dist/journey-cli/migrate.js +13 -6
- package/dist/journey-cli/migrate.js.map +1 -1
- package/dist/journey-cli/promote.js +11 -6
- package/dist/journey-cli/promote.js.map +1 -1
- package/dist/journey-cli/publish.js +12 -6
- package/dist/journey-cli/publish.js.map +1 -1
- package/dist/journey-cli/review.js +14 -8
- package/dist/journey-cli/review.js.map +1 -1
- package/dist/journey-cli/run.js +25 -10
- package/dist/journey-cli/run.js.map +1 -1
- package/dist/journey-cli/shared.d.ts +19 -1
- package/dist/journey-cli/shared.js +28 -0
- package/dist/journey-cli/shared.js.map +1 -1
- package/dist/journey-cli/verify.js +13 -6
- package/dist/journey-cli/verify.js.map +1 -1
- package/dist/journey-cli-bundle.d.ts +4 -0
- package/dist/journey-cli-bundle.js +70 -0
- package/dist/journey-cli-bundle.js.map +1 -0
- package/dist/journey-cli-readiness.d.ts +4 -0
- package/dist/journey-cli-readiness.js +163 -0
- package/dist/journey-cli-readiness.js.map +1 -0
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +9 -1
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-cli.js +10 -5
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-handback.d.ts +62 -0
- package/dist/journey-handback.js +150 -0
- package/dist/journey-handback.js.map +1 -0
- package/dist/journey-link-api.js +1 -1
- package/dist/journey-link-api.js.map +1 -1
- package/dist/journey-link-cli.js +13 -8
- package/dist/journey-link-cli.js.map +1 -1
- package/dist/journey-readiness.d.ts +104 -0
- package/dist/journey-readiness.js +369 -0
- package/dist/journey-readiness.js.map +1 -0
- package/dist/journey-verify.d.ts +2 -0
- package/dist/journey-verify.js +14 -1
- package/dist/journey-verify.js.map +1 -1
- package/dist/mcp-cli-tools.js +79 -20
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/program.js +3 -0
- package/dist/program.js.map +1 -1
- package/dist/project-layout.d.ts +57 -0
- package/dist/project-layout.js +144 -0
- package/dist/project-layout.js.map +1 -0
- package/dist/project-where.d.ts +4 -0
- package/dist/project-where.js +48 -0
- package/dist/project-where.js.map +1 -0
- package/package.json +9 -9
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #585: one resolver for every command that reads or writes a project's Journeys or catalog —
|
|
3
|
+
* `docs/contracts/project-layout.md` §3 (resolution) and §4 (this API). It resolves the location
|
|
4
|
+
* flags against the working directory once, refuses an unusable explicit path with a typed error
|
|
5
|
+
* (and a concrete next action), and reports where each location came from. It never copies,
|
|
6
|
+
* rewrites or relocates files: the same Journey content reaches the same content hash whichever
|
|
7
|
+
* flag or cwd reached it.
|
|
8
|
+
*/
|
|
9
|
+
import { existsSync, statSync } from "node:fs";
|
|
10
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
11
|
+
import { findProjectDir, homeDataRoot } from "./project-dir.js";
|
|
12
|
+
/** A refused layout: the code, and the concrete next action (a command or flag) that resolves it. */
|
|
13
|
+
export class ProjectLayoutError extends Error {
|
|
14
|
+
code;
|
|
15
|
+
nextAction;
|
|
16
|
+
constructor(code, message, nextAction) {
|
|
17
|
+
super(message);
|
|
18
|
+
this.name = "ProjectLayoutError";
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.nextAction = nextAction;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** The §2 deprecation line `--dir` prints (stderr, never the `--json` stdout envelope). */
|
|
24
|
+
function deprecationFor(meaning) {
|
|
25
|
+
return meaning === "journeys"
|
|
26
|
+
? "jevitate: --dir is deprecated here; use --journeys-dir <path> (same meaning)"
|
|
27
|
+
: "jevitate: --dir is deprecated here; use --project <path> (same meaning)";
|
|
28
|
+
}
|
|
29
|
+
function isDir(p) {
|
|
30
|
+
try {
|
|
31
|
+
return statSync(p).isDirectory();
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/** The directory `jevitate init` would create the project in, for a missing project path. */
|
|
38
|
+
function initDirFor(path) {
|
|
39
|
+
return basename(path) === ".jevitate" ? dirname(path) : path;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolves the project, catalog and Journey locations for one invocation (§3 steps 1-8).
|
|
43
|
+
*
|
|
44
|
+
* `dirMeaning` is the command's current meaning for the deprecated `--dir` (§2): `journeys`
|
|
45
|
+
* commands keep using it as the store, project/catalog commands as the project. `requireProject`
|
|
46
|
+
* refuses with `E_PROJECT_NOT_FOUND` when a command needs the catalog but no project was found —
|
|
47
|
+
* never falling back to `~/.jevitate`. `deps` carries the CLI's test seams (`cwd`/`homedir`, and
|
|
48
|
+
* the `CliDeps.journeysDir` seam that wins over discovery but not over a flag).
|
|
49
|
+
*/
|
|
50
|
+
export function resolveLayout(flags, opts) {
|
|
51
|
+
const { dirMeaning } = opts;
|
|
52
|
+
const deps = opts.deps ?? {};
|
|
53
|
+
// §3.1: every explicit path is resolved against the working directory, once, before any check.
|
|
54
|
+
const cwd = (deps.cwd ?? (() => process.cwd()))();
|
|
55
|
+
const projectFlag = flags.project === undefined ? undefined : resolve(cwd, flags.project);
|
|
56
|
+
const journeysFlag = flags.journeysDir === undefined ? undefined : resolve(cwd, flags.journeysDir);
|
|
57
|
+
const dirFlag = flags.dir === undefined ? undefined : resolve(cwd, flags.dir);
|
|
58
|
+
// §3.2: the deprecated --dir is exclusive with the two new flags.
|
|
59
|
+
if (dirFlag !== undefined && (projectFlag !== undefined || journeysFlag !== undefined)) {
|
|
60
|
+
throw new ProjectLayoutError("E_PROJECT_ARGS", "--dir cannot be combined with --project or --journeys-dir", "drop --dir and pass --project for the project, or --journeys-dir for the Journey store");
|
|
61
|
+
}
|
|
62
|
+
// Where the project comes from: --project, or a project-meaning --dir, else discovery (§1).
|
|
63
|
+
const projectPath = projectFlag ?? (dirMeaning === "project" ? dirFlag : undefined);
|
|
64
|
+
// §3.3: an explicit project path or Journey store that does not exist is refused (never a raw
|
|
65
|
+
// ENOENT), and nothing is created. The deprecated --dir-as-journeys keeps its current meaning and
|
|
66
|
+
// is used as given (a command's store need not exist yet); --dir-as-project is a project path.
|
|
67
|
+
if (projectPath !== undefined && !existsSync(projectPath)) {
|
|
68
|
+
throw new ProjectLayoutError("E_PROJECT_DIR_MISSING", `the project path ${projectPath} does not exist`, `run jevitate init in ${initDirFor(projectPath)}, or pass an existing --project <dir>`);
|
|
69
|
+
}
|
|
70
|
+
if (journeysFlag !== undefined && !existsSync(journeysFlag)) {
|
|
71
|
+
throw new ProjectLayoutError("E_PROJECT_DIR_MISSING", `the journeys dir ${journeysFlag} does not exist`, `check the path and pass an existing --journeys-dir <path>, or run jevitate init to create the project store`);
|
|
72
|
+
}
|
|
73
|
+
// §3.4: a `.jevitate` directory is the project; otherwise it must contain one.
|
|
74
|
+
let projectDir;
|
|
75
|
+
let fromProject;
|
|
76
|
+
if (projectPath !== undefined) {
|
|
77
|
+
if (basename(projectPath) === ".jevitate") {
|
|
78
|
+
if (!isDir(projectPath)) {
|
|
79
|
+
throw new ProjectLayoutError("E_PROJECT_LAYOUT", `--project ${projectPath} is not a directory`, `pass the .jevitate directory itself or its parent with --project <path>, or run jevitate init in ${initDirFor(projectPath)}`);
|
|
80
|
+
}
|
|
81
|
+
projectDir = projectPath;
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const nested = join(projectPath, ".jevitate");
|
|
85
|
+
if (!isDir(nested)) {
|
|
86
|
+
throw new ProjectLayoutError("E_PROJECT_LAYOUT", `--project ${projectPath} is not a .jevitate directory and does not contain one (expected ${nested})`, `pass the .jevitate directory itself or its parent with --project <path>, or run jevitate init in ${projectPath}`);
|
|
87
|
+
}
|
|
88
|
+
projectDir = nested;
|
|
89
|
+
}
|
|
90
|
+
fromProject = projectFlag !== undefined ? "flag" : "dir";
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
projectDir = findProjectDir({ cwd: () => cwd, ...(deps.homedir === undefined ? {} : { homedir: deps.homedir }) });
|
|
94
|
+
fromProject = projectDir === null ? "none" : "discovered";
|
|
95
|
+
}
|
|
96
|
+
// §3.5: a command that needs the catalog is refused when no project was found; never ~/.jevitate.
|
|
97
|
+
if (projectDir === null && opts.requireProject === true) {
|
|
98
|
+
throw new ProjectLayoutError("E_PROJECT_NOT_FOUND", "no project found: the working directory is not inside a .jevitate/ and --project was not given", "pass --project <dir>, or run jevitate init in the project");
|
|
99
|
+
}
|
|
100
|
+
// §3.6: journeys default exactly as today; an explicit store is never redirected. Precedence is
|
|
101
|
+
// flag > deprecated --dir > the CLI's journeysDir seam > project discovery > ~/.jevitate.
|
|
102
|
+
let journeysDir;
|
|
103
|
+
let fromJourneys;
|
|
104
|
+
if (journeysFlag !== undefined) {
|
|
105
|
+
journeysDir = journeysFlag;
|
|
106
|
+
fromJourneys = "flag";
|
|
107
|
+
}
|
|
108
|
+
else if (dirMeaning === "journeys" && dirFlag !== undefined) {
|
|
109
|
+
journeysDir = dirFlag;
|
|
110
|
+
fromJourneys = "dir";
|
|
111
|
+
}
|
|
112
|
+
else if (deps.journeysDir !== undefined) {
|
|
113
|
+
journeysDir = deps.journeysDir;
|
|
114
|
+
fromJourneys = "seam";
|
|
115
|
+
}
|
|
116
|
+
else if (projectDir !== null) {
|
|
117
|
+
journeysDir = join(projectDir, "journeys");
|
|
118
|
+
fromJourneys = "project";
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
journeysDir = join(homeDataRoot(deps), "journeys");
|
|
122
|
+
fromJourneys = "home";
|
|
123
|
+
}
|
|
124
|
+
const deprecation = dirFlag === undefined ? undefined : deprecationFor(dirMeaning);
|
|
125
|
+
return {
|
|
126
|
+
projectDir,
|
|
127
|
+
journeysDir,
|
|
128
|
+
catalogDir: projectDir,
|
|
129
|
+
from: { project: fromProject, journeys: fromJourneys },
|
|
130
|
+
...(deprecation === undefined ? {} : { deprecation }),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Adds the standard project-location flags, `--project <path>` and `--journeys-dir <path>` (§2/§4).
|
|
135
|
+
* It does not add the deprecated `--dir`: that stays on a command while it is being migrated, so the
|
|
136
|
+
* resolver can report it.
|
|
137
|
+
*/
|
|
138
|
+
export function withProjectFlags(cmd) {
|
|
139
|
+
cmd
|
|
140
|
+
.option("--project <path>", "the project: a .jevitate directory or the directory containing it; sets the catalog dir and the default journeys dir")
|
|
141
|
+
.option("--journeys-dir <path>", "the Journey store only; wins over --project for journeys, while the catalog still comes from --project");
|
|
142
|
+
return cmd;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=project-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-layout.js","sourceRoot":"","sources":["../src/project-layout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
import { type CliDeps } from "./cli-shared.js";
|
|
3
|
+
/** Registers `jevitate where` (#585 §5): the resolved layout for `--project`/`--journeys-dir` and cwd. */
|
|
4
|
+
export declare function registerWhere(program: Command, deps: CliDeps): void;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* #585 — `jevitate where`: prints the resolved project layout for the current flags and working
|
|
3
|
+
* directory (docs/contracts/project-layout.md §5) — the project dir, the catalog dir, the Journey
|
|
4
|
+
* store and the logs dir, and where each came from. Paths only; no file contents, no secrets.
|
|
5
|
+
* `--json` prints the `ResolvedLayout` (plus the logs dir); the human form is one line per location.
|
|
6
|
+
* Registered on the root program with `registerWhere` (program.ts wires it in a later change).
|
|
7
|
+
*/
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { emitJson } from "./cli-shared.js";
|
|
10
|
+
import { ok } from "./envelope.js";
|
|
11
|
+
import { EXIT_CODES } from "./exit-codes.js";
|
|
12
|
+
import { logsRoot } from "./project-dir.js";
|
|
13
|
+
import { journeyLayout } from "./journey-cli/shared.js";
|
|
14
|
+
import { withProjectFlags } from "./project-layout.js";
|
|
15
|
+
/** The human form: one line per location, then where the project and Journey store came from. */
|
|
16
|
+
function render(data) {
|
|
17
|
+
const dir = (p) => p ?? "(none)";
|
|
18
|
+
return [
|
|
19
|
+
`project ${dir(data.projectDir)}`,
|
|
20
|
+
`catalog ${dir(data.catalogDir)}`,
|
|
21
|
+
`journeys ${data.journeysDir}`,
|
|
22
|
+
`logs ${data.logsDir}`,
|
|
23
|
+
`from project: ${data.from.project}, journeys: ${data.from.journeys}`,
|
|
24
|
+
"",
|
|
25
|
+
].join("\n");
|
|
26
|
+
}
|
|
27
|
+
/** Registers `jevitate where` (#585 §5): the resolved layout for `--project`/`--journeys-dir` and cwd. */
|
|
28
|
+
export function registerWhere(program, deps) {
|
|
29
|
+
withProjectFlags(program.command("where").description("#585: the resolved project layout — project, catalog, journeys and logs dirs, and where each came from; paths only, no file contents"))
|
|
30
|
+
.option("--json", "emit the ResolvedLayout (plus the logs dir) as a JSON envelope")
|
|
31
|
+
.action(function () {
|
|
32
|
+
const { project, journeysDir, json } = this.opts();
|
|
33
|
+
const layout = journeyLayout(program, deps, { project, journeysDir });
|
|
34
|
+
if (layout === null)
|
|
35
|
+
return;
|
|
36
|
+
// The logs dir follows an explicit --project (logsRoot() alone discovers only from cwd).
|
|
37
|
+
const logsDir = layout.projectDir === null ? logsRoot() : join(layout.projectDir, "logs");
|
|
38
|
+
const data = { ...layout, logsDir };
|
|
39
|
+
if (json === true) {
|
|
40
|
+
emitJson(program, ok(data));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
program.configureOutput().writeOut?.(render(data));
|
|
44
|
+
process.exitCode = EXIT_CODES.ok;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=project-where.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-where.js","sourceRoot":"","sources":["../src/project-where.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAgB,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AAE5E,iGAAiG;AACjG,SAAS,MAAM,CAAC,IAAmD;IACjE,MAAM,GAAG,GAAG,CAAC,CAAgB,EAAU,EAAE,CAAC,CAAC,IAAI,QAAQ,CAAC;IACxD,OAAO;QACL,aAAa,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;QACnC,aAAa,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;QACnC,aAAa,IAAI,CAAC,WAAW,EAAE;QAC/B,aAAa,IAAI,CAAC,OAAO,EAAE;QAC3B,sBAAsB,IAAI,CAAC,IAAI,CAAC,OAAO,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;QAC1E,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,IAAa;IAC3D,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,sIAAsI,CAAC,CAAC;SAC3L,MAAM,CAAC,QAAQ,EAAE,gEAAgE,CAAC;SAClF,MAAM,CAAC;QACN,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,EAA8D,CAAC;QAC/G,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;QACtE,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,yFAAyF;QACzF,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1F,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,EAAE,CAAC;QACnC,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jevitate/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Autonomous browser testing that turns discovered bugs into deterministic regression tests: explore a web app in a real browser, confirm findings with evidence, and replay them as regressions in CI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -62,27 +62,27 @@
|
|
|
62
62
|
"ajv": "^8.20.0",
|
|
63
63
|
"esbuild": "^0.28.2",
|
|
64
64
|
"@jevitate/ai-core": "0.1.0",
|
|
65
|
-
"@jevitate/daemon": "0.1.0",
|
|
66
|
-
"@jevitate/domain": "0.1.0",
|
|
67
65
|
"@jevitate/example-site": "0.1.0",
|
|
68
66
|
"@jevitate/explore": "0.1.0",
|
|
67
|
+
"@jevitate/domain": "0.1.0",
|
|
68
|
+
"@jevitate/daemon": "0.1.0",
|
|
69
69
|
"@jevitate/findings": "0.1.0",
|
|
70
|
-
"@jevitate/inbox": "0.1.0",
|
|
71
70
|
"@jevitate/interpreter": "0.1.0",
|
|
72
|
-
"@jevitate/
|
|
71
|
+
"@jevitate/inbox": "0.1.0",
|
|
73
72
|
"@jevitate/journey": "0.1.0",
|
|
74
|
-
"@jevitate/missions": "0.1.0",
|
|
75
73
|
"@jevitate/mcp-facade": "0.1.0",
|
|
74
|
+
"@jevitate/missions": "0.1.0",
|
|
76
75
|
"@jevitate/playwright": "0.1.0",
|
|
76
|
+
"@jevitate/load": "0.1.0",
|
|
77
77
|
"@jevitate/recorder": "0.1.0",
|
|
78
78
|
"@jevitate/recording": "0.1.0",
|
|
79
|
-
"@jevitate/regression": "0.1.0",
|
|
80
79
|
"@jevitate/runtime": "0.1.0",
|
|
81
80
|
"@jevitate/screenplay": "0.1.0",
|
|
81
|
+
"@jevitate/regression": "0.1.0",
|
|
82
|
+
"@jevitate/skills": "0.1.0",
|
|
82
83
|
"@jevitate/sources": "0.1.0",
|
|
83
84
|
"@jevitate/storage-sqlite": "0.1.0",
|
|
84
|
-
"@jevitate/ux": "0.1.0"
|
|
85
|
-
"@jevitate/skills": "0.1.0"
|
|
85
|
+
"@jevitate/ux": "0.1.0"
|
|
86
86
|
},
|
|
87
87
|
"scripts": {
|
|
88
88
|
"build": "node scripts/generate-build-info.mjs && tsc --build",
|