@crewbie/cli 0.1.0-alpha.49

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 (165) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +506 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +84 -0
  7. package/dist/config.js +178 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/core.d.ts +31 -0
  10. package/dist/core.js +186 -0
  11. package/dist/core.js.map +1 -0
  12. package/dist/execution/attribution.d.ts +10 -0
  13. package/dist/execution/attribution.js +102 -0
  14. package/dist/execution/attribution.js.map +1 -0
  15. package/dist/execution/cancel.d.ts +3 -0
  16. package/dist/execution/cancel.js +59 -0
  17. package/dist/execution/cancel.js.map +1 -0
  18. package/dist/execution/capabilities.d.ts +22 -0
  19. package/dist/execution/capabilities.js +101 -0
  20. package/dist/execution/capabilities.js.map +1 -0
  21. package/dist/execution/controls.d.ts +51 -0
  22. package/dist/execution/controls.js +257 -0
  23. package/dist/execution/controls.js.map +1 -0
  24. package/dist/execution/dispatch.d.ts +69 -0
  25. package/dist/execution/dispatch.js +831 -0
  26. package/dist/execution/dispatch.js.map +1 -0
  27. package/dist/execution/fix.d.ts +3 -0
  28. package/dist/execution/fix.js +267 -0
  29. package/dist/execution/fix.js.map +1 -0
  30. package/dist/execution/github.d.ts +15 -0
  31. package/dist/execution/github.js +43 -0
  32. package/dist/execution/github.js.map +1 -0
  33. package/dist/execution/merge.d.ts +15 -0
  34. package/dist/execution/merge.js +133 -0
  35. package/dist/execution/merge.js.map +1 -0
  36. package/dist/execution/planning-approval.d.ts +33 -0
  37. package/dist/execution/planning-approval.js +227 -0
  38. package/dist/execution/planning-approval.js.map +1 -0
  39. package/dist/execution/pr-review.d.ts +86 -0
  40. package/dist/execution/pr-review.js +339 -0
  41. package/dist/execution/pr-review.js.map +1 -0
  42. package/dist/execution/review-loop.d.ts +63 -0
  43. package/dist/execution/review-loop.js +463 -0
  44. package/dist/execution/review-loop.js.map +1 -0
  45. package/dist/execution/test-feature.d.ts +29 -0
  46. package/dist/execution/test-feature.js +240 -0
  47. package/dist/execution/test-feature.js.map +1 -0
  48. package/dist/execution/watch.d.ts +12 -0
  49. package/dist/execution/watch.js +34 -0
  50. package/dist/execution/watch.js.map +1 -0
  51. package/dist/memory/context.d.ts +14 -0
  52. package/dist/memory/context.js +82 -0
  53. package/dist/memory/context.js.map +1 -0
  54. package/dist/memory/improvement.d.ts +25 -0
  55. package/dist/memory/improvement.js +168 -0
  56. package/dist/memory/improvement.js.map +1 -0
  57. package/dist/memory/launch.d.ts +9 -0
  58. package/dist/memory/launch.js +65 -0
  59. package/dist/memory/launch.js.map +1 -0
  60. package/dist/memory/runner.d.ts +4 -0
  61. package/dist/memory/runner.js +74 -0
  62. package/dist/memory/runner.js.map +1 -0
  63. package/dist/memory/state.d.ts +10 -0
  64. package/dist/memory/state.js +42 -0
  65. package/dist/memory/state.js.map +1 -0
  66. package/dist/presentation.d.ts +19 -0
  67. package/dist/presentation.js +128 -0
  68. package/dist/presentation.js.map +1 -0
  69. package/dist/reporting/dashboard.d.ts +2 -0
  70. package/dist/reporting/dashboard.js +106 -0
  71. package/dist/reporting/dashboard.js.map +1 -0
  72. package/dist/reporting/pr-usage.d.ts +24 -0
  73. package/dist/reporting/pr-usage.js +179 -0
  74. package/dist/reporting/pr-usage.js.map +1 -0
  75. package/dist/reporting/records.d.ts +28 -0
  76. package/dist/reporting/records.js +152 -0
  77. package/dist/reporting/records.js.map +1 -0
  78. package/dist/setup/agents.d.ts +8 -0
  79. package/dist/setup/agents.js +83 -0
  80. package/dist/setup/agents.js.map +1 -0
  81. package/dist/setup/assessment.d.ts +31 -0
  82. package/dist/setup/assessment.js +75 -0
  83. package/dist/setup/assessment.js.map +1 -0
  84. package/dist/setup/auto-loaded.d.ts +17 -0
  85. package/dist/setup/auto-loaded.js +49 -0
  86. package/dist/setup/auto-loaded.js.map +1 -0
  87. package/dist/setup/copilot-version.d.ts +7 -0
  88. package/dist/setup/copilot-version.js +39 -0
  89. package/dist/setup/copilot-version.js.map +1 -0
  90. package/dist/setup/copilot.d.ts +22 -0
  91. package/dist/setup/copilot.js +164 -0
  92. package/dist/setup/copilot.js.map +1 -0
  93. package/dist/setup/init.d.ts +41 -0
  94. package/dist/setup/init.js +315 -0
  95. package/dist/setup/init.js.map +1 -0
  96. package/dist/setup/install.d.ts +12 -0
  97. package/dist/setup/install.js +211 -0
  98. package/dist/setup/install.js.map +1 -0
  99. package/dist/setup/instruction-quality.d.ts +25 -0
  100. package/dist/setup/instruction-quality.js +258 -0
  101. package/dist/setup/instruction-quality.js.map +1 -0
  102. package/dist/setup/inventory.d.ts +26 -0
  103. package/dist/setup/inventory.js +78 -0
  104. package/dist/setup/inventory.js.map +1 -0
  105. package/dist/setup/onboarding.d.ts +40 -0
  106. package/dist/setup/onboarding.js +472 -0
  107. package/dist/setup/onboarding.js.map +1 -0
  108. package/dist/setup/package.d.ts +2 -0
  109. package/dist/setup/package.js +8 -0
  110. package/dist/setup/package.js.map +1 -0
  111. package/dist/setup/planning-workflow.d.ts +3 -0
  112. package/dist/setup/planning-workflow.js +250 -0
  113. package/dist/setup/planning-workflow.js.map +1 -0
  114. package/dist/setup/repository-map.d.ts +34 -0
  115. package/dist/setup/repository-map.js +89 -0
  116. package/dist/setup/repository-map.js.map +1 -0
  117. package/dist/setup/review.d.ts +8 -0
  118. package/dist/setup/review.js +137 -0
  119. package/dist/setup/review.js.map +1 -0
  120. package/dist/setup/team.d.ts +18 -0
  121. package/dist/setup/team.js +172 -0
  122. package/dist/setup/team.js.map +1 -0
  123. package/dist/setup/templates.d.ts +11 -0
  124. package/dist/setup/templates.js +494 -0
  125. package/dist/setup/templates.js.map +1 -0
  126. package/dist/setup/terminal.d.ts +12 -0
  127. package/dist/setup/terminal.js +11 -0
  128. package/dist/setup/terminal.js.map +1 -0
  129. package/dist/setup/update.d.ts +6 -0
  130. package/dist/setup/update.js +71 -0
  131. package/dist/setup/update.js.map +1 -0
  132. package/dist/specification/batch.d.ts +50 -0
  133. package/dist/specification/batch.js +127 -0
  134. package/dist/specification/batch.js.map +1 -0
  135. package/dist/specification/plan-checks.d.ts +6 -0
  136. package/dist/specification/plan-checks.js +73 -0
  137. package/dist/specification/plan-checks.js.map +1 -0
  138. package/dist/specification/planning.d.ts +26 -0
  139. package/dist/specification/planning.js +507 -0
  140. package/dist/specification/planning.js.map +1 -0
  141. package/dist/specification/prose.d.ts +1 -0
  142. package/dist/specification/prose.js +15 -0
  143. package/dist/specification/prose.js.map +1 -0
  144. package/dist/tracking/ado.d.ts +19 -0
  145. package/dist/tracking/ado.js +128 -0
  146. package/dist/tracking/ado.js.map +1 -0
  147. package/dist/tracking/github.d.ts +8 -0
  148. package/dist/tracking/github.js +112 -0
  149. package/dist/tracking/github.js.map +1 -0
  150. package/dist/tracking/issues.d.ts +28 -0
  151. package/dist/tracking/issues.js +180 -0
  152. package/dist/tracking/issues.js.map +1 -0
  153. package/dist/tracking/native.d.ts +5 -0
  154. package/dist/tracking/native.js +30 -0
  155. package/dist/tracking/native.js.map +1 -0
  156. package/dist/tracking/refs.d.ts +14 -0
  157. package/dist/tracking/refs.js +56 -0
  158. package/dist/tracking/refs.js.map +1 -0
  159. package/dist/tracking/sources.d.ts +5 -0
  160. package/dist/tracking/sources.js +29 -0
  161. package/dist/tracking/sources.js.map +1 -0
  162. package/docs/operations.md +1114 -0
  163. package/examples/batch.json +27 -0
  164. package/examples/runs.json +22 -0
  165. package/package.json +50 -0
