@elie-laloum/outpost 1.1.3 → 2.0.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 (95) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +12 -6
  3. package/dist/cli/image.js +1 -1
  4. package/dist/cli/image.js.map +1 -1
  5. package/dist/cli/init-command.js +4 -3
  6. package/dist/cli/init-command.js.map +1 -1
  7. package/dist/cli/main.constants.d.ts +4 -10
  8. package/dist/cli/main.constants.js +4 -7
  9. package/dist/cli/main.constants.js.map +1 -1
  10. package/dist/cli/project-settings.js +8 -2
  11. package/dist/cli/project-settings.js.map +1 -1
  12. package/dist/cli/scaffold-files.d.ts +1 -1
  13. package/dist/cli/scaffold-files.js +26 -20
  14. package/dist/cli/scaffold-files.js.map +1 -1
  15. package/dist/cli/scaffold-validation.js +2 -5
  16. package/dist/cli/scaffold-validation.js.map +1 -1
  17. package/dist/cli/scaffold.constants.d.ts +0 -2
  18. package/dist/cli/scaffold.constants.js +2 -13
  19. package/dist/cli/scaffold.constants.js.map +1 -1
  20. package/dist/cli/scaffold.d.ts +1 -1
  21. package/dist/cli/scaffold.js +37 -29
  22. package/dist/cli/scaffold.js.map +1 -1
  23. package/dist/cli/scaffold.types.d.ts +3 -5
  24. package/dist/cli/scaffold.types.js.map +1 -1
  25. package/dist/cli/starters.d.ts +1 -2
  26. package/dist/cli/starters.js +42 -30
  27. package/dist/cli/starters.js.map +1 -1
  28. package/dist/index.d.ts +0 -5
  29. package/dist/index.js +0 -2
  30. package/dist/index.js.map +1 -1
  31. package/dist/infrastructure/binary-process.d.ts +3 -0
  32. package/dist/infrastructure/binary-process.js +53 -0
  33. package/dist/infrastructure/binary-process.js.map +1 -0
  34. package/dist/infrastructure/binary-process.types.d.ts +5 -0
  35. package/dist/infrastructure/binary-process.types.js +2 -0
  36. package/dist/infrastructure/binary-process.types.js.map +1 -0
  37. package/dist/infrastructure/transfer-copy.d.ts +3 -0
  38. package/dist/infrastructure/transfer-copy.js +51 -0
  39. package/dist/infrastructure/transfer-copy.js.map +1 -0
  40. package/dist/providers/container-archive.d.ts +3 -0
  41. package/dist/providers/container-archive.js +27 -0
  42. package/dist/providers/container-archive.js.map +1 -0
  43. package/dist/providers/container-command.js +3 -3
  44. package/dist/providers/container-command.js.map +1 -1
  45. package/dist/providers/container-files.d.ts +2 -1
  46. package/dist/providers/container-files.js +100 -11
  47. package/dist/providers/container-files.js.map +1 -1
  48. package/dist/providers/container.js +11 -2
  49. package/dist/providers/container.js.map +1 -1
  50. package/package.json +1 -1
  51. package/dist/adapters/backlogs/backlog.constants.d.ts +0 -4
  52. package/dist/adapters/backlogs/backlog.constants.js +0 -5
  53. package/dist/adapters/backlogs/backlog.constants.js.map +0 -1
  54. package/dist/adapters/backlogs/beads-adapter.d.ts +0 -4
  55. package/dist/adapters/backlogs/beads-adapter.js +0 -31
  56. package/dist/adapters/backlogs/beads-adapter.js.map +0 -1
  57. package/dist/adapters/backlogs/cli.d.ts +0 -3
  58. package/dist/adapters/backlogs/cli.js +0 -20
  59. package/dist/adapters/backlogs/cli.js.map +0 -1
  60. package/dist/adapters/backlogs/github-adapter.d.ts +0 -4
  61. package/dist/adapters/backlogs/github-adapter.js +0 -28
  62. package/dist/adapters/backlogs/github-adapter.js.map +0 -1
  63. package/dist/adapters/backlogs/issue.d.ts +0 -2
  64. package/dist/adapters/backlogs/issue.js +0 -13
  65. package/dist/adapters/backlogs/issue.js.map +0 -1
  66. package/dist/adapters/backlogs/settings.types.d.ts +0 -5
  67. package/dist/adapters/backlogs/settings.types.js +0 -2
  68. package/dist/adapters/backlogs/settings.types.js.map +0 -1
  69. package/dist/application/campaign-integration.d.ts +0 -2
  70. package/dist/application/campaign-integration.js +0 -44
  71. package/dist/application/campaign-integration.js.map +0 -1
  72. package/dist/application/campaign-planner.d.ts +0 -3
  73. package/dist/application/campaign-planner.js +0 -35
  74. package/dist/application/campaign-planner.js.map +0 -1
  75. package/dist/application/campaign-worker.d.ts +0 -3
  76. package/dist/application/campaign-worker.js +0 -54
  77. package/dist/application/campaign-worker.js.map +0 -1
  78. package/dist/application/campaign.constants.d.ts +0 -7
  79. package/dist/application/campaign.constants.js +0 -8
  80. package/dist/application/campaign.constants.js.map +0 -1
  81. package/dist/application/campaign.d.ts +0 -3
  82. package/dist/application/campaign.js +0 -96
  83. package/dist/application/campaign.js.map +0 -1
  84. package/dist/application/campaign.types.d.ts +0 -43
  85. package/dist/application/campaign.types.js +0 -2
  86. package/dist/application/campaign.types.js.map +0 -1
  87. package/dist/domain/backlog.d.ts +0 -3
  88. package/dist/domain/backlog.js +0 -23
  89. package/dist/domain/backlog.js.map +0 -1
  90. package/dist/domain/backlog.types.d.ts +0 -15
  91. package/dist/domain/backlog.types.js +0 -2
  92. package/dist/domain/backlog.types.js.map +0 -1
  93. package/dist/providers/backlogs.d.ts +0 -3
  94. package/dist/providers/backlogs.js +0 -3
  95. package/dist/providers/backlogs.js.map +0 -1
