@jevitate/cli 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-cli.d.ts +3 -1
- package/dist/ai-cli.js +60 -16
- package/dist/ai-cli.js.map +1 -1
- package/dist/approval-provenance.d.ts +136 -0
- package/dist/approval-provenance.js +317 -0
- package/dist/approval-provenance.js.map +1 -0
- package/dist/author-journey-cli.js +4 -2
- package/dist/author-journey-cli.js.map +1 -1
- package/dist/bin.js +30544 -20851
- package/dist/browser-cli.d.ts +10 -0
- package/dist/browser-cli.js +50 -0
- package/dist/browser-cli.js.map +1 -0
- package/dist/build-info.generated.js +2 -2
- package/dist/builtin-analyzers.d.ts +7 -0
- package/dist/builtin-analyzers.js +19 -0
- package/dist/builtin-analyzers.js.map +1 -0
- package/dist/campaign-cli.d.ts +6 -0
- package/dist/campaign-cli.js +9 -4
- package/dist/campaign-cli.js.map +1 -1
- package/dist/catalog-analysis.d.ts +70 -0
- package/dist/catalog-analysis.js +507 -0
- package/dist/catalog-analysis.js.map +1 -0
- package/dist/catalog-api.d.ts +73 -0
- package/dist/catalog-api.js +97 -0
- package/dist/catalog-api.js.map +1 -0
- package/dist/catalog-cli.d.ts +12 -0
- package/dist/catalog-cli.js +224 -0
- package/dist/catalog-cli.js.map +1 -0
- package/dist/catalog-review.d.ts +29 -0
- package/dist/catalog-review.js +290 -0
- package/dist/catalog-review.js.map +1 -0
- package/dist/catalog.d.ts +133 -0
- package/dist/catalog.js +352 -0
- package/dist/catalog.js.map +1 -0
- package/dist/change-context.d.ts +44 -0
- package/dist/change-context.js +203 -0
- package/dist/change-context.js.map +1 -0
- package/dist/check-api.d.ts +1 -1
- package/dist/check-api.js +68 -9
- package/dist/check-api.js.map +1 -1
- package/dist/check-cli.d.ts +5 -1
- package/dist/check-cli.js +64 -10
- package/dist/check-cli.js.map +1 -1
- package/dist/check-execute.d.ts +16 -1
- package/dist/check-execute.js +78 -31
- package/dist/check-execute.js.map +1 -1
- package/dist/check-plan.d.ts +14 -0
- package/dist/check-plan.js +28 -2
- package/dist/check-plan.js.map +1 -1
- package/dist/check-suite.js +6 -3
- package/dist/check-suite.js.map +1 -1
- package/dist/check-types.d.ts +51 -6
- package/dist/check-types.js +8 -0
- package/dist/check-types.js.map +1 -1
- package/dist/cli-output.js +85 -5
- package/dist/cli-output.js.map +1 -1
- package/dist/cli-shared.d.ts +22 -2
- package/dist/cli-shared.js +34 -5
- package/dist/cli-shared.js.map +1 -1
- package/dist/demo-aspect-api.d.ts +15 -0
- package/dist/demo-aspect-api.js +26 -1
- package/dist/demo-aspect-api.js.map +1 -1
- package/dist/demo-aspect-cli.js +64 -5
- package/dist/demo-aspect-cli.js.map +1 -1
- package/dist/exit-codes.d.ts +6 -3
- package/dist/exit-codes.js +13 -3
- package/dist/exit-codes.js.map +1 -1
- package/dist/explore-adversarial.d.ts +3 -1
- package/dist/explore-adversarial.js +4 -4
- package/dist/explore-adversarial.js.map +1 -1
- package/dist/explore-author.js +5 -2
- package/dist/explore-author.js.map +1 -1
- package/dist/explore-cli.js +145 -9
- package/dist/explore-cli.js.map +1 -1
- package/dist/explore-coverage.d.ts +6 -2
- package/dist/explore-coverage.js +7 -6
- package/dist/explore-coverage.js.map +1 -1
- package/dist/explore-feature.d.ts +3 -1
- package/dist/explore-feature.js +5 -5
- package/dist/explore-feature.js.map +1 -1
- package/dist/explore-goal.d.ts +37 -6
- package/dist/explore-goal.js +69 -50
- package/dist/explore-goal.js.map +1 -1
- package/dist/explore-shared.d.ts +12 -7
- package/dist/explore-shared.js +9 -1
- package/dist/explore-shared.js.map +1 -1
- package/dist/findings-filing.d.ts +6 -0
- package/dist/findings-filing.js +15 -1
- package/dist/findings-filing.js.map +1 -1
- package/dist/goal-run-flags.d.ts +2 -0
- package/dist/goal-run-flags.js +8 -1
- package/dist/goal-run-flags.js.map +1 -1
- package/dist/heal-probe-guard.d.ts +9 -0
- package/dist/heal-probe-guard.js +113 -0
- package/dist/heal-probe-guard.js.map +1 -0
- package/dist/host-health-run.d.ts +32 -1
- package/dist/host-health-run.js +38 -1
- package/dist/host-health-run.js.map +1 -1
- package/dist/http-5xx-outcome.d.ts +8 -3
- package/dist/http-5xx-outcome.js +5 -15
- package/dist/http-5xx-outcome.js.map +1 -1
- package/dist/init-cli.d.ts +7 -0
- package/dist/init-cli.js +79 -9
- package/dist/init-cli.js.map +1 -1
- package/dist/init-codeowners.d.ts +39 -0
- package/dist/init-codeowners.js +91 -0
- package/dist/init-codeowners.js.map +1 -0
- package/dist/init-keys.d.ts +3 -1
- package/dist/init-keys.js +20 -8
- package/dist/init-keys.js.map +1 -1
- package/dist/init-skills.d.ts +85 -7
- package/dist/init-skills.js +303 -36
- package/dist/init-skills.js.map +1 -1
- package/dist/jev-advisor.d.ts +72 -0
- package/dist/jev-advisor.js +172 -0
- package/dist/jev-advisor.js.map +1 -0
- package/dist/journey-api.d.ts +76 -5
- package/dist/journey-api.js +238 -29
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.js +257 -23
- package/dist/journey-cli.js.map +1 -1
- package/dist/journey-heal.d.ts +74 -0
- package/dist/journey-heal.js +180 -0
- package/dist/journey-heal.js.map +1 -0
- package/dist/journey-network-checks.d.ts +5 -1
- package/dist/journey-network-checks.js +15 -4
- package/dist/journey-network-checks.js.map +1 -1
- package/dist/journey-prefix.js +2 -2
- package/dist/journey-prefix.js.map +1 -1
- package/dist/journey-proposal-store.d.ts +100 -0
- package/dist/journey-proposal-store.js +342 -0
- package/dist/journey-proposal-store.js.map +1 -0
- package/dist/journey-result-record.d.ts +40 -0
- package/dist/journey-result-record.js +28 -0
- package/dist/journey-result-record.js.map +1 -0
- package/dist/journey-review-api.d.ts +19 -0
- package/dist/journey-review-api.js +53 -0
- package/dist/journey-review-api.js.map +1 -0
- package/dist/journey-review-store.d.ts +16 -0
- package/dist/journey-review-store.js +95 -0
- package/dist/journey-review-store.js.map +1 -0
- package/dist/journey-review.d.ts +54 -0
- package/dist/journey-review.js +538 -0
- package/dist/journey-review.js.map +1 -0
- package/dist/journey-verify.js +14 -1
- package/dist/journey-verify.js.map +1 -1
- package/dist/key-report.d.ts +20 -5
- package/dist/key-report.js +32 -9
- package/dist/key-report.js.map +1 -1
- package/dist/kill-signal.js +10 -2
- package/dist/kill-signal.js.map +1 -1
- package/dist/launch-armed.js +5 -1
- package/dist/launch-armed.js.map +1 -1
- package/dist/load-cli.js +4 -2
- package/dist/load-cli.js.map +1 -1
- package/dist/log-classes.d.ts +73 -0
- package/dist/log-classes.js +167 -0
- package/dist/log-classes.js.map +1 -0
- package/dist/log-correlation.d.ts +29 -10
- package/dist/log-correlation.js +44 -21
- package/dist/log-correlation.js.map +1 -1
- package/dist/login-cli.d.ts +17 -0
- package/dist/login-cli.js +161 -0
- package/dist/login-cli.js.map +1 -0
- package/dist/logs-cli.js +3 -1
- package/dist/logs-cli.js.map +1 -1
- package/dist/mcp-api.d.ts +6 -1
- package/dist/mcp-api.js +110 -16
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-cli-runner.d.ts +2 -0
- package/dist/mcp-cli-runner.js +3 -1
- package/dist/mcp-cli-runner.js.map +1 -1
- package/dist/mcp-cli-tools.d.ts +5 -0
- package/dist/mcp-cli-tools.js +178 -23
- package/dist/mcp-cli-tools.js.map +1 -1
- package/dist/mission-cli.js +8 -4
- package/dist/mission-cli.js.map +1 -1
- package/dist/mission-journal.d.ts +4 -1
- package/dist/mission-journal.js +9 -3
- package/dist/mission-journal.js.map +1 -1
- package/dist/mission-queue-cli.js +21 -2
- package/dist/mission-queue-cli.js.map +1 -1
- package/dist/mission-queue-runner.d.ts +6 -0
- package/dist/mission-queue-runner.js +33 -3
- package/dist/mission-queue-runner.js.map +1 -1
- package/dist/multi-run-cli.d.ts +7 -1
- package/dist/multi-run-cli.js +10 -3
- package/dist/multi-run-cli.js.map +1 -1
- package/dist/multi-run.d.ts +44 -8
- package/dist/multi-run.js +118 -25
- package/dist/multi-run.js.map +1 -1
- package/dist/persona-login.d.ts +256 -0
- package/dist/persona-login.js +884 -0
- package/dist/persona-login.js.map +1 -0
- package/dist/pre-approval.d.ts +98 -0
- package/dist/pre-approval.js +175 -0
- package/dist/pre-approval.js.map +1 -0
- package/dist/program.js +12 -0
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +2 -1
- package/dist/project-dir.js +3 -1
- package/dist/project-dir.js.map +1 -1
- package/dist/readiness.d.ts +29 -0
- package/dist/readiness.js +291 -0
- package/dist/readiness.js.map +1 -0
- package/dist/regression-cli.js +4 -2
- package/dist/regression-cli.js.map +1 -1
- package/dist/report-api.d.ts +25 -2
- package/dist/report-api.js +34 -5
- package/dist/report-api.js.map +1 -1
- package/dist/report-cli.js +8 -1
- package/dist/report-cli.js.map +1 -1
- package/dist/resource-preflight.js +5 -3
- package/dist/resource-preflight.js.map +1 -1
- package/dist/result-schema.d.ts +12 -0
- package/dist/result-schema.js +8 -0
- package/dist/result-schema.js.map +1 -1
- package/dist/run-index.d.ts +4 -2
- package/dist/run-index.js +3 -1
- package/dist/run-index.js.map +1 -1
- package/dist/run-key-preflight.d.ts +2 -1
- package/dist/run-key-preflight.js +3 -2
- package/dist/run-key-preflight.js.map +1 -1
- package/dist/run-metadata.d.ts +29 -0
- package/dist/run-metadata.js +48 -0
- package/dist/run-metadata.js.map +1 -0
- package/dist/run-tags-cli.d.ts +14 -0
- package/dist/run-tags-cli.js +41 -0
- package/dist/run-tags-cli.js.map +1 -0
- package/dist/self-heal-adapter.d.ts +43 -27
- package/dist/self-heal-adapter.js +196 -62
- package/dist/self-heal-adapter.js.map +1 -1
- package/dist/site-cli.d.ts +1 -1
- package/dist/site-cli.js +24 -1
- package/dist/site-cli.js.map +1 -1
- package/dist/source-cli.js +9 -5
- package/dist/source-cli.js.map +1 -1
- package/dist/suite-explore-options.d.ts +14 -0
- package/dist/suite-explore-options.js +8 -0
- package/dist/suite-explore-options.js.map +1 -1
- package/dist/sweep-api.d.ts +289 -0
- package/dist/sweep-api.js +859 -0
- package/dist/sweep-api.js.map +1 -0
- package/dist/sweep-cli.d.ts +9 -0
- package/dist/sweep-cli.js +117 -0
- package/dist/sweep-cli.js.map +1 -0
- package/dist/target-config.d.ts +5 -2
- package/dist/target-config.js +15 -0
- package/dist/target-config.js.map +1 -1
- package/dist/ux-cli.js +3 -1
- package/dist/ux-cli.js.map +1 -1
- package/dist/ux-usability.d.ts +9 -3
- package/dist/ux-usability.js +8 -5
- package/dist/ux-usability.js.map +1 -1
- package/dist/verify-fix-cli.js +4 -2
- package/dist/verify-fix-cli.js.map +1 -1
- package/package.json +9 -9
- package/skills/jevitate-ci-check/SKILL.md +9 -1
- package/skills/jevitate-demo/SKILL.md +5 -2
- package/skills/jevitate-getting-started/SKILL.md +14 -1
- package/skills/jevitate-mission-scope/SKILL.md +2 -2
- package/skills/jevitate-run-journey/SKILL.md +42 -9
- package/skills/jevitate-test-campaign/SKILL.md +26 -5
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { describeProvenance } from "./approval-provenance.js";
|
|
2
|
+
import { CatalogStatusSchema, GTWR_SET_CHARACTERISTICS, JobReviewSchema, PersonaReviewSchema, } from "@jevitate/journey";
|
|
3
|
+
import { journeyLinks, journeysForJob, journeysForPersona, personaLinkId, requireJob, requirePersona } from "./catalog.js";
|
|
4
|
+
import { preApprovalFindings } from "./pre-approval.js";
|
|
5
|
+
import { jevLayerOf } from "./jev-advisor.js";
|
|
6
|
+
function sheetCtx(action, opts) {
|
|
7
|
+
return { action, ...(opts.readiness === true ? { readiness: true } : {}), ...(opts.jev === undefined ? {} : { jev: opts.jev }) };
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* #433 — the persona and job review sheets (`persona|job review <id>`, MCP `review_persona` /
|
|
11
|
+
* `review_job`) and `catalog status`. Built from a loaded `Catalog`; the sheets carry the
|
|
12
|
+
* pre-approval findings (`preApprovalFindings`), so what a reviewer reads is what `approve` gates on.
|
|
13
|
+
*/
|
|
14
|
+
function journeyRef(catalog, j) {
|
|
15
|
+
return { id: j.id, name: j.name, promoted: j.promoted, needsReReview: journeyLinks(catalog, j).needsReReview.length > 0 };
|
|
16
|
+
}
|
|
17
|
+
export async function buildPersonaReview(catalog, id, action = "review", opts = {}) {
|
|
18
|
+
const p = requirePersona(catalog, id);
|
|
19
|
+
const findings = await preApprovalFindings({ kind: "persona", id }, catalog, sheetCtx(action, opts));
|
|
20
|
+
return PersonaReviewSchema.parse({
|
|
21
|
+
id: p.id,
|
|
22
|
+
...(p.description === undefined ? {} : { description: p.description }),
|
|
23
|
+
...(p.role === undefined ? {} : { role: p.role }),
|
|
24
|
+
status: p.status,
|
|
25
|
+
needsReReview: p.status === "stale",
|
|
26
|
+
session: { storageState: p.hasStorageState, login: p.hasLogin },
|
|
27
|
+
jobs: catalog.jobs.filter((j) => j.personas.includes(id)).map((j) => ({ id: j.id, story: j.story, status: j.status })),
|
|
28
|
+
journeys: journeysForPersona(catalog, id).map((j) => journeyRef(catalog, j)),
|
|
29
|
+
findings,
|
|
30
|
+
...(opts.jev === undefined ? {} : { jev: jevLayerOf(opts.jev) }),
|
|
31
|
+
...(p.approval === undefined ? {} : { approval: p.approval }),
|
|
32
|
+
contentHash: p.contentHash,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function buildJobReview(catalog, id, action = "review", opts = {}) {
|
|
36
|
+
const job = requireJob(catalog, id);
|
|
37
|
+
const findings = await preApprovalFindings({ kind: "job", id }, catalog, sheetCtx(action, opts));
|
|
38
|
+
const journeys = journeysForJob(catalog, id);
|
|
39
|
+
const personas = job.personas.map((pid) => {
|
|
40
|
+
const mine = journeys.filter((j) => personaLinkId(catalog, j) === pid);
|
|
41
|
+
return {
|
|
42
|
+
id: pid,
|
|
43
|
+
status: catalog.personas.find((p) => p.id === pid)?.status ?? "unknown",
|
|
44
|
+
journeys: mine.map((j) => j.id),
|
|
45
|
+
promotedJourneys: mine.filter((j) => j.promoted).map((j) => j.id),
|
|
46
|
+
};
|
|
47
|
+
});
|
|
48
|
+
return JobReviewSchema.parse({
|
|
49
|
+
id: job.id,
|
|
50
|
+
story: job.story,
|
|
51
|
+
trigger: job.job.trigger,
|
|
52
|
+
motivation: job.job.motivation,
|
|
53
|
+
outcome: job.job.outcome,
|
|
54
|
+
...(job.job.priority === undefined ? {} : { priority: job.job.priority }),
|
|
55
|
+
status: job.status,
|
|
56
|
+
needsReReview: job.status === "stale",
|
|
57
|
+
personas,
|
|
58
|
+
gaps: personas.filter((p) => p.promotedJourneys.length === 0).map((p) => p.id),
|
|
59
|
+
journeys: journeys.map((j) => {
|
|
60
|
+
const persona = personaLinkId(catalog, j);
|
|
61
|
+
return { ...journeyRef(catalog, j), ...(persona === undefined ? {} : { persona }) };
|
|
62
|
+
}),
|
|
63
|
+
findings,
|
|
64
|
+
...(opts.jev === undefined ? {} : { jev: jevLayerOf(opts.jev) }),
|
|
65
|
+
...(job.approval === undefined ? {} : { approval: job.approval }),
|
|
66
|
+
contentHash: job.contentHash,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** #433: `catalog status` — the jobs × personas matrix, gaps, unlinked Journeys, dangling links, stale approvals. */
|
|
70
|
+
export function buildCatalogStatus(catalog) {
|
|
71
|
+
const personaIds = catalog.personas.map((p) => p.id);
|
|
72
|
+
const unknownPersonas = [...new Set(catalog.jobs.flatMap((j) => j.personas))].filter((id) => !personaIds.includes(id));
|
|
73
|
+
const columns = [...personaIds, ...unknownPersonas];
|
|
74
|
+
const gaps = [];
|
|
75
|
+
const matrix = catalog.jobs.map((job) => {
|
|
76
|
+
const journeys = journeysForJob(catalog, job.id);
|
|
77
|
+
const cells = {};
|
|
78
|
+
for (const pid of columns) {
|
|
79
|
+
if (!job.personas.includes(pid)) {
|
|
80
|
+
cells[pid] = { state: "n/a", journeys: [] };
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
const mine = journeys.filter((j) => personaLinkId(catalog, j) === pid);
|
|
84
|
+
const state = mine.some((j) => j.promoted) ? "promoted" : mine.length > 0 ? "draft" : "missing";
|
|
85
|
+
if (state !== "promoted")
|
|
86
|
+
gaps.push({ job: job.id, persona: pid });
|
|
87
|
+
cells[pid] = { state, journeys: mine.map((j) => j.id) };
|
|
88
|
+
}
|
|
89
|
+
return { job: job.id, cells };
|
|
90
|
+
});
|
|
91
|
+
const stale = [
|
|
92
|
+
...catalog.personas.filter((p) => p.status === "stale").map((p) => ({ kind: "persona", id: p.id, reason: "edited since its approval" })),
|
|
93
|
+
...catalog.jobs.filter((j) => j.status === "stale").map((j) => ({ kind: "job", id: j.id, reason: "edited since its approval" })),
|
|
94
|
+
...catalog.journeys.flatMap((j) => {
|
|
95
|
+
const why = journeyLinks(catalog, j).needsReReview;
|
|
96
|
+
return why.length === 0 ? [] : [{ kind: "journey", id: j.id, reason: why.join("; ") }];
|
|
97
|
+
}),
|
|
98
|
+
];
|
|
99
|
+
const danglingLinks = catalog.journeys.flatMap((j) => {
|
|
100
|
+
const links = journeyLinks(catalog, j);
|
|
101
|
+
return [
|
|
102
|
+
...(links.job?.status === "unknown" ? [{ journey: j.id, kind: "job", id: links.job.id }] : []),
|
|
103
|
+
...(links.persona?.status === "unknown" ? [{ journey: j.id, kind: "persona", id: links.persona.id }] : []),
|
|
104
|
+
];
|
|
105
|
+
});
|
|
106
|
+
return CatalogStatusSchema.parse({
|
|
107
|
+
personas: catalog.personas.map((p) => ({ id: p.id, status: p.status, ...(p.role === undefined ? {} : { role: p.role }) })),
|
|
108
|
+
jobs: catalog.jobs.map((j) => ({ id: j.id, story: j.story, status: j.status, ...(j.job.priority === undefined ? {} : { priority: j.job.priority }), personas: [...j.personas] })),
|
|
109
|
+
matrix,
|
|
110
|
+
approvedJobsWithoutPromotedJourney: catalog.jobs.filter((j) => j.status === "approved" && !journeysForJob(catalog, j.id).some((x) => x.promoted)).map((j) => j.id),
|
|
111
|
+
gaps,
|
|
112
|
+
unlinkedJourneys: catalog.journeys.filter((j) => !journeyLinks(catalog, j).linked).map((j) => j.id),
|
|
113
|
+
danglingLinks,
|
|
114
|
+
stale,
|
|
115
|
+
files: { personas: catalog.personasFile, jobs: catalog.jobsFile },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function helpers(style) {
|
|
119
|
+
const md = style === "markdown";
|
|
120
|
+
return {
|
|
121
|
+
md,
|
|
122
|
+
code: (s) => (md ? `\`${s.replace(/`/g, "'")}\`` : s),
|
|
123
|
+
h1: (s) => (md ? `# ${s}` : `${s}\n${"=".repeat(Math.min(s.length, 80))}`),
|
|
124
|
+
h2: (s) => (md ? `## ${s}` : s.toUpperCase()),
|
|
125
|
+
em: (s) => (md ? `_${s}_` : s),
|
|
126
|
+
li: (s, depth = 0) => `${" ".repeat(md ? depth : depth + 1)}- ${s}`,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const STATUS_WORDS = { draft: "draft (not approved)", approved: "approved", stale: "STALE — edited since its approval: needs re-review", unknown: "UNKNOWN — not declared in the catalog" };
|
|
130
|
+
function findingLine(f, code) {
|
|
131
|
+
return `${f.requiresAcknowledgment ? "⚠ NEEDS ACKNOWLEDGMENT " : ""}${f.severity} ${code(`${f.analyzer}/${f.code}`)}: ${f.message}${f.probability === undefined ? "" : ` (p=${f.probability.toFixed(2)})`}${f.characteristic === undefined ? "" : ` [GtWR: ${f.characteristic}]`}${f.fix === undefined ? "" : ` — fix: ${f.fix}`}`;
|
|
132
|
+
}
|
|
133
|
+
/** #435: catalog-analysis findings, one sub-section per INCOSE GtWR set characteristic (non-empty ones, in the guide's order). */
|
|
134
|
+
export function renderAnalysisGroups(findings, style) {
|
|
135
|
+
const { md, li, code } = helpers(style);
|
|
136
|
+
const h3 = (s) => (md ? `### ${s}` : `${s}:`);
|
|
137
|
+
const out = [];
|
|
138
|
+
for (const characteristic of GTWR_SET_CHARACTERISTICS) {
|
|
139
|
+
const mine = findings.filter((f) => f.characteristic === characteristic);
|
|
140
|
+
if (mine.length > 0)
|
|
141
|
+
out.push(h3(`GtWR: ${characteristic}`), "", ...mine.map((f) => li(findingLine(f, code))), "");
|
|
142
|
+
}
|
|
143
|
+
const other = findings.filter((f) => !GTWR_SET_CHARACTERISTICS.includes(f.characteristic ?? ""));
|
|
144
|
+
if (other.length > 0)
|
|
145
|
+
out.push(h3("Other"), "", ...other.map((f) => li(findingLine(f, code))), "");
|
|
146
|
+
return out;
|
|
147
|
+
}
|
|
148
|
+
/** The analyzers whose findings get their own section of the sheet (#434 readiness, #435 catalog analysis). */
|
|
149
|
+
const READINESS_ANALYZER = "readiness";
|
|
150
|
+
const READINESS_JEV_ANALYZER = "readiness-jev";
|
|
151
|
+
const CATALOG_ANALYSIS_ANALYZER = "catalog-analysis";
|
|
152
|
+
/**
|
|
153
|
+
* #433: the pre-approval findings every review sheet shows before an approval. #434: the readiness
|
|
154
|
+
* findings form their own Readiness section, its two layers apart (deterministic checks; the
|
|
155
|
+
* advisory Jev review). #435: the catalog analysis forms its own section, grouped by GtWR set
|
|
156
|
+
* characteristic. The acknowledgment line counts every section.
|
|
157
|
+
*/
|
|
158
|
+
export function renderFindings(findings, style) {
|
|
159
|
+
const { h2, li, em, code, md } = helpers(style);
|
|
160
|
+
const h3 = (s) => (md ? `### ${s}` : `${s}:`);
|
|
161
|
+
const blocking = findings.filter((f) => f.requiresAcknowledgment).length;
|
|
162
|
+
const of = (id) => findings.filter((f) => f.analyzer === id);
|
|
163
|
+
const readiness = of(READINESS_ANALYZER);
|
|
164
|
+
const jev = of(READINESS_JEV_ANALYZER);
|
|
165
|
+
const analysis = of(CATALOG_ANALYSIS_ANALYZER);
|
|
166
|
+
const rest = findings.filter((f) => f.analyzer !== READINESS_ANALYZER && f.analyzer !== READINESS_JEV_ANALYZER && f.analyzer !== CATALOG_ANALYSIS_ANALYZER);
|
|
167
|
+
const lines = (fs) => (fs.length === 0 ? [li(em("none"))] : fs.map((f) => li(findingLine(f, code))));
|
|
168
|
+
return [
|
|
169
|
+
...(readiness.length + jev.length === 0
|
|
170
|
+
? []
|
|
171
|
+
: [
|
|
172
|
+
h2("Readiness"),
|
|
173
|
+
"",
|
|
174
|
+
h3("Deterministic checks (pass / warn / fail, with INCOSE GtWR rules)"),
|
|
175
|
+
"",
|
|
176
|
+
...lines(readiness),
|
|
177
|
+
"",
|
|
178
|
+
h3("Jev review (advisory: never blocks, never changes an exit code)"),
|
|
179
|
+
"",
|
|
180
|
+
...lines(jev),
|
|
181
|
+
"",
|
|
182
|
+
]),
|
|
183
|
+
...(analysis.length === 0 ? [] : [h2("Catalog analysis (against the rest of the catalog)"), "", ...renderAnalysisGroups(analysis, style)]),
|
|
184
|
+
h2("Pre-approval findings"),
|
|
185
|
+
"",
|
|
186
|
+
...lines(rest),
|
|
187
|
+
...(blocking === 0 ? [] : ["", `${blocking} finding(s) need an acknowledgment: approving refuses (E_APPROVAL_FINDINGS) unless you pass --accept-findings "<reason>".`]),
|
|
188
|
+
];
|
|
189
|
+
}
|
|
190
|
+
function finish(out) {
|
|
191
|
+
return `${out.join("\n").replace(/\n{3,}/g, "\n\n").trimEnd()}\n`;
|
|
192
|
+
}
|
|
193
|
+
export function renderPersonaReview(r, style) {
|
|
194
|
+
const { h1, h2, li, em, code } = helpers(style);
|
|
195
|
+
const out = [
|
|
196
|
+
h1(`Persona review: ${r.id}`),
|
|
197
|
+
"",
|
|
198
|
+
`Content hash: ${code(r.contentHash)}`,
|
|
199
|
+
`Status: ${STATUS_WORDS[r.status]}${r.approval === undefined ? "" : ` · last approved ${r.approval.at} — ${describeProvenance(r.approval.provenance)}`}`,
|
|
200
|
+
"",
|
|
201
|
+
h2("Who"),
|
|
202
|
+
"",
|
|
203
|
+
li(`Description: ${r.description ?? em("none")}`),
|
|
204
|
+
li(`Account role: ${r.role ?? em("none")}`),
|
|
205
|
+
li(`Session: ${r.session.storageState ? "storage state declared" : "no storage state"}${r.session.login ? ", login parameters declared" : ""}`),
|
|
206
|
+
"",
|
|
207
|
+
h2("Jobs it serves"),
|
|
208
|
+
"",
|
|
209
|
+
...(r.jobs.length === 0 ? [li(em("none"))] : r.jobs.map((j) => li(`${code(j.id)} (${j.status}): ${j.story}`))),
|
|
210
|
+
"",
|
|
211
|
+
h2("Journeys linked to it"),
|
|
212
|
+
"",
|
|
213
|
+
...(r.journeys.length === 0 ? [li(em("none"))] : r.journeys.map((j) => li(`${code(j.id)} — ${j.name} (${j.promoted ? "promoted" : "not promoted"})${j.needsReReview ? " — needs re-review" : ""}`))),
|
|
214
|
+
"",
|
|
215
|
+
...renderFindings(r.findings, style),
|
|
216
|
+
"",
|
|
217
|
+
h2("Approve"),
|
|
218
|
+
"",
|
|
219
|
+
`Approve exactly this version: ${code(`jevitate persona approve ${r.id} --reviewed-hash ${r.contentHash}`)}`,
|
|
220
|
+
];
|
|
221
|
+
return finish(out);
|
|
222
|
+
}
|
|
223
|
+
export function renderJobReview(r, style) {
|
|
224
|
+
const { h1, h2, li, em, code } = helpers(style);
|
|
225
|
+
const out = [
|
|
226
|
+
h1(`Job review: ${r.id}`),
|
|
227
|
+
"",
|
|
228
|
+
`Content hash: ${code(r.contentHash)}`,
|
|
229
|
+
`Status: ${STATUS_WORDS[r.status]}${r.approval === undefined ? "" : ` · last approved ${r.approval.at} — ${describeProvenance(r.approval.provenance)}`}`,
|
|
230
|
+
"",
|
|
231
|
+
h2("Job story"),
|
|
232
|
+
"",
|
|
233
|
+
r.story,
|
|
234
|
+
"",
|
|
235
|
+
li(`Trigger (when): ${r.trigger}`),
|
|
236
|
+
li(`Motivation (I want to): ${r.motivation}`),
|
|
237
|
+
li(`Outcome (so I can): ${r.outcome}`),
|
|
238
|
+
...(r.priority === undefined ? [] : [li(`Priority: ${r.priority}`)]),
|
|
239
|
+
"",
|
|
240
|
+
h2("Personas"),
|
|
241
|
+
"",
|
|
242
|
+
...(r.personas.length === 0
|
|
243
|
+
? [li(em("none"))]
|
|
244
|
+
: r.personas.map((p) => li(`${code(p.id)} (${STATUS_WORDS[p.status]}): ${p.promotedJourneys.length > 0 ? `promoted Journey(s) ${p.promotedJourneys.map(code).join(", ")}` : p.journeys.length > 0 ? `only unpromoted Journey(s) ${p.journeys.map(code).join(", ")}` : "no Journey"}`))),
|
|
245
|
+
"",
|
|
246
|
+
h2("Gaps"),
|
|
247
|
+
"",
|
|
248
|
+
...(r.gaps.length === 0 ? [li(em("none — every persona it serves has a promoted Journey"))] : r.gaps.map((g) => li(`no promoted Journey for persona ${code(g)}`))),
|
|
249
|
+
"",
|
|
250
|
+
h2("Journeys"),
|
|
251
|
+
"",
|
|
252
|
+
...(r.journeys.length === 0
|
|
253
|
+
? [li(em("none"))]
|
|
254
|
+
: r.journeys.map((j) => li(`${code(j.id)} — ${j.name}${j.persona === undefined ? "" : ` as ${j.persona}`} (${j.promoted ? "promoted" : "not promoted"})${j.needsReReview ? " — needs re-review" : ""}`))),
|
|
255
|
+
"",
|
|
256
|
+
...renderFindings(r.findings, style),
|
|
257
|
+
"",
|
|
258
|
+
h2("Approve"),
|
|
259
|
+
"",
|
|
260
|
+
`Approve exactly this version: ${code(`jevitate job approve ${r.id} --reviewed-hash ${r.contentHash}`)}`,
|
|
261
|
+
];
|
|
262
|
+
return finish(out);
|
|
263
|
+
}
|
|
264
|
+
const CELL = { "n/a": "·", promoted: "✓", draft: "draft", missing: "MISSING" };
|
|
265
|
+
export function renderCatalogStatus(r) {
|
|
266
|
+
const out = ["Catalog status", "=============="];
|
|
267
|
+
if (r.files.personas === null && r.files.jobs === null && r.unlinkedJourneys.length === 0 && r.stale.length === 0) {
|
|
268
|
+
out.push("", "No personas or jobs declared (.jevitate/personas.json, .jevitate/jobs.json) — see docs/catalog.md.");
|
|
269
|
+
}
|
|
270
|
+
out.push("", `Personas: ${r.personas.length === 0 ? "none" : r.personas.map((p) => `${p.id} (${p.status})`).join(", ")}`);
|
|
271
|
+
out.push(`Jobs: ${r.jobs.length === 0 ? "none" : r.jobs.map((j) => `${j.id} (${j.status})`).join(", ")}`);
|
|
272
|
+
if (r.matrix.length > 0) {
|
|
273
|
+
const cols = Object.keys(r.matrix[0].cells);
|
|
274
|
+
const rows = [["job \\ persona", ...cols], ...r.matrix.map((m) => [m.job, ...cols.map((c) => CELL[m.cells[c].state])])];
|
|
275
|
+
const widths = rows[0].map((_, i) => Math.max(...rows.map((row) => row[i].length)));
|
|
276
|
+
out.push("", "Jobs × personas (✓ promoted Journey · draft: only unpromoted · MISSING: none · '·' not served):");
|
|
277
|
+
for (const row of rows)
|
|
278
|
+
out.push(` ${row.map((cell, i) => cell.padEnd(widths[i])).join(" ")}`.trimEnd());
|
|
279
|
+
}
|
|
280
|
+
const section = (title, items) => {
|
|
281
|
+
out.push("", `${title}:`, ...(items.length === 0 ? [" - none"] : items.map((i) => ` - ${i}`)));
|
|
282
|
+
};
|
|
283
|
+
section("Approved jobs with no promoted Journey", r.approvedJobsWithoutPromotedJourney);
|
|
284
|
+
section("Gaps (job × persona with no promoted Journey)", r.gaps.map((g) => `${g.job} × ${g.persona}`));
|
|
285
|
+
section("Journeys linked to nothing", r.unlinkedJourneys);
|
|
286
|
+
section("Dangling links", r.danglingLinks.map((d) => `journey ${d.journey} → ${d.kind} '${d.id}' (not declared)`));
|
|
287
|
+
section("Stale approvals (needs re-review)", r.stale.map((s) => `${s.kind} ${s.id}: ${s.reason}`));
|
|
288
|
+
return `${out.join("\n")}\n`;
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=catalog-review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog-review.js","sourceRoot":"","sources":["../src/catalog-review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { type CatalogApproval, type CatalogItemStatus, type Job, type Journey, type JourneyApproval, type JourneyCatalogLinks } from "@jevitate/journey";
|
|
2
|
+
/**
|
|
3
|
+
* #433 — the catalog: personas, jobs and Journeys, with their ids, content hashes and approval
|
|
4
|
+
* state, loaded in one place (`CatalogLoader`) for every approval path, every review sheet and
|
|
5
|
+
* `catalog status` — and for the readiness (#434) and catalog-analysis (#435) analyzers.
|
|
6
|
+
*
|
|
7
|
+
* Files (in the project's `.jevitate/`):
|
|
8
|
+
* - `personas.json` — the #427 personas file, extended: an entry may carry `description`, `role`
|
|
9
|
+
* and its `approval`, beside its session settings (`storageState`, `login`). A catalog-only
|
|
10
|
+
* persona (no session yet) is allowed. The persona's id is its #427 `name` (`id` is accepted too).
|
|
11
|
+
* - `jobs.json` — job stories (`JobSchema`); `.jevitate/campaign/jobs.json` (the test-campaign
|
|
12
|
+
* skill's old place) is read when `jobs.json` does not exist.
|
|
13
|
+
*
|
|
14
|
+
* Content hashes leave the approval out, so approving does not change what was approved. A
|
|
15
|
+
* persona's hash covers what the persona IS (id, description, role, any other descriptive key),
|
|
16
|
+
* not its session settings: re-minting a session or moving a storage state is not a new persona.
|
|
17
|
+
* A missing file is an empty catalog — a project without personas/jobs works exactly as before;
|
|
18
|
+
* a file that exists but cannot be read as the catalog is refused (`CatalogInputError`), never skipped.
|
|
19
|
+
*/
|
|
20
|
+
export declare const PERSONAS_FILE = "personas.json";
|
|
21
|
+
export declare const JOBS_FILE = "jobs.json";
|
|
22
|
+
/** The test-campaign skill's jobs file before #433 — still read for compatibility. */
|
|
23
|
+
export declare const LEGACY_JOBS_FILE: string;
|
|
24
|
+
/** A catalog file that exists but is not a valid catalog — refused (exit 64), never skipped. */
|
|
25
|
+
export declare class CatalogInputError extends Error {
|
|
26
|
+
readonly code = "E_CATALOG_INPUT";
|
|
27
|
+
}
|
|
28
|
+
/** `persona|job review|approve <id>`: no such item in the catalog. */
|
|
29
|
+
export declare class UnknownCatalogItemError extends Error {
|
|
30
|
+
readonly kind: "persona" | "job";
|
|
31
|
+
constructor(kind: "persona" | "job", message: string);
|
|
32
|
+
get code(): string;
|
|
33
|
+
}
|
|
34
|
+
export interface CatalogPersona {
|
|
35
|
+
readonly id: string;
|
|
36
|
+
readonly description?: string;
|
|
37
|
+
readonly role?: string;
|
|
38
|
+
readonly hasStorageState: boolean;
|
|
39
|
+
readonly hasLogin: boolean;
|
|
40
|
+
readonly approval?: CatalogApproval;
|
|
41
|
+
readonly contentHash: string;
|
|
42
|
+
readonly status: CatalogItemStatus;
|
|
43
|
+
}
|
|
44
|
+
export interface CatalogJob {
|
|
45
|
+
readonly id: string;
|
|
46
|
+
readonly job: Job;
|
|
47
|
+
/** The job story in the template's words. */
|
|
48
|
+
readonly story: string;
|
|
49
|
+
/** The personas it serves (`personas`, plus a legacy single `persona`). */
|
|
50
|
+
readonly personas: readonly string[];
|
|
51
|
+
readonly approval?: CatalogApproval;
|
|
52
|
+
readonly contentHash: string;
|
|
53
|
+
readonly status: CatalogItemStatus;
|
|
54
|
+
}
|
|
55
|
+
export interface CatalogJourney {
|
|
56
|
+
readonly id: string;
|
|
57
|
+
readonly name: string;
|
|
58
|
+
readonly promoted: boolean;
|
|
59
|
+
readonly journey: Journey;
|
|
60
|
+
/** `metadata.job`, as written. */
|
|
61
|
+
readonly job?: string;
|
|
62
|
+
/** `metadata.persona`, as written (a catalog persona id, or free text). */
|
|
63
|
+
readonly personaText?: string;
|
|
64
|
+
readonly approval?: JourneyApproval;
|
|
65
|
+
/** `journeyReviewHash`. */
|
|
66
|
+
readonly contentHash: string;
|
|
67
|
+
/** Promoted with a recorded approval whose hash is no longer the Journey's. */
|
|
68
|
+
readonly changedSinceApproval: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface Catalog {
|
|
71
|
+
/** The project data dir the catalog files live in, or null outside a project (an empty catalog). */
|
|
72
|
+
readonly dir: string | null;
|
|
73
|
+
readonly personasFile: string | null;
|
|
74
|
+
readonly jobsFile: string | null;
|
|
75
|
+
readonly personas: readonly CatalogPersona[];
|
|
76
|
+
readonly jobs: readonly CatalogJob[];
|
|
77
|
+
readonly journeys: readonly CatalogJourney[];
|
|
78
|
+
/** #434/#435: the journeys directory the Journeys were loaded from (their `.verify/` records live beside them). */
|
|
79
|
+
readonly journeysDir?: string;
|
|
80
|
+
}
|
|
81
|
+
/** #433: a persona's content hash — its id and descriptive keys, without its approval or session settings. */
|
|
82
|
+
export declare function personaContentHash(id: string, fields: Readonly<Record<string, unknown>>): string;
|
|
83
|
+
/** #433: a job's content hash — the job without its approval. */
|
|
84
|
+
export declare function jobContentHash(job: Job): string;
|
|
85
|
+
export declare function catalogJourney(journey: Journey): CatalogJourney;
|
|
86
|
+
export interface CatalogLoaderOptions {
|
|
87
|
+
/** The project data dir (`<repo>/.jevitate`) holding personas.json and jobs.json; null: no catalog files. */
|
|
88
|
+
readonly catalogDir: string | null;
|
|
89
|
+
/** The journeys directory. */
|
|
90
|
+
readonly journeysDir: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* #433: loads personas + jobs + Journeys with their ids, content hashes and approval state. Shared
|
|
94
|
+
* by every approval path (`persona|job approve`, `journey promote`, `demo approve`), the review
|
|
95
|
+
* sheets and `catalog status` — and exported for the #434 / #435 analyzers.
|
|
96
|
+
*/
|
|
97
|
+
export declare class CatalogLoader {
|
|
98
|
+
private readonly opts;
|
|
99
|
+
constructor(opts: CatalogLoaderOptions);
|
|
100
|
+
/** The personas file path (whether or not it exists), or null without a catalog dir. */
|
|
101
|
+
personasPath(): string | null;
|
|
102
|
+
/** The jobs file in use: `jobs.json`, else the legacy `campaign/jobs.json`; null when neither exists. */
|
|
103
|
+
jobsPath(): string | null;
|
|
104
|
+
loadPersonas(): Promise<{
|
|
105
|
+
file: string | null;
|
|
106
|
+
personas: CatalogPersona[];
|
|
107
|
+
}>;
|
|
108
|
+
loadJobs(): Promise<{
|
|
109
|
+
file: string | null;
|
|
110
|
+
jobs: CatalogJob[];
|
|
111
|
+
}>;
|
|
112
|
+
loadJourneys(): Promise<CatalogJourney[]>;
|
|
113
|
+
load(): Promise<Catalog>;
|
|
114
|
+
}
|
|
115
|
+
export declare function findPersona(catalog: Catalog, id: string): CatalogPersona | undefined;
|
|
116
|
+
export declare function findJob(catalog: Catalog, id: string): CatalogJob | undefined;
|
|
117
|
+
export declare function requirePersona(catalog: Catalog, id: string): CatalogPersona;
|
|
118
|
+
export declare function requireJob(catalog: Catalog, id: string): CatalogJob;
|
|
119
|
+
/** The Journeys whose catalog persona link is this persona. */
|
|
120
|
+
export declare function journeysForPersona(catalog: Catalog, personaId: string): CatalogJourney[];
|
|
121
|
+
export declare function journeysForJob(catalog: Catalog, jobId: string): CatalogJourney[];
|
|
122
|
+
/**
|
|
123
|
+
* The persona id a Journey links: `metadata.persona` when it names a catalog persona; when the
|
|
124
|
+
* Journey links a job, its persona is ALWAYS read as an id (an unknown one is a dangling link).
|
|
125
|
+
* Otherwise `metadata.persona` is free text and links nothing.
|
|
126
|
+
*/
|
|
127
|
+
export declare function personaLinkId(catalog: Catalog, j: CatalogJourney): string | undefined;
|
|
128
|
+
/** #433: a Journey's links, their approval state, what is unvetted and why it needs re-review. */
|
|
129
|
+
export declare function journeyLinks(catalog: Catalog, j: CatalogJourney): JourneyCatalogLinks;
|
|
130
|
+
/** #433: records a persona's approval in personas.json, on the same entry (a bare path entry becomes `{storageState, approval}`). */
|
|
131
|
+
export declare function writePersonaApproval(file: string, id: string, approval: CatalogApproval): Promise<void>;
|
|
132
|
+
/** #433: records a job's approval in its jobs file. */
|
|
133
|
+
export declare function writeJobApproval(file: string, id: string, approval: CatalogApproval): Promise<void>;
|