@jterrats/open-orchestra 0.1.0 → 0.2.1
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/CHANGELOG.md +53 -0
- package/README.md +17 -2
- package/dist/assets/web-console.js +743 -0
- package/dist/cli.js +157 -4
- package/dist/cli.js.map +1 -1
- package/dist/collaboration-flows.d.ts +5 -0
- package/dist/collaboration-flows.js +256 -0
- package/dist/collaboration-flows.js.map +1 -0
- package/dist/command-manifest.d.ts +11 -0
- package/dist/command-manifest.js +52 -0
- package/dist/command-manifest.js.map +1 -0
- package/dist/commands.d.ts +31 -0
- package/dist/commands.js +644 -2
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +4 -0
- package/dist/constants.js +22 -0
- package/dist/constants.js.map +1 -1
- package/dist/defaults.d.ts +7 -11
- package/dist/defaults.js +7 -625
- package/dist/defaults.js.map +1 -1
- package/dist/delegation-decision.d.ts +14 -0
- package/dist/delegation-decision.js +391 -0
- package/dist/delegation-decision.js.map +1 -0
- package/dist/detect-commands.d.ts +3 -0
- package/dist/detect-commands.js +28 -0
- package/dist/detect-commands.js.map +1 -0
- package/dist/diagram-validation.d.ts +36 -0
- package/dist/diagram-validation.js +118 -0
- package/dist/diagram-validation.js.map +1 -0
- package/dist/fs-utils.d.ts +2 -0
- package/dist/fs-utils.js +75 -6
- package/dist/fs-utils.js.map +1 -1
- package/dist/health-checks.d.ts +28 -0
- package/dist/health-checks.js +219 -0
- package/dist/health-checks.js.map +1 -0
- package/dist/health-commands.d.ts +2 -0
- package/dist/health-commands.js +18 -0
- package/dist/health-commands.js.map +1 -0
- package/dist/instruction-apply.d.ts +34 -0
- package/dist/instruction-apply.js +150 -0
- package/dist/instruction-apply.js.map +1 -0
- package/dist/instruction-blocks.d.ts +22 -0
- package/dist/instruction-blocks.js +120 -0
- package/dist/instruction-blocks.js.map +1 -0
- package/dist/instruction-imports.d.ts +12 -0
- package/dist/instruction-imports.js +45 -0
- package/dist/instruction-imports.js.map +1 -0
- package/dist/instruction-stale.d.ts +9 -0
- package/dist/instruction-stale.js +106 -0
- package/dist/instruction-stale.js.map +1 -0
- package/dist/instruction-types.d.ts +66 -0
- package/dist/instruction-types.js +2 -0
- package/dist/instruction-types.js.map +1 -0
- package/dist/instruction-updates.d.ts +4 -0
- package/dist/instruction-updates.js +5 -0
- package/dist/instruction-updates.js.map +1 -0
- package/dist/knowledge-base.d.ts +10 -0
- package/dist/knowledge-base.js +117 -0
- package/dist/knowledge-base.js.map +1 -0
- package/dist/mcp-oauth-proxy.d.ts +39 -0
- package/dist/mcp-oauth-proxy.js +80 -0
- package/dist/mcp-oauth-proxy.js.map +1 -0
- package/dist/pr-review.d.ts +20 -0
- package/dist/pr-review.js +142 -0
- package/dist/pr-review.js.map +1 -0
- package/dist/project-detection.d.ts +22 -0
- package/dist/project-detection.js +174 -0
- package/dist/project-detection.js.map +1 -0
- package/dist/prompt-registry.d.ts +56 -0
- package/dist/prompt-registry.js +163 -0
- package/dist/prompt-registry.js.map +1 -0
- package/dist/release-candidate.d.ts +41 -0
- package/dist/release-candidate.js +196 -0
- package/dist/release-candidate.js.map +1 -0
- package/dist/release-commands.d.ts +4 -0
- package/dist/release-commands.js +50 -0
- package/dist/release-commands.js.map +1 -0
- package/dist/roles/ai-support-roles.d.ts +11 -0
- package/dist/roles/ai-support-roles.js +67 -0
- package/dist/roles/ai-support-roles.js.map +1 -0
- package/dist/roles/core-roles.d.ts +11 -0
- package/dist/roles/core-roles.js +144 -0
- package/dist/roles/core-roles.js.map +1 -0
- package/dist/roles/engineering-roles.d.ts +11 -0
- package/dist/roles/engineering-roles.js +176 -0
- package/dist/roles/engineering-roles.js.map +1 -0
- package/dist/roles/governance-roles.d.ts +11 -0
- package/dist/roles/governance-roles.js +117 -0
- package/dist/roles/governance-roles.js.map +1 -0
- package/dist/roles/index.d.ts +11 -0
- package/dist/roles/index.js +17 -0
- package/dist/roles/index.js.map +1 -0
- package/dist/roles/platform-ops-roles.d.ts +11 -0
- package/dist/roles/platform-ops-roles.js +158 -0
- package/dist/roles/platform-ops-roles.js.map +1 -0
- package/dist/roles/qa-ux-roles.d.ts +11 -0
- package/dist/roles/qa-ux-roles.js +193 -0
- package/dist/roles/qa-ux-roles.js.map +1 -0
- package/dist/roles/release-ops-roles.d.ts +11 -0
- package/dist/roles/release-ops-roles.js +109 -0
- package/dist/roles/release-ops-roles.js.map +1 -0
- package/dist/runtime-adapters.d.ts +6 -0
- package/dist/runtime-adapters.js +88 -0
- package/dist/runtime-adapters.js.map +1 -0
- package/dist/runtime-bootstrap.d.ts +12 -0
- package/dist/runtime-bootstrap.js +85 -0
- package/dist/runtime-bootstrap.js.map +1 -0
- package/dist/skills.d.ts +36 -0
- package/dist/skills.js +665 -0
- package/dist/skills.js.map +1 -0
- package/dist/subagent-protocol.d.ts +41 -0
- package/dist/subagent-protocol.js +179 -0
- package/dist/subagent-protocol.js.map +1 -0
- package/dist/telemetry-consent.d.ts +24 -0
- package/dist/telemetry-consent.js +95 -0
- package/dist/telemetry-consent.js.map +1 -0
- package/dist/telemetry-export.d.ts +14 -0
- package/dist/telemetry-export.js +126 -0
- package/dist/telemetry-export.js.map +1 -0
- package/dist/telemetry-records.d.ts +3 -0
- package/dist/telemetry-records.js +96 -0
- package/dist/telemetry-records.js.map +1 -0
- package/dist/telemetry-redaction.d.ts +9 -0
- package/dist/telemetry-redaction.js +55 -0
- package/dist/telemetry-redaction.js.map +1 -0
- package/dist/telemetry-types.d.ts +52 -0
- package/dist/telemetry-types.js +2 -0
- package/dist/telemetry-types.js.map +1 -0
- package/dist/telemetry.d.ts +4 -0
- package/dist/telemetry.js +4 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/types.d.ts +176 -1
- package/dist/validation.d.ts +3 -1
- package/dist/validation.js +28 -5
- package/dist/validation.js.map +1 -1
- package/dist/web-api.js +167 -3
- package/dist/web-api.js.map +1 -1
- package/dist/web-console.js +6 -160
- package/dist/web-console.js.map +1 -1
- package/dist/workflow-gates.js +4 -2
- package/dist/workflow-gates.js.map +1 -1
- package/dist/workflow-services.js +125 -67
- package/dist/workflow-services.js.map +1 -1
- package/dist/workflow-templates.d.ts +10 -0
- package/dist/workflow-templates.js +141 -0
- package/dist/workflow-templates.js.map +1 -0
- package/dist/workspace-classification.d.ts +5 -0
- package/dist/workspace-classification.js +127 -0
- package/dist/workspace-classification.js.map +1 -0
- package/dist/workspace-validator.js +11 -1
- package/dist/workspace-validator.js.map +1 -1
- package/dist/workspace.d.ts +8 -4
- package/dist/workspace.js +111 -4
- package/dist/workspace.js.map +1 -1
- package/docs/dev-team-specialist-role-profiles.md +171 -0
- package/docs/mcp-oauth-proxy-evaluation.md +44 -0
- package/docs/multi-agent-orchestrator-backlog.md +413 -1
- package/docs/open-orchestra-dogfooding-findings.md +66 -0
- package/docs/orchestra-mvp.md +46 -1
- package/docs/runtime-adapters.md +86 -0
- package/docs/runtime-llm-flow.md +124 -0
- package/docs/setup-agents-dogfooding-findings.md +101 -0
- package/docs/skill-loading-strategy.md +114 -0
- package/docs/source-of-truth-and-agent-learning.md +83 -0
- package/package.json +9 -5
- package/rules/agent-roles.mdc +30 -0
- package/rules/ai-assisted-development.mdc +22 -0
- package/skills/agent-learning/SKILL.md +24 -0
- package/skills/agent-learning/manifest.json +40 -0
- package/skills/backlog-sync/SKILL.md +24 -0
- package/skills/backlog-sync/manifest.json +41 -0
- package/skills/diagram-export/SKILL.md +35 -0
- package/skills/diagram-export/manifest.json +40 -0
- package/skills/model-evaluation/SKILL.md +25 -0
- package/skills/model-evaluation/manifest.json +41 -0
- package/skills/playwright-evidence/SKILL.md +28 -0
- package/skills/playwright-evidence/manifest.json +46 -0
- package/skills/pr-review/SKILL.md +23 -0
- package/skills/pr-review/manifest.json +43 -0
- package/skills/prompt-registry/SKILL.md +24 -0
- package/skills/prompt-registry/manifest.json +45 -0
- package/skills/release-readiness/SKILL.md +25 -0
- package/skills/release-readiness/manifest.json +45 -0
- package/skills/source-of-truth/SKILL.md +24 -0
- package/skills/source-of-truth/manifest.json +47 -0
- package/skills/static-analysis/SKILL.md +26 -0
- package/skills/static-analysis/manifest.json +46 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { exists } from "./fs-utils.js";
|
|
4
|
+
export const PROMPT_REGISTRY_DIR = ".generated-prompts";
|
|
5
|
+
const VERSION_COMMENT = "<!-- open-orchestra: prompt-registry-v1 -->";
|
|
6
|
+
const FOOTER = "<!-- Entries below this line are maintained by agents -->";
|
|
7
|
+
const REGISTER_FILES = {
|
|
8
|
+
"code.md": {
|
|
9
|
+
title: "Code Generation Prompts",
|
|
10
|
+
covers: "source code, refactors, shared modules, and implementation-heavy changes",
|
|
11
|
+
usage: [
|
|
12
|
+
"Read this file before creating or substantially changing source code.",
|
|
13
|
+
"Use previous entries to preserve naming, layering, module ownership, and test patterns.",
|
|
14
|
+
"Update the matching component entry when behavior, responsibility, or architecture changes.",
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
"ui.md": {
|
|
18
|
+
title: "UI and UX Prompts",
|
|
19
|
+
covers: "frontend screens, components, responsive layouts, UI copy, and accessibility-sensitive work",
|
|
20
|
+
usage: [
|
|
21
|
+
"Read this file before changing user-facing UI.",
|
|
22
|
+
"Preserve mobile-first decisions, state coverage, accessibility constraints, and visual language.",
|
|
23
|
+
"Update entries for new flows, component state changes, or significant copy/interaction changes.",
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
"services.md": {
|
|
27
|
+
title: "Service and Domain Prompts",
|
|
28
|
+
covers: "domain models, service boundaries, API contracts, data flow, and backend behavior",
|
|
29
|
+
usage: [
|
|
30
|
+
"Read this file before changing domain logic, service contracts, or persistence integration.",
|
|
31
|
+
"Preserve API conventions, failure-mode decisions, idempotency, retries, and data ownership.",
|
|
32
|
+
"Update entries when contracts, business rules, or service responsibilities change.",
|
|
33
|
+
],
|
|
34
|
+
},
|
|
35
|
+
"tests.md": {
|
|
36
|
+
title: "Test and Evidence Prompts",
|
|
37
|
+
covers: "unit tests, integration tests, Playwright specs, QA plans, fixtures, and evidence strategy",
|
|
38
|
+
usage: [
|
|
39
|
+
"Read this file before creating tests or QA automation.",
|
|
40
|
+
"Preserve fixture strategy, page object patterns, locator conventions, and evidence requirements.",
|
|
41
|
+
"Update entries for substantial test plan, Playwright, or regression coverage changes.",
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
"cicd.md": {
|
|
45
|
+
title: "CI/CD and Infrastructure Prompts",
|
|
46
|
+
covers: "workflow YAML, deployment scripts, IaC, runtime config, observability, and rollback automation",
|
|
47
|
+
usage: [
|
|
48
|
+
"Read this file before changing CI/CD, infra, environments, release, or runtime configuration.",
|
|
49
|
+
"Preserve secret naming, gate order, rollback assumptions, and deployment safety constraints.",
|
|
50
|
+
"Update entries for new pipelines, deployment stages, infrastructure modules, or operational gates.",
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
"docs.md": {
|
|
54
|
+
title: "Documentation Prompts",
|
|
55
|
+
covers: "ADRs, runbooks, release notes, user docs, support docs, and technical guides",
|
|
56
|
+
usage: [
|
|
57
|
+
"Read this file before generating or substantially revising documentation.",
|
|
58
|
+
"Preserve audience, structure, tone, decision history, and links to related artifacts.",
|
|
59
|
+
"Update entries when docs capture new decisions, release behavior, runbooks, or support guidance.",
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
"diagrams.md": {
|
|
63
|
+
title: "Diagram Prompts",
|
|
64
|
+
covers: "architecture diagrams, workflow maps, Mermaid, Lucid, draw.io, and visual explanations",
|
|
65
|
+
usage: [
|
|
66
|
+
"Read this file before creating or changing diagrams.",
|
|
67
|
+
"Preserve diagram notation, scope boundaries, naming, and source-of-truth decisions.",
|
|
68
|
+
"Update entries when a diagram changes architecture, data flow, or operational interpretation.",
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
"evals.md": {
|
|
72
|
+
title: "AI Evaluation and Prompt Quality Prompts",
|
|
73
|
+
covers: "LLM evals, prompt changes, model routing, provider fallback, rubrics, and AI behavior evidence",
|
|
74
|
+
usage: [
|
|
75
|
+
"Read this file before changing prompts, model routing, provider fallback, or eval criteria.",
|
|
76
|
+
"Preserve eval objectives, datasets, rubrics, model comparison notes, and accepted residual risks.",
|
|
77
|
+
"Update entries when LLM behavior, scoring, or prompt quality expectations change.",
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
export function promptRegistryFileNames() {
|
|
82
|
+
return Object.keys(REGISTER_FILES).sort();
|
|
83
|
+
}
|
|
84
|
+
export function buildPromptRegistryFile(name) {
|
|
85
|
+
const file = REGISTER_FILES[name];
|
|
86
|
+
const usage = file.usage.map((item) => `- ${item}`).join("\n");
|
|
87
|
+
return [
|
|
88
|
+
VERSION_COMMENT,
|
|
89
|
+
`# ${file.title}`,
|
|
90
|
+
"",
|
|
91
|
+
`> Prompt register for ${file.covers}.`,
|
|
92
|
+
"> Commit this file so generated artifacts can be traced back to their prompt intent.",
|
|
93
|
+
"> Keep one entry per artifact or component; store only the latest prompt. Git history keeps prior versions.",
|
|
94
|
+
"",
|
|
95
|
+
"## Agent Protocol",
|
|
96
|
+
"",
|
|
97
|
+
"### Before creating or substantially changing an artifact",
|
|
98
|
+
"",
|
|
99
|
+
`1. Read the full relevant register file in \`${PROMPT_REGISTRY_DIR}/\`.`,
|
|
100
|
+
"2. Search for an existing `## <ArtifactName>` entry.",
|
|
101
|
+
"3. Use prior entries to preserve project conventions, constraints, decisions, and known risks.",
|
|
102
|
+
"4. If a related entry exists, adapt the new work to fit that established context unless an explicit decision changes it.",
|
|
103
|
+
"",
|
|
104
|
+
"### After creating or substantially changing an artifact",
|
|
105
|
+
"",
|
|
106
|
+
"1. Add or update the matching `## <ArtifactName>` entry.",
|
|
107
|
+
"2. Increment **Iterations** on substantial updates.",
|
|
108
|
+
"3. Replace **Prompt** with the final prompt or a concise summary when the prompt is long.",
|
|
109
|
+
"4. Record key decisions and evidence links that explain why the artifact changed.",
|
|
110
|
+
"5. Do not update the register for typos, formatting-only edits, or single-line mechanical fixes.",
|
|
111
|
+
"",
|
|
112
|
+
"## Usage",
|
|
113
|
+
"",
|
|
114
|
+
usage,
|
|
115
|
+
"",
|
|
116
|
+
"## Entry Format",
|
|
117
|
+
"",
|
|
118
|
+
"```markdown",
|
|
119
|
+
"## <ArtifactName>",
|
|
120
|
+
"- **Created:** YYYY-MM-DD",
|
|
121
|
+
"- **Updated:** YYYY-MM-DD",
|
|
122
|
+
"- **Iterations:** N",
|
|
123
|
+
"- **Task:** TASK-ID or backlog item",
|
|
124
|
+
"- **Role:** active role that generated or changed the artifact",
|
|
125
|
+
"",
|
|
126
|
+
"### Key decisions",
|
|
127
|
+
"- <Pattern, constraint, trade-off, or risk that shaped the artifact>",
|
|
128
|
+
"",
|
|
129
|
+
"### Evidence",
|
|
130
|
+
"- <Command, test, review, screenshot, trace, or decision link>",
|
|
131
|
+
"",
|
|
132
|
+
"### Prompt",
|
|
133
|
+
"````",
|
|
134
|
+
"<final prompt, or summary of the prompt key instructions if over 500 words>",
|
|
135
|
+
"````",
|
|
136
|
+
"---",
|
|
137
|
+
"```",
|
|
138
|
+
"",
|
|
139
|
+
FOOTER,
|
|
140
|
+
"",
|
|
141
|
+
].join("\n");
|
|
142
|
+
}
|
|
143
|
+
export async function initPromptRegistry({ root = process.cwd(), force = false, } = {}) {
|
|
144
|
+
const registryRoot = path.join(root, PROMPT_REGISTRY_DIR);
|
|
145
|
+
await mkdir(registryRoot, { recursive: true });
|
|
146
|
+
const written = [];
|
|
147
|
+
const skipped = [];
|
|
148
|
+
for (const name of promptRegistryFileNames()) {
|
|
149
|
+
const filePath = path.join(registryRoot, name);
|
|
150
|
+
const relativePath = path.join(PROMPT_REGISTRY_DIR, name);
|
|
151
|
+
if ((await exists(filePath)) && !force) {
|
|
152
|
+
skipped.push(relativePath);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
await writeFile(filePath, buildPromptRegistryFile(name), "utf8");
|
|
156
|
+
written.push(relativePath);
|
|
157
|
+
}
|
|
158
|
+
return { written, skipped };
|
|
159
|
+
}
|
|
160
|
+
export async function readPromptRegistryFile(root, name) {
|
|
161
|
+
return readFile(path.join(root, PROMPT_REGISTRY_DIR, name), "utf8");
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=prompt-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-registry.js","sourceRoot":"","sources":["../src/prompt-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { EventEntry } from "./types.js";
|
|
2
|
+
export interface ReleaseStoryReadiness {
|
|
3
|
+
taskId: string;
|
|
4
|
+
title: string;
|
|
5
|
+
backlogItem: string | undefined;
|
|
6
|
+
githubIssue: string | undefined;
|
|
7
|
+
approved: boolean;
|
|
8
|
+
missing: string[];
|
|
9
|
+
blockers: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface CandidateReleasePlan {
|
|
12
|
+
version: string | undefined;
|
|
13
|
+
stories: ReleaseStoryReadiness[];
|
|
14
|
+
approvedStories: ReleaseStoryReadiness[];
|
|
15
|
+
changelog: string;
|
|
16
|
+
ready: boolean;
|
|
17
|
+
missing: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare function generateCandidateReleasePlan({ root, version, }?: {
|
|
20
|
+
root?: string;
|
|
21
|
+
version?: string | undefined;
|
|
22
|
+
}): Promise<CandidateReleasePlan>;
|
|
23
|
+
export declare function writeCandidateReleasePlan({ root, version, }?: {
|
|
24
|
+
root?: string;
|
|
25
|
+
version?: string | undefined;
|
|
26
|
+
}): Promise<{
|
|
27
|
+
artifact: string;
|
|
28
|
+
content: string;
|
|
29
|
+
}>;
|
|
30
|
+
export declare function recordReleaseTagApproval({ root, version, approver, approved, }: {
|
|
31
|
+
root?: string;
|
|
32
|
+
version: string;
|
|
33
|
+
approver?: string | undefined;
|
|
34
|
+
approved: boolean;
|
|
35
|
+
}): Promise<EventEntry>;
|
|
36
|
+
export declare function attachReleaseEvidence({ root, kind, summary, artifactPath, }: {
|
|
37
|
+
root?: string;
|
|
38
|
+
kind: "smoke" | "rollback";
|
|
39
|
+
summary: string;
|
|
40
|
+
artifactPath?: string | undefined;
|
|
41
|
+
}): Promise<EventEntry>;
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import { appendEvent, loadWorkspace, readEvents, writeArtifact, } from "./workspace.js";
|
|
2
|
+
export async function generateCandidateReleasePlan({ root = process.cwd(), version, } = {}) {
|
|
3
|
+
const workspace = await loadWorkspace(root);
|
|
4
|
+
const events = await readEvents(root);
|
|
5
|
+
const stories = workspace.tasks.map((task) => evaluateReleaseStory(task, events));
|
|
6
|
+
const approvedStories = stories.filter((story) => story.approved);
|
|
7
|
+
const missing = releasePlanMissingItems(stories, approvedStories);
|
|
8
|
+
return {
|
|
9
|
+
version,
|
|
10
|
+
stories,
|
|
11
|
+
approvedStories,
|
|
12
|
+
changelog: renderReleaseChangelog(version, approvedStories),
|
|
13
|
+
ready: missing.length === 0,
|
|
14
|
+
missing,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export async function writeCandidateReleasePlan({ root = process.cwd(), version, } = {}) {
|
|
18
|
+
const plan = await generateCandidateReleasePlan({ root, version });
|
|
19
|
+
const fileName = "candidate-release-" + Date.now() + ".md";
|
|
20
|
+
const content = renderCandidateReleasePlan(plan);
|
|
21
|
+
const artifact = await writeArtifact(root, "releases", fileName, content);
|
|
22
|
+
await appendEvent(root, {
|
|
23
|
+
type: "RELEASE_CANDIDATE_PLANNED",
|
|
24
|
+
actor: "release_manager",
|
|
25
|
+
summary: "Candidate release plan generated",
|
|
26
|
+
artifacts: [artifact],
|
|
27
|
+
metadata: {
|
|
28
|
+
version,
|
|
29
|
+
ready: plan.ready,
|
|
30
|
+
approvedStoryIds: plan.approvedStories.map((story) => story.taskId),
|
|
31
|
+
missing: plan.missing,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
return { artifact, content };
|
|
35
|
+
}
|
|
36
|
+
export async function recordReleaseTagApproval({ root = process.cwd(), version, approver, approved, }) {
|
|
37
|
+
if (!approved || !approver) {
|
|
38
|
+
throw new Error("release tag action requires --approve and --approver");
|
|
39
|
+
}
|
|
40
|
+
return appendEvent(root, {
|
|
41
|
+
type: "RELEASE_TAG_APPROVED",
|
|
42
|
+
actor: approver,
|
|
43
|
+
summary: "Release tag approved for " + version,
|
|
44
|
+
metadata: { version, tag: "v" + version },
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export async function attachReleaseEvidence({ root = process.cwd(), kind, summary, artifactPath, }) {
|
|
48
|
+
return appendEvent(root, {
|
|
49
|
+
type: "RELEASE_EVIDENCE_ATTACHED",
|
|
50
|
+
actor: "release_manager",
|
|
51
|
+
summary,
|
|
52
|
+
artifacts: artifactPath ? [artifactPath] : [],
|
|
53
|
+
metadata: { kind },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
function evaluateReleaseStory(task, events) {
|
|
57
|
+
const taskEvents = events.filter((event) => event.taskId === task.id);
|
|
58
|
+
const missing = [
|
|
59
|
+
...missingTaskFields(task),
|
|
60
|
+
...missingStoryEvidence(task, taskEvents),
|
|
61
|
+
];
|
|
62
|
+
const blockers = unresolvedStoryBlockers(task, taskEvents);
|
|
63
|
+
return {
|
|
64
|
+
taskId: task.id,
|
|
65
|
+
title: task.title,
|
|
66
|
+
backlogItem: task.backlogItem,
|
|
67
|
+
githubIssue: githubIssueReference(task.backlogItem),
|
|
68
|
+
approved: isApprovedStatus(task.status) &&
|
|
69
|
+
missing.length === 0 &&
|
|
70
|
+
blockers.length === 0,
|
|
71
|
+
missing,
|
|
72
|
+
blockers,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function missingTaskFields(task) {
|
|
76
|
+
const missing = [];
|
|
77
|
+
if (!task.acceptanceCriteria || task.acceptanceCriteria.length === 0) {
|
|
78
|
+
missing.push("acceptanceCriteria");
|
|
79
|
+
}
|
|
80
|
+
if (!task.testStrategy) {
|
|
81
|
+
missing.push("testStrategy");
|
|
82
|
+
}
|
|
83
|
+
return missing;
|
|
84
|
+
}
|
|
85
|
+
function missingStoryEvidence(task, events) {
|
|
86
|
+
const missing = [];
|
|
87
|
+
if (!hasPassedQa(task, events)) {
|
|
88
|
+
missing.push("qaEvidence");
|
|
89
|
+
}
|
|
90
|
+
if (!hasApprovingReview(events)) {
|
|
91
|
+
missing.push("approvedReview");
|
|
92
|
+
}
|
|
93
|
+
if (!hasDocumentationEvidence(events)) {
|
|
94
|
+
missing.push("documentationEvidence");
|
|
95
|
+
}
|
|
96
|
+
if (!dependenciesAreReleaseReady(task)) {
|
|
97
|
+
missing.push("dependenciesReady");
|
|
98
|
+
}
|
|
99
|
+
if (!hasRollbackPlan(events)) {
|
|
100
|
+
missing.push("rollbackPlan");
|
|
101
|
+
}
|
|
102
|
+
return missing;
|
|
103
|
+
}
|
|
104
|
+
function unresolvedStoryBlockers(task, events) {
|
|
105
|
+
const blockers = [];
|
|
106
|
+
if (task.status === "blocked") {
|
|
107
|
+
blockers.push(task.blockedReason ?? "task is blocked");
|
|
108
|
+
}
|
|
109
|
+
for (const event of events) {
|
|
110
|
+
if (event.type === "REVIEW_RECORDED" && event.metadata.result === "block") {
|
|
111
|
+
blockers.push(String(event.metadata.findings ?? event.summary));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return blockers;
|
|
115
|
+
}
|
|
116
|
+
function hasPassedQa(task, events) {
|
|
117
|
+
return (task.qaGate?.executionStatus === "passed" &&
|
|
118
|
+
events.some((event) => event.type === "EVIDENCE_ADDED" && event.actor === "qa"));
|
|
119
|
+
}
|
|
120
|
+
function hasApprovingReview(events) {
|
|
121
|
+
return events.some((event) => event.type === "REVIEW_RECORDED" && event.metadata.result === "approve");
|
|
122
|
+
}
|
|
123
|
+
function hasDocumentationEvidence(events) {
|
|
124
|
+
return events.some((event) => /doc|release note|runbook/i.test(event.summary + " " + event.actor));
|
|
125
|
+
}
|
|
126
|
+
function dependenciesAreReleaseReady(task) {
|
|
127
|
+
return (task.dependencies.length === 0 ||
|
|
128
|
+
task.status === "done" ||
|
|
129
|
+
task.status === "approved");
|
|
130
|
+
}
|
|
131
|
+
function hasRollbackPlan(events) {
|
|
132
|
+
return events.some((event) => /rollback/i.test(event.summary));
|
|
133
|
+
}
|
|
134
|
+
function isApprovedStatus(status) {
|
|
135
|
+
return status === "approved" || status === "done";
|
|
136
|
+
}
|
|
137
|
+
function githubIssueReference(backlogItem) {
|
|
138
|
+
if (!backlogItem) {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
if (backlogItem.includes("github.com") || backlogItem.startsWith("#")) {
|
|
142
|
+
return backlogItem;
|
|
143
|
+
}
|
|
144
|
+
return undefined;
|
|
145
|
+
}
|
|
146
|
+
function releasePlanMissingItems(stories, approvedStories) {
|
|
147
|
+
const missing = [];
|
|
148
|
+
if (approvedStories.length === 0) {
|
|
149
|
+
missing.push("approvedStories");
|
|
150
|
+
}
|
|
151
|
+
if (stories.some((story) => story.blockers.length > 0)) {
|
|
152
|
+
missing.push("unresolvedBlockers");
|
|
153
|
+
}
|
|
154
|
+
return missing;
|
|
155
|
+
}
|
|
156
|
+
function renderReleaseChangelog(version, approvedStories) {
|
|
157
|
+
const title = version ? "# Changelog " + version : "# Changelog";
|
|
158
|
+
const lines = [title, ""];
|
|
159
|
+
for (const story of approvedStories) {
|
|
160
|
+
lines.push("- " + story.taskId + ": " + story.title);
|
|
161
|
+
}
|
|
162
|
+
return lines.join("\n");
|
|
163
|
+
}
|
|
164
|
+
function renderCandidateReleasePlan(plan) {
|
|
165
|
+
return [
|
|
166
|
+
"# Candidate Release" + (plan.version ? " " + plan.version : ""),
|
|
167
|
+
"",
|
|
168
|
+
"- Ready: " + plan.ready,
|
|
169
|
+
"- Approved stories: " + plan.approvedStories.length,
|
|
170
|
+
"- Missing: " + (plan.missing.join(", ") || "none"),
|
|
171
|
+
"",
|
|
172
|
+
"## Stories",
|
|
173
|
+
...plan.stories.map(renderStoryLine),
|
|
174
|
+
"",
|
|
175
|
+
"## Changelog",
|
|
176
|
+
plan.changelog,
|
|
177
|
+
"",
|
|
178
|
+
].join("\n");
|
|
179
|
+
}
|
|
180
|
+
function renderStoryLine(story) {
|
|
181
|
+
const state = story.approved ? "approved" : "blocked";
|
|
182
|
+
const missing = story.missing.join(", ") || "none";
|
|
183
|
+
const blockers = story.blockers.join(", ") || "none";
|
|
184
|
+
const issue = story.githubIssue ? " issue=" + story.githubIssue : "";
|
|
185
|
+
return ("- " +
|
|
186
|
+
story.taskId +
|
|
187
|
+
" [" +
|
|
188
|
+
state +
|
|
189
|
+
"]" +
|
|
190
|
+
issue +
|
|
191
|
+
" missing=" +
|
|
192
|
+
missing +
|
|
193
|
+
" blockers=" +
|
|
194
|
+
blockers);
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=release-candidate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-candidate.js","sourceRoot":"","sources":["../src/release-candidate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CliIo, CliOptions } from "./types.js";
|
|
2
|
+
export declare function releaseCandidateCommand(options: CliOptions, io: CliIo): Promise<void>;
|
|
3
|
+
export declare function releaseTagCommand(options: CliOptions, io: CliIo): Promise<void>;
|
|
4
|
+
export declare function releaseEvidenceCommand(options: CliOptions, io: CliIo): Promise<void>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { requireArg } from "./args.js";
|
|
2
|
+
import { attachReleaseEvidence, generateCandidateReleasePlan, recordReleaseTagApproval, writeCandidateReleasePlan, } from "./release-candidate.js";
|
|
3
|
+
export async function releaseCandidateCommand(options, io) {
|
|
4
|
+
const version = stringOption(options.version);
|
|
5
|
+
if (options["dry-run"]) {
|
|
6
|
+
const plan = await generateCandidateReleasePlan({ version });
|
|
7
|
+
io.log(JSON.stringify(plan, null, 2));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const result = await writeCandidateReleasePlan({ version });
|
|
11
|
+
if (options.json) {
|
|
12
|
+
io.log(JSON.stringify(result, null, 2));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
io.log("Candidate release plan written: " + result.artifact);
|
|
16
|
+
}
|
|
17
|
+
export async function releaseTagCommand(options, io) {
|
|
18
|
+
const event = await recordReleaseTagApproval({
|
|
19
|
+
version: requireArg(options, "version"),
|
|
20
|
+
approver: stringOption(options.approver),
|
|
21
|
+
approved: Boolean(options.approve),
|
|
22
|
+
});
|
|
23
|
+
if (options.json) {
|
|
24
|
+
io.log(JSON.stringify(event, null, 2));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
io.log(event.summary);
|
|
28
|
+
}
|
|
29
|
+
export async function releaseEvidenceCommand(options, io) {
|
|
30
|
+
const event = await attachReleaseEvidence({
|
|
31
|
+
kind: parseReleaseEvidenceKind(requireArg(options, "kind")),
|
|
32
|
+
summary: requireArg(options, "summary"),
|
|
33
|
+
artifactPath: stringOption(options.path),
|
|
34
|
+
});
|
|
35
|
+
if (options.json) {
|
|
36
|
+
io.log(JSON.stringify(event, null, 2));
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
io.log("Release evidence attached: " + event.summary);
|
|
40
|
+
}
|
|
41
|
+
function parseReleaseEvidenceKind(value) {
|
|
42
|
+
if (value === "smoke" || value === "rollback") {
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
throw new Error("release evidence kind must be smoke or rollback");
|
|
46
|
+
}
|
|
47
|
+
function stringOption(value) {
|
|
48
|
+
return typeof value === "string" ? value : undefined;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=release-commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release-commands.js","sourceRoot":"","sources":["../src/release-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EACL,qBAAqB,EACrB,4BAA4B,EAC5B,wBAAwB,EACxB,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAGhC,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAmB,EACnB,EAAS;IAET,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,4BAA4B,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,kCAAkC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAmB,EACnB,EAAS;IAET,MAAM,KAAK,GAAG,MAAM,wBAAwB,CAAC;QAC3C,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC;QACvC,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;KACnC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAmB,EACnB,EAAS;IAET,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC;QACxC,IAAI,EAAE,wBAAwB,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3D,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC;QACvC,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC;KACzC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO;IACT,CAAC;IACD,EAAE,CAAC,GAAG,CAAC,6BAA6B,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAa;IAC7C,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,YAAY,CACnB,KAA8C;IAE9C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const aiSupportRoles: {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
capabilities: string[];
|
|
6
|
+
requiredHandoffFields: string[];
|
|
7
|
+
blockingAuthority: string[];
|
|
8
|
+
activationCriteria: string[];
|
|
9
|
+
expectedEvidence: string[];
|
|
10
|
+
gateParticipation: string[];
|
|
11
|
+
}[];
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export const aiSupportRoles = [
|
|
2
|
+
{
|
|
3
|
+
id: "support_customer_ops",
|
|
4
|
+
name: "Support / Customer Operations",
|
|
5
|
+
description: "Owns support readiness, customer-facing known issues, incident intake, troubleshooting guidance, and feedback loops after release.",
|
|
6
|
+
capabilities: [
|
|
7
|
+
"support_readiness",
|
|
8
|
+
"customer_feedback",
|
|
9
|
+
"known_issues",
|
|
10
|
+
"troubleshooting",
|
|
11
|
+
"post_release_intake",
|
|
12
|
+
],
|
|
13
|
+
requiredHandoffFields: [
|
|
14
|
+
"customerImpact",
|
|
15
|
+
"knownIssues",
|
|
16
|
+
"supportRunbook",
|
|
17
|
+
"feedbackLoop",
|
|
18
|
+
],
|
|
19
|
+
blockingAuthority: ["support_readiness"],
|
|
20
|
+
activationCriteria: [
|
|
21
|
+
"customer-visible release",
|
|
22
|
+
"support workflow change",
|
|
23
|
+
"known issue or workaround required",
|
|
24
|
+
"post-release feedback collection needed",
|
|
25
|
+
],
|
|
26
|
+
expectedEvidence: [
|
|
27
|
+
"support runbook",
|
|
28
|
+
"known issues note",
|
|
29
|
+
"customer communication draft",
|
|
30
|
+
"feedback intake plan",
|
|
31
|
+
],
|
|
32
|
+
gateParticipation: ["release-readiness"],
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: "ai_evaluation_engineer",
|
|
36
|
+
name: "AI Evaluation / Prompt Quality Engineer",
|
|
37
|
+
description: "Owns LLM eval design, prompt regression coverage, rubric quality, model comparison, hallucination risk, and AI behavior evidence.",
|
|
38
|
+
capabilities: [
|
|
39
|
+
"llm_evaluations",
|
|
40
|
+
"prompt_quality",
|
|
41
|
+
"rubrics",
|
|
42
|
+
"model_comparison",
|
|
43
|
+
"ai_regression_testing",
|
|
44
|
+
],
|
|
45
|
+
requiredHandoffFields: [
|
|
46
|
+
"evalDataset",
|
|
47
|
+
"rubric",
|
|
48
|
+
"modelBehavior",
|
|
49
|
+
"regressionRisk",
|
|
50
|
+
],
|
|
51
|
+
blockingAuthority: ["ai_quality", "model_risk"],
|
|
52
|
+
activationCriteria: [
|
|
53
|
+
"LLM behavior change",
|
|
54
|
+
"prompt or system instruction change",
|
|
55
|
+
"model routing change for critical role",
|
|
56
|
+
"AI output quality regression risk",
|
|
57
|
+
],
|
|
58
|
+
expectedEvidence: [
|
|
59
|
+
"eval cases",
|
|
60
|
+
"rubric results",
|
|
61
|
+
"model comparison summary",
|
|
62
|
+
"failure analysis",
|
|
63
|
+
],
|
|
64
|
+
gateParticipation: ["risk-review", "release-readiness"],
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
//# sourceMappingURL=ai-support-roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-support-roles.js","sourceRoot":"","sources":["../../src/roles/ai-support-roles.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B;QACE,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,+BAA+B;QACrC,WAAW,EACT,oIAAoI;QACtI,YAAY,EAAE;YACZ,mBAAmB;YACnB,mBAAmB;YACnB,cAAc;YACd,iBAAiB;YACjB,qBAAqB;SACtB;QACD,qBAAqB,EAAE;YACrB,gBAAgB;YAChB,aAAa;YACb,gBAAgB;YAChB,cAAc;SACf;QACD,iBAAiB,EAAE,CAAC,mBAAmB,CAAC;QACxC,kBAAkB,EAAE;YAClB,0BAA0B;YAC1B,yBAAyB;YACzB,oCAAoC;YACpC,yCAAyC;SAC1C;QACD,gBAAgB,EAAE;YAChB,iBAAiB;YACjB,mBAAmB;YACnB,8BAA8B;YAC9B,sBAAsB;SACvB;QACD,iBAAiB,EAAE,CAAC,mBAAmB,CAAC;KACzC;IACD;QACE,EAAE,EAAE,wBAAwB;QAC5B,IAAI,EAAE,yCAAyC;QAC/C,WAAW,EACT,mIAAmI;QACrI,YAAY,EAAE;YACZ,iBAAiB;YACjB,gBAAgB;YAChB,SAAS;YACT,kBAAkB;YAClB,uBAAuB;SACxB;QACD,qBAAqB,EAAE;YACrB,aAAa;YACb,QAAQ;YACR,eAAe;YACf,gBAAgB;SACjB;QACD,iBAAiB,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;QAC/C,kBAAkB,EAAE;YAClB,qBAAqB;YACrB,qCAAqC;YACrC,wCAAwC;YACxC,mCAAmC;SACpC;QACD,gBAAgB,EAAE;YAChB,YAAY;YACZ,gBAAgB;YAChB,0BAA0B;YAC1B,kBAAkB;SACnB;QACD,iBAAiB,EAAE,CAAC,aAAa,EAAE,mBAAmB,CAAC;KACxD;CACe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const coreRoles: {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
capabilities: string[];
|
|
6
|
+
requiredHandoffFields: string[];
|
|
7
|
+
blockingAuthority: string[];
|
|
8
|
+
activationCriteria: string[];
|
|
9
|
+
expectedEvidence: string[];
|
|
10
|
+
gateParticipation: string[];
|
|
11
|
+
}[];
|