@damian87/omp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/.github/agents/architect.md +25 -0
  2. package/.github/agents/code-reviewer.md +25 -0
  3. package/.github/agents/designer.md +26 -0
  4. package/.github/agents/executor.md +24 -0
  5. package/.github/agents/planner.md +26 -0
  6. package/.github/agents/researcher.md +26 -0
  7. package/.github/agents/verifier.md +26 -0
  8. package/.github/copilot-instructions.md +20 -0
  9. package/.github/plugin/marketplace.json +30 -0
  10. package/.github/skills/caveman/SKILL.md +20 -0
  11. package/.github/skills/code-review/SKILL.md +22 -0
  12. package/.github/skills/codebase-research/SKILL.md +20 -0
  13. package/.github/skills/create-skill/SKILL.md +78 -0
  14. package/.github/skills/create-skill/references/best-practices.md +449 -0
  15. package/.github/skills/create-skill/references/examples.md +69 -0
  16. package/.github/skills/create-skill/references/progressive-disclosure.md +25 -0
  17. package/.github/skills/create-skill/references/skill-structure.md +55 -0
  18. package/.github/skills/debug/SKILL.md +22 -0
  19. package/.github/skills/grill-me/SKILL.md +16 -0
  20. package/.github/skills/jira-ticket/SKILL.md +21 -0
  21. package/.github/skills/omp-autopilot/SKILL.md +20 -0
  22. package/.github/skills/prototype/SKILL.md +21 -0
  23. package/.github/skills/ralph/SKILL.md +20 -0
  24. package/.github/skills/ralplan/SKILL.md +21 -0
  25. package/.github/skills/self-evolve/SKILL.md +157 -0
  26. package/.github/skills/tdd/SKILL.md +19 -0
  27. package/.github/skills/team/SKILL.md +20 -0
  28. package/.github/skills/ultraqa/SKILL.md +20 -0
  29. package/.github/skills/ultrawork/SKILL.md +20 -0
  30. package/.github/skills/verify/SKILL.md +20 -0
  31. package/LICENSE +21 -0
  32. package/README.md +214 -0
  33. package/catalog/capabilities.json +729 -0
  34. package/catalog/skills-general.json +427 -0
  35. package/dist/src/catalog.d.ts +79 -0
  36. package/dist/src/catalog.js +113 -0
  37. package/dist/src/catalog.js.map +1 -0
  38. package/dist/src/cli.d.ts +9 -0
  39. package/dist/src/cli.js +475 -0
  40. package/dist/src/cli.js.map +1 -0
  41. package/dist/src/copilot/config.d.ts +7 -0
  42. package/dist/src/copilot/config.js +24 -0
  43. package/dist/src/copilot/config.js.map +1 -0
  44. package/dist/src/copilot/doctor.d.ts +18 -0
  45. package/dist/src/copilot/doctor.js +85 -0
  46. package/dist/src/copilot/doctor.js.map +1 -0
  47. package/dist/src/copilot/launch.d.ts +14 -0
  48. package/dist/src/copilot/launch.js +64 -0
  49. package/dist/src/copilot/launch.js.map +1 -0
  50. package/dist/src/copilot/list.d.ts +17 -0
  51. package/dist/src/copilot/list.js +82 -0
  52. package/dist/src/copilot/list.js.map +1 -0
  53. package/dist/src/copilot/paths.d.ts +21 -0
  54. package/dist/src/copilot/paths.js +36 -0
  55. package/dist/src/copilot/paths.js.map +1 -0
  56. package/dist/src/copilot/setup.d.ts +20 -0
  57. package/dist/src/copilot/setup.js +90 -0
  58. package/dist/src/copilot/setup.js.map +1 -0
  59. package/dist/src/copilot/version.d.ts +13 -0
  60. package/dist/src/copilot/version.js +34 -0
  61. package/dist/src/copilot/version.js.map +1 -0
  62. package/dist/src/jira.d.ts +149 -0
  63. package/dist/src/jira.js +492 -0
  64. package/dist/src/jira.js.map +1 -0
  65. package/dist/src/lint.d.ts +11 -0
  66. package/dist/src/lint.js +85 -0
  67. package/dist/src/lint.js.map +1 -0
  68. package/dist/src/mcp/server.d.ts +10 -0
  69. package/dist/src/mcp/server.js +44 -0
  70. package/dist/src/mcp/server.js.map +1 -0
  71. package/dist/src/mcp/tools/index.d.ts +9 -0
  72. package/dist/src/mcp/tools/index.js +15 -0
  73. package/dist/src/mcp/tools/index.js.map +1 -0
  74. package/dist/src/mcp/tools/notepad.d.ts +2 -0
  75. package/dist/src/mcp/tools/notepad.js +135 -0
  76. package/dist/src/mcp/tools/notepad.js.map +1 -0
  77. package/dist/src/mcp/tools/project-memory.d.ts +2 -0
  78. package/dist/src/mcp/tools/project-memory.js +91 -0
  79. package/dist/src/mcp/tools/project-memory.js.map +1 -0
  80. package/dist/src/mcp/tools/shared-memory.d.ts +2 -0
  81. package/dist/src/mcp/tools/shared-memory.js +148 -0
  82. package/dist/src/mcp/tools/shared-memory.js.map +1 -0
  83. package/dist/src/mcp/tools/state.d.ts +2 -0
  84. package/dist/src/mcp/tools/state.js +107 -0
  85. package/dist/src/mcp/tools/state.js.map +1 -0
  86. package/dist/src/mcp/tools/trace.d.ts +10 -0
  87. package/dist/src/mcp/tools/trace.js +102 -0
  88. package/dist/src/mcp/tools/trace.js.map +1 -0
  89. package/dist/src/mcp/types.d.ts +29 -0
  90. package/dist/src/mcp/types.js +7 -0
  91. package/dist/src/mcp/types.js.map +1 -0
  92. package/dist/src/mode-state/index.d.ts +4 -0
  93. package/dist/src/mode-state/index.js +5 -0
  94. package/dist/src/mode-state/index.js.map +1 -0
  95. package/dist/src/mode-state/paths.d.ts +5 -0
  96. package/dist/src/mode-state/paths.js +29 -0
  97. package/dist/src/mode-state/paths.js.map +1 -0
  98. package/dist/src/mode-state/ralph.d.ts +25 -0
  99. package/dist/src/mode-state/ralph.js +44 -0
  100. package/dist/src/mode-state/ralph.js.map +1 -0
  101. package/dist/src/mode-state/ultraqa.d.ts +26 -0
  102. package/dist/src/mode-state/ultraqa.js +51 -0
  103. package/dist/src/mode-state/ultraqa.js.map +1 -0
  104. package/dist/src/mode-state/ultrawork.d.ts +20 -0
  105. package/dist/src/mode-state/ultrawork.js +34 -0
  106. package/dist/src/mode-state/ultrawork.js.map +1 -0
  107. package/dist/src/project.d.ts +29 -0
  108. package/dist/src/project.js +101 -0
  109. package/dist/src/project.js.map +1 -0
  110. package/dist/src/skills.d.ts +17 -0
  111. package/dist/src/skills.js +61 -0
  112. package/dist/src/skills.js.map +1 -0
  113. package/dist/src/sync.d.ts +6 -0
  114. package/dist/src/sync.js +27 -0
  115. package/dist/src/sync.js.map +1 -0
  116. package/dist/src/team/api.d.ts +20 -0
  117. package/dist/src/team/api.js +55 -0
  118. package/dist/src/team/api.js.map +1 -0
  119. package/dist/src/team/heartbeat.d.ts +4 -0
  120. package/dist/src/team/heartbeat.js +27 -0
  121. package/dist/src/team/heartbeat.js.map +1 -0
  122. package/dist/src/team/idle-nudge.d.ts +27 -0
  123. package/dist/src/team/idle-nudge.js +60 -0
  124. package/dist/src/team/idle-nudge.js.map +1 -0
  125. package/dist/src/team/inbox.d.ts +3 -0
  126. package/dist/src/team/inbox.js +16 -0
  127. package/dist/src/team/inbox.js.map +1 -0
  128. package/dist/src/team/index.d.ts +11 -0
  129. package/dist/src/team/index.js +12 -0
  130. package/dist/src/team/index.js.map +1 -0
  131. package/dist/src/team/outbox.d.ts +14 -0
  132. package/dist/src/team/outbox.js +82 -0
  133. package/dist/src/team/outbox.js.map +1 -0
  134. package/dist/src/team/runtime.d.ts +84 -0
  135. package/dist/src/team/runtime.js +243 -0
  136. package/dist/src/team/runtime.js.map +1 -0
  137. package/dist/src/team/state-paths.d.ts +31 -0
  138. package/dist/src/team/state-paths.js +54 -0
  139. package/dist/src/team/state-paths.js.map +1 -0
  140. package/dist/src/team/task-store.d.ts +41 -0
  141. package/dist/src/team/task-store.js +153 -0
  142. package/dist/src/team/task-store.js.map +1 -0
  143. package/dist/src/team/tmux.d.ts +26 -0
  144. package/dist/src/team/tmux.js +87 -0
  145. package/dist/src/team/tmux.js.map +1 -0
  146. package/dist/src/team/types.d.ts +45 -0
  147. package/dist/src/team/types.js +2 -0
  148. package/dist/src/team/types.js.map +1 -0
  149. package/dist/src/team/worker-bootstrap.d.ts +8 -0
  150. package/dist/src/team/worker-bootstrap.js +52 -0
  151. package/dist/src/team/worker-bootstrap.js.map +1 -0
  152. package/docs/copilot-distribution.md +100 -0
  153. package/docs/general-skills.md +76 -0
  154. package/docs/jira.md +64 -0
  155. package/docs/self-evolve.md +22 -0
  156. package/hooks/hooks.json +74 -0
  157. package/package.json +58 -0
  158. package/plugin.json +14 -0
  159. package/scripts/error.mjs +31 -0
  160. package/scripts/lib/hook-output.mjs +30 -0
  161. package/scripts/lib/stdin.mjs +29 -0
  162. package/scripts/post-tool-use.mjs +31 -0
  163. package/scripts/pre-tool-use.mjs +30 -0
  164. package/scripts/prompt-submit.mjs +66 -0
  165. package/scripts/session-end.mjs +29 -0
  166. package/scripts/session-start.mjs +33 -0
