@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.
Files changed (187) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +17 -2
  3. package/dist/assets/web-console.js +743 -0
  4. package/dist/cli.js +157 -4
  5. package/dist/cli.js.map +1 -1
  6. package/dist/collaboration-flows.d.ts +5 -0
  7. package/dist/collaboration-flows.js +256 -0
  8. package/dist/collaboration-flows.js.map +1 -0
  9. package/dist/command-manifest.d.ts +11 -0
  10. package/dist/command-manifest.js +52 -0
  11. package/dist/command-manifest.js.map +1 -0
  12. package/dist/commands.d.ts +31 -0
  13. package/dist/commands.js +644 -2
  14. package/dist/commands.js.map +1 -1
  15. package/dist/constants.d.ts +4 -0
  16. package/dist/constants.js +22 -0
  17. package/dist/constants.js.map +1 -1
  18. package/dist/defaults.d.ts +7 -11
  19. package/dist/defaults.js +7 -625
  20. package/dist/defaults.js.map +1 -1
  21. package/dist/delegation-decision.d.ts +14 -0
  22. package/dist/delegation-decision.js +391 -0
  23. package/dist/delegation-decision.js.map +1 -0
  24. package/dist/detect-commands.d.ts +3 -0
  25. package/dist/detect-commands.js +28 -0
  26. package/dist/detect-commands.js.map +1 -0
  27. package/dist/diagram-validation.d.ts +36 -0
  28. package/dist/diagram-validation.js +118 -0
  29. package/dist/diagram-validation.js.map +1 -0
  30. package/dist/fs-utils.d.ts +2 -0
  31. package/dist/fs-utils.js +75 -6
  32. package/dist/fs-utils.js.map +1 -1
  33. package/dist/health-checks.d.ts +28 -0
  34. package/dist/health-checks.js +219 -0
  35. package/dist/health-checks.js.map +1 -0
  36. package/dist/health-commands.d.ts +2 -0
  37. package/dist/health-commands.js +18 -0
  38. package/dist/health-commands.js.map +1 -0
  39. package/dist/instruction-apply.d.ts +34 -0
  40. package/dist/instruction-apply.js +150 -0
  41. package/dist/instruction-apply.js.map +1 -0
  42. package/dist/instruction-blocks.d.ts +22 -0
  43. package/dist/instruction-blocks.js +120 -0
  44. package/dist/instruction-blocks.js.map +1 -0
  45. package/dist/instruction-imports.d.ts +12 -0
  46. package/dist/instruction-imports.js +45 -0
  47. package/dist/instruction-imports.js.map +1 -0
  48. package/dist/instruction-stale.d.ts +9 -0
  49. package/dist/instruction-stale.js +106 -0
  50. package/dist/instruction-stale.js.map +1 -0
  51. package/dist/instruction-types.d.ts +66 -0
  52. package/dist/instruction-types.js +2 -0
  53. package/dist/instruction-types.js.map +1 -0
  54. package/dist/instruction-updates.d.ts +4 -0
  55. package/dist/instruction-updates.js +5 -0
  56. package/dist/instruction-updates.js.map +1 -0
  57. package/dist/knowledge-base.d.ts +10 -0
  58. package/dist/knowledge-base.js +117 -0
  59. package/dist/knowledge-base.js.map +1 -0
  60. package/dist/mcp-oauth-proxy.d.ts +39 -0
  61. package/dist/mcp-oauth-proxy.js +80 -0
  62. package/dist/mcp-oauth-proxy.js.map +1 -0
  63. package/dist/pr-review.d.ts +20 -0
  64. package/dist/pr-review.js +142 -0
  65. package/dist/pr-review.js.map +1 -0
  66. package/dist/project-detection.d.ts +22 -0
  67. package/dist/project-detection.js +174 -0
  68. package/dist/project-detection.js.map +1 -0
  69. package/dist/prompt-registry.d.ts +56 -0
  70. package/dist/prompt-registry.js +163 -0
  71. package/dist/prompt-registry.js.map +1 -0
  72. package/dist/release-candidate.d.ts +41 -0
  73. package/dist/release-candidate.js +196 -0
  74. package/dist/release-candidate.js.map +1 -0
  75. package/dist/release-commands.d.ts +4 -0
  76. package/dist/release-commands.js +50 -0
  77. package/dist/release-commands.js.map +1 -0
  78. package/dist/roles/ai-support-roles.d.ts +11 -0
  79. package/dist/roles/ai-support-roles.js +67 -0
  80. package/dist/roles/ai-support-roles.js.map +1 -0
  81. package/dist/roles/core-roles.d.ts +11 -0
  82. package/dist/roles/core-roles.js +144 -0
  83. package/dist/roles/core-roles.js.map +1 -0
  84. package/dist/roles/engineering-roles.d.ts +11 -0
  85. package/dist/roles/engineering-roles.js +176 -0
  86. package/dist/roles/engineering-roles.js.map +1 -0
  87. package/dist/roles/governance-roles.d.ts +11 -0
  88. package/dist/roles/governance-roles.js +117 -0
  89. package/dist/roles/governance-roles.js.map +1 -0
  90. package/dist/roles/index.d.ts +11 -0
  91. package/dist/roles/index.js +17 -0
  92. package/dist/roles/index.js.map +1 -0
  93. package/dist/roles/platform-ops-roles.d.ts +11 -0
  94. package/dist/roles/platform-ops-roles.js +158 -0
  95. package/dist/roles/platform-ops-roles.js.map +1 -0
  96. package/dist/roles/qa-ux-roles.d.ts +11 -0
  97. package/dist/roles/qa-ux-roles.js +193 -0
  98. package/dist/roles/qa-ux-roles.js.map +1 -0
  99. package/dist/roles/release-ops-roles.d.ts +11 -0
  100. package/dist/roles/release-ops-roles.js +109 -0
  101. package/dist/roles/release-ops-roles.js.map +1 -0
  102. package/dist/runtime-adapters.d.ts +6 -0
  103. package/dist/runtime-adapters.js +88 -0
  104. package/dist/runtime-adapters.js.map +1 -0
  105. package/dist/runtime-bootstrap.d.ts +12 -0
  106. package/dist/runtime-bootstrap.js +85 -0
  107. package/dist/runtime-bootstrap.js.map +1 -0
  108. package/dist/skills.d.ts +36 -0
  109. package/dist/skills.js +665 -0
  110. package/dist/skills.js.map +1 -0
  111. package/dist/subagent-protocol.d.ts +41 -0
  112. package/dist/subagent-protocol.js +179 -0
  113. package/dist/subagent-protocol.js.map +1 -0
  114. package/dist/telemetry-consent.d.ts +24 -0
  115. package/dist/telemetry-consent.js +95 -0
  116. package/dist/telemetry-consent.js.map +1 -0
  117. package/dist/telemetry-export.d.ts +14 -0
  118. package/dist/telemetry-export.js +126 -0
  119. package/dist/telemetry-export.js.map +1 -0
  120. package/dist/telemetry-records.d.ts +3 -0
  121. package/dist/telemetry-records.js +96 -0
  122. package/dist/telemetry-records.js.map +1 -0
  123. package/dist/telemetry-redaction.d.ts +9 -0
  124. package/dist/telemetry-redaction.js +55 -0
  125. package/dist/telemetry-redaction.js.map +1 -0
  126. package/dist/telemetry-types.d.ts +52 -0
  127. package/dist/telemetry-types.js +2 -0
  128. package/dist/telemetry-types.js.map +1 -0
  129. package/dist/telemetry.d.ts +4 -0
  130. package/dist/telemetry.js +4 -0
  131. package/dist/telemetry.js.map +1 -0
  132. package/dist/types.d.ts +176 -1
  133. package/dist/validation.d.ts +3 -1
  134. package/dist/validation.js +28 -5
  135. package/dist/validation.js.map +1 -1
  136. package/dist/web-api.js +167 -3
  137. package/dist/web-api.js.map +1 -1
  138. package/dist/web-console.js +6 -160
  139. package/dist/web-console.js.map +1 -1
  140. package/dist/workflow-gates.js +4 -2
  141. package/dist/workflow-gates.js.map +1 -1
  142. package/dist/workflow-services.js +125 -67
  143. package/dist/workflow-services.js.map +1 -1
  144. package/dist/workflow-templates.d.ts +10 -0
  145. package/dist/workflow-templates.js +141 -0
  146. package/dist/workflow-templates.js.map +1 -0
  147. package/dist/workspace-classification.d.ts +5 -0
  148. package/dist/workspace-classification.js +127 -0
  149. package/dist/workspace-classification.js.map +1 -0
  150. package/dist/workspace-validator.js +11 -1
  151. package/dist/workspace-validator.js.map +1 -1
  152. package/dist/workspace.d.ts +8 -4
  153. package/dist/workspace.js +111 -4
  154. package/dist/workspace.js.map +1 -1
  155. package/docs/dev-team-specialist-role-profiles.md +171 -0
  156. package/docs/mcp-oauth-proxy-evaluation.md +44 -0
  157. package/docs/multi-agent-orchestrator-backlog.md +413 -1
  158. package/docs/open-orchestra-dogfooding-findings.md +66 -0
  159. package/docs/orchestra-mvp.md +46 -1
  160. package/docs/runtime-adapters.md +86 -0
  161. package/docs/runtime-llm-flow.md +124 -0
  162. package/docs/setup-agents-dogfooding-findings.md +101 -0
  163. package/docs/skill-loading-strategy.md +114 -0
  164. package/docs/source-of-truth-and-agent-learning.md +83 -0
  165. package/package.json +9 -5
  166. package/rules/agent-roles.mdc +30 -0
  167. package/rules/ai-assisted-development.mdc +22 -0
  168. package/skills/agent-learning/SKILL.md +24 -0
  169. package/skills/agent-learning/manifest.json +40 -0
  170. package/skills/backlog-sync/SKILL.md +24 -0
  171. package/skills/backlog-sync/manifest.json +41 -0
  172. package/skills/diagram-export/SKILL.md +35 -0
  173. package/skills/diagram-export/manifest.json +40 -0
  174. package/skills/model-evaluation/SKILL.md +25 -0
  175. package/skills/model-evaluation/manifest.json +41 -0
  176. package/skills/playwright-evidence/SKILL.md +28 -0
  177. package/skills/playwright-evidence/manifest.json +46 -0
  178. package/skills/pr-review/SKILL.md +23 -0
  179. package/skills/pr-review/manifest.json +43 -0
  180. package/skills/prompt-registry/SKILL.md +24 -0
  181. package/skills/prompt-registry/manifest.json +45 -0
  182. package/skills/release-readiness/SKILL.md +25 -0
  183. package/skills/release-readiness/manifest.json +45 -0
  184. package/skills/source-of-truth/SKILL.md +24 -0
  185. package/skills/source-of-truth/manifest.json +47 -0
  186. package/skills/static-analysis/SKILL.md +26 -0
  187. package/skills/static-analysis/manifest.json +46 -0
