@jevitate/cli 0.6.0 → 0.8.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 +120 -0
- package/dist/approval-provenance.js +300 -0
- package/dist/approval-provenance.js.map +1 -0
- package/dist/author-journey-cli.js +11 -18
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +29012 -20685
- 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/check-api.js +24 -2
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +3 -0
- package/dist/check-cli.js +18 -4
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.js +25 -9
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.js +4 -1
- 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 +12 -1
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.js +86 -4
- 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 +21 -5
- package/dist/demo-aspect-api.js +30 -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/environments.js +6 -1
- package/dist/environments.js.map +1 -1
- package/dist/exit-codes.js +4 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.d.ts +3 -1
- package/dist/explore-adversarial.js +3 -3
- 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 +162 -13
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +6 -2
- package/dist/explore-coverage.js +5 -4
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +3 -1
- package/dist/explore-feature.js +2 -2
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +37 -6
- package/dist/explore-goal.js +70 -52
- 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/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/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 +104 -5
- package/dist/journey-api.js +165 -23
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +1 -1
- package/dist/journey-cli.js +320 -13
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-demo-api.d.ts +7 -1
- package/dist/journey-demo-api.js +8 -3
- package/dist/journey-demo-api.js.map +1 -1
- package/dist/journey-demo-cli.js +3 -0
- package/dist/journey-demo-cli.js.map +1 -1
- package/dist/journey-lint-sarif.d.ts +19 -0
- package/dist/journey-lint-sarif.js +48 -0
- package/dist/journey-lint-sarif.js.map +1 -0
- package/dist/journey-network-checks.d.ts +45 -9
- package/dist/journey-network-checks.js +117 -30
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.d.ts +24 -15
- package/dist/journey-prefix.js +53 -7
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-review-api.d.ts +19 -0
- package/dist/journey-review-api.js +46 -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 +47 -0
- package/dist/journey-review.js +499 -0
- package/dist/journey-review.js.map +1 -0
- package/dist/journey-verify.d.ts +61 -0
- package/dist/journey-verify.js +144 -0
- package/dist/journey-verify.js.map +1 -0
- 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/load-api.js +9 -3
- package/dist/load-api.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 +15 -0
- package/dist/login-cli.js +116 -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 +1 -0
- package/dist/mcp-api.js +61 -12
- 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 +6 -0
- package/dist/mcp-cli-tools.js +182 -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 +38 -3
- package/dist/multi-run.js +115 -23
- package/dist/multi-run.js.map +1 -1
- package/dist/persona-login.d.ts +199 -0
- package/dist/persona-login.js +574 -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 +10 -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/promotions.d.ts +15 -0
- package/dist/promotions.js +52 -0
- package/dist/promotions.js.map +1 -0
- 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 +24 -2
- package/dist/report-api.js +33 -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/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 +26 -0
- package/dist/run-metadata.js +41 -0
- package/dist/run-metadata.js.map +1 -0
- package/dist/run-tags-cli.d.ts +12 -0
- package/dist/run-tags-cli.js +35 -0
- package/dist/run-tags-cli.js.map +1 -0
- package/dist/self-heal-adapter.js +3 -1
- 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 +4 -2
- package/dist/source-cli.js.map +1 -1
- package/dist/source-run-api.js +17 -7
- package/dist/source-run-api.js.map +1 -1
- package/dist/suite-explore-options.d.ts +14 -0
- package/dist/suite-explore-options.js +7 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +266 -0
- package/dist/sweep-api.js +828 -0
- package/dist/sweep-api.js.map +1 -0
- package/dist/sweep-cli.d.ts +9 -0
- package/dist/sweep-cli.js +115 -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/usability-capture.js +6 -0
- package/dist/usability-capture.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 +6 -4
- 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 +13 -13
- package/skills/jevitate-demo/SKILL.md +5 -2
- package/skills/jevitate-explore/SKILL.md +6 -2
- package/skills/jevitate-getting-started/SKILL.md +12 -0
- package/skills/jevitate-run-journey/SKILL.md +17 -4
- package/skills/jevitate-test-campaign/SKILL.md +26 -5
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { clock } from "@jevitate/domain";
|
|
3
|
+
import { CatalogLoader, catalogJourney, journeyLinks, requireJob, requirePersona, writeJobApproval, writePersonaApproval } from "./catalog.js";
|
|
4
|
+
import { acknowledgeFindings, preApprovalFindings } from "./pre-approval.js";
|
|
5
|
+
import { findProjectDir } from "./project-dir.js";
|
|
6
|
+
import { programmaticProvenance } from "./approval-provenance.js";
|
|
7
|
+
/**
|
|
8
|
+
* #433 — the approvals of the catalog (`persona approve`, `job approve`: a person's act, CLI only)
|
|
9
|
+
* and the catalog gate every Journey approval (`journey promote`, `demo approve`) passes.
|
|
10
|
+
*/
|
|
11
|
+
/** The catalog's directory: `--dir`, else the CLI's seam, else the project's `.jevitate/` (null outside a project). */
|
|
12
|
+
export function resolveCatalogDir(seam, flag) {
|
|
13
|
+
return flag ?? seam ?? findProjectDir();
|
|
14
|
+
}
|
|
15
|
+
/** Loads the catalog of a project data dir and a journeys dir. */
|
|
16
|
+
export function loadCatalog(catalogDir, journeysDir) {
|
|
17
|
+
return new CatalogLoader({ catalogDir, journeysDir }).load();
|
|
18
|
+
}
|
|
19
|
+
/** The journeys directory of a catalog `--dir` (its `journeys/`), else the CLI's default. */
|
|
20
|
+
export function catalogJourneysDir(flag, fallback) {
|
|
21
|
+
return flag === undefined ? fallback : join(flag, "journeys");
|
|
22
|
+
}
|
|
23
|
+
/** `persona|job approve --reviewed-hash`: the item changed after the reviewer's sheet was produced. */
|
|
24
|
+
export class StaleCatalogReviewError extends Error {
|
|
25
|
+
code = "E_CATALOG_REVIEW_STALE";
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* #433: approves a persona or a job — bound to its content hash, after the shared pre-approval
|
|
29
|
+
* pipeline (`preApprovalFindings` + the acknowledgment rule). A human act: never an MCP tool.
|
|
30
|
+
*/
|
|
31
|
+
export async function approveCatalogItem(kind, catalog, id, opts = {}) {
|
|
32
|
+
const item = kind === "persona" ? requirePersona(catalog, id) : requireJob(catalog, id);
|
|
33
|
+
const reviewed = opts.reviewedHash?.trim().toLowerCase();
|
|
34
|
+
if (reviewed !== undefined && reviewed !== item.contentHash) {
|
|
35
|
+
throw new StaleCatalogReviewError(`${kind} '${id}' changed after its review sheet was produced (reviewed ${reviewed}, now ${item.contentHash}) — review it again: jevitate ${kind} review ${id}`);
|
|
36
|
+
}
|
|
37
|
+
const action = kind === "persona" ? "persona approve" : "job approve";
|
|
38
|
+
// #434: every approval runs the readiness checks (the Jev layer only with --real and a key).
|
|
39
|
+
const findings = await preApprovalFindings({ kind, id }, catalog, { action, readiness: true, ...(opts.jev === undefined ? {} : { jev: opts.jev }) });
|
|
40
|
+
const acceptedFindings = acknowledgeFindings(`${kind} '${id}'`, findings, opts.acceptFindings);
|
|
41
|
+
const provenance = opts.confirm === undefined
|
|
42
|
+
? programmaticProvenance()
|
|
43
|
+
: await opts.confirm({
|
|
44
|
+
kind,
|
|
45
|
+
id,
|
|
46
|
+
contentHash: item.contentHash,
|
|
47
|
+
waivers: acceptedFindings === undefined ? [] : [{ flag: "--accept-findings", reason: acceptedFindings.reason, detail: acceptedFindings.findings.join(", ") }],
|
|
48
|
+
});
|
|
49
|
+
const approval = {
|
|
50
|
+
contentHash: item.contentHash,
|
|
51
|
+
at: clock.nowIso(),
|
|
52
|
+
provenance,
|
|
53
|
+
...(acceptedFindings === undefined ? {} : { acceptedFindings: { ...acceptedFindings, provenance } }),
|
|
54
|
+
};
|
|
55
|
+
const file = kind === "persona" ? catalog.personasFile : catalog.jobsFile;
|
|
56
|
+
// requirePersona/requireJob found the item, so its file was read.
|
|
57
|
+
if (file === null)
|
|
58
|
+
throw new Error(`${kind} '${id}' has no catalog file`);
|
|
59
|
+
if (kind === "persona")
|
|
60
|
+
await writePersonaApproval(file, id, approval);
|
|
61
|
+
else
|
|
62
|
+
await writeJobApproval(file, id, approval);
|
|
63
|
+
return { kind, id, approval, previousStatus: item.status, findings, file };
|
|
64
|
+
}
|
|
65
|
+
/** #433: `journey promote` of a Journey whose linked job/persona is not approved, without `--accept-unvetted`. */
|
|
66
|
+
export class UnvettedLinksError extends Error {
|
|
67
|
+
unvetted;
|
|
68
|
+
code = "E_JOURNEY_UNVETTED";
|
|
69
|
+
constructor(message, unvetted) {
|
|
70
|
+
super(message);
|
|
71
|
+
this.unvetted = unvetted;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* #433: the catalog gate of a Journey approval. A Journey linking a job or a catalog persona needs
|
|
76
|
+
* each linked item approved (an unknown, draft or stale one is "unvetted"), or a recorded waiver
|
|
77
|
+
* (`--accept-unvetted "<reason>"` → `approval.waivers`). An unlinked Journey passes (opt-in). Then
|
|
78
|
+
* the shared pre-approval pipeline and its acknowledgment rule (`--accept-findings`).
|
|
79
|
+
*/
|
|
80
|
+
export async function journeyCatalogGate(journey, opts) {
|
|
81
|
+
const catalog = await loadCatalog(opts.catalogDir, opts.journeysDir);
|
|
82
|
+
const links = journeyLinks(catalog, catalogJourney(journey));
|
|
83
|
+
const id = journey.metadata.id;
|
|
84
|
+
let waivers;
|
|
85
|
+
if (links.unvetted.length > 0) {
|
|
86
|
+
const reason = opts.acceptUnvetted?.trim() ?? "";
|
|
87
|
+
if (reason === "") {
|
|
88
|
+
throw new UnvettedLinksError(`journey '${id}' links catalog items that are not approved: ${links.unvetted.join(", ")} — approve them first (jevitate job|persona review/approve <id>), ` +
|
|
89
|
+
`or promote anyway with --accept-unvetted "<reason>" (recorded on the approval)`, links.unvetted);
|
|
90
|
+
}
|
|
91
|
+
waivers = [{ kind: "unvetted", reason, items: [...links.unvetted] }];
|
|
92
|
+
}
|
|
93
|
+
const findings = await preApprovalFindings({ kind: "journey", id }, catalog, { action: opts.action, journey, readiness: true, ...(opts.jev === undefined ? {} : { jev: opts.jev }) });
|
|
94
|
+
const acceptedFindings = acknowledgeFindings(`journey '${id}'`, findings, opts.acceptFindings);
|
|
95
|
+
return { ...(waivers === undefined ? {} : { waivers }), ...(acceptedFindings === undefined ? {} : { acceptedFindings }), findings };
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=catalog-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-api.js","sourceRoot":"","sources":["../src/catalog-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import { type CliDeps } from "./cli-shared.js";
|
|
3
|
+
import { type JevSetup } from "./jev-advisor.js";
|
|
4
|
+
/** #434/#435: `--readiness` / `--real` / `--jev-provider` help. */
|
|
5
|
+
export declare const READINESS_FLAG_HELP = "#434: add the Readiness section \u2014 deterministic checks with INCOSE GtWR rule findings, and (with --real and a judgment key) advisory Jev questions with probabilities";
|
|
6
|
+
export declare const REAL_JEV_FLAG_HELP = "#434/#435: ask Jev (advisory; never blocks on its own) \u2014 readiness questions and catalog pair classifications, cached by content hash. Without a judgment key the Jev layer is skipped, the deterministic layer still runs";
|
|
7
|
+
/** The Jev layer of a catalog command (`--real`), its answer cache under the catalog's data dir. */
|
|
8
|
+
export declare function jevSetupFor(deps: CliDeps, catalogDir: string | null, o: {
|
|
9
|
+
real?: boolean;
|
|
10
|
+
jevProvider?: string;
|
|
11
|
+
}): Promise<JevSetup>;
|
|
12
|
+
export declare function registerCatalogCommands(program: Command, deps: CliDeps): void;
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { writeFile } from "node:fs/promises";
|
|
2
|
+
import { ok, fail } from "./envelope.js";
|
|
3
|
+
import { MissingCredentialError } from "@jevitate/ai-core";
|
|
4
|
+
import { GatewaySelectionError, JEV_PROVIDER_FLAG_HELP, emitJson, emitUsageLine, jevProviderArg, resolveJourneysDir } from "./cli-shared.js";
|
|
5
|
+
import { positiveIntArg } from "./cli-args.js";
|
|
6
|
+
import { buildJevSetup, jevCacheDir } from "./jev-advisor.js";
|
|
7
|
+
import { analyzeCatalog, renderCatalogAnalysis, ANALYZE_PAIR_CAP } from "./catalog-analysis.js";
|
|
8
|
+
import { CatalogInputError, UnknownCatalogItemError } from "./catalog.js";
|
|
9
|
+
import { StaleCatalogReviewError, approveCatalogItem, catalogJourneysDir, loadCatalog, resolveCatalogDir } from "./catalog-api.js";
|
|
10
|
+
import { buildCatalogStatus, buildJobReview, buildPersonaReview, renderCatalogStatus, renderJobReview, renderPersonaReview } from "./catalog-review.js";
|
|
11
|
+
import { ApprovalFindingsError } from "./pre-approval.js";
|
|
12
|
+
import { EXIT_CODES } from "./exit-codes.js";
|
|
13
|
+
import { ApprovalArgsError, approvalRefusal, approvalsReport, checkNonInteractiveReason, describeProvenance, makeApprovalConfirm, parseAllowedChannels, renderApprovals, } from "./approval-provenance.js";
|
|
14
|
+
/**
|
|
15
|
+
* #433 — the catalog commands: `persona review|approve <id>`, `job review|approve <id>` and
|
|
16
|
+
* `catalog status`. Approving is a person's act: these approve commands are CLI only (no MCP tool;
|
|
17
|
+
* MCP gets the read-only `review_persona`, `review_job` and `catalog_status`).
|
|
18
|
+
*/
|
|
19
|
+
const DIR_HELP = "the project data dir holding personas.json and jobs.json (default: the repo's .jevitate/); its journeys/ are the Journeys";
|
|
20
|
+
/** #434/#435: `--readiness` / `--real` / `--jev-provider` help. */
|
|
21
|
+
export const READINESS_FLAG_HELP = "#434: add the Readiness section — deterministic checks with INCOSE GtWR rule findings, and (with --real and a judgment key) advisory Jev questions with probabilities";
|
|
22
|
+
export const REAL_JEV_FLAG_HELP = "#434/#435: ask Jev (advisory; never blocks on its own) — readiness questions and catalog pair classifications, cached by content hash. Without a judgment key the Jev layer is skipped, the deterministic layer still runs";
|
|
23
|
+
/** The Jev layer of a catalog command (`--real`), its answer cache under the catalog's data dir. */
|
|
24
|
+
export function jevSetupFor(deps, catalogDir, o) {
|
|
25
|
+
return buildJevSetup(deps, { ...(o.real === undefined ? {} : { real: o.real }), ...(o.jevProvider === undefined ? {} : { jevProvider: o.jevProvider }), cacheDir: jevCacheDir(catalogDir) });
|
|
26
|
+
}
|
|
27
|
+
function refuse(program, err, fallbackCode) {
|
|
28
|
+
const refusal = approvalRefusal(err);
|
|
29
|
+
if (refusal !== null) {
|
|
30
|
+
emitJson(program, fail(refusal.code, refusal.message));
|
|
31
|
+
}
|
|
32
|
+
else if (err instanceof GatewaySelectionError || err instanceof MissingCredentialError) {
|
|
33
|
+
emitJson(program, fail("E_AI_SETUP_REQUIRED", err.message));
|
|
34
|
+
}
|
|
35
|
+
else if (err instanceof UnknownCatalogItemError) {
|
|
36
|
+
emitJson(program, fail(err.code, err.message));
|
|
37
|
+
}
|
|
38
|
+
else if (err instanceof CatalogInputError || err instanceof StaleCatalogReviewError) {
|
|
39
|
+
emitJson(program, fail(err.code, err.message));
|
|
40
|
+
}
|
|
41
|
+
else if (err instanceof ApprovalFindingsError) {
|
|
42
|
+
// #433: a refusal on the item's findings — exit 1 (a gating finding), like E_JOURNEY_WEAK.
|
|
43
|
+
emitJson(program, fail(err.code, err.message));
|
|
44
|
+
process.exitCode = EXIT_CODES.defects;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
emitJson(program, fail(fallbackCode, String(err instanceof Error ? err.message : err)));
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function registerItemCommands(program, deps, kind) {
|
|
51
|
+
const group = program
|
|
52
|
+
.command(kind)
|
|
53
|
+
.description(kind === "persona"
|
|
54
|
+
? "#433: catalog personas (.jevitate/personas.json) — review a persona's sheet, approve it (a person's sign-off, bound to its content hash)"
|
|
55
|
+
: "#433: catalog jobs — job stories in .jevitate/jobs.json (\"When …, I want to …, so I can ….\") — review a job's sheet, approve it (bound to its content hash)");
|
|
56
|
+
const code = kind === "persona" ? "E_PERSONA" : "E_JOB";
|
|
57
|
+
const argsCode = kind === "persona" ? "E_PERSONA_REVIEW_ARGS" : "E_JOB_REVIEW_ARGS";
|
|
58
|
+
const load = (dir) => loadCatalog(resolveCatalogDir(deps.catalogDir, dir), catalogJourneysDir(dir, resolveJourneysDir(deps)));
|
|
59
|
+
const sheet = async (dir, id, action, opts) => {
|
|
60
|
+
const catalog = await load(dir);
|
|
61
|
+
if (kind === "persona") {
|
|
62
|
+
const review = await buildPersonaReview(catalog, id, action, opts);
|
|
63
|
+
return { catalog, review, render: (style) => renderPersonaReview(review, style) };
|
|
64
|
+
}
|
|
65
|
+
const review = await buildJobReview(catalog, id, action, opts);
|
|
66
|
+
return { catalog, review, render: (style) => renderJobReview(review, style) };
|
|
67
|
+
};
|
|
68
|
+
group
|
|
69
|
+
.command("review <id>")
|
|
70
|
+
.description(kind === "persona"
|
|
71
|
+
? "a persona's review sheet: who it is, the jobs it serves, the Journeys linked to it, its approval state (stale = needs re-review), the pre-approval findings, its content hash"
|
|
72
|
+
: "a job's review sheet: its story, its personas and which have a promoted Journey for it, the gaps, its Journeys, its approval state, the pre-approval findings, its content hash")
|
|
73
|
+
.option("--dir <path>", DIR_HELP)
|
|
74
|
+
.option("--markdown", "render the sheet as Markdown")
|
|
75
|
+
.option("--out <file>", "write the sheet (JSON with --json, Markdown with --markdown, else text) to this file")
|
|
76
|
+
.option("--readiness", READINESS_FLAG_HELP)
|
|
77
|
+
.option("--real", REAL_JEV_FLAG_HELP)
|
|
78
|
+
.option("--jev-provider <provider>", JEV_PROVIDER_FLAG_HELP, jevProviderArg)
|
|
79
|
+
.option("--json", "emit a JSON envelope (the schema-checked sheet)")
|
|
80
|
+
.action(async function (id) {
|
|
81
|
+
const { dir, json, markdown, out: outFile, readiness, real, jevProvider } = this.opts();
|
|
82
|
+
if (json === true && markdown === true) {
|
|
83
|
+
emitJson(program, fail(argsCode, "--json and --markdown are exclusive: pick one rendering"));
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const jev = await jevSetupFor(deps, resolveCatalogDir(deps.catalogDir, dir), { real, jevProvider });
|
|
88
|
+
const { review, render } = await sheet(dir, id, "review", { readiness: readiness === true, jev });
|
|
89
|
+
const rendered = json ? `${JSON.stringify(review, null, 2)}\n` : render(markdown ? "markdown" : "text");
|
|
90
|
+
if (outFile !== undefined)
|
|
91
|
+
await writeFile(outFile, rendered, { mode: 0o600 });
|
|
92
|
+
if (json)
|
|
93
|
+
emitJson(program, ok(review));
|
|
94
|
+
else if (outFile !== undefined)
|
|
95
|
+
program.configureOutput().writeOut?.(`review sheet for ${kind} '${review.id}' written to ${outFile} (content hash ${review.contentHash})\n`);
|
|
96
|
+
else
|
|
97
|
+
program.configureOutput().writeOut?.(rendered);
|
|
98
|
+
emitUsageLine(program, review.jev);
|
|
99
|
+
// #434: a review never fails on its findings (readiness and Jev answers are advice).
|
|
100
|
+
process.exitCode = 0;
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
refuse(program, err, `${code}_REVIEW`);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
group
|
|
107
|
+
.command("approve <id>")
|
|
108
|
+
.description(`approve a ${kind} (a person's sign-off; CLI only, never an MCP tool): shows its review sheet, runs the pre-approval findings, then records {contentHash, at} in ${kind === "persona" ? "personas.json" : "its jobs file"}. Editing it later makes it — and its Journeys — "needs re-review"`)
|
|
109
|
+
.option("--dir <path>", DIR_HELP)
|
|
110
|
+
.option("--reviewed-hash <hash>", `the content hash of the review sheet you read; refused (E_CATALOG_REVIEW_STALE) if the ${kind} changed since`)
|
|
111
|
+
.option("--accept-findings <reason>", "approve although pre-approval findings need an acknowledgment, recording the reason with the approval")
|
|
112
|
+
.option("--real", `${REAL_JEV_FLAG_HELP}; a conflicting/duplicate pair classification at or above the documented threshold then needs --accept-findings`)
|
|
113
|
+
.option("--jev-provider <provider>", JEV_PROVIDER_FLAG_HELP, jevProviderArg)
|
|
114
|
+
.option("--non-interactive-approval <reason>", "#437: approve without a terminal confirmation (a scripted setup), recorded as channel non-interactive (ci under a CI marker) with the reason — never as a person's; check --require-approvals fails it. A coding agent never uses this")
|
|
115
|
+
.option("--json", "emit a JSON envelope")
|
|
116
|
+
.action(async function (id) {
|
|
117
|
+
const { dir, json, reviewedHash: hashFlag, acceptFindings, real, jevProvider, nonInteractiveApproval } = this.opts();
|
|
118
|
+
let reviewedHash = hashFlag?.trim().toLowerCase();
|
|
119
|
+
if (reviewedHash !== undefined && !/^[0-9a-f]{64}$/.test(reviewedHash)) {
|
|
120
|
+
emitJson(program, fail(argsCode, "--reviewed-hash needs the 64-hex content hash a review sheet shows"));
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (acceptFindings !== undefined && acceptFindings.trim() === "") {
|
|
124
|
+
emitJson(program, fail(argsCode, "--accept-findings needs a reason"));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
checkNonInteractiveReason(nonInteractiveApproval);
|
|
129
|
+
const action = kind === "persona" ? "persona approve" : "job approve";
|
|
130
|
+
// #434/#435: every approval shows readiness and the catalog analysis; Jev only with --real.
|
|
131
|
+
const jev = await jevSetupFor(deps, resolveCatalogDir(deps.catalogDir, dir), { real, jevProvider });
|
|
132
|
+
const { catalog, review, render } = await sheet(dir, id, action, { readiness: true, jev });
|
|
133
|
+
if (!json) {
|
|
134
|
+
// Human mode: the sheet (with its findings) is shown before approving; the approval binds to what was shown.
|
|
135
|
+
program.configureOutput().writeOut?.(`${render("text")}\n`);
|
|
136
|
+
reviewedHash ??= review.contentHash;
|
|
137
|
+
}
|
|
138
|
+
const result = await approveCatalogItem(kind, catalog, id, {
|
|
139
|
+
...(reviewedHash === undefined ? {} : { reviewedHash }),
|
|
140
|
+
...(acceptFindings === undefined ? {} : { acceptFindings }),
|
|
141
|
+
jev,
|
|
142
|
+
// #437: a typed confirmation on a TTY (or the escape hatch), recorded as provenance.
|
|
143
|
+
confirm: makeApprovalConfirm(deps.approval, nonInteractiveApproval === undefined ? {} : { nonInteractiveReason: nonInteractiveApproval }),
|
|
144
|
+
});
|
|
145
|
+
emitUsageLine(program, review.jev);
|
|
146
|
+
if (json)
|
|
147
|
+
emitJson(program, ok(result));
|
|
148
|
+
else {
|
|
149
|
+
program.configureOutput().writeOut?.(`approved ${kind} '${id}' (content hash ${result.approval.contentHash}; ${describeProvenance(result.approval.provenance)})${result.previousStatus === "stale" ? " — re-approved: its Journeys no longer need re-review on its account" : ""}\n`);
|
|
150
|
+
process.exitCode = 0;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
refuse(program, err, `${code}_APPROVE`);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
export function registerCatalogCommands(program, deps) {
|
|
159
|
+
registerItemCommands(program, deps, "persona");
|
|
160
|
+
registerItemCommands(program, deps, "job");
|
|
161
|
+
const catalog = program.command("catalog").description("#433: the human-vetted catalog of personas, jobs and the Journeys linked to them");
|
|
162
|
+
catalog
|
|
163
|
+
.command("status")
|
|
164
|
+
.description("the jobs × personas matrix (which have a promoted Journey), approved jobs with no promoted Journey, Journeys linked to nothing, dangling links and stale approvals")
|
|
165
|
+
.option("--dir <path>", DIR_HELP)
|
|
166
|
+
.option("--require-approvals", "#437: exit 1 when a promoted Journey or an approved persona/job has a missing or stale approval, or one made over a channel not allowed (--allow-channels)")
|
|
167
|
+
.option("--allow-channels <list>", "#437: with --require-approvals, the approval channels that pass (comma list of tty, non-interactive, mcp, ci; default tty)")
|
|
168
|
+
.option("--json", "emit a JSON envelope (the schema-checked report)")
|
|
169
|
+
.action(async function () {
|
|
170
|
+
const { dir, json, requireApprovals, allowChannels } = this.opts();
|
|
171
|
+
try {
|
|
172
|
+
if (allowChannels !== undefined && requireApprovals !== true)
|
|
173
|
+
throw new ApprovalArgsError("--allow-channels needs --require-approvals");
|
|
174
|
+
const allowed = requireApprovals === true ? parseAllowedChannels(allowChannels) : undefined;
|
|
175
|
+
const catalog = await loadCatalog(resolveCatalogDir(deps.catalogDir, dir), catalogJourneysDir(dir, resolveJourneysDir(deps)));
|
|
176
|
+
// #437: every recorded approval and how it was made; with --require-approvals, the violations.
|
|
177
|
+
const approvals = approvalsReport([catalog], allowed);
|
|
178
|
+
const report = { ...buildCatalogStatus(catalog), approvals };
|
|
179
|
+
const failed = (approvals.requirement?.violations.length ?? 0) > 0;
|
|
180
|
+
if (json)
|
|
181
|
+
emitJson(program, ok(report));
|
|
182
|
+
else
|
|
183
|
+
program.configureOutput().writeOut?.(`${renderCatalogStatus(report)}${renderApprovals(approvals)}`);
|
|
184
|
+
process.exitCode = failed ? EXIT_CODES.defects : 0;
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
refuse(program, err, "E_CATALOG_STATUS");
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
catalog
|
|
191
|
+
.command("analyze")
|
|
192
|
+
.description("#435: problems BETWEEN catalog items, grouped by INCOSE GtWR set characteristic — candidate pairs (paired by code: shared persona/terms, opposing writes, same role) classified by Jev (with --real) as compatible/duplicate/overlapping/conflicting/dependent, " +
|
|
193
|
+
"completeness gaps, and update advice (stale approvals, Journeys whose last mutation proof fails). Read-only and advisory: it never changes the catalog and never gates")
|
|
194
|
+
.option("--dir <path>", DIR_HELP)
|
|
195
|
+
.option("--real", "#435: classify the candidate pairs with Jev (advisory; cached by content hash). Without a judgment key: the deterministic layer only")
|
|
196
|
+
.option("--jev-provider <provider>", JEV_PROVIDER_FLAG_HELP, jevProviderArg)
|
|
197
|
+
.option("--max-pairs <n>", `the most candidate pairs to judge (default ${ANALYZE_PAIR_CAP}); the rest are listed as overflow, never dropped`, positiveIntArg)
|
|
198
|
+
.option("--markdown", "render the report as Markdown")
|
|
199
|
+
.option("--json", "emit a JSON envelope (the schema-checked report)")
|
|
200
|
+
.action(async function () {
|
|
201
|
+
const { dir, json, markdown, real, jevProvider, maxPairs } = this.opts();
|
|
202
|
+
if (json === true && markdown === true) {
|
|
203
|
+
emitJson(program, fail("E_CATALOG_ANALYZE_ARGS", "--json and --markdown are exclusive: pick one rendering"));
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
try {
|
|
207
|
+
const catalogDir = resolveCatalogDir(deps.catalogDir, dir);
|
|
208
|
+
const loaded = await loadCatalog(catalogDir, catalogJourneysDir(dir, resolveJourneysDir(deps)));
|
|
209
|
+
const jev = await jevSetupFor(deps, catalogDir, { real, jevProvider });
|
|
210
|
+
const { report } = await analyzeCatalog(loaded, { jev, ...(maxPairs === undefined ? {} : { pairCap: maxPairs }) });
|
|
211
|
+
if (json)
|
|
212
|
+
emitJson(program, ok(report));
|
|
213
|
+
else
|
|
214
|
+
program.configureOutput().writeOut?.(renderCatalogAnalysis(report, markdown ? "markdown" : "text"));
|
|
215
|
+
emitUsageLine(program, report.jev);
|
|
216
|
+
// Advisory: the report's findings never change the exit code.
|
|
217
|
+
process.exitCode = 0;
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
refuse(program, err, "E_CATALOG_ANALYZE");
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=catalog-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-cli.js","sourceRoot":"","sources":["../src/catalog-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type CatalogStatusReport, type Finding, type JobReview, type PersonaReview } from "@jevitate/journey";
|
|
2
|
+
import { type Catalog } from "./catalog.js";
|
|
3
|
+
import { type ApprovalAction } from "./pre-approval.js";
|
|
4
|
+
import { type JevSetup } from "./jev-advisor.js";
|
|
5
|
+
/** #434/#435: what a review sheet asks of the pipeline beyond the defaults. */
|
|
6
|
+
export interface SheetOptions {
|
|
7
|
+
/** #434: include the Readiness section (`--readiness`; every approval sets it). */
|
|
8
|
+
readonly readiness?: boolean;
|
|
9
|
+
/** #434/#435: the advisory Jev layer (`--real`), or why it is skipped. */
|
|
10
|
+
readonly jev?: JevSetup;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildPersonaReview(catalog: Catalog, id: string, action?: ApprovalAction, opts?: SheetOptions): Promise<PersonaReview>;
|
|
13
|
+
export declare function buildJobReview(catalog: Catalog, id: string, action?: ApprovalAction, opts?: SheetOptions): Promise<JobReview>;
|
|
14
|
+
/** #433: `catalog status` — the jobs × personas matrix, gaps, unlinked Journeys, dangling links, stale approvals. */
|
|
15
|
+
export declare function buildCatalogStatus(catalog: Catalog): CatalogStatusReport;
|
|
16
|
+
type Style = "markdown" | "text";
|
|
17
|
+
/** #435: catalog-analysis findings, one sub-section per INCOSE GtWR set characteristic (non-empty ones, in the guide's order). */
|
|
18
|
+
export declare function renderAnalysisGroups(findings: readonly Finding[], style: Style): string[];
|
|
19
|
+
/**
|
|
20
|
+
* #433: the pre-approval findings every review sheet shows before an approval. #434: the readiness
|
|
21
|
+
* findings form their own Readiness section, its two layers apart (deterministic checks; the
|
|
22
|
+
* advisory Jev review). #435: the catalog analysis forms its own section, grouped by GtWR set
|
|
23
|
+
* characteristic. The acknowledgment line counts every section.
|
|
24
|
+
*/
|
|
25
|
+
export declare function renderFindings(findings: readonly Finding[], style: Style): string[];
|
|
26
|
+
export declare function renderPersonaReview(r: PersonaReview, style: Style): string;
|
|
27
|
+
export declare function renderJobReview(r: JobReview, style: Style): string;
|
|
28
|
+
export declare function renderCatalogStatus(r: CatalogStatusReport): string;
|
|
29
|
+
export {};
|