@@ -0,0 +1,50 @@
1
+ import { type Config } from "../config.js";
2
+ export interface Task {
3
+ id: string;
4
+ title: string;
5
+ body: string;
6
+ owner: string;
7
+ model: string;
8
+ priority: number;
9
+ dependsOn: string[];
10
+ kind?: "implementation" | "review";
11
+ adoWorkItem?: number;
12
+ }
13
+ /** Task PRs of a plan merge into this branch; one feature PR then takes the whole plan to the default branch. */
14
+ /** One branch per approved revision, so a replanned batch never builds on, or reports, an earlier revision's feature PR. */
15
+ export declare function featureBranch(batch: Batch): string;
16
+ export interface SourceReference {
17
+ uri: string;
18
+ revision: string;
19
+ fingerprint?: string;
20
+ }
21
+ export declare function sourceReferences(value: unknown): SourceReference[];
22
+ export interface Batch {
23
+ schemaVersion: 1;
24
+ id: string;
25
+ spec: string;
26
+ sources: SourceReference[];
27
+ tasks: Task[];
28
+ approval: {
29
+ digest: string;
30
+ execute: boolean;
31
+ } | null;
32
+ }
33
+ export declare function parseBatch(value: unknown, config?: Config): Batch;
34
+ export declare function batchDigest(batch: Batch): string;
35
+ export declare function approvedBatch(batch: Batch, execute: boolean): Batch;
36
+ export declare function requireApproval(batch: Batch): void;
37
+ export declare function issueDigest(title: string, body: string): string;
38
+ export declare function issueBody(batch: Batch, task: Task, metadataOverride?: {
39
+ batchDigest?: string;
40
+ branch?: string;
41
+ }): string;
42
+ export interface TaskMetadata {
43
+ batch: string;
44
+ batchDigest: string;
45
+ sources: SourceReference[];
46
+ task: Task;
47
+ branch: string;
48
+ }
49
+ /** Null for bodies without Crewbie metadata and for tasks published before feature branches, which people finish by hand. */
50
+ export declare function taskMetadata(body: string): TaskMetadata | null;
@@ -0,0 +1,127 @@
1
+ import { bounded, hash, integer, record, slug, string, strings } from "../core.js";
2
+ import { limitsFor } from "../config.js";
3
+ function taskKind(value) {
4
+ if (value !== "implementation" && value !== "review")
5
+ throw new Error("Task kind must be implementation or review.");
6
+ return value;
7
+ }
8
+ /** Task PRs of a plan merge into this branch; one feature PR then takes the whole plan to the default branch. */
9
+ /** One branch per approved revision, so a replanned batch never builds on, or reports, an earlier revision's feature PR. */
10
+ export function featureBranch(batch) { return `crewbie/${slug(batch.id, "batch ID").slice(0, 55)}-${batchDigest(batch).slice(0, 8)}`; }
11
+ export function sourceReferences(value) {
12
+ if (!Array.isArray(value))
13
+ throw new Error("sources must be a list of URI/revision records.");
14
+ return value.map((item) => {
15
+ const source = record(item, "source");
16
+ return {
17
+ uri: string(source.uri, "source URI"), revision: string(source.revision, "source revision"),
18
+ ...(source.fingerprint === undefined ? {} : { fingerprint: string(source.fingerprint, "source fingerprint") }),
19
+ };
20
+ });
21
+ }
22
+ export function parseBatch(value, config) {
23
+ const data = record(value, "batch");
24
+ if (data.schemaVersion !== 1)
25
+ throw new Error("Unsupported batch version.");
26
+ const spec = string(data.spec, "user-supplied scope or source reference");
27
+ bounded(spec, limitsFor(config).spec, "User-supplied scope or source reference");
28
+ const sources = sourceReferences(data.sources);
29
+ if (!Array.isArray(data.tasks) || !data.tasks.length || data.tasks.length > 100)
30
+ throw new Error("A batch must contain 1-100 tasks.");
31
+ const tasks = data.tasks.map((item) => {
32
+ const task = record(item, "task");
33
+ const result = {
34
+ id: slug(task.id, "task ID"), title: string(task.title, "title"), body: string(task.body, "task body"),
35
+ owner: slug(task.owner, "owner"), model: string(task.model, "model"),
36
+ priority: integer(task.priority, "priority", 0, 1000), dependsOn: strings(task.dependsOn, "dependencies"),
37
+ ...(task.kind === undefined ? {} : { kind: taskKind(task.kind) }),
38
+ ...(task.adoWorkItem === undefined ? {} : { adoWorkItem: integer(task.adoWorkItem, "ADO work item") }),
39
+ };
40
+ bounded(result.body, limitsFor(config).spec, `${result.id} description`);
41
+ if (result.model.trim().toLowerCase() === "auto")
42
+ throw new Error("Tasks require an explicit approved model.");
43
+ if (!/^#{1,3}\s+Acceptance criteria\s*$/im.test(result.body))
44
+ throw new Error(`${result.id} needs an Acceptance criteria heading.`);
45
+ if (config && !config.roles.some((role) => role.id === result.owner && role.model === result.model))
46
+ throw new Error(`${result.id} owner/model does not match approved configuration.`);
47
+ return result;
48
+ });
49
+ if (new Set(tasks.map((task) => task.id)).size !== tasks.length)
50
+ throw new Error("Task IDs must be unique.");
51
+ const byId = new Map(tasks.map((task) => [task.id, task]));
52
+ const complete = new Set();
53
+ const visiting = new Set();
54
+ function visit(id) {
55
+ if (complete.has(id))
56
+ return;
57
+ if (visiting.has(id))
58
+ throw new Error(`Dependency cycle at ${id}.`);
59
+ const task = byId.get(id);
60
+ if (!task)
61
+ throw new Error(`Missing dependency: ${id}.`);
62
+ visiting.add(id);
63
+ for (const dependency of task.dependsOn)
64
+ visit(dependency);
65
+ visiting.delete(id);
66
+ complete.add(id);
67
+ }
68
+ for (const task of tasks)
69
+ visit(task.id);
70
+ const approval = data.approval == null ? null : record(data.approval, "approval");
71
+ if (approval && typeof approval.execute !== "boolean")
72
+ throw new Error("approval.execute must be boolean.");
73
+ return {
74
+ schemaVersion: 1, id: slug(data.id, "batch ID"), spec, sources, tasks,
75
+ approval: approval ? { digest: string(approval.digest, "approval digest"), execute: approval.execute === true } : null,
76
+ };
77
+ }
78
+ export function batchDigest(batch) {
79
+ return hash(JSON.stringify({ schemaVersion: batch.schemaVersion, id: batch.id, spec: batch.spec, sources: batch.sources, tasks: batch.tasks }));
80
+ }
81
+ export function approvedBatch(batch, execute) {
82
+ return { ...batch, approval: { digest: batchDigest(batch), execute } };
83
+ }
84
+ export function requireApproval(batch) {
85
+ if (batch.approval?.digest !== batchDigest(batch))
86
+ throw new Error("This batch is unapproved or changed after approval. Review and approve it again.");
87
+ }
88
+ export function issueDigest(title, body) {
89
+ return hash(JSON.stringify({ title, body }));
90
+ }
91
+ export function issueBody(batch, task, metadataOverride = {}) {
92
+ const metadata = JSON.stringify({ batch: batch.id, batchDigest: metadataOverride.batchDigest ?? batchDigest(batch), sources: batch.sources, task, branch: metadataOverride.branch ?? featureBranch(batch) });
93
+ if (task.body.includes("<!-- crewbie-task:"))
94
+ throw new Error("Task body contains a reserved metadata marker.");
95
+ return `${task.body}\n\n## Context\n\n${batch.spec}\n\n${batch.sources.map((source) => `- ${source.uri} (revision: ${source.revision})`).join("\n")}\n\nUse the named Crewbie specialist. Link the resulting PR to this issue. Read and report the specialist's charter and relevant memory. Keep the PR description concise.\n\n<!-- crewbie-task:${Buffer.from(metadata).toString("base64")} -->`;
96
+ }
97
+ function taskBranch(value) {
98
+ const branch = string(value, "feature branch");
99
+ if (!/^crewbie\/[a-z][a-z0-9-]{0,63}$/.test(branch))
100
+ throw new Error("Invalid Crewbie feature branch.");
101
+ return branch;
102
+ }
103
+ /** Null for bodies without Crewbie metadata and for tasks published before feature branches, which people finish by hand. */
104
+ export function taskMetadata(body) {
105
+ const matches = [...body.matchAll(/<!-- crewbie-task:([A-Za-z0-9+/=]+) -->/g)];
106
+ if (!matches.length)
107
+ return null;
108
+ if (matches.length !== 1 || !matches[0]?.[1])
109
+ throw new Error("Issue has ambiguous Crewbie metadata.");
110
+ const value = record(JSON.parse(Buffer.from(matches[0][1], "base64").toString("utf8")), "issue metadata");
111
+ if (value.branch === undefined)
112
+ return null;
113
+ const task = record(value.task, "issue task");
114
+ return {
115
+ batch: slug(value.batch, "batch"), batchDigest: string(value.batchDigest, "batch digest"),
116
+ sources: sourceReferences(value.sources),
117
+ task: {
118
+ id: slug(task.id, "task ID"), title: string(task.title, "title"), body: string(task.body, "body"),
119
+ owner: slug(task.owner, "owner"), model: string(task.model, "model"),
120
+ dependsOn: strings(task.dependsOn, "dependencies"), priority: integer(task.priority, "priority", 0, 1000),
121
+ ...(task.kind === undefined ? {} : { kind: taskKind(task.kind) }),
122
+ ...(task.adoWorkItem === undefined ? {} : { adoWorkItem: integer(task.adoWorkItem, "ADO work item") }),
123
+ },
124
+ branch: taskBranch(value.branch),
125
+ };
126
+ }
127
+ //# sourceMappingURL=batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/specification/batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Batch } from "./batch.js";
2
+ import { type RepositoryMap } from "../setup/repository-map.js";
3
+ /** Concrete contract values: HTTP status codes and quantities with units, normalized for comparison. */
4
+ export declare function contractValues(text: string): string[];
5
+ export declare function planChecks(batch: Batch, source: string, map: RepositoryMap | null): string[];
6
+ export declare function renderPlanChecks(warnings: string[]): string;
@@ -0,0 +1,73 @@
1
+ import { missingPaths } from "../setup/repository-map.js";
2
+ /**
3
+ * Deterministic checks of a proposed plan against its source issue and the working tree. They are advisory:
4
+ * they surface under-specified contracts, overlapping paid runs and stale paths for the human reviewing the plan.
5
+ */
6
+ const UNIT = {
7
+ ms: "ms", millisecond: "ms", milliseconds: "ms",
8
+ s: "s", sec: "s", secs: "s", second: "s", seconds: "s",
9
+ m: "min", min: "min", mins: "min", minute: "min", minutes: "min",
10
+ h: "h", hr: "h", hrs: "h", hour: "h", hours: "h",
11
+ d: "d", day: "d", days: "d",
12
+ kb: "KB", mb: "MB", gb: "GB", "%": "%",
13
+ };
14
+ const QUANTITY = /(?<![\w.])(\d+(?:\.\d+)?)\s?(ms|milliseconds?|secs?|seconds?|s|mins?|minutes?|m|hrs?|hours?|h|days?|d|kb|mb|gb|%)(?![\w])/gi;
15
+ const STATUS = /\b(?:HTTP\s*|status\s*(?:code\s*)?(?:of\s*)?|returns?\s+(?:an?\s+)?|respond(?:s|ing)?\s+with\s+(?:an?\s+)?)([1-5]\d\d)\b|\b([1-5]\d\d)\s+(?:OK|Created|Accepted|No Content|Bad Request|Unauthorized|Forbidden|Not Found|Conflict|Gone|Unprocessable|Too Many Requests|Internal Server Error|Service Unavailable)\b/gi;
16
+ /** Concrete contract values: HTTP status codes and quantities with units, normalized for comparison. */
17
+ export function contractValues(text) {
18
+ const values = new Set();
19
+ for (const match of text.matchAll(STATUS))
20
+ values.add(`HTTP ${match[1] ?? match[2]}`);
21
+ for (const match of text.matchAll(QUANTITY))
22
+ values.add(`${Number(match[1])}${UNIT[match[2].toLowerCase()] ?? match[2]}`);
23
+ return [...values];
24
+ }
25
+ const STOP = new Set(["the", "and", "for", "with", "that", "this", "are", "is", "be", "to", "of", "in", "on", "a", "an", "or", "it", "its", "when", "each", "all", "any", "from", "into", "by", "as", "at", "not", "no", "must", "should", "can", "only", "via", "per"]);
26
+ function words(line) {
27
+ return new Set(line.toLowerCase().replace(/`[^`]*`/g, (span) => span.replace(/[^\w]+/g, "_")).split(/[^\w/.-]+/).filter((word) => word.length >= 3 && !STOP.has(word)));
28
+ }
29
+ function criteria(task) {
30
+ const section = /^#{2,3}\s+Acceptance criteria\s*$([\s\S]*?)(?=^#{1,3}\s|(?![\s\S]))/im.exec(task.body)?.[1] ?? "";
31
+ return section.split(/\r?\n/).map((line) => line.replace(/^\s*(?:[-*]|\d+\.)\s+(?:\[[ x]\]\s+)?/i, "").trim()).filter((line) => line.length > 0);
32
+ }
33
+ function jaccard(a, b) {
34
+ const shared = [...a].filter((word) => b.has(word)).length;
35
+ return shared / (a.size + b.size - shared || 1);
36
+ }
37
+ const OVERLAP = 0.6;
38
+ const GENERIC = /^(?:existing behavio(?:u)?r remains covered by relevant tests|all (?:existing )?tests pass|no regressions?)\.?$/i;
39
+ export function planChecks(batch, source, map) {
40
+ const warnings = [];
41
+ const issueValues = new Set(contractValues(source));
42
+ const carried = new Set();
43
+ for (const task of batch.tasks) {
44
+ const values = contractValues(`${task.title}\n${task.body}`);
45
+ values.forEach((value) => carried.add(value));
46
+ const invented = values.filter((value) => !issueValues.has(value));
47
+ if (invented.length)
48
+ warnings.push(`\`${task.id}\` states values the source issue does not: ${invented.join(", ")}. Confirm them, or ask instead of guessing.`);
49
+ const missing = map ? missingPaths(map, `${task.title}\n${task.body}`) : [];
50
+ if (missing.length)
51
+ warnings.push(`\`${task.id}\` cites paths not in the repository: ${missing.slice(0, 8).map((path) => `\`${path}\``).join(", ")}. Fine if the task creates them; otherwise correct the plan.`);
52
+ }
53
+ const dropped = [...issueValues].filter((value) => !carried.has(value));
54
+ if (dropped.length)
55
+ warnings.push(`The source issue states values no task carries: ${dropped.join(", ")}. Put them verbatim in the task that owns that behavior.`);
56
+ const work = batch.tasks.filter((task) => task.kind !== "review");
57
+ for (let i = 0; i < work.length; i++)
58
+ for (let j = i + 1; j < work.length; j++) {
59
+ const shared = criteria(work[i]).filter((line) => !GENERIC.test(line))
60
+ .find((line) => criteria(work[j]).some((other) => !GENERIC.test(other) && jaccard(words(line), words(other)) >= OVERLAP));
61
+ if (shared)
62
+ warnings.push(`\`${work[i].id}\` and \`${work[j].id}\` share an acceptance criterion ("${shared.slice(0, 120)}"). Give each deliverable, including its tests, one owning task so two paid runs do not build it.`);
63
+ }
64
+ return warnings;
65
+ }
66
+ const SHOWN = 12;
67
+ export function renderPlanChecks(warnings) {
68
+ if (!warnings.length)
69
+ return "";
70
+ const more = warnings.length > SHOWN ? `\n- ${warnings.length - SHOWN} more warnings not shown.` : "";
71
+ return `## Plan checks\n\nCrewbie compared the tasks with the source issue and the repository file names. Advisory; nothing was changed.\n\n${warnings.slice(0, SHOWN).map((warning) => `- ${warning.slice(0, 400)}`).join("\n")}${more}\n\n`;
72
+ }
73
+ //# sourceMappingURL=plan-checks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-checks.js","sourceRoot":"","sources":["../../src/specification/plan-checks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type Config } from "../config.js";
2
+ import { type GitHubApi } from "../tracking/github.js";
3
+ import { type Batch } from "./batch.js";
4
+ export { PLANNING_LABEL } from "../config.js";
5
+ interface Source {
6
+ number: number;
7
+ title: string;
8
+ body: string;
9
+ revision: string;
10
+ labelEvent: number;
11
+ }
12
+ export interface Plan {
13
+ summary: string;
14
+ questions: string[];
15
+ teamSuggestions: string[];
16
+ batch: Batch | null;
17
+ decisions: string | null;
18
+ }
19
+ export declare function requestPlanningRevision(client: GitHubApi, config: Config, number: number, feedback: string, apply: boolean): Promise<string>;
20
+ export declare function preparePlanning(root: string, client: GitHubApi, config: Config, eventValue: unknown, runId?: number): Promise<{
21
+ ready: boolean;
22
+ reason: string;
23
+ model: string;
24
+ }>;
25
+ export declare function parsePlan(value: unknown, config: Config, source: Source): Plan;
26
+ export declare function publishPlanning(root: string, client: GitHubApi, config: Config): Promise<string>;