@@ -0,0 +1,51 @@
1
+ import { clearModeState, readModeStateJson, writeModeStateJson } from "./paths.js";
2
+ export function startUltraqa(opts) {
3
+ const cwd = opts.cwd ?? process.cwd();
4
+ const state = {
5
+ active: true,
6
+ goal: opts.goal,
7
+ cycleCount: 0,
8
+ maxCycles: opts.maxCycles ?? 5,
9
+ startedAt: new Date().toISOString(),
10
+ sessionId: opts.sessionId,
11
+ projectPath: cwd,
12
+ lastVerdict: "pending",
13
+ };
14
+ writeModeStateJson(cwd, "ultraqa", state);
15
+ return state;
16
+ }
17
+ export function readUltraqa(cwd = process.cwd()) {
18
+ return readModeStateJson(cwd, "ultraqa");
19
+ }
20
+ export function cancelUltraqa(cwd = process.cwd()) {
21
+ clearModeState(cwd, "ultraqa");
22
+ }
23
+ export function recordUltraqaCycle(cwd = process.cwd(), verdict) {
24
+ const state = readUltraqa(cwd);
25
+ if (!state)
26
+ return { ok: false, reason: "not active" };
27
+ const next = {
28
+ ...state,
29
+ cycleCount: state.cycleCount + 1,
30
+ lastVerdict: verdict,
31
+ };
32
+ if (verdict === "pass") {
33
+ cancelUltraqa(cwd);
34
+ return { ok: true, state: { ...next, active: false } };
35
+ }
36
+ if (next.cycleCount >= state.maxCycles) {
37
+ cancelUltraqa(cwd);
38
+ return { ok: false, state: { ...next, active: false }, reason: `max cycles (${state.maxCycles}) reached` };
39
+ }
40
+ writeModeStateJson(cwd, "ultraqa", next);
41
+ return { ok: true, state: next };
42
+ }
43
+ export function buildUltraqaContext(state) {
44
+ return [
45
+ `[ULTRAQA ACTIVE: cycle ${state.cycleCount}/${state.maxCycles}]`,
46
+ `Goal: ${state.goal}`,
47
+ `Last verdict: ${state.lastVerdict ?? "pending"}`,
48
+ "Run tests → verify → fix. Iterate until the goal passes.",
49
+ ].join("\n");
50
+ }
51
+ //# sourceMappingURL=ultraqa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ultraqa.js","sourceRoot":"","sources":["../../../src/mode-state/ultraqa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoBnF,MAAM,UAAU,YAAY,CAAC,IAAyB;IACpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,KAAK,GAAiB;QAC1B,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,GAAG;QAChB,WAAW,EAAE,SAAS;KACvB,CAAC;IACF,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACrD,OAAO,iBAAiB,CAAe,GAAG,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACvD,cAAc,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;AACjC,CAAC;AAQD,MAAM,UAAU,kBAAkB,CAChC,MAAc,OAAO,CAAC,GAAG,EAAE,EAC3B,OAAoC;IAEpC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACvD,MAAM,IAAI,GAAiB;QACzB,GAAG,KAAK;QACR,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC;QAChC,WAAW,EAAE,OAAO;KACrB,CAAC;IACF,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,aAAa,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACvC,aAAa,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,eAAe,KAAK,CAAC,SAAS,WAAW,EAAE,CAAC;IAC7G,CAAC;IACD,kBAAkB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACzC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAmB;IACrD,OAAO;QACL,0BAA0B,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,GAAG;QAChE,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,iBAAiB,KAAK,CAAC,WAAW,IAAI,SAAS,EAAE;QACjD,0DAA0D;KAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface UltraworkState {
2
+ active: boolean;
3
+ objective: string;
4
+ taskSummary?: string;
5
+ startedAt: string;
6
+ sessionId?: string;
7
+ projectPath: string;
8
+ taskCount: number;
9
+ }
10
+ export interface StartUltraworkOptions {
11
+ cwd?: string;
12
+ objective: string;
13
+ taskSummary?: string;
14
+ sessionId?: string;
15
+ taskCount?: number;
16
+ }
17
+ export declare function startUltrawork(opts: StartUltraworkOptions): UltraworkState;
18
+ export declare function readUltrawork(cwd?: string): UltraworkState | undefined;
19
+ export declare function cancelUltrawork(cwd?: string): void;
20
+ export declare function buildUltraworkContext(state: UltraworkState): string;
@@ -0,0 +1,34 @@
1
+ import { clearModeState, readModeStateJson, writeModeStateJson } from "./paths.js";
2
+ export function startUltrawork(opts) {
3
+ const cwd = opts.cwd ?? process.cwd();
4
+ const state = {
5
+ active: true,
6
+ objective: opts.objective,
7
+ taskSummary: opts.taskSummary,
8
+ startedAt: new Date().toISOString(),
9
+ sessionId: opts.sessionId,
10
+ projectPath: cwd,
11
+ taskCount: opts.taskCount ?? 0,
12
+ };
13
+ writeModeStateJson(cwd, "ultrawork", state);
14
+ return state;
15
+ }
16
+ export function readUltrawork(cwd = process.cwd()) {
17
+ return readModeStateJson(cwd, "ultrawork");
18
+ }
19
+ export function cancelUltrawork(cwd = process.cwd()) {
20
+ clearModeState(cwd, "ultrawork");
21
+ }
22
+ export function buildUltraworkContext(state) {
23
+ return [
24
+ "[ULTRAWORK ACTIVE]",
25
+ `Objective: ${state.objective}`,
26
+ `Started: ${state.startedAt}`,
27
+ `Tasks: ${state.taskCount}`,
28
+ state.taskSummary ? `Summary: ${state.taskSummary}` : "",
29
+ "Sustain the objective. Batch parallel tasks. Report progress per todo.",
30
+ ]
31
+ .filter(Boolean)
32
+ .join("\n");
33
+ }
34
+ //# sourceMappingURL=ultrawork.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ultrawork.js","sourceRoot":"","sources":["../../../src/mode-state/ultrawork.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAoBnF,MAAM,UAAU,cAAc,CAAC,IAA2B;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,KAAK,GAAmB;QAC5B,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC;KAC/B,CAAC;IACF,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACvD,OAAO,iBAAiB,CAAiB,GAAG,EAAE,WAAW,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACzD,cAAc,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAqB;IACzD,OAAO;QACL,oBAAoB;QACpB,cAAc,KAAK,CAAC,SAAS,EAAE;QAC/B,YAAY,KAAK,CAAC,SAAS,EAAE;QAC7B,UAAU,KAAK,CAAC,SAAS,EAAE;QAC3B,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE;QACxD,wEAAwE;KACzE;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface ProjectPaths {
2
+ cwd: string;
3
+ packageRoot: string;
4
+ repoRoot: string;
5
+ catalogDir: string;
6
+ defaultSkillsRoot: string;
7
+ }
8
+ export interface ProjectInspection extends ProjectPaths {
9
+ hasCopilotSkills: boolean;
10
+ hasCatalog: boolean;
11
+ hasPackageJson: boolean;
12
+ }
13
+ export declare function findUp(start: string, marker: string): string | undefined;
14
+ export declare function packageRootFromImportMeta(importMetaUrl: string): string;
15
+ export declare function packageRoot(...segments: string[]): string;
16
+ export declare function repoRoot(...segments: string[]): string;
17
+ export declare function resolveProjectPaths(options?: {
18
+ cwd?: string;
19
+ packageRoot?: string;
20
+ }): ProjectPaths;
21
+ export declare function inspectProject(options?: {
22
+ cwd?: string;
23
+ packageRoot?: string;
24
+ }): ProjectInspection;
25
+ export declare function pathExists(path: string): boolean;
26
+ export declare function readText(path: string): string;
27
+ export declare function listSkillNames(root?: string): string[];
28
+ export declare function parseFrontmatter(text: string): Record<string, string>;
29
+ export declare function toFileUrl(path: string): string;
@@ -0,0 +1,101 @@
1
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
2
+ import { dirname, join, resolve } from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ export function findUp(start, marker) {
5
+ let current = resolve(start);
6
+ while (true) {
7
+ if (existsSync(join(current, marker))) {
8
+ return current;
9
+ }
10
+ const parent = dirname(current);
11
+ if (parent === current) {
12
+ return undefined;
13
+ }
14
+ current = parent;
15
+ }
16
+ }
17
+ export function packageRootFromImportMeta(importMetaUrl) {
18
+ const moduleDir = dirname(fileURLToPath(importMetaUrl));
19
+ const directRoot = resolve(moduleDir, "..");
20
+ if (existsSync(join(directRoot, "catalog")) || existsSync(join(directRoot, "package.json"))) {
21
+ return directRoot;
22
+ }
23
+ const found = findUp(moduleDir, "package.json");
24
+ return found ?? directRoot;
25
+ }
26
+ export function packageRoot(...segments) {
27
+ return resolve(findUp(process.cwd(), "package.json") ?? process.cwd(), ...segments);
28
+ }
29
+ export function repoRoot(...segments) {
30
+ return resolve(packageRoot(), ...segments);
31
+ }
32
+ function inferPackageRoot(cwd) {
33
+ const localPackage = findUp(cwd, "package.json");
34
+ if (localPackage) {
35
+ return localPackage;
36
+ }
37
+ const childPackage = join(cwd, "oh-my-copilot", "package.json");
38
+ if (existsSync(childPackage)) {
39
+ return join(cwd, "oh-my-copilot");
40
+ }
41
+ return cwd;
42
+ }
43
+ export function resolveProjectPaths(options = {}) {
44
+ const cwd = resolve(options.cwd ?? process.cwd());
45
+ const resolvedPackageRoot = resolve(options.packageRoot ?? inferPackageRoot(cwd));
46
+ const resolvedRepoRoot = resolvedPackageRoot;
47
+ return {
48
+ cwd,
49
+ packageRoot: resolvedPackageRoot,
50
+ repoRoot: resolvedRepoRoot,
51
+ catalogDir: join(resolvedPackageRoot, "catalog"),
52
+ defaultSkillsRoot: join(resolvedRepoRoot, ".github", "skills"),
53
+ };
54
+ }
55
+ export function inspectProject(options = {}) {
56
+ const paths = resolveProjectPaths(options);
57
+ return {
58
+ ...paths,
59
+ hasCopilotSkills: existsSync(paths.defaultSkillsRoot),
60
+ hasCatalog: existsSync(paths.catalogDir),
61
+ hasPackageJson: existsSync(join(paths.packageRoot, "package.json")),
62
+ };
63
+ }
64
+ export function pathExists(path) {
65
+ return existsSync(path);
66
+ }
67
+ export function readText(path) {
68
+ return readFileSync(path, "utf8");
69
+ }
70
+ export function listSkillNames(root = repoRoot()) {
71
+ const skillsDir = join(root, ".github", "skills");
72
+ if (!existsSync(skillsDir))
73
+ return [];
74
+ return readdirSync(skillsDir, { withFileTypes: true })
75
+ .filter((entry) => entry.isDirectory())
76
+ .map((entry) => entry.name)
77
+ .sort();
78
+ }
79
+ export function parseFrontmatter(text) {
80
+ if (!text.startsWith("---"))
81
+ return {};
82
+ const end = text.indexOf("\n---", 3);
83
+ if (end === -1)
84
+ return {};
85
+ const frontmatter = text.slice(3, end).trim();
86
+ const result = {};
87
+ for (const line of frontmatter.split(/\r?\n/)) {
88
+ const match = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
89
+ if (!match)
90
+ continue;
91
+ const [, key, rawValue] = match;
92
+ if (!key || rawValue === undefined)
93
+ continue;
94
+ result[key] = rawValue.replace(/^['"]|['"]$/g, "");
95
+ }
96
+ return result;
97
+ }
98
+ export function toFileUrl(path) {
99
+ return pathToFileURL(path).href;
100
+ }
101
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface SkillInstallOptions {
2
+ cwd?: string;
3
+ root?: string;
4
+ source: string;
5
+ scope?: 'project' | 'user';
6
+ dryRun?: boolean;
7
+ }
8
+ export interface SkillInstallResult {
9
+ ok: boolean;
10
+ dryRun: boolean;
11
+ skillName: string;
12
+ sourceDir: string;
13
+ targetDir: string;
14
+ files: string[];
15
+ }
16
+ export declare function installSkill(options: SkillInstallOptions): SkillInstallResult;
17
+ export declare function formatSkillInstall(result: SkillInstallResult): string;
@@ -0,0 +1,61 @@
1
+ import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync } from 'node:fs';
2
+ import { basename, join, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { parseFrontmatter, resolveProjectPaths } from './project.js';
5
+ function findSkillDir(input, cwd) {
6
+ const direct = resolve(cwd, input);
7
+ if (existsSync(join(direct, 'SKILL.md')))
8
+ return direct;
9
+ if (existsSync(direct) && statSync(direct).isFile() && basename(direct) === 'SKILL.md') {
10
+ return resolve(direct, '..');
11
+ }
12
+ throw new Error(`skill source must be a directory containing SKILL.md: ${input}`);
13
+ }
14
+ function listFiles(dir, base = dir) {
15
+ return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
16
+ const path = join(dir, entry.name);
17
+ if (entry.isDirectory())
18
+ return listFiles(path, base);
19
+ return [path.slice(base.length + 1)];
20
+ }).sort();
21
+ }
22
+ export function installSkill(options) {
23
+ const cwd = resolve(options.cwd ?? process.cwd());
24
+ const sourceDir = findSkillDir(options.source, cwd);
25
+ const skillFile = join(sourceDir, 'SKILL.md');
26
+ const frontmatter = parseFrontmatter(readFileSync(skillFile, 'utf8'));
27
+ const skillName = frontmatter.name || basename(sourceDir);
28
+ if (!frontmatter.name)
29
+ throw new Error(`missing skill name in ${skillFile}`);
30
+ if (!frontmatter.description)
31
+ throw new Error(`missing skill description in ${skillFile}`);
32
+ const scope = options.scope ?? 'project';
33
+ const targetRoot = scope === 'user'
34
+ ? join(homedir(), '.copilot', 'skills')
35
+ : join(resolveProjectPaths({ cwd, packageRoot: options.root }).packageRoot, '.github', 'skills');
36
+ const targetDir = join(targetRoot, skillName);
37
+ const files = listFiles(sourceDir);
38
+ if (!options.dryRun) {
39
+ mkdirSync(targetRoot, { recursive: true });
40
+ rmSync(targetDir, { recursive: true, force: true });
41
+ cpSync(sourceDir, targetDir, { recursive: true });
42
+ }
43
+ return {
44
+ ok: true,
45
+ dryRun: Boolean(options.dryRun),
46
+ skillName,
47
+ sourceDir,
48
+ targetDir,
49
+ files,
50
+ };
51
+ }
52
+ export function formatSkillInstall(result) {
53
+ const action = result.dryRun ? 'DRY-RUN' : 'PASS';
54
+ return [
55
+ `${action}: skill install /${result.skillName}`,
56
+ `source=${result.sourceDir}`,
57
+ `target=${result.targetDir}`,
58
+ ...result.files.map((file) => `- ${file}`),
59
+ ].join('\n');
60
+ }
61
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export interface ProjectionFile {
2
+ path: string;
3
+ content: string;
4
+ }
5
+ export declare function projectCopilotCommands(): ProjectionFile[];
6
+ export declare function formatDryRun(files?: ProjectionFile[]): string;
@@ -0,0 +1,27 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { packageRootFromImportMeta } from './project.js';
4
+ function projectSkillNames(packageRoot) {
5
+ const skillsRoot = join(packageRoot, '.github', 'skills');
6
+ if (!existsSync(skillsRoot))
7
+ return [];
8
+ return readdirSync(skillsRoot, { withFileTypes: true })
9
+ .filter((entry) => entry.isDirectory())
10
+ .map((entry) => entry.name)
11
+ .filter((name) => existsSync(join(skillsRoot, name, 'SKILL.md')))
12
+ .sort();
13
+ }
14
+ export function projectCopilotCommands() {
15
+ const packageRoot = packageRootFromImportMeta(import.meta.url);
16
+ return projectSkillNames(packageRoot).map((name) => {
17
+ const path = `.github/skills/${name}/SKILL.md`;
18
+ return {
19
+ path,
20
+ content: readFileSync(join(packageRoot, path), 'utf8'),
21
+ };
22
+ });
23
+ }
24
+ export function formatDryRun(files = projectCopilotCommands()) {
25
+ return ['PASS: Copilot skills dry-run', ...files.map((file) => `- ${file.path} (${file.content.length} bytes)`)].join('\n');
26
+ }
27
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAOzD,SAAS,iBAAiB,CAAC,WAAmB;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO,WAAW,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACpD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;SAChE,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,MAAM,WAAW,GAAG,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,kBAAkB,IAAI,WAAW,CAAC;QAC/C,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC;SACvD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAK,GAAG,sBAAsB,EAAE;IAC3D,OAAO,CAAC,8BAA8B,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9H,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type ClaimResult, type TransitionResult } from "./task-store.js";
2
+ import type { TaskStatus } from "./types.js";
3
+ export interface ClaimInput {
4
+ team_name: string;
5
+ task_id: string;
6
+ worker: string;
7
+ cwd?: string;
8
+ }
9
+ export declare function apiClaimTask(input: ClaimInput): ClaimResult;
10
+ export interface TransitionInput {
11
+ team_name: string;
12
+ task_id: string;
13
+ worker?: string;
14
+ from: TaskStatus;
15
+ to: TaskStatus;
16
+ claim_token: string;
17
+ result?: string;
18
+ cwd?: string;
19
+ }
20
+ export declare function apiTransitionTaskStatus(input: TransitionInput): TransitionResult;
@@ -0,0 +1,55 @@
1
+ import { resolve } from "node:path";
2
+ import { resolveTeamPaths, resolveWorkerPaths } from "./state-paths.js";
3
+ import { tryClaimTask, transitionTask } from "./task-store.js";
4
+ import { writeHeartbeat } from "./heartbeat.js";
5
+ import { appendOutbox } from "./outbox.js";
6
+ export function apiClaimTask(input) {
7
+ const cwd = resolve(input.cwd ?? process.cwd());
8
+ const team = resolveTeamPaths(cwd, input.team_name);
9
+ const worker = resolveWorkerPaths(team, input.worker);
10
+ const result = tryClaimTask({ tasksDir: team.tasksDir, taskId: input.task_id, worker: input.worker });
11
+ if (result.ok) {
12
+ writeHeartbeat(worker.heartbeatFile, {
13
+ pid: process.pid,
14
+ workerName: input.worker,
15
+ teamName: input.team_name,
16
+ lastPollAt: new Date().toISOString(),
17
+ turnCount: 1,
18
+ alive: true,
19
+ });
20
+ }
21
+ return result;
22
+ }
23
+ export function apiTransitionTaskStatus(input) {
24
+ const cwd = resolve(input.cwd ?? process.cwd());
25
+ const team = resolveTeamPaths(cwd, input.team_name);
26
+ const transition = transitionTask({
27
+ tasksDir: team.tasksDir,
28
+ taskId: input.task_id,
29
+ from: input.from,
30
+ to: input.to,
31
+ claimToken: input.claim_token,
32
+ result: input.result,
33
+ });
34
+ if (transition.ok && input.worker) {
35
+ const worker = resolveWorkerPaths(team, input.worker);
36
+ const messageType = input.to === "completed" ? "task_complete" : input.to === "failed" ? "task_failed" : "progress";
37
+ appendOutbox(worker.outboxFile, {
38
+ type: messageType,
39
+ taskId: input.task_id,
40
+ status: input.to,
41
+ result: input.result,
42
+ timestamp: new Date().toISOString(),
43
+ });
44
+ writeHeartbeat(worker.heartbeatFile, {
45
+ pid: process.pid,
46
+ workerName: input.worker,
47
+ teamName: input.team_name,
48
+ lastPollAt: new Date().toISOString(),
49
+ turnCount: 2,
50
+ alive: input.to === "in_progress",
51
+ });
52
+ }
53
+ return transition;
54
+ }
55
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/team/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Heartbeat } from "./types.js";
2
+ export declare function writeHeartbeat(path: string, hb: Heartbeat): void;
3
+ export declare function readHeartbeat(path: string): Heartbeat | undefined;
4
+ export declare function isHeartbeatStale(hb: Heartbeat | undefined, now?: number, maxAgeMs?: number): boolean;
@@ -0,0 +1,27 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ export function writeHeartbeat(path, hb) {
4
+ mkdirSync(dirname(path), { recursive: true });
5
+ const tmp = `${path}.tmp.${process.pid}.${Date.now()}`;
6
+ writeFileSync(tmp, JSON.stringify(hb), "utf8");
7
+ renameSync(tmp, path);
8
+ }
9
+ export function readHeartbeat(path) {
10
+ if (!existsSync(path))
11
+ return undefined;
12
+ try {
13
+ return JSON.parse(readFileSync(path, "utf8"));
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ export function isHeartbeatStale(hb, now = Date.now(), maxAgeMs = 30_000) {
20
+ if (!hb)
21
+ return true;
22
+ const last = Date.parse(hb.lastPollAt);
23
+ if (!Number.isFinite(last))
24
+ return true;
25
+ return now - last > maxAgeMs;
26
+ }
27
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/team/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,EAAa;IACxD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACvD,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAc,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAyB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,MAAM;IACrG,IAAI,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,GAAG,GAAG,IAAI,GAAG,QAAQ,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type TmuxApi } from "./tmux.js";
2
+ export interface NudgeConfig {
3
+ delayMs: number;
4
+ maxCount: number;
5
+ scanIntervalMs: number;
6
+ message: string;
7
+ }
8
+ export declare const DEFAULT_NUDGE_CONFIG: NudgeConfig;
9
+ export interface NudgeSummaryEntry {
10
+ paneId: string;
11
+ nudgeCount: number;
12
+ lastNudgeAt: number | null;
13
+ }
14
+ export interface NudgeAttempt {
15
+ paneId: string;
16
+ nudgeCount: number;
17
+ at: number;
18
+ }
19
+ export declare class NudgeTracker {
20
+ private readonly config;
21
+ private readonly states;
22
+ private lastScanAt;
23
+ constructor(config?: Partial<NudgeConfig>);
24
+ checkAndNudge(api: TmuxApi, sessionName: string, panes: string[], leaderPaneId?: string, now?: number): Promise<NudgeAttempt[]>;
25
+ getSummary(): NudgeSummaryEntry[];
26
+ reset(): void;
27
+ }
@@ -0,0 +1,60 @@
1
+ import { paneHasActiveTask, paneLooksReady, sendToWorker } from "./tmux.js";
2
+ export const DEFAULT_NUDGE_CONFIG = {
3
+ delayMs: 30_000,
4
+ maxCount: 3,
5
+ scanIntervalMs: 5_000,
6
+ message: "Continue working on your assigned task and report concrete progress (not ACK-only).",
7
+ };
8
+ export class NudgeTracker {
9
+ config;
10
+ states = new Map();
11
+ lastScanAt = 0;
12
+ constructor(config = {}) {
13
+ this.config = { ...DEFAULT_NUDGE_CONFIG, ...config };
14
+ }
15
+ async checkAndNudge(api, sessionName, panes, leaderPaneId, now = Date.now()) {
16
+ if (now - this.lastScanAt < this.config.scanIntervalMs)
17
+ return [];
18
+ this.lastScanAt = now;
19
+ const attempts = [];
20
+ for (const paneId of panes) {
21
+ if (paneId === leaderPaneId)
22
+ continue;
23
+ let state = this.states.get(paneId);
24
+ if (!state) {
25
+ state = { nudgeCount: 0, firstIdleAt: null, lastNudgeAt: null };
26
+ this.states.set(paneId, state);
27
+ }
28
+ if (state.nudgeCount >= this.config.maxCount)
29
+ continue;
30
+ const captured = api.capturePane(paneId, 80).stdout;
31
+ const idle = paneLooksReady(captured) && !paneHasActiveTask(captured);
32
+ if (!idle) {
33
+ state.firstIdleAt = null;
34
+ continue;
35
+ }
36
+ if (state.firstIdleAt === null)
37
+ state.firstIdleAt = now;
38
+ if (now - state.firstIdleAt < this.config.delayMs)
39
+ continue;
40
+ const sent = await sendToWorker(api, paneId, this.config.message, { rounds: 4, delayMs: 100 });
41
+ if (sent) {
42
+ state.nudgeCount++;
43
+ state.lastNudgeAt = now;
44
+ state.firstIdleAt = null;
45
+ attempts.push({ paneId, nudgeCount: state.nudgeCount, at: now });
46
+ }
47
+ }
48
+ return attempts;
49
+ }
50
+ getSummary() {
51
+ return Array.from(this.states.entries())
52
+ .filter(([, s]) => s.nudgeCount > 0)
53
+ .map(([paneId, s]) => ({ paneId, nudgeCount: s.nudgeCount, lastNudgeAt: s.lastNudgeAt }));
54
+ }
55
+ reset() {
56
+ this.states.clear();
57
+ this.lastScanAt = 0;
58
+ }
59
+ }
60
+ //# sourceMappingURL=idle-nudge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-nudge.js","sourceRoot":"","sources":["../../../src/team/idle-nudge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function writeInbox(path: string, content: string): void;
2
+ export declare function appendInbox(path: string, content: string): void;
3
+ export declare function readInbox(path: string): string;
@@ -0,0 +1,16 @@
1
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ export function writeInbox(path, content) {
4
+ mkdirSync(dirname(path), { recursive: true });
5
+ writeFileSync(path, content, "utf8");
6
+ }
7
+ export function appendInbox(path, content) {
8
+ mkdirSync(dirname(path), { recursive: true });
9
+ appendFileSync(path, content, "utf8");
10
+ }
11
+ export function readInbox(path) {
12
+ if (!existsSync(path))
13
+ return "";
14
+ return readFileSync(path, "utf8");
15
+ }
16
+ //# sourceMappingURL=inbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.js","sourceRoot":"","sources":["../../../src/team/inbox.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,OAAe;IACvD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export * from "./types.js";
2
+ export * from "./state-paths.js";
3
+ export * from "./heartbeat.js";
4
+ export * from "./inbox.js";
5
+ export * from "./outbox.js";
6
+ export * from "./task-store.js";
7
+ export * from "./tmux.js";
8
+ export * from "./idle-nudge.js";
9
+ export * from "./worker-bootstrap.js";
10
+ export * from "./api.js";
11
+ export * from "./runtime.js";