@@ -1,7 +0,0 @@
1
- export declare const campaignDefaults: Readonly<{
2
- cycles: 10;
3
- concurrency: 3;
4
- implementationPasses: 100;
5
- reviewPasses: 1;
6
- standards: "Follow the repository conventions. Keep changes focused, test behavior and commit the result.";
7
- }>;
@@ -1,8 +0,0 @@
1
- export const campaignDefaults = Object.freeze({
2
- cycles: 10,
3
- concurrency: 3,
4
- implementationPasses: 100,
5
- reviewPasses: 1,
6
- standards: "Follow the repository conventions. Keep changes focused, test behavior and commit the result.",
7
- });
8
- //# sourceMappingURL=campaign.constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"campaign.constants.js","sourceRoot":"","sources":["../../src/application/campaign.constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5C,MAAM,EAAE,EAAE;IACV,WAAW,EAAE,CAAC;IACd,oBAAoB,EAAE,GAAG;IACzB,YAAY,EAAE,CAAC;IACf,SAAS,EACP,+FAA+F;CAClG,CAAC,CAAC","sourcesContent":["export const campaignDefaults = Object.freeze({\n cycles: 10,\n concurrency: 3,\n implementationPasses: 100,\n reviewPasses: 1,\n standards:\n \"Follow the repository conventions. Keep changes focused, test behavior and commit the result.\",\n});\n"]}
@@ -1,3 +0,0 @@
1
- import type { CampaignOptions, CampaignResult } from "./campaign.types.ts";
2
- export type { CampaignEvent, CampaignOptions, CampaignResult, IssueOutcome, } from "./campaign.types.ts";
3
- export declare function campaign(options: CampaignOptions): Promise<CampaignResult>;
@@ -1,96 +0,0 @@
1
- import { invariant, positive } from "../domain/errors.js";
2
- import { workflow } from "../domain/workflow.js";
3
- import { task } from "../domain/workflow/task.js";
4
- import { git } from "../infrastructure/git/command.js";
5
- import { integrateIssues } from "./campaign-integration.js";
6
- import { planIssues } from "./campaign-planner.js";
7
- import { implementIssue } from "./campaign-worker.js";
8
- import { campaignDefaults } from "./campaign.constants.js";
9
- import { notify } from "./observation.js";
10
- export async function campaign(options) {
11
- options.signal?.throwIfAborted();
12
- const limit = positive(options.cycles ?? campaignDefaults.cycles, "cycles");
13
- const concurrency = positive(options.concurrency ?? campaignDefaults.concurrency, "concurrency");
14
- positive(options.implementationPasses ?? campaignDefaults.implementationPasses, "implementationPasses");
15
- positive(options.reviewPasses ?? campaignDefaults.reviewPasses, "reviewPasses");
16
- const { backlog, planner, reviewer, merger, cycles: _cycles, concurrency: _concurrency, implementationPasses, reviewPasses, standards = campaignDefaults.standards, observe, ...runtime } = options;
17
- const repository = runtime.repository ?? process.cwd();
18
- const outcomes = [];
19
- const emit = (phase, cycle, issue) => notify(observe, { phase, cycle, ...(issue ? { issue } : {}) });
20
- for (let cycle = 1; cycle <= limit; cycle++) {
21
- runtime.signal?.throwIfAborted();
22
- emit("backlog", cycle);
23
- const available = await backlog.list(runtime.signal);
24
- invariant(new Set(available.map((issue) => issue.id)).size === available.length, "Backlog contains duplicate issue ids");
25
- if (!available.length)
26
- return { cycles: cycle - 1, reason: "empty", issues: outcomes };
27
- const pending = new Set(available.map((issue) => issue.id));
28
- const ready = available.filter((issue) => !issue.blockedBy?.some((id) => pending.has(id)));
29
- if (!ready.length)
30
- return { cycles: cycle - 1, reason: "blocked", issues: outcomes };
31
- const context = {
32
- options,
33
- runtime,
34
- standards,
35
- emit: (phase, issue) => emit(phase, cycle, issue),
36
- };
37
- const assignments = await planIssues(context, ready, concurrency);
38
- if (!assignments.length)
39
- return { cycles: cycle - 1, reason: "blocked", issues: outcomes };
40
- const baseline = (await git(repository, ["rev-parse", "HEAD"])).trim();
41
- for (const assignment of assignments) {
42
- invariant(ready.some((issue) => issue.id === assignment.id), `Plan selected an unavailable or blocked issue: ${assignment.id}`);
43
- await git(repository, [
44
- "check-ref-format",
45
- "--branch",
46
- assignment.branch,
47
- ]);
48
- const exists = await git(repository, [
49
- "show-ref",
50
- "--verify",
51
- `refs/heads/${assignment.branch}`,
52
- ]).then(() => true, () => false);
53
- invariant(!exists, `Issue branch already exists: ${assignment.branch}`);
54
- }
55
- const jobs = assignments.map((assignment, index) => task({
56
- key: `issue-${index + 1}`,
57
- async perform({ signal }) {
58
- return implementIssue(context, assignment, baseline, signal);
59
- },
60
- }));
61
- const execution = await workflow(`batch-${cycle}`, jobs).start({
62
- concurrency,
63
- stopOnError: false,
64
- ...(runtime.signal ? { signal: runtime.signal } : {}),
65
- });
66
- runtime.signal?.throwIfAborted();
67
- const completed = [];
68
- jobs.forEach((job, index) => {
69
- const record = execution.tasks[index];
70
- if (record.status !== "done")
71
- outcomes.push({
72
- ...assignments[index],
73
- state: "failed",
74
- error: record.error,
75
- });
76
- else {
77
- const item = execution.value(job);
78
- if (item)
79
- completed.push(item);
80
- else
81
- outcomes.push({ ...assignments[index], state: "empty" });
82
- }
83
- });
84
- if (!completed.length)
85
- return { cycles: cycle, reason: "no-progress", issues: outcomes };
86
- emit("merge", cycle);
87
- await integrateIssues(context, completed);
88
- for (const item of completed) {
89
- emit("close", cycle, item.id);
90
- await backlog.close(item.id, runtime.signal);
91
- outcomes.push({ id: item.id, branch: item.branch, state: "merged" });
92
- }
93
- }
94
- return { cycles: limit, reason: "limit", issues: outcomes };
95
- }
96
- //# sourceMappingURL=campaign.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"campaign.js","sourceRoot":"","sources":["../../src/application/campaign.ts"],"names":[],"mappings":"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","sourcesContent":["import { invariant, positive } from \"../domain/errors.ts\";\nimport { workflow } from \"../domain/workflow.ts\";\nimport { task } from \"../domain/workflow/task.ts\";\nimport { git } from \"../infrastructure/git/command.ts\";\nimport { integrateIssues } from \"./campaign-integration.ts\";\nimport { planIssues } from \"./campaign-planner.ts\";\nimport { implementIssue } from \"./campaign-worker.ts\";\nimport { campaignDefaults } from \"./campaign.constants.ts\";\nimport type {\n CampaignContext,\n CampaignEvent,\n CampaignOptions,\n CampaignResult,\n CompletedIssue,\n IssueOutcome,\n} from \"./campaign.types.ts\";\nimport { notify } from \"./observation.ts\";\n\nexport type {\n CampaignEvent,\n CampaignOptions,\n CampaignResult,\n IssueOutcome,\n} from \"./campaign.types.ts\";\n\nexport async function campaign(\n options: CampaignOptions,\n): Promise<CampaignResult> {\n options.signal?.throwIfAborted();\n const limit = positive(options.cycles ?? campaignDefaults.cycles, \"cycles\");\n const concurrency = positive(\n options.concurrency ?? campaignDefaults.concurrency,\n \"concurrency\",\n );\n positive(\n options.implementationPasses ?? campaignDefaults.implementationPasses,\n \"implementationPasses\",\n );\n positive(\n options.reviewPasses ?? campaignDefaults.reviewPasses,\n \"reviewPasses\",\n );\n const {\n backlog,\n planner,\n reviewer,\n merger,\n cycles: _cycles,\n concurrency: _concurrency,\n implementationPasses,\n reviewPasses,\n standards = campaignDefaults.standards,\n observe,\n ...runtime\n } = options;\n const repository = runtime.repository ?? process.cwd();\n const outcomes: IssueOutcome[] = [];\n const emit = (phase: CampaignEvent[\"phase\"], cycle: number, issue?: string) =>\n notify(observe, { phase, cycle, ...(issue ? { issue } : {}) });\n for (let cycle = 1; cycle <= limit; cycle++) {\n runtime.signal?.throwIfAborted();\n emit(\"backlog\", cycle);\n const available = await backlog.list(runtime.signal);\n invariant(\n new Set(available.map((issue) => issue.id)).size === available.length,\n \"Backlog contains duplicate issue ids\",\n );\n if (!available.length)\n return { cycles: cycle - 1, reason: \"empty\", issues: outcomes };\n const pending = new Set(available.map((issue) => issue.id));\n const ready = available.filter(\n (issue) => !issue.blockedBy?.some((id) => pending.has(id)),\n );\n if (!ready.length)\n return { cycles: cycle - 1, reason: \"blocked\", issues: outcomes };\n const context: CampaignContext = {\n options,\n runtime,\n standards,\n emit: (phase, issue) => emit(phase, cycle, issue),\n };\n const assignments = await planIssues(context, ready, concurrency);\n if (!assignments.length)\n return { cycles: cycle - 1, reason: \"blocked\", issues: outcomes };\n const baseline = (await git(repository, [\"rev-parse\", \"HEAD\"])).trim();\n for (const assignment of assignments) {\n invariant(\n ready.some((issue) => issue.id === assignment.id),\n `Plan selected an unavailable or blocked issue: ${assignment.id}`,\n );\n await git(repository, [\n \"check-ref-format\",\n \"--branch\",\n assignment.branch,\n ]);\n const exists = await git(repository, [\n \"show-ref\",\n \"--verify\",\n `refs/heads/${assignment.branch}`,\n ]).then(\n () => true,\n () => false,\n );\n invariant(!exists, `Issue branch already exists: ${assignment.branch}`);\n }\n const jobs = assignments.map((assignment, index) =>\n task({\n key: `issue-${index + 1}`,\n async perform({ signal }) {\n return implementIssue(context, assignment, baseline, signal);\n },\n }),\n );\n const execution = await workflow(`batch-${cycle}`, jobs).start({\n concurrency,\n stopOnError: false,\n ...(runtime.signal ? { signal: runtime.signal } : {}),\n });\n runtime.signal?.throwIfAborted();\n const completed: CompletedIssue[] = [];\n jobs.forEach((job, index) => {\n const record = execution.tasks[index]!;\n if (record.status !== \"done\")\n outcomes.push({\n ...assignments[index]!,\n state: \"failed\",\n error: record.error,\n });\n else {\n const item = execution.value(job);\n if (item) completed.push(item);\n else outcomes.push({ ...assignments[index]!, state: \"empty\" });\n }\n });\n if (!completed.length)\n return { cycles: cycle, reason: \"no-progress\", issues: outcomes };\n emit(\"merge\", cycle);\n await integrateIssues(context, completed);\n for (const item of completed) {\n emit(\"close\", cycle, item.id);\n await backlog.close(item.id, runtime.signal);\n outcomes.push({ id: item.id, branch: item.branch, state: \"merged\" });\n }\n }\n return { cycles: limit, reason: \"limit\", issues: outcomes };\n}\n"]}
@@ -1,43 +0,0 @@
1
- import type { AgentAdapter } from "../domain/agent.types.ts";
2
- import type { Assignment, Backlog } from "../domain/backlog.types.ts";
3
- import type { SandboxOptions } from "./outpost.types.ts";
4
- export interface CampaignEvent {
5
- readonly phase: "backlog" | "plan" | "implement" | "review" | "merge" | "close";
6
- readonly cycle: number;
7
- readonly issue?: string;
8
- }
9
- export interface CampaignOptions extends Omit<SandboxOptions, "workspace" | "branch" | "agent"> {
10
- readonly agent: AgentAdapter;
11
- readonly backlog: Backlog;
12
- readonly planner?: AgentAdapter | false;
13
- readonly reviewer?: AgentAdapter | false;
14
- readonly merger?: AgentAdapter;
15
- readonly cycles?: number;
16
- readonly concurrency?: number;
17
- readonly implementationPasses?: number;
18
- readonly reviewPasses?: number;
19
- readonly standards?: string;
20
- readonly observe?: (event: CampaignEvent) => void;
21
- }
22
- export interface IssueOutcome {
23
- readonly id: string;
24
- readonly branch: string;
25
- readonly state: "empty" | "failed" | "merged";
26
- readonly error?: unknown;
27
- }
28
- export interface CampaignResult {
29
- readonly cycles: number;
30
- readonly reason: "empty" | "blocked" | "no-progress" | "limit";
31
- readonly issues: readonly IssueOutcome[];
32
- }
33
- export interface CompletedIssue extends Assignment {
34
- readonly head: string;
35
- }
36
- export interface CampaignContext {
37
- readonly options: CampaignOptions;
38
- readonly runtime: SandboxOptions & {
39
- readonly agent: AgentAdapter;
40
- };
41
- readonly standards: string;
42
- readonly emit: (phase: CampaignEvent["phase"], issue?: string) => void;
43
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=campaign.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"campaign.types.js","sourceRoot":"","sources":["../../src/application/campaign.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { AgentAdapter } from \"../domain/agent.types.ts\";\nimport type { Assignment, Backlog } from \"../domain/backlog.types.ts\";\nimport type { SandboxOptions } from \"./outpost.types.ts\";\n\nexport interface CampaignEvent {\n readonly phase:\n \"backlog\" | \"plan\" | \"implement\" | \"review\" | \"merge\" | \"close\";\n readonly cycle: number;\n readonly issue?: string;\n}\n\nexport interface CampaignOptions extends Omit<\n SandboxOptions,\n \"workspace\" | \"branch\" | \"agent\"\n> {\n readonly agent: AgentAdapter;\n readonly backlog: Backlog;\n readonly planner?: AgentAdapter | false;\n readonly reviewer?: AgentAdapter | false;\n readonly merger?: AgentAdapter;\n readonly cycles?: number;\n readonly concurrency?: number;\n readonly implementationPasses?: number;\n readonly reviewPasses?: number;\n readonly standards?: string;\n readonly observe?: (event: CampaignEvent) => void;\n}\n\nexport interface IssueOutcome {\n readonly id: string;\n readonly branch: string;\n readonly state: \"empty\" | \"failed\" | \"merged\";\n readonly error?: unknown;\n}\n\nexport interface CampaignResult {\n readonly cycles: number;\n readonly reason: \"empty\" | \"blocked\" | \"no-progress\" | \"limit\";\n readonly issues: readonly IssueOutcome[];\n}\n\nexport interface CompletedIssue extends Assignment {\n readonly head: string;\n}\nexport interface CampaignContext {\n readonly options: CampaignOptions;\n readonly runtime: SandboxOptions & { readonly agent: AgentAdapter };\n readonly standards: string;\n readonly emit: (phase: CampaignEvent[\"phase\"], issue?: string) => void;\n}\n"]}
@@ -1,3 +0,0 @@
1
- import type { Assignment } from "./backlog.types.ts";
2
- export type { Assignment, Backlog, Issue } from "./backlog.types.ts";
3
- export declare function readPlan(input: unknown): readonly Assignment[];
@@ -1,23 +0,0 @@
1
- import { invariant } from "./errors.js";
2
- export function readPlan(input) {
3
- invariant(!!input &&
4
- typeof input === "object" &&
5
- "issues" in input &&
6
- Array.isArray(input.issues), "Plan must contain an issues array");
7
- const ids = new Set(), branches = new Set();
8
- return input.issues.map((entry) => {
9
- invariant(!!entry &&
10
- typeof entry === "object" &&
11
- "id" in entry &&
12
- typeof entry.id === "string" &&
13
- entry.id.trim().length > 0 &&
14
- "branch" in entry &&
15
- typeof entry.branch === "string" &&
16
- entry.branch.startsWith("outpost/"), "Each assignment needs an issue id and an outpost/ branch");
17
- invariant(!ids.has(entry.id) && !branches.has(entry.branch), "Plan contains duplicate issues or branches");
18
- ids.add(entry.id);
19
- branches.add(entry.branch);
20
- return { id: entry.id, branch: entry.branch };
21
- });
22
- }
23
- //# sourceMappingURL=backlog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backlog.js","sourceRoot":"","sources":["../../src/domain/backlog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,SAAS,CACP,CAAC,CAAC,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,QAAQ,IAAI,KAAK;QACjB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAC7B,mCAAmC,CACpC,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,EAC3B,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;QACzC,SAAS,CACP,CAAC,CAAC,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,IAAI,IAAI,KAAK;YACb,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;YAC5B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAC1B,QAAQ,IAAI,KAAK;YACjB,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAChC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,EACrC,0DAA0D,CAC3D,CAAC;QACF,SAAS,CACP,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EACjD,4CAA4C,CAC7C,CAAC;QACF,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Assignment } from \"./backlog.types.ts\";\nimport { invariant } from \"./errors.ts\";\n\nexport type { Assignment, Backlog, Issue } from \"./backlog.types.ts\";\n\nexport function readPlan(input: unknown): readonly Assignment[] {\n invariant(\n !!input &&\n typeof input === \"object\" &&\n \"issues\" in input &&\n Array.isArray(input.issues),\n \"Plan must contain an issues array\",\n );\n const ids = new Set<string>(),\n branches = new Set<string>();\n return input.issues.map((entry: unknown) => {\n invariant(\n !!entry &&\n typeof entry === \"object\" &&\n \"id\" in entry &&\n typeof entry.id === \"string\" &&\n entry.id.trim().length > 0 &&\n \"branch\" in entry &&\n typeof entry.branch === \"string\" &&\n entry.branch.startsWith(\"outpost/\"),\n \"Each assignment needs an issue id and an outpost/ branch\",\n );\n invariant(\n !ids.has(entry.id) && !branches.has(entry.branch),\n \"Plan contains duplicate issues or branches\",\n );\n ids.add(entry.id);\n branches.add(entry.branch);\n return { id: entry.id, branch: entry.branch };\n });\n}\n"]}
@@ -1,15 +0,0 @@
1
- export interface Issue {
2
- readonly id: string;
3
- readonly title: string;
4
- readonly body?: string;
5
- readonly blockedBy?: readonly string[];
6
- }
7
- export interface Backlog {
8
- list(signal?: AbortSignal): Promise<readonly Issue[]>;
9
- get(id: string, signal?: AbortSignal): Promise<Issue>;
10
- close(id: string, signal?: AbortSignal): Promise<void>;
11
- }
12
- export interface Assignment {
13
- readonly id: string;
14
- readonly branch: string;
15
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=backlog.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backlog.types.js","sourceRoot":"","sources":["../../src/domain/backlog.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface Issue {\n readonly id: string;\n readonly title: string;\n readonly body?: string;\n readonly blockedBy?: readonly string[];\n}\n\nexport interface Backlog {\n list(signal?: AbortSignal): Promise<readonly Issue[]>;\n get(id: string, signal?: AbortSignal): Promise<Issue>;\n close(id: string, signal?: AbortSignal): Promise<void>;\n}\n\nexport interface Assignment {\n readonly id: string;\n readonly branch: string;\n}\n"]}
@@ -1,3 +0,0 @@
1
- export { beadsBacklog } from "../adapters/backlogs/beads-adapter.ts";
2
- export { githubBacklog } from "../adapters/backlogs/github-adapter.ts";
3
- export type { BacklogSettings } from "../adapters/backlogs/settings.types.ts";
@@ -1,3 +0,0 @@
1
- export { beadsBacklog } from "../adapters/backlogs/beads-adapter.js";
2
- export { githubBacklog } from "../adapters/backlogs/github-adapter.js";
3
- //# sourceMappingURL=backlogs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backlogs.js","sourceRoot":"","sources":["../../src/providers/backlogs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC","sourcesContent":["export { beadsBacklog } from \"../adapters/backlogs/beads-adapter.ts\";\nexport { githubBacklog } from \"../adapters/backlogs/github-adapter.ts\";\nexport type { BacklogSettings } from \"../adapters/backlogs/settings.types.ts\";\n"]}