@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
package/dist/fs-utils.js CHANGED
@@ -1,6 +1,8 @@
1
- import { access, mkdir, readFile, writeFile, appendFile, } from "node:fs/promises";
1
+ import { access, appendFile, mkdir, readFile, rename, rm, writeFile, } from "node:fs/promises";
2
2
  import { constants as fsConstants } from "node:fs";
3
3
  import path from "node:path";
4
+ const FILE_LOCK_RETRY_MS = 25;
5
+ const FILE_LOCK_TIMEOUT_MS = 5000;
4
6
  export async function exists(filePath) {
5
7
  try {
6
8
  await access(filePath, fsConstants.F_OK);
@@ -21,15 +23,82 @@ export async function readJson(filePath, fallback) {
21
23
  return JSON.parse(content);
22
24
  }
23
25
  export async function writeJson(filePath, value, { overwrite = true } = {}) {
24
- if (!overwrite && (await exists(filePath))) {
25
- throw new Error(`${filePath} already exists`);
26
- }
27
- await writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
26
+ await withFileLock(filePath, async () => {
27
+ if (!overwrite && (await exists(filePath))) {
28
+ throw new Error(`${filePath} already exists`);
29
+ }
30
+ await writeJsonAtomic(filePath, value);
31
+ });
32
+ }
33
+ export async function updateJsonFile(filePath, fallback, update) {
34
+ return withFileLock(filePath, async () => {
35
+ const current = await readJson(filePath, fallback);
36
+ const next = await update(current);
37
+ await writeJsonAtomic(filePath, next);
38
+ return next;
39
+ });
28
40
  }
29
41
  export async function appendJsonLine(filePath, value) {
30
- await appendFile(filePath, `${JSON.stringify(value)}\n`, "utf8");
42
+ await withFileLock(filePath, async () => {
43
+ await appendFile(filePath, `${JSON.stringify(value)}\n`, "utf8");
44
+ });
31
45
  }
32
46
  export function resolveWorkflowPath(root, ...segments) {
33
47
  return path.join(root, ".agent-workflow", ...segments);
34
48
  }
49
+ export function resolveWorkspaceWritePath(root, relativePath) {
50
+ if (path.isAbsolute(relativePath)) {
51
+ throw new Error("workspace write path must be relative");
52
+ }
53
+ const normalizedRoot = path.resolve(root);
54
+ const resolvedPath = path.resolve(normalizedRoot, relativePath);
55
+ const relativeToRoot = path.relative(normalizedRoot, resolvedPath);
56
+ if (relativeToRoot === "" || relativeToRoot.startsWith("..")) {
57
+ throw new Error("workspace write path must stay inside the workspace");
58
+ }
59
+ return resolvedPath;
60
+ }
61
+ async function writeJsonAtomic(filePath, value) {
62
+ const tempPath = `${filePath}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`;
63
+ await writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
64
+ await rename(tempPath, filePath);
65
+ }
66
+ async function withFileLock(filePath, operation) {
67
+ await ensureDir(path.dirname(filePath));
68
+ const lockPath = `${filePath}.lock`;
69
+ const startedAt = Date.now();
70
+ while (true) {
71
+ try {
72
+ await mkdir(lockPath);
73
+ break;
74
+ }
75
+ catch (error) {
76
+ if (!isAlreadyExistsError(error)) {
77
+ throw error;
78
+ }
79
+ if (Date.now() - startedAt >= FILE_LOCK_TIMEOUT_MS) {
80
+ throw new Error(`timed out waiting for file lock: ${filePath}`, {
81
+ cause: error,
82
+ });
83
+ }
84
+ await delay(FILE_LOCK_RETRY_MS);
85
+ }
86
+ }
87
+ try {
88
+ return await operation();
89
+ }
90
+ finally {
91
+ await rm(lockPath, { recursive: true, force: true });
92
+ }
93
+ }
94
+ function isAlreadyExistsError(error) {
95
+ return (error instanceof Error &&
96
+ "code" in error &&
97
+ error.code === "EEXIST");
98
+ }
99
+ function delay(milliseconds) {
100
+ return new Promise((resolve) => {
101
+ setTimeout(resolve, milliseconds);
102
+ });
103
+ }
35
104
  //# sourceMappingURL=fs-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../src/fs-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,EACL,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,QAAgB;IAC3C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAe;IAC7C,MAAM,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,QAAgB,EAAE,QAAW;IAC7D,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,KAAc,EACd,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE;IAEzB,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,QAAQ,iBAAiB,CAAC,CAAC;IAChD,CAAC;IACD,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,KAAc;IAEd,MAAM,UAAU,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,GAAG,QAAkB;IAErB,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,QAAQ,CAAC,CAAC;AACzD,CAAC"}
1
+ {"version":3,"file":"fs-utils.js","sourceRoot":"","sources":["../src/fs-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { WorkspaceClassification } from "./types.js";
2
+ export type HealthStatus = "pass" | "warn" | "fail" | "not_checked";
3
+ export interface HealthCheckItem {
4
+ id: string;
5
+ label: string;
6
+ status: HealthStatus;
7
+ message: string;
8
+ remediation?: string;
9
+ details?: Record<string, unknown>;
10
+ }
11
+ export interface HealthCheckReport {
12
+ generatedAt: string;
13
+ packageRoot: string;
14
+ overallStatus: "healthy" | "degraded" | "unhealthy";
15
+ workspaceClassification: WorkspaceClassification;
16
+ checks: HealthCheckItem[];
17
+ }
18
+ export interface CommandResult {
19
+ exitCode: number;
20
+ stdout: string;
21
+ stderr: string;
22
+ }
23
+ export type HealthCommandRunner = (command: string, args: string[]) => Promise<CommandResult>;
24
+ export declare function getLocalHealthReport({ root, includeNetwork, runner, }?: {
25
+ root?: string;
26
+ includeNetwork?: boolean;
27
+ runner?: HealthCommandRunner;
28
+ }): Promise<HealthCheckReport>;
@@ -0,0 +1,219 @@
1
+ import { execFile } from "node:child_process";
2
+ import { access, readFile } from "node:fs/promises";
3
+ import { dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { validateWorkspace } from "./workspace-validator.js";
6
+ import { classifyWorkspace } from "./workspace-classification.js";
7
+ const PACKAGE_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
8
+ const COMMAND_TIMEOUT_MS = 3000;
9
+ export async function getLocalHealthReport({ root = process.cwd(), includeNetwork = false, runner = runCommand, } = {}) {
10
+ const packageJson = await readPackageJson();
11
+ const workspaceClassification = await classifyWorkspace({ root });
12
+ const checks = [
13
+ packageCheck(packageJson),
14
+ workspaceClassificationCheck(workspaceClassification),
15
+ await commandVersionCheck("node", "Node.js", ["--version"], runner),
16
+ await commandVersionCheck("npm", "npm", ["--version"], runner),
17
+ await commandVersionCheck("git", "Git", ["--version"], runner),
18
+ await githubAuthCheck(includeNetwork, runner),
19
+ await playwrightAvailabilityCheck(packageJson),
20
+ await workflowValidationCheck(root),
21
+ ];
22
+ return {
23
+ generatedAt: new Date().toISOString(),
24
+ packageRoot: PACKAGE_ROOT,
25
+ workspaceClassification,
26
+ overallStatus: overallHealthStatus(checks),
27
+ checks,
28
+ };
29
+ }
30
+ async function readPackageJson() {
31
+ return JSON.parse(await readFile(join(PACKAGE_ROOT, "package.json"), "utf8"));
32
+ }
33
+ function packageCheck(packageJson) {
34
+ const name = typeof packageJson.name === "string" ? packageJson.name : "unknown";
35
+ const version = typeof packageJson.version === "string" ? packageJson.version : "unknown";
36
+ const item = {
37
+ id: "package",
38
+ label: "Open Orchestra package",
39
+ status: version === "unknown" ? "fail" : "pass",
40
+ message: name + "@" + version,
41
+ details: { name, version, packageRoot: PACKAGE_ROOT },
42
+ };
43
+ if (version === "unknown") {
44
+ item.remediation = "Verify package.json contains name and version.";
45
+ }
46
+ return item;
47
+ }
48
+ function workspaceClassificationCheck(classification) {
49
+ if (classification.writePolicy === "blocked") {
50
+ return {
51
+ id: "workspace-classification",
52
+ label: "Workspace classification",
53
+ status: "fail",
54
+ message: `Workspace is ${classification.kind}.`,
55
+ remediation: classification.recommendedAction,
56
+ details: { classification },
57
+ };
58
+ }
59
+ if (classification.writePolicy === "confirm_required") {
60
+ return {
61
+ id: "workspace-classification",
62
+ label: "Workspace classification",
63
+ status: "warn",
64
+ message: "Workspace requires explicit init confirmation.",
65
+ remediation: classification.recommendedAction,
66
+ details: { classification },
67
+ };
68
+ }
69
+ return {
70
+ id: "workspace-classification",
71
+ label: "Workspace classification",
72
+ status: "pass",
73
+ message: `Workspace is ${classification.kind}.`,
74
+ details: { classification },
75
+ };
76
+ }
77
+ async function commandVersionCheck(command, label, args, runner) {
78
+ const result = await runner(command, args).catch((error) => ({
79
+ exitCode: 127,
80
+ stdout: "",
81
+ stderr: error instanceof Error ? error.message : String(error),
82
+ }));
83
+ if (result.exitCode !== 0) {
84
+ return {
85
+ id: command,
86
+ label,
87
+ status: "fail",
88
+ message: label + " is not available.",
89
+ remediation: "Install " + command + " and ensure it is on PATH.",
90
+ details: { stderr: result.stderr },
91
+ };
92
+ }
93
+ return {
94
+ id: command,
95
+ label,
96
+ status: "pass",
97
+ message: result.stdout.trim() || label + " command succeeded.",
98
+ };
99
+ }
100
+ async function githubAuthCheck(includeNetwork, runner) {
101
+ const ghVersion = await runner("gh", ["--version"]).catch(() => null);
102
+ if (!ghVersion || ghVersion.exitCode !== 0) {
103
+ return {
104
+ id: "github-auth",
105
+ label: "GitHub auth",
106
+ status: "warn",
107
+ message: "GitHub CLI is not available.",
108
+ remediation: "Install gh and run gh auth login when GitHub integration is needed.",
109
+ };
110
+ }
111
+ if (!includeNetwork) {
112
+ return {
113
+ id: "github-auth",
114
+ label: "GitHub auth",
115
+ status: "not_checked",
116
+ message: "Skipped to avoid network calls.",
117
+ remediation: "Run orchestra health --network to check gh auth status.",
118
+ };
119
+ }
120
+ const auth = await runner("gh", ["auth", "status"]).catch((error) => ({
121
+ exitCode: 1,
122
+ stdout: "",
123
+ stderr: error instanceof Error ? error.message : String(error),
124
+ }));
125
+ return auth.exitCode === 0
126
+ ? {
127
+ id: "github-auth",
128
+ label: "GitHub auth",
129
+ status: "pass",
130
+ message: "gh auth status passed.",
131
+ }
132
+ : {
133
+ id: "github-auth",
134
+ label: "GitHub auth",
135
+ status: "warn",
136
+ message: "gh auth status failed.",
137
+ remediation: "Run gh auth login or verify token scopes.",
138
+ details: { stderr: auth.stderr },
139
+ };
140
+ }
141
+ async function playwrightAvailabilityCheck(packageJson) {
142
+ const dependencyNames = packageDependencyNames(packageJson);
143
+ const hasPlaywrightDependency = dependencyNames.has("@playwright/test") ||
144
+ dependencyNames.has("playwright");
145
+ const hasLocalBinary = await fileExists(join(PACKAGE_ROOT, "node_modules", ".bin", "playwright"));
146
+ if (hasPlaywrightDependency || hasLocalBinary) {
147
+ return {
148
+ id: "playwright",
149
+ label: "Playwright/browser tooling",
150
+ status: "pass",
151
+ message: "Playwright tooling is available locally.",
152
+ details: {
153
+ dependency: hasPlaywrightDependency,
154
+ localBinary: hasLocalBinary,
155
+ },
156
+ };
157
+ }
158
+ return {
159
+ id: "playwright",
160
+ label: "Playwright/browser tooling",
161
+ status: "warn",
162
+ message: "Playwright is not installed in this package.",
163
+ remediation: "Install @playwright/test and run npx playwright install when browser evidence is required.",
164
+ };
165
+ }
166
+ async function workflowValidationCheck(root) {
167
+ const report = await validateWorkspace(root).catch((error) => ({
168
+ valid: false,
169
+ errors: [
170
+ { message: error instanceof Error ? error.message : String(error) },
171
+ ],
172
+ }));
173
+ if (report.valid) {
174
+ return {
175
+ id: "workflow",
176
+ label: "Workflow readiness",
177
+ status: "pass",
178
+ message: "Workspace valid.",
179
+ };
180
+ }
181
+ return {
182
+ id: "workflow",
183
+ label: "Workflow readiness",
184
+ status: "fail",
185
+ message: "Workspace validation failed.",
186
+ remediation: "Run orchestra validate --json and fix reported workflow errors.",
187
+ details: { errors: report.errors },
188
+ };
189
+ }
190
+ function packageDependencyNames(packageJson) {
191
+ return new Set([
192
+ ...Object.keys(packageJson.dependencies ?? {}),
193
+ ...Object.keys(packageJson.devDependencies ?? {}),
194
+ ]);
195
+ }
196
+ async function fileExists(filePath) {
197
+ return access(filePath).then(() => true, () => false);
198
+ }
199
+ function overallHealthStatus(checks) {
200
+ if (checks.some((check) => check.status === "fail")) {
201
+ return "unhealthy";
202
+ }
203
+ if (checks.some((check) => check.status === "warn" || check.status === "not_checked")) {
204
+ return "degraded";
205
+ }
206
+ return "healthy";
207
+ }
208
+ function runCommand(command, args) {
209
+ return new Promise((resolve) => {
210
+ execFile(command, args, { timeout: COMMAND_TIMEOUT_MS }, (error, stdout, stderr) => {
211
+ resolve({
212
+ exitCode: typeof error?.code === "number" ? error.code : error ? 1 : 0,
213
+ stdout,
214
+ stderr,
215
+ });
216
+ });
217
+ });
218
+ }
219
+ //# sourceMappingURL=health-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-checks.js","sourceRoot":"","sources":["../src/health-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CliIo, CliOptions } from "./types.js";
2
+ export declare function healthCommand(options: CliOptions, io: CliIo): Promise<void>;
@@ -0,0 +1,18 @@
1
+ import { getLocalHealthReport } from "./health-checks.js";
2
+ export async function healthCommand(options, io) {
3
+ const report = await getLocalHealthReport({
4
+ includeNetwork: Boolean(options.network),
5
+ });
6
+ if (options.json) {
7
+ io.log(JSON.stringify(report, null, 2));
8
+ return;
9
+ }
10
+ io.log("Open Orchestra health: " + report.overallStatus);
11
+ for (const check of report.checks) {
12
+ io.log("- " + check.id + " [" + check.status + "]: " + check.message);
13
+ if (check.remediation) {
14
+ io.log(" fix: " + check.remediation);
15
+ }
16
+ }
17
+ }
18
+ //# sourceMappingURL=health-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-commands.js","sourceRoot":"","sources":["../src/health-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAmB,EACnB,EAAS;IAET,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC;QACxC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;KACzC,CAAC,CAAC;IACH,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,yBAAyB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACtE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,EAAE,CAAC,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { type InstructionFileSpec } from "./instruction-updates.js";
2
+ export interface InstructionUpdateManifest {
3
+ files?: InstructionUpdateManifestFile[];
4
+ }
5
+ export type InstructionUpdateMode = "apply" | "check" | "dry-run";
6
+ export interface InstructionUpdateManifestFile extends Omit<InstructionFileSpec, "content"> {
7
+ content?: string;
8
+ contentPath?: string;
9
+ }
10
+ export interface InstructionApplyItem {
11
+ filePath: string;
12
+ blockId: string;
13
+ status: "changed" | "unchanged" | "blocked";
14
+ changed: boolean;
15
+ drift: boolean;
16
+ missing: boolean;
17
+ mode: InstructionUpdateMode;
18
+ hash: string;
19
+ existingHash?: string;
20
+ reason: string;
21
+ }
22
+ export interface InstructionApplyReport {
23
+ items: InstructionApplyItem[];
24
+ totals: Record<InstructionApplyItem["status"], number>;
25
+ mode: InstructionUpdateMode;
26
+ force: boolean;
27
+ }
28
+ export declare function applyInstructionUpdatesFromManifest({ root, manifestPath, check, dryRun, force, }: {
29
+ root?: string;
30
+ manifestPath: string;
31
+ check?: boolean;
32
+ dryRun?: boolean;
33
+ force?: boolean;
34
+ }): Promise<InstructionApplyReport>;
@@ -0,0 +1,150 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { ensureDir, resolveWorkspaceWritePath } from "./fs-utils.js";
4
+ import { checkManagedInstructionBlock, upsertManagedInstructionBlock, } from "./instruction-updates.js";
5
+ export async function applyInstructionUpdatesFromManifest({ root = process.cwd(), manifestPath, check = false, dryRun = false, force = false, }) {
6
+ const manifest = await readInstructionUpdateManifest(manifestPath);
7
+ const mode = instructionUpdateMode({ check, dryRun });
8
+ const items = [];
9
+ for (const manifestFile of manifest.files ?? []) {
10
+ items.push(await applyInstructionUpdateFile(root, manifestFile, {
11
+ mode,
12
+ force,
13
+ }));
14
+ }
15
+ return { items, totals: summarizeInstructionApplyItems(items), mode, force };
16
+ }
17
+ async function applyInstructionUpdateFile(root, manifestFile, options) {
18
+ const filePath = resolveWorkspaceWritePath(root, manifestFile.filePath);
19
+ const existingContent = await readFile(filePath, "utf8").catch(() => "");
20
+ const generatedContent = await resolveGeneratedInstructionContent(root, manifestFile);
21
+ const blockInput = { ...manifestFile, content: generatedContent };
22
+ const result = options.mode === "check"
23
+ ? checkManagedInstructionBlock(existingContent, blockInput)
24
+ : upsertManagedInstructionBlock(existingContent, blockInput, {
25
+ force: options.force,
26
+ });
27
+ const isBlocked = result.drift && !options.force;
28
+ const nextContent = isBlocked
29
+ ? existingContent
30
+ : applyTargetCompatibleMetadata(result.content, manifestFile, result.hash);
31
+ const changed = nextContent !== existingContent;
32
+ if (options.mode === "apply" && !isBlocked && changed) {
33
+ await ensureDir(path.dirname(filePath));
34
+ await writeFile(filePath, nextContent);
35
+ }
36
+ return removeUndefinedApplyItem({
37
+ filePath: manifestFile.filePath,
38
+ blockId: manifestFile.blockId,
39
+ status: isBlocked ? "blocked" : result.changed ? "changed" : "unchanged",
40
+ changed,
41
+ drift: result.drift,
42
+ missing: result.missing,
43
+ mode: options.mode,
44
+ hash: result.hash,
45
+ existingHash: result.existingHash,
46
+ reason: applyInstructionReason(changed, isBlocked),
47
+ });
48
+ }
49
+ async function readInstructionUpdateManifest(manifestPath) {
50
+ return JSON.parse(await readFile(manifestPath, "utf8"));
51
+ }
52
+ async function resolveGeneratedInstructionContent(root, manifestFile) {
53
+ if (manifestFile.content !== undefined) {
54
+ return manifestFile.content;
55
+ }
56
+ if (manifestFile.contentPath !== undefined) {
57
+ return readFile(resolveWorkspaceWritePath(root, manifestFile.contentPath), "utf8");
58
+ }
59
+ throw new Error("instruction manifest file is missing content: " + manifestFile.filePath);
60
+ }
61
+ function instructionUpdateMode(input) {
62
+ if (input.check) {
63
+ return "check";
64
+ }
65
+ if (input.dryRun) {
66
+ return "dry-run";
67
+ }
68
+ return "apply";
69
+ }
70
+ function applyTargetCompatibleMetadata(content, manifestFile, contentHash) {
71
+ if (manifestFile.target !== "cursor" &&
72
+ !manifestFile.filePath.endsWith(".mdc")) {
73
+ return content;
74
+ }
75
+ return upsertCursorMdcFrontmatter(content, {
76
+ blockId: manifestFile.blockId,
77
+ generator: manifestFile.generator,
78
+ version: manifestFile.version,
79
+ target: manifestFile.target,
80
+ sourceManifest: manifestFile.sourceManifest,
81
+ contentHash,
82
+ updatedAt: readManagedBlockUpdatedAt(content),
83
+ });
84
+ }
85
+ function upsertCursorMdcFrontmatter(content, metadata) {
86
+ const metadataLines = [
87
+ "open_orchestra:",
88
+ " block_id: " + metadata.blockId,
89
+ " generator: " + metadata.generator,
90
+ " version: " + metadata.version,
91
+ " target: " + metadata.target,
92
+ " source_manifest: " + metadata.sourceManifest,
93
+ " content_sha256: " + metadata.contentHash,
94
+ " updated_at: " + metadata.updatedAt,
95
+ ];
96
+ if (!content.startsWith("---\n")) {
97
+ return ["---", ...metadataLines, "---", content].join("\n");
98
+ }
99
+ const closingIndex = content.indexOf("\n---", 4);
100
+ if (closingIndex === -1) {
101
+ return content;
102
+ }
103
+ const frontmatter = content.slice(4, closingIndex).split("\n");
104
+ const preservedFrontmatter = removeExistingOpenOrchestraFrontmatter(frontmatter);
105
+ const body = content.slice(closingIndex + "\n---".length);
106
+ return (["---", ...preservedFrontmatter, ...metadataLines, "---"].join("\n") + body);
107
+ }
108
+ function removeExistingOpenOrchestraFrontmatter(lines) {
109
+ const result = [];
110
+ let skippingOpenOrchestra = false;
111
+ for (const line of lines) {
112
+ if (line === "open_orchestra:") {
113
+ skippingOpenOrchestra = true;
114
+ continue;
115
+ }
116
+ if (skippingOpenOrchestra && line.startsWith(" ")) {
117
+ continue;
118
+ }
119
+ skippingOpenOrchestra = false;
120
+ result.push(line);
121
+ }
122
+ return result.filter((line) => line.trim() !== "");
123
+ }
124
+ function readManagedBlockUpdatedAt(content) {
125
+ const match = content.match(/updated-at="([^"]+)"/);
126
+ return match?.[1] ?? new Date().toISOString();
127
+ }
128
+ function applyInstructionReason(changed, blocked) {
129
+ if (blocked) {
130
+ return "managed block drifted; rerun with force to overwrite";
131
+ }
132
+ return changed
133
+ ? "managed block can be updated"
134
+ : "managed block already matches source";
135
+ }
136
+ function summarizeInstructionApplyItems(items) {
137
+ const totals = {
138
+ changed: 0,
139
+ unchanged: 0,
140
+ blocked: 0,
141
+ };
142
+ for (const item of items) {
143
+ totals[item.status] += 1;
144
+ }
145
+ return totals;
146
+ }
147
+ function removeUndefinedApplyItem(value) {
148
+ return Object.fromEntries(Object.entries(value).filter((entry) => entry[1] !== undefined));
149
+ }
150
+ //# sourceMappingURL=instruction-apply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instruction-apply.js","sourceRoot":"","sources":["../src/instruction-apply.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ManagedInstructionBlockInput, ManagedInstructionBlockResult } from "./instruction-types.js";
2
+ export declare function renderManagedInstructionBlock(input: ManagedInstructionBlockInput): string;
3
+ export declare function upsertManagedInstructionBlock(existing: string, input: ManagedInstructionBlockInput, options?: {
4
+ force?: boolean;
5
+ }): ManagedInstructionBlockResult;
6
+ export declare function checkManagedInstructionBlock(existing: string, input: ManagedInstructionBlockInput): ManagedInstructionBlockResult;
7
+ export declare function updateManagedInstructionFile({ filePath, contentPath, input, check, dryRun, force, }: {
8
+ filePath: string;
9
+ contentPath: string;
10
+ input: Omit<ManagedInstructionBlockInput, "content">;
11
+ check?: boolean;
12
+ dryRun?: boolean;
13
+ force?: boolean;
14
+ }): Promise<ManagedInstructionBlockResult>;
15
+ export declare function findManagedBlock(existing: string, blockId: string): {
16
+ start: number;
17
+ end: number;
18
+ metadataHash: string;
19
+ actualHash: string;
20
+ attributes: Map<string, string>;
21
+ } | null;
22
+ export declare function hashContent(content: string): string;