@@ -0,0 +1,80 @@
1
+ import path from "node:path";
2
+ export function evaluateMcpOAuthProxy(config) {
3
+ const risks = validateMcpOAuthProxyConfig(config);
4
+ return {
5
+ approved: risks.length === 0,
6
+ risks,
7
+ recommendations: [
8
+ "Keep the proxy opt-in and require user approval before writing MCP config.",
9
+ "Never log access tokens, refresh tokens, authorization codes, or token endpoint responses.",
10
+ "Support revocation by deleting local token material and re-running authorization.",
11
+ ],
12
+ modes: [
13
+ {
14
+ mode: "stdio-proxy",
15
+ summary: "A local process bridges stdio clients to HTTP MCP servers.",
16
+ tradeOff: "Best compatibility, but the proxy owns token injection and refresh risk.",
17
+ },
18
+ {
19
+ mode: "direct-http",
20
+ summary: "The client connects directly to the HTTP MCP server.",
21
+ tradeOff: "Simpler runtime, but only works when the tool supports HTTP MCP and auth.",
22
+ },
23
+ {
24
+ mode: "tool-native-oauth",
25
+ summary: "The IDE or CLI handles OAuth and MCP transport itself.",
26
+ tradeOff: "Best security ownership, but availability depends on each tool runtime.",
27
+ },
28
+ ],
29
+ };
30
+ }
31
+ export function validateMcpOAuthProxyConfig(config) {
32
+ const risks = [];
33
+ if (!config.enabled) {
34
+ risks.push("proxy is disabled; no MCP config should be changed");
35
+ }
36
+ if (!config.approvedBy) {
37
+ risks.push("missing explicit user approval");
38
+ }
39
+ if (!config.serverUrl.startsWith("https://")) {
40
+ risks.push("serverUrl must use https");
41
+ }
42
+ if (config.refreshWindowSeconds < 30) {
43
+ risks.push("refreshWindowSeconds must be at least 30");
44
+ }
45
+ if (config.tokenStorage === "secure-file") {
46
+ if (!config.tokenPath) {
47
+ risks.push("secure-file token storage requires tokenPath");
48
+ }
49
+ else if (!isSecureLocalTokenPath(config.tokenPath)) {
50
+ risks.push("tokenPath must stay under an approved local secret directory");
51
+ }
52
+ }
53
+ return risks;
54
+ }
55
+ export async function refreshMcpTokenIfNeeded({ token, now = new Date(), refreshWindowSeconds, refresh, }) {
56
+ const expiresAt = new Date(token.expiresAt);
57
+ const refreshAt = expiresAt.getTime() - refreshWindowSeconds * 1000;
58
+ if (now.getTime() < refreshAt) {
59
+ return {
60
+ refreshed: false,
61
+ reason: "token still valid outside refresh window",
62
+ token,
63
+ };
64
+ }
65
+ return {
66
+ refreshed: true,
67
+ reason: "token refreshed inside refresh window",
68
+ token: await refresh(token),
69
+ };
70
+ }
71
+ function isSecureLocalTokenPath(tokenPath) {
72
+ const normalized = path.normalize(tokenPath);
73
+ const home = process.env.HOME ? path.normalize(process.env.HOME) : "";
74
+ const approvedPrefixes = [
75
+ path.join(home, ".config", "open-orchestra", "secrets"),
76
+ path.join(home, ".local", "share", "open-orchestra", "secrets"),
77
+ ];
78
+ return approvedPrefixes.some((prefix) => normalized === prefix || normalized.startsWith(prefix + path.sep));
79
+ }
80
+ //# sourceMappingURL=mcp-oauth-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-oauth-proxy.js","sourceRoot":"","sources":["../src/mcp-oauth-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { EventEntry, LockEntry, Task } from "./types.js";
2
+ export interface PullRequestReviewAnalysis {
3
+ behaviorSummary: string;
4
+ changedFiles: string[];
5
+ testEvidence: string[];
6
+ unresolvedQuestions: string[];
7
+ requiredReviewers: string[];
8
+ missingReviewers: string[];
9
+ checklist: string[];
10
+ evidenceGaps: string[];
11
+ mergeBlocked: boolean;
12
+ mergeBlockers: string[];
13
+ }
14
+ export declare function analyzePullRequestReview(input: {
15
+ task: Task;
16
+ reviews: EventEntry[];
17
+ evidence: EventEntry[];
18
+ gates: EventEntry[];
19
+ locks: LockEntry[];
20
+ }): PullRequestReviewAnalysis;
@@ -0,0 +1,142 @@
1
+ export function analyzePullRequestReview(input) {
2
+ const changedFiles = input.task.paths ?? [];
3
+ const requiredReviewers = requiredReviewersForTask(input.task, changedFiles);
4
+ const approvedReviewers = approvedReviewersFromEvents(input.reviews);
5
+ const missingReviewers = requiredReviewers.filter((reviewer) => !approvedReviewers.has(reviewer));
6
+ const evidenceGaps = missingEvidenceForTask(input.task, input.evidence);
7
+ const unresolvedQuestions = unresolvedQuestionsForTask(input.task, input.gates);
8
+ const mergeBlockers = [
9
+ ...missingReviewers.map((role) => "missing required review: " + role),
10
+ ...evidenceGaps.map((gap) => "missing evidence: " + gap),
11
+ ...input.locks.map((lock) => "active lock: " + lock.path),
12
+ ...input.reviews
13
+ .filter((review) => review.metadata.result === "block")
14
+ .map((review) => "blocking review: " + review.actor),
15
+ ...unresolvedQuestions.map((question) => "unresolved question: " + question),
16
+ ];
17
+ return {
18
+ behaviorSummary: behaviorSummaryForTask(input.task),
19
+ changedFiles,
20
+ testEvidence: input.evidence.map((event) => event.summary),
21
+ unresolvedQuestions,
22
+ requiredReviewers,
23
+ missingReviewers,
24
+ checklist: checklistForChangedFiles(changedFiles),
25
+ evidenceGaps,
26
+ mergeBlocked: mergeBlockers.length > 0,
27
+ mergeBlockers,
28
+ };
29
+ }
30
+ function behaviorSummaryForTask(task) {
31
+ return task.goal ?? task.scope ?? task.title;
32
+ }
33
+ function requiredReviewersForTask(task, changedFiles) {
34
+ const reviewers = new Set(["tech_lead", "qa"]);
35
+ const lowerRisks = [
36
+ ...(task.risks ?? []),
37
+ ...(task.riskGate?.impactAreas ?? []),
38
+ ].map((risk) => risk.toLowerCase());
39
+ for (const filePath of changedFiles) {
40
+ addReviewersForPath(filePath, reviewers);
41
+ }
42
+ for (const risk of lowerRisks) {
43
+ addReviewersForRisk(risk, reviewers);
44
+ }
45
+ if (task.architectureApproval ||
46
+ /architecture|design|service|api/i.test(task.scope ?? "")) {
47
+ reviewers.add("architect");
48
+ }
49
+ return Array.from(reviewers).sort();
50
+ }
51
+ function addReviewersForPath(filePath, reviewers) {
52
+ if (/\.(tsx|jsx|css|scss)$|src\/web|app\/|pages\//.test(filePath)) {
53
+ reviewers.add("frontend_specialist");
54
+ reviewers.add("ux_ui_designer");
55
+ }
56
+ if (/server|api|service|backend|\.sql$|migrations?\//.test(filePath)) {
57
+ reviewers.add("backend_specialist");
58
+ }
59
+ if (/\.sql$|migrations?\//.test(filePath)) {
60
+ reviewers.add("dba");
61
+ }
62
+ if (/Dockerfile|docker-compose|\.github\/workflows|terraform|infra\//.test(filePath)) {
63
+ reviewers.add("devops");
64
+ }
65
+ if (/auth|security|secret|permission|policy/.test(filePath)) {
66
+ reviewers.add("security");
67
+ }
68
+ if (/test|spec|playwright|e2e/.test(filePath)) {
69
+ reviewers.add("sdet");
70
+ }
71
+ }
72
+ function addReviewersForRisk(risk, reviewers) {
73
+ const reviewerByRisk = {
74
+ security: "security",
75
+ devops: "devops",
76
+ sre: "sre",
77
+ dba: "dba",
78
+ ux: "ux_ui_designer",
79
+ release: "release_manager",
80
+ compliance: "compliance_privacy",
81
+ };
82
+ const reviewer = reviewerByRisk[risk];
83
+ if (reviewer) {
84
+ reviewers.add(reviewer);
85
+ }
86
+ }
87
+ function approvedReviewersFromEvents(reviews) {
88
+ return new Set(reviews
89
+ .filter((review) => review.metadata.result === "approve")
90
+ .map((review) => review.actor));
91
+ }
92
+ function missingEvidenceForTask(task, evidence) {
93
+ const gaps = [];
94
+ if (!evidence.some((event) => event.type === "EVIDENCE_ADDED")) {
95
+ gaps.push("test evidence");
96
+ }
97
+ if ((task.paths ?? []).some((filePath) => /tsx|jsx|playwright|e2e/.test(filePath))) {
98
+ const hasBrowserEvidence = evidence.some((event) => /screenshot|trace|browser|playwright/i.test(event.summary));
99
+ if (!hasBrowserEvidence) {
100
+ gaps.push("browser evidence");
101
+ }
102
+ }
103
+ if (!evidence.some((event) => /rollback|rollout/i.test(event.summary))) {
104
+ gaps.push("rollout or rollback note");
105
+ }
106
+ return gaps;
107
+ }
108
+ function unresolvedQuestionsForTask(task, gates) {
109
+ const questions = [];
110
+ if (task.status === "blocked" && task.blockedReason) {
111
+ questions.push(task.blockedReason);
112
+ }
113
+ for (const gate of gates) {
114
+ if (gate.type === "GATE_BLOCKED") {
115
+ questions.push(gate.summary);
116
+ }
117
+ }
118
+ return questions;
119
+ }
120
+ function checklistForChangedFiles(changedFiles) {
121
+ const checklist = new Set([
122
+ "Confirm user-visible behavior matches acceptance criteria.",
123
+ "Confirm tests and evidence cover changed behavior.",
124
+ "Confirm rollback or forward-fix path is documented.",
125
+ ]);
126
+ for (const filePath of changedFiles) {
127
+ if (/\.(ts|tsx|js|jsx)$/.test(filePath)) {
128
+ checklist.add("Check type safety, error handling, and public API contracts.");
129
+ }
130
+ if (/tsx|jsx|css|scss|src\/web|app\/|pages\//.test(filePath)) {
131
+ checklist.add("Check responsive UI, accessibility, and browser evidence.");
132
+ }
133
+ if (/Dockerfile|\.github\/workflows|terraform|infra\//.test(filePath)) {
134
+ checklist.add("Check CI/CD, secrets, rollback, and runtime configuration impact.");
135
+ }
136
+ if (/\.sql$|migrations?\//.test(filePath)) {
137
+ checklist.add("Check migration reversibility, data safety, and DBA approval.");
138
+ }
139
+ }
140
+ return Array.from(checklist).sort();
141
+ }
142
+ //# sourceMappingURL=pr-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-review.js","sourceRoot":"","sources":["../src/pr-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface ProjectSignal {
2
+ id: string;
3
+ label: string;
4
+ evidence: string[];
5
+ recommendedRoles: string[];
6
+ recommendedSkills: string[];
7
+ sourceGroups: string[];
8
+ }
9
+ export interface ProjectDetectionReport {
10
+ root: string;
11
+ signals: ProjectSignal[];
12
+ recommendedRoles: string[];
13
+ recommendedSkills: string[];
14
+ sourceGroups: string[];
15
+ reviewRequired: boolean;
16
+ accepted: boolean;
17
+ }
18
+ export declare function detectProjectProfile(root?: string): Promise<ProjectDetectionReport>;
19
+ export declare function acceptDetectedProjectProfile({ root, outputPath, }?: {
20
+ root?: string;
21
+ outputPath?: string;
22
+ }): Promise<ProjectDetectionReport>;
@@ -0,0 +1,174 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { exists, resolveWorkspaceWritePath, writeJson } from "./fs-utils.js";
4
+ const SIGNAL_RULES = [
5
+ {
6
+ id: "node-package-manager",
7
+ label: "Node package manager",
8
+ roles: ["developer", "tech_lead"],
9
+ skills: ["static-analysis", "prompt-registry"],
10
+ sourceGroups: ["codebase", "quality-security"],
11
+ paths: ["package.json", "package-lock.json", "yarn.lock", "pnpm-lock.yaml"],
12
+ },
13
+ {
14
+ id: "playwright",
15
+ label: "Playwright browser testing",
16
+ roles: ["qa", "sdet", "frontend_specialist"],
17
+ skills: ["playwright-evidence", "static-analysis"],
18
+ sourceGroups: ["quality-security", "codebase"],
19
+ paths: ["playwright.config.ts", "playwright.config.js", "e2e", "tests/e2e"],
20
+ packageNames: ["@playwright/test", "playwright"],
21
+ },
22
+ {
23
+ id: "github-actions",
24
+ label: "GitHub Actions workflows",
25
+ roles: ["devops", "platform_engineer"],
26
+ skills: ["static-analysis", "release-readiness"],
27
+ sourceGroups: ["devops-runtime", "quality-security"],
28
+ paths: [".github/workflows"],
29
+ },
30
+ {
31
+ id: "containers",
32
+ label: "Docker or Compose runtime",
33
+ roles: ["devops", "sre", "security"],
34
+ skills: ["static-analysis", "release-readiness"],
35
+ sourceGroups: ["devops-runtime", "quality-security"],
36
+ paths: ["Dockerfile", "docker-compose.yml", "compose.yml"],
37
+ },
38
+ {
39
+ id: "iac",
40
+ label: "Infrastructure as Code",
41
+ roles: ["devops", "security", "sre"],
42
+ skills: ["static-analysis", "diagram-export"],
43
+ sourceGroups: ["devops-runtime", "quality-security", "architecture"],
44
+ paths: ["terraform", "infra", "infrastructure"],
45
+ extensions: [".tf", ".tfvars"],
46
+ },
47
+ {
48
+ id: "frontend",
49
+ label: "Frontend application",
50
+ roles: ["frontend_specialist", "ux_designer", "accessibility_specialist"],
51
+ skills: ["playwright-evidence", "static-analysis"],
52
+ sourceGroups: ["codebase", "quality-security"],
53
+ paths: ["src/App.tsx", "src/App.jsx", "src/main.tsx", "src/pages", "app"],
54
+ packageNames: ["react", "vue", "@angular/core", "next", "vite"],
55
+ },
56
+ {
57
+ id: "python",
58
+ label: "Python project",
59
+ roles: ["developer", "backend_specialist", "qa"],
60
+ skills: ["static-analysis", "prompt-registry"],
61
+ sourceGroups: ["codebase", "quality-security"],
62
+ paths: ["pyproject.toml", "requirements.txt", "setup.py"],
63
+ extensions: [".py"],
64
+ },
65
+ {
66
+ id: "api-service",
67
+ label: "API or service layer",
68
+ roles: ["backend_specialist", "security", "sre"],
69
+ skills: ["static-analysis", "release-readiness"],
70
+ sourceGroups: ["codebase", "quality-security", "devops-runtime"],
71
+ paths: ["src/api", "src/server.ts", "src/server.js", "services", "backend"],
72
+ packageNames: ["express", "fastify", "@nestjs/core", "hono"],
73
+ },
74
+ ];
75
+ export async function detectProjectProfile(root = process.cwd()) {
76
+ const packageNames = await readPackageDependencyNames(root);
77
+ const allFiles = await listProjectFiles(root);
78
+ const signals = [];
79
+ for (const rule of SIGNAL_RULES) {
80
+ const evidence = await collectSignalEvidence(root, allFiles, packageNames, rule);
81
+ if (evidence.length > 0) {
82
+ signals.push({
83
+ id: rule.id,
84
+ label: rule.label,
85
+ evidence,
86
+ recommendedRoles: [...rule.roles],
87
+ recommendedSkills: [...rule.skills],
88
+ sourceGroups: [...rule.sourceGroups],
89
+ });
90
+ }
91
+ }
92
+ return {
93
+ root,
94
+ signals,
95
+ recommendedRoles: unique(signals.flatMap((signal) => signal.recommendedRoles)),
96
+ recommendedSkills: unique(signals.flatMap((signal) => signal.recommendedSkills)),
97
+ sourceGroups: unique(signals.flatMap((signal) => signal.sourceGroups)),
98
+ reviewRequired: signals.length > 0,
99
+ accepted: false,
100
+ };
101
+ }
102
+ export async function acceptDetectedProjectProfile({ root = process.cwd(), outputPath = ".agent-workflow/detected-profile.json", } = {}) {
103
+ const report = { ...(await detectProjectProfile(root)), accepted: true };
104
+ const resolvedOutputPath = resolveWorkspaceWritePath(root, outputPath);
105
+ await writeJson(resolvedOutputPath, report);
106
+ return report;
107
+ }
108
+ async function collectSignalEvidence(root, allFiles, packageNames, rule) {
109
+ const pathEvidence = await existingSignalPaths(root, rule.paths ?? []);
110
+ const extensionEvidence = (rule.extensions ?? []).flatMap((extension) => allFiles.filter((filePath) => filePath.endsWith(extension)).slice(0, 3));
111
+ const packageEvidence = (rule.packageNames ?? [])
112
+ .filter((packageName) => packageNames.has(packageName))
113
+ .map((packageName) => "package:" + packageName);
114
+ return unique([...pathEvidence, ...extensionEvidence, ...packageEvidence]);
115
+ }
116
+ async function existingSignalPaths(root, candidatePaths) {
117
+ const foundPaths = [];
118
+ for (const candidatePath of candidatePaths) {
119
+ if (await exists(path.resolve(root, candidatePath))) {
120
+ foundPaths.push(candidatePath);
121
+ }
122
+ }
123
+ return foundPaths;
124
+ }
125
+ async function readPackageDependencyNames(root) {
126
+ const packagePath = path.resolve(root, "package.json");
127
+ if (!(await exists(packagePath))) {
128
+ return new Set();
129
+ }
130
+ const packageJson = JSON.parse(await readFile(packagePath, "utf8"));
131
+ return new Set([
132
+ ...Object.keys(packageJson.dependencies ?? {}),
133
+ ...Object.keys(packageJson.devDependencies ?? {}),
134
+ ]);
135
+ }
136
+ async function listProjectFiles(root) {
137
+ const files = [];
138
+ await collectProjectFiles(root, "", files);
139
+ return files;
140
+ }
141
+ async function collectProjectFiles(root, relativeDirectory, files) {
142
+ const directory = path.join(root, relativeDirectory);
143
+ let entries;
144
+ try {
145
+ entries = await readdir(directory, { withFileTypes: true });
146
+ }
147
+ catch {
148
+ return;
149
+ }
150
+ for (const entry of entries) {
151
+ if (shouldSkipDirectory(entry.name)) {
152
+ continue;
153
+ }
154
+ const relativePath = path.join(relativeDirectory, entry.name);
155
+ if (entry.isDirectory()) {
156
+ await collectProjectFiles(root, relativePath, files);
157
+ continue;
158
+ }
159
+ files.push(relativePath);
160
+ }
161
+ }
162
+ function shouldSkipDirectory(name) {
163
+ return [
164
+ ".git",
165
+ "node_modules",
166
+ "dist",
167
+ "coverage",
168
+ ".agent-workflow",
169
+ ].includes(name);
170
+ }
171
+ function unique(values) {
172
+ return Array.from(new Set(values)).sort();
173
+ }
174
+ //# sourceMappingURL=project-detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detection.js","sourceRoot":"","sources":["../src/project-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export declare const PROMPT_REGISTRY_DIR = ".generated-prompts";
2
+ declare const REGISTER_FILES: {
3
+ readonly "code.md": {
4
+ readonly title: "Code Generation Prompts";
5
+ readonly covers: "source code, refactors, shared modules, and implementation-heavy changes";
6
+ readonly usage: readonly ["Read this file before creating or substantially changing source code.", "Use previous entries to preserve naming, layering, module ownership, and test patterns.", "Update the matching component entry when behavior, responsibility, or architecture changes."];
7
+ };
8
+ readonly "ui.md": {
9
+ readonly title: "UI and UX Prompts";
10
+ readonly covers: "frontend screens, components, responsive layouts, UI copy, and accessibility-sensitive work";
11
+ readonly usage: readonly ["Read this file before changing user-facing UI.", "Preserve mobile-first decisions, state coverage, accessibility constraints, and visual language.", "Update entries for new flows, component state changes, or significant copy/interaction changes."];
12
+ };
13
+ readonly "services.md": {
14
+ readonly title: "Service and Domain Prompts";
15
+ readonly covers: "domain models, service boundaries, API contracts, data flow, and backend behavior";
16
+ readonly usage: readonly ["Read this file before changing domain logic, service contracts, or persistence integration.", "Preserve API conventions, failure-mode decisions, idempotency, retries, and data ownership.", "Update entries when contracts, business rules, or service responsibilities change."];
17
+ };
18
+ readonly "tests.md": {
19
+ readonly title: "Test and Evidence Prompts";
20
+ readonly covers: "unit tests, integration tests, Playwright specs, QA plans, fixtures, and evidence strategy";
21
+ readonly usage: readonly ["Read this file before creating tests or QA automation.", "Preserve fixture strategy, page object patterns, locator conventions, and evidence requirements.", "Update entries for substantial test plan, Playwright, or regression coverage changes."];
22
+ };
23
+ readonly "cicd.md": {
24
+ readonly title: "CI/CD and Infrastructure Prompts";
25
+ readonly covers: "workflow YAML, deployment scripts, IaC, runtime config, observability, and rollback automation";
26
+ readonly usage: readonly ["Read this file before changing CI/CD, infra, environments, release, or runtime configuration.", "Preserve secret naming, gate order, rollback assumptions, and deployment safety constraints.", "Update entries for new pipelines, deployment stages, infrastructure modules, or operational gates."];
27
+ };
28
+ readonly "docs.md": {
29
+ readonly title: "Documentation Prompts";
30
+ readonly covers: "ADRs, runbooks, release notes, user docs, support docs, and technical guides";
31
+ readonly usage: readonly ["Read this file before generating or substantially revising documentation.", "Preserve audience, structure, tone, decision history, and links to related artifacts.", "Update entries when docs capture new decisions, release behavior, runbooks, or support guidance."];
32
+ };
33
+ readonly "diagrams.md": {
34
+ readonly title: "Diagram Prompts";
35
+ readonly covers: "architecture diagrams, workflow maps, Mermaid, Lucid, draw.io, and visual explanations";
36
+ readonly usage: readonly ["Read this file before creating or changing diagrams.", "Preserve diagram notation, scope boundaries, naming, and source-of-truth decisions.", "Update entries when a diagram changes architecture, data flow, or operational interpretation."];
37
+ };
38
+ readonly "evals.md": {
39
+ readonly title: "AI Evaluation and Prompt Quality Prompts";
40
+ readonly covers: "LLM evals, prompt changes, model routing, provider fallback, rubrics, and AI behavior evidence";
41
+ readonly usage: readonly ["Read this file before changing prompts, model routing, provider fallback, or eval criteria.", "Preserve eval objectives, datasets, rubrics, model comparison notes, and accepted residual risks.", "Update entries when LLM behavior, scoring, or prompt quality expectations change."];
42
+ };
43
+ };
44
+ export type PromptRegistryFileName = keyof typeof REGISTER_FILES;
45
+ export interface PromptRegistryWriteResult {
46
+ written: string[];
47
+ skipped: string[];
48
+ }
49
+ export declare function promptRegistryFileNames(): PromptRegistryFileName[];
50
+ export declare function buildPromptRegistryFile(name: PromptRegistryFileName): string;
51
+ export declare function initPromptRegistry({ root, force, }?: {
52
+ root?: string | undefined;
53
+ force?: boolean | undefined;
54
+ }): Promise<PromptRegistryWriteResult>;
55
+ export declare function readPromptRegistryFile(root: string, name: PromptRegistryFileName): Promise<string>;
56
+ export {};