nightralph 0.0.53 → 0.0.56

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 (60) hide show
  1. package/README.md +181 -19
  2. package/dist/blockers.js +149 -0
  3. package/dist/blockers.js.map +7 -0
  4. package/dist/display.js +12 -4
  5. package/dist/display.js.map +2 -2
  6. package/dist/docs-templates/issue-tracker.md +9 -1
  7. package/dist/index.js +2735 -415
  8. package/dist/index.js.map +4 -4
  9. package/dist/learnings.js +360 -0
  10. package/dist/learnings.js.map +7 -0
  11. package/dist/meta.json +289 -16
  12. package/dist/orchestrator.js +753 -188
  13. package/dist/orchestrator.js.map +3 -3
  14. package/dist/preflight.js +34 -0
  15. package/dist/preflight.js.map +7 -0
  16. package/dist/progress.js +5 -4
  17. package/dist/progress.js.map +2 -2
  18. package/dist/resolve.js +98 -9
  19. package/dist/resolve.js.map +2 -2
  20. package/dist/retry.js +83 -0
  21. package/dist/retry.js.map +7 -0
  22. package/dist/review.js +669 -0
  23. package/dist/review.js.map +7 -0
  24. package/dist/rules.js +67 -0
  25. package/dist/rules.js.map +7 -0
  26. package/dist/skills/to-tickets/SKILL.md +5 -5
  27. package/dist/src/blockers.d.ts +45 -0
  28. package/dist/src/blockers.d.ts.map +1 -0
  29. package/dist/src/display.d.ts +9 -0
  30. package/dist/src/display.d.ts.map +1 -1
  31. package/dist/src/index.d.ts.map +1 -1
  32. package/dist/src/learnings.d.ts +70 -0
  33. package/dist/src/learnings.d.ts.map +1 -0
  34. package/dist/src/orchestrator.d.ts +85 -28
  35. package/dist/src/orchestrator.d.ts.map +1 -1
  36. package/dist/src/preflight.d.ts +6 -0
  37. package/dist/src/preflight.d.ts.map +1 -0
  38. package/dist/src/progress.d.ts +1 -1
  39. package/dist/src/progress.d.ts.map +1 -1
  40. package/dist/src/resolve.d.ts +24 -0
  41. package/dist/src/resolve.d.ts.map +1 -1
  42. package/dist/src/retry.d.ts +26 -0
  43. package/dist/src/retry.d.ts.map +1 -0
  44. package/dist/src/review.d.ts +131 -0
  45. package/dist/src/review.d.ts.map +1 -0
  46. package/dist/src/rules.d.ts +11 -0
  47. package/dist/src/rules.d.ts.map +1 -0
  48. package/dist/src/stats.d.ts +43 -0
  49. package/dist/src/stats.d.ts.map +1 -0
  50. package/dist/src/testcmd.d.ts +1 -0
  51. package/dist/src/testcmd.d.ts.map +1 -1
  52. package/dist/src/worktree.d.ts +30 -1
  53. package/dist/src/worktree.d.ts.map +1 -1
  54. package/dist/stats.js +111 -0
  55. package/dist/stats.js.map +7 -0
  56. package/dist/testcmd.js +13 -0
  57. package/dist/testcmd.js.map +2 -2
  58. package/dist/worktree.js +236 -32
  59. package/dist/worktree.js.map +2 -2
  60. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export type ResolveExecutableOpts = {
2
+ path?: string;
3
+ cwd?: string;
4
+ };
5
+ export declare function resolveExecutable(cmd: string, opts?: ResolveExecutableOpts): string | null;
6
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../../src/preflight.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,qBAAqB,GAAG;IAEhC,IAAI,CAAC,EAAC,MAAM,CAAA;IAGZ,GAAG,CAAC,EAAC,MAAM,CAAA;CACd,CAAA;AAeD,wBAAgB,iBAAiB,CAC7B,GAAG,EAAC,MAAM,EACV,IAAI,GAAC,qBAA0B,GACjC,MAAM,GAAC,IAAI,CAcZ"}
@@ -35,5 +35,5 @@ export declare function checkTicket(data: ProgressData, ticketNum: number, resul
35
35
  done?: boolean;
36
36
  }): void;
37
37
  export declare function writeProgress(progressPath: string, data: ProgressData): void;
38
- export declare function commitProgress(repoRoot: string, progressPath: string, message: string): Promise<boolean>;
38
+ export declare function commitProgress(repoRoot: string, paths: string | string[], message: string): Promise<boolean>;
39
39
  //# sourceMappingURL=progress.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAM/C,MAAM,MAAM,cAAc,GAAG;IACzB,GAAG,EAAC,MAAM,CAAA;IACV,IAAI,EAAC,MAAM,CAAA;IACX,QAAQ,EAAC,MAAM,CAAA;IACf,IAAI,EAAC,OAAO,CAAA;IACZ,MAAM,EAAC,MAAM,GAAC,IAAI,CAAA;IAClB,QAAQ,EAAC,MAAM,GAAC,IAAI,CAAA;IACpB,WAAW,EAAC,MAAM,GAAC,IAAI,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACvB,OAAO,EAAC,MAAM,CAAA;IACd,SAAS,EAAC,MAAM,CAAA;IAChB,OAAO,EAAC,KAAK,CAAC,cAAc,CAAC,CAAA;CAChC,CAAA;AAED,wBAAgB,gBAAgB,CAC5B,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,YAAY,CAcb;AAED,wBAAgB,4BAA4B,CACxC,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAa1B;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,OAAO,EAAC,CAAC,OAAO,EAAC,MAAM,KAAK,YAAY,CAAA;IACxC,OAAO,EAAC,CAAC,OAAO,EAAC,MAAM,KAAK,MAAM,CAAA;CACrC,CAAA;AAED,wBAAgB,qBAAqB,CAAE,IAAI,EAAC;IACxC,aAAa,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,OAAO,EAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACjC,YAAY,EAAC,MAAM,CAAA;IACnB,YAAY,EAAC,YAAY,CAAA;CAC5B,GAAE,eAAe,CAWjB;AAED,wBAAgB,cAAc,CAC1B,YAAY,EAAC,MAAM,GACrB,OAAO,CAKR;AAED,wBAAgB,YAAY,CACxB,YAAY,EAAC,MAAM,GACrB,YAAY,GAAC,IAAI,CAwDlB;AAED,wBAAgB,aAAa,CACzB,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAC,YAAY,GAAC,IAAI,GAC5B,YAAY,CAcb;AAED,wBAAgB,cAAc,CAAE,IAAI,EAAC,YAAY,GAAE,MAAM,CAgCxD;AAED,wBAAgB,WAAW,CACvB,IAAI,EAAC,YAAY,EACjB,SAAS,EAAC,MAAM,EAChB,MAAM,EAAC;IAAE,MAAM,EAAC,MAAM,CAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAC,IAAI,CAAC,EAAC,OAAO,CAAA;CAAE,GAC1D,IAAI,CAYL;AAED,wBAAgB,aAAa,CACzB,YAAY,EAAC,MAAM,EACnB,IAAI,EAAC,YAAY,GACnB,IAAI,CAKL;AAED,wBAAsB,cAAc,CAChC,QAAQ,EAAC,MAAM,EACf,YAAY,EAAC,MAAM,EACnB,OAAO,EAAC,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAwBjB"}
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/progress.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAM/C,MAAM,MAAM,cAAc,GAAG;IACzB,GAAG,EAAC,MAAM,CAAA;IACV,IAAI,EAAC,MAAM,CAAA;IACX,QAAQ,EAAC,MAAM,CAAA;IACf,IAAI,EAAC,OAAO,CAAA;IACZ,MAAM,EAAC,MAAM,GAAC,IAAI,CAAA;IAClB,QAAQ,EAAC,MAAM,GAAC,IAAI,CAAA;IACpB,WAAW,EAAC,MAAM,GAAC,IAAI,CAAA;CAC1B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACvB,OAAO,EAAC,MAAM,CAAA;IACd,SAAS,EAAC,MAAM,CAAA;IAChB,OAAO,EAAC,KAAK,CAAC,cAAc,CAAC,CAAA;CAChC,CAAA;AAED,wBAAgB,gBAAgB,CAC5B,OAAO,EAAC,MAAM,EACd,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,YAAY,CAcb;AAED,wBAAgB,4BAA4B,CACxC,OAAO,EAAC,aAAa,CAAC,MAAM,CAAC,GAC/B,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAa1B;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,OAAO,EAAC,CAAC,OAAO,EAAC,MAAM,KAAK,YAAY,CAAA;IACxC,OAAO,EAAC,CAAC,OAAO,EAAC,MAAM,KAAK,MAAM,CAAA;CACrC,CAAA;AAED,wBAAgB,qBAAqB,CAAE,IAAI,EAAC;IACxC,aAAa,EAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjC,OAAO,EAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACjC,YAAY,EAAC,MAAM,CAAA;IACnB,YAAY,EAAC,YAAY,CAAA;CAC5B,GAAE,eAAe,CAWjB;AAED,wBAAgB,cAAc,CAC1B,YAAY,EAAC,MAAM,GACrB,OAAO,CAKR;AAED,wBAAgB,YAAY,CACxB,YAAY,EAAC,MAAM,GACrB,YAAY,GAAC,IAAI,CAwDlB;AAED,wBAAgB,aAAa,CACzB,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAC,YAAY,GAAC,IAAI,GAC5B,YAAY,CAcb;AAED,wBAAgB,cAAc,CAAE,IAAI,EAAC,YAAY,GAAE,MAAM,CAgCxD;AAED,wBAAgB,WAAW,CACvB,IAAI,EAAC,YAAY,EACjB,SAAS,EAAC,MAAM,EAChB,MAAM,EAAC;IAAE,MAAM,EAAC,MAAM,CAAC;IAAC,QAAQ,EAAC,MAAM,CAAC;IAAC,IAAI,CAAC,EAAC,OAAO,CAAA;CAAE,GAC1D,IAAI,CAYL;AAED,wBAAgB,aAAa,CACzB,YAAY,EAAC,MAAM,EACnB,IAAI,EAAC,YAAY,GACnB,IAAI,CAKL;AAED,wBAAsB,cAAc,CAChC,QAAQ,EAAC,MAAM,EACf,KAAK,EAAC,MAAM,GAAC,MAAM,EAAE,EACrB,OAAO,EAAC,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CA2BjB"}
@@ -1,3 +1,6 @@
1
+ import { type Ticket } from './orchestrator.js';
2
+ import { type BlockerWarning } from './blockers.js';
3
+ export type { BlockerWarning };
1
4
  export type FeatureSelection = {
2
5
  dir: string;
3
6
  spec: string;
@@ -9,5 +12,26 @@ export declare function findFeatureDirs(cwd: string): {
9
12
  dir: string;
10
13
  spec: string;
11
14
  }[];
15
+ export type LoadedSelection = {
16
+ tickets: Ticket[];
17
+ warnings: BlockerWarning[];
18
+ };
19
+ /**
20
+ * Tickets of the named features with every blocker resolved, and
21
+ * the problems found on the way. An unselected feature is scanned
22
+ * only when a ref points into it, once.
23
+ */
24
+ export declare function loadSelection(scratchDir: string, names: ReadonlyArray<string>): LoadedSelection;
25
+ export type FeatureCounts = {
26
+ ready: number;
27
+ total: number;
28
+ badBlockers: number;
29
+ };
30
+ /**
31
+ * Counts for one feature as if it ran alone: the same
32
+ * loadSelection a `--spec <name>` run uses.
33
+ */
34
+ export declare function featureCounts(scratchDir: string, name: string): FeatureCounts;
35
+ export declare function featureChoiceLabel(scratchDir: string, name: string): string;
12
36
  export declare function resolveIssuesDir(specName: string | undefined, cwd?: string): Promise<FeatureSelection[]>;
13
37
  //# sourceMappingURL=resolve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,gBAAgB,GAAG;IAC3B,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAC;IACZ,IAAI,EAAC,MAAM,CAAC;CACf,CAAA;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAC,MAAM,GAAE;IACzC,IAAI,EAAC,MAAM,CAAC;IACZ,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAA;CACd,EAAE,CA4BF;AAID,wBAAsB,gBAAgB,CAClC,QAAQ,EAAC,MAAM,GAAC,SAAS,EACzB,GAAG,GAAC,MAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA6D5B"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resolve.ts"],"names":[],"mappings":"AAKA,OAAO,EAIH,KAAK,MAAM,EACd,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAGH,KAAK,cAAc,EACtB,MAAM,eAAe,CAAA;AAEtB,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,MAAM,MAAM,gBAAgB,GAAG;IAC3B,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAC;IACZ,IAAI,EAAC,MAAM,CAAC;CACf,CAAA;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAE,GAAG,EAAC,MAAM,GAAE;IACzC,IAAI,EAAC,MAAM,CAAC;IACZ,GAAG,EAAC,MAAM,CAAC;IACX,IAAI,EAAC,MAAM,CAAA;CACd,EAAE,CA4BF;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,OAAO,EAAC,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAC,cAAc,EAAE,CAAC;CAC7B,CAAA;AAuBD;;;;GAIG;AACH,wBAAgB,aAAa,CACzB,UAAU,EAAC,MAAM,EACjB,KAAK,EAAC,aAAa,CAAC,MAAM,CAAC,GAC7B,eAAe,CA+ChB;AAED,MAAM,MAAM,aAAa,GAAG;IACxB,KAAK,EAAC,MAAM,CAAC;IACb,KAAK,EAAC,MAAM,CAAC;IACb,WAAW,EAAC,MAAM,CAAC;CACtB,CAAA;AAED;;;GAGG;AACH,wBAAgB,aAAa,CACzB,UAAU,EAAC,MAAM,EACjB,IAAI,EAAC,MAAM,GACb,aAAa,CAOd;AAED,wBAAgB,kBAAkB,CAC9B,UAAU,EAAC,MAAM,EACjB,IAAI,EAAC,MAAM,GACb,MAAM,CAOP;AAID,wBAAsB,gBAAgB,CAClC,QAAQ,EAAC,MAAM,GAAC,SAAS,EACzB,GAAG,GAAC,MAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0D5B"}
@@ -0,0 +1,26 @@
1
+ export declare const EFFORT_LADDERS: {
2
+ readonly pi: readonly ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
3
+ readonly claude: readonly ["low", "medium", "high", "xhigh", "max"];
4
+ readonly codex: readonly ["low", "medium", "high"];
5
+ };
6
+ export type ProviderName = keyof typeof EFFORT_LADDERS;
7
+ export type EffortLevel = typeof EFFORT_LADDERS[ProviderName][number];
8
+ export declare const ALL_EFFORT_LEVELS: EffortLevel[];
9
+ export declare function escalateEffort(provider: ProviderName, level?: EffortLevel): EffortLevel;
10
+ export declare function retryDelayFor(base: number, attempt: number): number;
11
+ export declare function sleep(ms: number): Promise<void>;
12
+ export type AttemptStep<T> = {
13
+ result: T;
14
+ stop: boolean;
15
+ };
16
+ export type RetryOpts = {
17
+ maxAttempts: number;
18
+ retryDelay: number;
19
+ agentCmd: string;
20
+ effort?: EffortLevel;
21
+ label: string;
22
+ log: (msg: string) => void;
23
+ wait?: (ms: number) => Promise<void>;
24
+ };
25
+ export declare function runWithRetries<T>(opts: RetryOpts, run: (attempt: number, effort: EffortLevel | undefined) => Promise<AttemptStep<T>>): Promise<T>;
26
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/retry.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,cAAc;;;;CAMjB,CAAA;AAEV,MAAM,MAAM,YAAY,GACpB,MAAM,OAAO,cAAc,CAAA;AAE/B,MAAM,MAAM,WAAW,GACnB,OAAO,cAAc,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AAE/C,eAAO,MAAM,iBAAiB,EAAC,WAAW,EAGzC,CAAA;AAKD,wBAAgB,cAAc,CAC1B,QAAQ,EAAC,YAAY,EACrB,KAAK,CAAC,EAAC,WAAW,GACpB,WAAW,CASZ;AAED,wBAAgB,aAAa,CAAE,IAAI,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAEjE;AAED,wBAAgB,KAAK,CAAE,EAAE,EAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,CAE9C;AAED,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI;IAAE,MAAM,EAAC,CAAC,CAAC;IAAC,IAAI,EAAC,OAAO,CAAA;CAAE,CAAA;AAEvD,MAAM,MAAM,SAAS,GAAG;IACpB,WAAW,EAAC,MAAM,CAAA;IAElB,UAAU,EAAC,MAAM,CAAA;IACjB,QAAQ,EAAC,MAAM,CAAA;IAEf,MAAM,CAAC,EAAC,WAAW,CAAA;IAEnB,KAAK,EAAC,MAAM,CAAA;IACZ,GAAG,EAAC,CAAC,GAAG,EAAC,MAAM,KAAK,IAAI,CAAA;IAExB,IAAI,CAAC,EAAC,CAAC,EAAE,EAAC,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrC,CAAA;AAKD,wBAAsB,cAAc,CAAC,CAAC,EAClC,IAAI,EAAC,SAAS,EACd,GAAG,EAAC,CACA,OAAO,EAAC,MAAM,EACd,MAAM,EAAC,WAAW,GAAC,SAAS,KAC3B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAgCX"}
@@ -0,0 +1,131 @@
1
+ import { type EffortLevel } from './retry.js';
2
+ import type { AgentResult } from './orchestrator.js';
3
+ export declare const FINDINGS_FILE = "findings.md";
4
+ export declare const FINDINGS_PATH: string;
5
+ export declare const NO_FINDINGS = "No findings.";
6
+ export declare const REVIEW_EXCLUDE = ".scratch";
7
+ export declare const REVIEW_MARKER = "---- REVIEW INSTRUCTIONS ----";
8
+ export declare const FIX_MARKER = "---- REVIEW FINDINGS ----";
9
+ export declare function reviewExcludeFor(repoRoot: string, reviewPath: string): string;
10
+ export declare function reviewDiffCommand(from: string, to: string, exclude?: string): string;
11
+ export declare function renderReviewPrompt(opts: {
12
+ specBody: string;
13
+ from: string;
14
+ to: string;
15
+ exclude?: string;
16
+ preferSubagent?: string;
17
+ }): string;
18
+ export type FixFailure = 'install' | 'exit' | 'no-commits' | 'tests' | 'merge';
19
+ export declare const FIX_FAILURE_TEXT: Record<FixFailure, string>;
20
+ export declare function renderFixPrompt(opts: {
21
+ specBody: string;
22
+ findings: ReadonlyArray<Finding>;
23
+ testCmd: string;
24
+ installCmd?: string;
25
+ preferSubagent?: string;
26
+ previous?: {
27
+ reason: FixFailure;
28
+ notes: string | null;
29
+ };
30
+ }): string;
31
+ export declare const REVIEW_STATUSES: readonly ["clean", "fixed", "unresolved", "review-failed"];
32
+ export type ReviewStatus = typeof REVIEW_STATUSES[number];
33
+ export type Finding = {
34
+ summary: string;
35
+ detail: string;
36
+ checked: boolean;
37
+ };
38
+ export type FixRecord = {
39
+ attempts: number;
40
+ maxAttempts: number;
41
+ effort?: string;
42
+ exitCode: number | null;
43
+ result: string;
44
+ notes: string | null;
45
+ };
46
+ export type ReviewEntryInput = {
47
+ from: string;
48
+ to: string;
49
+ status: ReviewStatus;
50
+ now: Date;
51
+ findings: Finding[];
52
+ fix?: FixRecord;
53
+ };
54
+ export type ReviewEntry = {
55
+ from: string;
56
+ to: string;
57
+ status: ReviewStatus;
58
+ findings: Finding[];
59
+ body: string;
60
+ };
61
+ export type ReviewOutcome = {
62
+ status: ReviewStatus | 'skipped';
63
+ findings: number;
64
+ fixed: number;
65
+ };
66
+ export declare function parseFindings(text: string): Finding[] | null;
67
+ export declare function markFixed(findings: ReadonlyArray<Finding>, completedItems: ReadonlyArray<string>): Finding[];
68
+ export declare function renderReviewEntry(input: ReviewEntryInput): string;
69
+ export declare function parseReviewEntries(text: string): ReviewEntry[];
70
+ export declare function selectReviewBase(entries: ReadonlyArray<ReviewEntry>, opts: {
71
+ isAncestor: (sha: string) => boolean;
72
+ forkPoint: string | null;
73
+ launchCommit: string;
74
+ }): string;
75
+ export declare function renderReviewSummary(outcome: ReviewOutcome, reviewPath: string): string | null;
76
+ export type SpawnAgentFn = (opts: {
77
+ prompt: string;
78
+ agentCmd: string;
79
+ model: string | null;
80
+ timeout: number;
81
+ logPath: string;
82
+ cwd?: string;
83
+ label?: string;
84
+ maxTurns?: number;
85
+ effort?: EffortLevel;
86
+ preferSubagent?: string;
87
+ onLine?: (line: string) => void;
88
+ }) => Promise<AgentResult>;
89
+ export type ReviewDeps = {
90
+ spawnAgent: SpawnAgentFn;
91
+ registry?: Set<number>;
92
+ };
93
+ export type ReviewPassOpts = {
94
+ repoRoot: string;
95
+ repoName: string;
96
+ baseBranch: string;
97
+ reviewPath: string;
98
+ forkedFrom?: string;
99
+ launchCommit: string;
100
+ specBody: string;
101
+ agentCmd: string;
102
+ model: string | null;
103
+ timeout: number;
104
+ logsDir: string;
105
+ testCmd: string;
106
+ installCmd?: string;
107
+ maxTurns?: number;
108
+ effort?: EffortLevel;
109
+ preferSubagent?: string;
110
+ retries: number;
111
+ retryDelay: number;
112
+ log: (msg: string) => void;
113
+ now?: () => Date;
114
+ };
115
+ export declare function runReviewer(opts: ReviewPassOpts, deps: ReviewDeps, range: {
116
+ from: string;
117
+ to: string;
118
+ }): Promise<Finding[] | null>;
119
+ export type FixResult = {
120
+ merged: boolean;
121
+ findings: Finding[];
122
+ attempts: number;
123
+ effort?: EffortLevel;
124
+ exitCode: number | null;
125
+ result: string;
126
+ notes: string | null;
127
+ };
128
+ export declare function runFixer(opts: ReviewPassOpts, deps: ReviewDeps, findings: ReadonlyArray<Finding>): Promise<FixResult>;
129
+ export declare function readReviewEntries(path: string): ReviewEntry[];
130
+ export declare function runReviewPass(opts: ReviewPassOpts, deps: ReviewDeps): Promise<ReviewOutcome>;
131
+ //# sourceMappingURL=review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare function readDocsRule(subject: string): string;
2
+ export declare function installRule(installCmd?: string): string[];
3
+ export declare function subagentRule(preferSubagent?: string, readOnly?: boolean): string[];
4
+ export declare function testGateRule(testCmd: string, subject: string): string;
5
+ export declare const LINT_RULE: string;
6
+ export declare function integrityRule(unit: string): string;
7
+ export declare const CONFINEMENT_RULES: string[];
8
+ export declare function commitRule(unit: string): string;
9
+ export declare function notesRule(unit: string, subject: string): string;
10
+ export declare function agentsMdRule(subject: string): string;
11
+ //# sourceMappingURL=rules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAOnD;AAID,wBAAgB,WAAW,CAAE,UAAU,CAAC,EAAC,MAAM,GAAE,MAAM,EAAE,CAUxD;AAMD,wBAAgB,YAAY,CACxB,cAAc,CAAC,EAAC,MAAM,EACtB,QAAQ,UAAQ,GAClB,MAAM,EAAE,CAiBT;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAenE;AAED,eAAO,MAAM,SAAS,QACQ,CAAA;AAE9B,wBAAgB,aAAa,CAAE,IAAI,EAAC,MAAM,GAAE,MAAM,CAQjD;AAED,eAAO,MAAM,iBAAiB,EAAC,MAAM,EAIpC,CAAA;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAC,MAAM,GAAE,MAAM,CAI9C;AAED,wBAAgB,SAAS,CAAE,IAAI,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAU7D;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAC,MAAM,GAAE,MAAM,CAenD"}
@@ -0,0 +1,43 @@
1
+ export type SubagentStats = {
2
+ subagents: number;
3
+ costUsd?: number;
4
+ };
5
+ export type StreamStatsState = {
6
+ readonly stats: SubagentStats;
7
+ readonly seenToolIds: ReadonlySet<string>;
8
+ };
9
+ export type RunStats = {
10
+ readonly agentRuns: number;
11
+ readonly withCost: number;
12
+ readonly subagents: number;
13
+ readonly costUsd: number;
14
+ };
15
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
16
+ export declare function emptyStreamStats(): StreamStatsState;
17
+ /**
18
+ * Fold one parsed stream-json value into the state. Returns the
19
+ * same `state` object when nothing changed, so callers can detect
20
+ * a change by identity. Never throws.
21
+ */
22
+ export declare function nextStreamStats(state: StreamStatsState, obj: unknown): StreamStatsState;
23
+ export declare function addStats(total: SubagentStats, run: {
24
+ subagents?: number;
25
+ costUsd?: number;
26
+ }): SubagentStats;
27
+ /**
28
+ * The display row suffix, e.g. `2 subagents, $0.42`, or `null`
29
+ * when there is nothing to show.
30
+ */
31
+ export declare function formatStats(stats?: SubagentStats): string | null;
32
+ export declare function emptyRunStats(): RunStats;
33
+ export declare function addRun(run: RunStats, result: {
34
+ subagents?: number;
35
+ costUsd?: number;
36
+ }): RunStats;
37
+ /**
38
+ * The one-line total logged after the finish summary, or `null`
39
+ * when no run reported a subagent or a cost (codex and pi never
40
+ * do).
41
+ */
42
+ export declare function renderRunStats(run: RunStats): string | null;
43
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/stats.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG;IACxB,SAAS,EAAC,MAAM,CAAA;IAEhB,OAAO,CAAC,EAAC,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC3B,QAAQ,CAAC,KAAK,EAAC,aAAa,CAAA;IAE5B,QAAQ,CAAC,WAAW,EAAC,WAAW,CAAC,MAAM,CAAC,CAAA;CAC3C,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IAEnB,QAAQ,CAAC,SAAS,EAAC,MAAM,CAAA;IAEzB,QAAQ,CAAC,QAAQ,EAAC,MAAM,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAC,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAC,MAAM,CAAA;CAC1B,CAAA;AAMD,wBAAgB,QAAQ,CAAE,KAAK,EAAC,OAAO,GAAE,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAIxE;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC3B,KAAK,EAAC,gBAAgB,EACtB,GAAG,EAAC,OAAO,GACb,gBAAgB,CAKjB;AAyED,wBAAgB,QAAQ,CACpB,KAAK,EAAC,aAAa,EACnB,GAAG,EAAC;IAAE,SAAS,CAAC,EAAC,MAAM,CAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAA;CAAE,GAC5C,aAAa,CASd;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAE,KAAK,CAAC,EAAC,aAAa,GAAE,MAAM,GAAC,IAAI,CAU7D;AAED,wBAAgB,aAAa,IAAI,QAAQ,CAExC;AAED,wBAAgB,MAAM,CAClB,GAAG,EAAC,QAAQ,EACZ,MAAM,EAAC;IAAE,SAAS,CAAC,EAAC,MAAM,CAAC;IAAC,OAAO,CAAC,EAAC,MAAM,CAAA;CAAE,GAC/C,QAAQ,CAOT;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAE,GAAG,EAAC,QAAQ,GAAE,MAAM,GAAC,IAAI,CAUxD"}
@@ -3,6 +3,7 @@ export type TestResult = {
3
3
  output: string;
4
4
  };
5
5
  export declare function detectTestCmd(projectDir: string): string | null;
6
+ export declare function detectInstallCmd(projectDir: string): string | null;
6
7
  export declare function runTestCmd(opts: {
7
8
  cmd: string;
8
9
  cwd: string;
@@ -1 +1 @@
1
- {"version":3,"file":"testcmd.d.ts","sourceRoot":"","sources":["../../src/testcmd.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IACrB,QAAQ,EAAC,MAAM,CAAA;IACf,MAAM,EAAC,MAAM,CAAA;CAChB,CAAA;AAID,wBAAgB,aAAa,CAAE,UAAU,EAAC,MAAM,GAAE,MAAM,GAAC,IAAI,CAa5D;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAC;IAC7B,GAAG,EAAC,MAAM,CAAA;IACV,GAAG,EAAC,MAAM,CAAA;IACV,OAAO,EAAC,MAAM,CAAA;IACd,QAAQ,CAAC,EAAC,GAAG,CAAC,MAAM,CAAC,CAAA;CACxB,GAAE,OAAO,CAAC,UAAU,CAAC,CAwDrB"}
1
+ {"version":3,"file":"testcmd.d.ts","sourceRoot":"","sources":["../../src/testcmd.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IACrB,QAAQ,EAAC,MAAM,CAAA;IACf,MAAM,EAAC,MAAM,CAAA;CAChB,CAAA;AAID,wBAAgB,aAAa,CAAE,UAAU,EAAC,MAAM,GAAE,MAAM,GAAC,IAAI,CAa5D;AAOD,wBAAgB,gBAAgB,CAAE,UAAU,EAAC,MAAM,GAAE,MAAM,GAAC,IAAI,CAW/D;AAED,wBAAgB,UAAU,CAAE,IAAI,EAAC;IAC7B,GAAG,EAAC,MAAM,CAAA;IACV,GAAG,EAAC,MAAM,CAAA;IACV,OAAO,EAAC,MAAM,CAAA;IACd,QAAQ,CAAC,EAAC,GAAG,CAAC,MAAM,CAAC,CAAA;CACxB,GAAE,OAAO,CAAC,UAAU,CAAC,CAwDrB"}
@@ -1,7 +1,22 @@
1
1
  import type { Ticket } from './orchestrator.js';
2
2
  export declare function getRepoRoot(): string;
3
3
  export declare function getRepoName(): string;
4
- export declare function getCurrentBranch(): string;
4
+ export declare function getCurrentBranch(cwd?: string): string;
5
+ export declare function localBranchExists(repoRoot: string, name: string): boolean;
6
+ export declare function getDefaultBranch(repoRoot: string): string | null;
7
+ export declare function integrationBranchName(features: ReadonlyArray<string>): string;
8
+ export declare function planIntegrationBranch(current: string, defaultBranch: string | null, features: ReadonlyArray<string>): string | null;
9
+ export type IntegrationPlan = {
10
+ branch: string;
11
+ created: boolean;
12
+ resumed: boolean;
13
+ behind: number;
14
+ fastForwarded: boolean;
15
+ launchBranch: string;
16
+ forkedFrom: string | null;
17
+ };
18
+ export declare function prepareIntegrationBranch(repoRoot: string, features: ReadonlyArray<string>): IntegrationPlan;
19
+ export declare function describeIntegrationBranch(repoRoot: string, features: ReadonlyArray<string>): string;
5
20
  export declare function buildBranchName(repoName: string, ticket: Ticket): string;
6
21
  export declare function createWorktree(opts: {
7
22
  repoRoot: string;
@@ -12,10 +27,24 @@ export declare function createWorktree(opts: {
12
27
  worktreePath: string;
13
28
  branchName: string;
14
29
  }>;
30
+ export declare function createNamedWorktree(opts: {
31
+ repoRoot: string;
32
+ repoName: string;
33
+ baseBranch: string;
34
+ name: string;
35
+ }): Promise<{
36
+ worktreePath: string;
37
+ branchName: string;
38
+ }>;
15
39
  export declare function removeWorktree(worktreePath: string, opts?: {
16
40
  force?: boolean;
17
41
  }): Promise<void>;
42
+ export declare function deleteBranch(repoRoot: string, name: string): Promise<void>;
18
43
  export declare function hasNewCommits(repoRoot: string, base: string, branch: string): boolean;
44
+ export declare function headCommit(cwd: string): string;
45
+ export declare function mergeBase(cwd: string, a: string, b: string): string | null;
46
+ export declare function isAncestor(cwd: string, ancestor: string, of: string): boolean;
47
+ export declare function hasChangesOutside(cwd: string, from: string, to: string, excludeDir: string): boolean;
19
48
  export declare function isDirty(cwd: string): boolean;
20
49
  export declare function commitDirty(cwd: string, message?: string): Promise<boolean>;
21
50
  export declare function listWorktrees(repoRoot: string): Promise<Array<string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/worktree.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAI/C,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC;AAkBD,wBAAgB,eAAe,CAC3B,QAAQ,EAAC,MAAM,EACf,MAAM,EAAC,MAAM,GACf,MAAM,CAMP;AAwED,wBAAgB,cAAc,CAC1B,IAAI,EAAC;IACD,QAAQ,EAAC,MAAM,CAAA;IACf,QAAQ,EAAC,MAAM,CAAA;IACf,UAAU,EAAC,MAAM,CAAA;IACjB,MAAM,EAAC,MAAM,CAAA;CAChB,GACH,OAAO,CAAC;IAAE,YAAY,EAAC,MAAM,CAAC;IAAC,UAAU,EAAC,MAAM,CAAA;CAAE,CAAC,CAIpD;AAeD,wBAAgB,cAAc,CAC1B,YAAY,EAAC,MAAM,EACnB,IAAI,CAAC,EAAC;IAAE,KAAK,CAAC,EAAC,OAAO,CAAA;CAAE,GAC1B,OAAO,CAAC,IAAI,CAAC,CAMd;AAED,wBAAgB,aAAa,CACzB,QAAQ,EAAC,MAAM,EACf,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,MAAM,GACf,OAAO,CAOR;AAED,wBAAgB,OAAO,CAAE,GAAG,EAAC,MAAM,GAAE,OAAO,CAO3C;AAED,wBAAsB,WAAW,CAC7B,GAAG,EAAC,MAAM,EACV,OAAO,CAAC,EAAC,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAsBjB;AAED,wBAAsB,aAAa,CAC/B,QAAQ,EAAC,MAAM,GACjB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAWvB"}
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../../src/worktree.ts"],"names":[],"mappings":"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"}
package/dist/stats.js ADDED
@@ -0,0 +1,111 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+ const SUBAGENT_TOOLS = /* @__PURE__ */ new Set(["Agent", "Task"]);
4
+ function isRecord(value) {
5
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6
+ }
7
+ __name(isRecord, "isRecord");
8
+ function emptyStreamStats() {
9
+ return { stats: { subagents: 0 }, seenToolIds: /* @__PURE__ */ new Set() };
10
+ }
11
+ __name(emptyStreamStats, "emptyStreamStats");
12
+ function nextStreamStats(state, obj) {
13
+ if (!isRecord(obj)) return state;
14
+ if (obj.type === "assistant") return countSubagents(state, obj);
15
+ if (obj.type === "result") return applyResult(state, obj);
16
+ return state;
17
+ }
18
+ __name(nextStreamStats, "nextStreamStats");
19
+ function countSubagents(state, obj) {
20
+ if (obj.parent_tool_use_id != null) return state;
21
+ const message = obj.message;
22
+ if (!isRecord(message) || !Array.isArray(message.content)) {
23
+ return state;
24
+ }
25
+ const ids = [];
26
+ for (const block of message.content) {
27
+ if (!isRecord(block) || block.type !== "tool_use") continue;
28
+ if (typeof block.name !== "string" || !SUBAGENT_TOOLS.has(block.name)) continue;
29
+ if (typeof block.id !== "string") continue;
30
+ if (state.seenToolIds.has(block.id)) continue;
31
+ if (ids.includes(block.id)) continue;
32
+ ids.push(block.id);
33
+ }
34
+ if (ids.length === 0) return state;
35
+ return {
36
+ stats: {
37
+ ...state.stats,
38
+ subagents: state.stats.subagents + ids.length
39
+ },
40
+ seenToolIds: /* @__PURE__ */ new Set([...state.seenToolIds, ...ids])
41
+ };
42
+ }
43
+ __name(countSubagents, "countSubagents");
44
+ function applyResult(state, obj) {
45
+ const cost = obj.total_cost_usd;
46
+ const hasCost = typeof cost === "number" && Number.isFinite(cost);
47
+ const subagentStats = obj.subagent_stats;
48
+ const spawned = isRecord(subagentStats) ? subagentStats.spawned : void 0;
49
+ const hasSpawned = typeof spawned === "number" && Number.isInteger(spawned) && spawned >= 0;
50
+ if (!hasCost && !hasSpawned) return state;
51
+ const subagents = hasSpawned ? spawned : state.stats.subagents;
52
+ const costUsd = hasCost ? cost : state.stats.costUsd;
53
+ if (subagents === state.stats.subagents && costUsd === state.stats.costUsd) return state;
54
+ return {
55
+ stats: costUsd === void 0 ? { subagents } : { subagents, costUsd },
56
+ seenToolIds: state.seenToolIds
57
+ };
58
+ }
59
+ __name(applyResult, "applyResult");
60
+ function addStats(total, run) {
61
+ const subagents = total.subagents + (run.subagents ?? 0);
62
+ if (total.costUsd === void 0 && run.costUsd === void 0) {
63
+ return { subagents };
64
+ }
65
+ return {
66
+ subagents,
67
+ costUsd: (total.costUsd ?? 0) + (run.costUsd ?? 0)
68
+ };
69
+ }
70
+ __name(addStats, "addStats");
71
+ function formatStats(stats) {
72
+ if (!stats) return null;
73
+ if (stats.subagents === 0 && stats.costUsd === void 0) {
74
+ return null;
75
+ }
76
+ const count = `${stats.subagents} ` + (stats.subagents === 1 ? "subagent" : "subagents");
77
+ return stats.costUsd === void 0 ? count : `${count}, $${stats.costUsd.toFixed(2)}`;
78
+ }
79
+ __name(formatStats, "formatStats");
80
+ function emptyRunStats() {
81
+ return { agentRuns: 0, withCost: 0, subagents: 0, costUsd: 0 };
82
+ }
83
+ __name(emptyRunStats, "emptyRunStats");
84
+ function addRun(run, result) {
85
+ return {
86
+ agentRuns: run.agentRuns + 1,
87
+ withCost: run.withCost + (result.costUsd === void 0 ? 0 : 1),
88
+ subagents: run.subagents + (result.subagents ?? 0),
89
+ costUsd: run.costUsd + (result.costUsd ?? 0)
90
+ };
91
+ }
92
+ __name(addRun, "addRun");
93
+ function renderRunStats(run) {
94
+ if (run.agentRuns === 0) return null;
95
+ if (run.withCost === 0 && run.subagents === 0) return null;
96
+ const runs = `${run.agentRuns} agent ` + (run.agentRuns === 1 ? "run" : "runs");
97
+ const partial = run.withCost < run.agentRuns ? ` (cost from ${run.withCost} of ${run.agentRuns} runs)` : "";
98
+ return `Subagents: ${run.subagents} started across ${runs}, cost $${run.costUsd.toFixed(2)}${partial}`;
99
+ }
100
+ __name(renderRunStats, "renderRunStats");
101
+ export {
102
+ addRun,
103
+ addStats,
104
+ emptyRunStats,
105
+ emptyStreamStats,
106
+ formatStats,
107
+ isRecord,
108
+ nextStreamStats,
109
+ renderRunStats
110
+ };
111
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/stats.ts"],
4
+ "sourcesContent": ["// Subagent counts and cost read from claude's stream-json output,\n// and the run-wide total. Pure: imports nothing, so the\n// orchestrator, display and tests can all use it.\n\nexport type SubagentStats = {\n subagents:number\n // absent until a `result` message reports it\n costUsd?:number\n}\n\nexport type StreamStatsState = {\n readonly stats:SubagentStats\n // tool_use ids already counted, so a repeated id counts once\n readonly seenToolIds:ReadonlySet<string>\n}\n\nexport type RunStats = {\n // spawnAgent results tallied\n readonly agentRuns:number\n // of those, how many reported a cost\n readonly withCost:number\n readonly subagents:number\n readonly costUsd:number\n}\n\n// Starting a subagent is a tool_use named `Agent`; Claude Code\n// named it `Task` before 2.1.63.\nconst SUBAGENT_TOOLS:ReadonlySet<string> = new Set(['Agent', 'Task'])\n\nexport function isRecord (value:unknown):value is Record<string, unknown> {\n return typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value)\n}\n\nexport function emptyStreamStats ():StreamStatsState {\n return { stats:{ subagents:0 }, seenToolIds:new Set() }\n}\n\n/**\n * Fold one parsed stream-json value into the state. Returns the\n * same `state` object when nothing changed, so callers can detect\n * a change by identity. Never throws.\n */\nexport function nextStreamStats (\n state:StreamStatsState,\n obj:unknown\n):StreamStatsState {\n if (!isRecord(obj)) return state\n if (obj.type === 'assistant') return countSubagents(state, obj)\n if (obj.type === 'result') return applyResult(state, obj)\n return state\n}\n\nfunction countSubagents (\n state:StreamStatsState,\n obj:Record<string, unknown>\n):StreamStatsState {\n // A message from inside a subagent carries the id of the\n // tool_use that started it; only the main loop is counted.\n if (obj.parent_tool_use_id != null) return state\n const message = obj.message\n if (!isRecord(message) || !Array.isArray(message.content)) {\n return state\n }\n const ids:string[] = []\n for (const block of message.content) {\n if (!isRecord(block) || block.type !== 'tool_use') continue\n if (\n typeof block.name !== 'string' ||\n !SUBAGENT_TOOLS.has(block.name)\n ) continue\n if (typeof block.id !== 'string') continue\n if (state.seenToolIds.has(block.id)) continue\n if (ids.includes(block.id)) continue\n ids.push(block.id)\n }\n if (ids.length === 0) return state\n return {\n stats:{\n ...state.stats,\n subagents:state.stats.subagents + ids.length,\n },\n seenToolIds:new Set([...state.seenToolIds, ...ids]),\n }\n}\n\n// `total_cost_usd` is cumulative and a process can emit several\n// `result` messages, so the latest one replaces earlier values.\nfunction applyResult (\n state:StreamStatsState,\n obj:Record<string, unknown>\n):StreamStatsState {\n const cost = obj.total_cost_usd\n const hasCost = typeof cost === 'number' && Number.isFinite(cost)\n const subagentStats = obj.subagent_stats\n const spawned = isRecord(subagentStats) ?\n subagentStats.spawned :\n undefined\n const hasSpawned = typeof spawned === 'number' &&\n Number.isInteger(spawned) &&\n spawned >= 0\n if (!hasCost && !hasSpawned) return state\n\n const subagents = hasSpawned ?\n spawned :\n state.stats.subagents\n const costUsd = hasCost ?\n cost :\n state.stats.costUsd\n // A repeated result with the same values is not a change\n if (\n subagents === state.stats.subagents &&\n costUsd === state.stats.costUsd\n ) return state\n return {\n stats:costUsd === undefined ?\n { subagents } :\n { subagents, costUsd },\n seenToolIds:state.seenToolIds,\n }\n}\n\n// The running total of a ticket's attempts. A cost is kept as\n// soon as either side reports one.\nexport function addStats (\n total:SubagentStats,\n run:{ subagents?:number; costUsd?:number }\n):SubagentStats {\n const subagents = total.subagents + (run.subagents ?? 0)\n if (total.costUsd === undefined && run.costUsd === undefined) {\n return { subagents }\n }\n return {\n subagents,\n costUsd:(total.costUsd ?? 0) + (run.costUsd ?? 0),\n }\n}\n\n/**\n * The display row suffix, e.g. `2 subagents, $0.42`, or `null`\n * when there is nothing to show.\n */\nexport function formatStats (stats?:SubagentStats):string|null {\n if (!stats) return null\n if (stats.subagents === 0 && stats.costUsd === undefined) {\n return null\n }\n const count = `${stats.subagents} ` +\n (stats.subagents === 1 ? 'subagent' : 'subagents')\n return stats.costUsd === undefined ?\n count :\n `${count}, $${stats.costUsd.toFixed(2)}`\n}\n\nexport function emptyRunStats ():RunStats {\n return { agentRuns:0, withCost:0, subagents:0, costUsd:0 }\n}\n\nexport function addRun (\n run:RunStats,\n result:{ subagents?:number; costUsd?:number }\n):RunStats {\n return {\n agentRuns:run.agentRuns + 1,\n withCost:run.withCost + (result.costUsd === undefined ? 0 : 1),\n subagents:run.subagents + (result.subagents ?? 0),\n costUsd:run.costUsd + (result.costUsd ?? 0),\n }\n}\n\n/**\n * The one-line total logged after the finish summary, or `null`\n * when no run reported a subagent or a cost (codex and pi never\n * do).\n */\nexport function renderRunStats (run:RunStats):string|null {\n if (run.agentRuns === 0) return null\n if (run.withCost === 0 && run.subagents === 0) return null\n const runs = `${run.agentRuns} agent ` +\n (run.agentRuns === 1 ? 'run' : 'runs')\n const partial = run.withCost < run.agentRuns ?\n ` (cost from ${run.withCost} of ${run.agentRuns} runs)` :\n ''\n return `Subagents: ${run.subagents} started across ${runs}, ` +\n `cost $${run.costUsd.toFixed(2)}${partial}`\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/testcmd.js CHANGED
@@ -16,6 +16,18 @@ function detectTestCmd(projectDir) {
16
16
  }
17
17
  }
18
18
  __name(detectTestCmd, "detectTestCmd");
19
+ function detectInstallCmd(projectDir) {
20
+ const has = /* @__PURE__ */ __name((name) => existsSync(join(projectDir, name)), "has");
21
+ if (!has("package.json")) return null;
22
+ if (has("pnpm-lock.yaml")) {
23
+ return "pnpm install --prefer-offline --frozen-lockfile";
24
+ }
25
+ if (has("package-lock.json")) {
26
+ return "npm ci --prefer-offline --no-audit --no-fund";
27
+ }
28
+ return "npm install --prefer-offline --no-audit --no-fund --no-package-lock";
29
+ }
30
+ __name(detectInstallCmd, "detectInstallCmd");
19
31
  function runTestCmd(opts) {
20
32
  return new Promise((resolve) => {
21
33
  let settled = false;
@@ -70,6 +82,7 @@ function runTestCmd(opts) {
70
82
  }
71
83
  __name(runTestCmd, "runTestCmd");
72
84
  export {
85
+ detectInstallCmd,
73
86
  detectTestCmd,
74
87
  runTestCmd
75
88
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/testcmd.ts"],
4
- "sourcesContent": ["import { spawn } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type TestResult = {\n exitCode:number\n output:string\n}\n\n// Returns the command to run the project's tests, or null\n// when the project does not declare one.\nexport function detectTestCmd (projectDir:string):string|null {\n const pkgPath = join(projectDir, 'package.json')\n if (!existsSync(pkgPath)) return null\n try {\n const pkg = JSON.parse(\n readFileSync(pkgPath, 'utf8')\n ) as { scripts?:Record<string, string> }\n return pkg.scripts?.test ?\n 'npm test' :\n null\n } catch {\n return null\n }\n}\n\nexport function runTestCmd (opts:{\n cmd:string\n cwd:string\n timeout:number\n registry?:Set<number>\n}):Promise<TestResult> {\n return new Promise(resolve => {\n let settled = false\n const child = spawn('sh', ['-c', opts.cmd], {\n cwd:opts.cwd,\n stdio:['ignore', 'pipe', 'pipe'],\n detached:true,\n })\n\n if (child.pid !== undefined && opts.registry) {\n opts.registry.add(child.pid)\n }\n\n const chunks:string[] = []\n child.stdout.on('data', d => chunks.push(String(d)))\n child.stderr.on('data', d => chunks.push(String(d)))\n\n const timer = setTimeout(() => {\n if (child.pid) {\n try {\n process.kill(-child.pid, 'SIGKILL')\n } catch {\n child.kill('SIGKILL')\n }\n } else {\n child.kill('SIGKILL')\n }\n }, opts.timeout * 1000)\n\n child.on('error', err => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (child.pid !== undefined && opts.registry) {\n opts.registry.delete(child.pid)\n }\n chunks.push(String(err))\n resolve({\n exitCode:1,\n output:chunks.join(''),\n })\n })\n\n child.on('close', code => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (child.pid !== undefined && opts.registry) {\n opts.registry.delete(child.pid)\n }\n resolve({\n exitCode:code ?? 1,\n output:chunks.join(''),\n })\n })\n })\n}\n"],
5
- "mappings": ";;AAAA,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AACzC,SAAS,YAAY;AASd,SAAS,cAAe,YAA+B;AAC1D,QAAM,UAAU,KAAK,YAAY,cAAc;AAC/C,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACA,UAAM,MAAM,KAAK;AAAA,MACb,aAAa,SAAS,MAAM;AAAA,IAChC;AACA,WAAO,IAAI,SAAS,OAChB,aACA;AAAA,EACR,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAbgB;AAeT,SAAS,WAAY,MAKL;AACnB,SAAO,IAAI,QAAQ,aAAW;AAC1B,QAAI,UAAU;AACd,UAAM,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG;AAAA,MACxC,KAAI,KAAK;AAAA,MACT,OAAM,CAAC,UAAU,QAAQ,MAAM;AAAA,MAC/B,UAAS;AAAA,IACb,CAAC;AAED,QAAI,MAAM,QAAQ,UAAa,KAAK,UAAU;AAC1C,WAAK,SAAS,IAAI,MAAM,GAAG;AAAA,IAC/B;AAEA,UAAM,SAAkB,CAAC;AACzB,UAAM,OAAO,GAAG,QAAQ,OAAK,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;AACnD,UAAM,OAAO,GAAG,QAAQ,OAAK,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;AAEnD,UAAM,QAAQ,WAAW,MAAM;AAC3B,UAAI,MAAM,KAAK;AACX,YAAI;AACA,kBAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,QACtC,QAAQ;AACJ,gBAAM,KAAK,SAAS;AAAA,QACxB;AAAA,MACJ,OAAO;AACH,cAAM,KAAK,SAAS;AAAA,MACxB;AAAA,IACJ,GAAG,KAAK,UAAU,GAAI;AAEtB,UAAM,GAAG,SAAS,SAAO;AACrB,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,UAAI,MAAM,QAAQ,UAAa,KAAK,UAAU;AAC1C,aAAK,SAAS,OAAO,MAAM,GAAG;AAAA,MAClC;AACA,aAAO,KAAK,OAAO,GAAG,CAAC;AACvB,cAAQ;AAAA,QACJ,UAAS;AAAA,QACT,QAAO,OAAO,KAAK,EAAE;AAAA,MACzB,CAAC;AAAA,IACL,CAAC;AAED,UAAM,GAAG,SAAS,UAAQ;AACtB,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,UAAI,MAAM,QAAQ,UAAa,KAAK,UAAU;AAC1C,aAAK,SAAS,OAAO,MAAM,GAAG;AAAA,MAClC;AACA,cAAQ;AAAA,QACJ,UAAS,QAAQ;AAAA,QACjB,QAAO,OAAO,KAAK,EAAE;AAAA,MACzB,CAAC;AAAA,IACL,CAAC;AAAA,EACL,CAAC;AACL;AA7DgB;",
4
+ "sourcesContent": ["import { spawn } from 'node:child_process'\nimport { existsSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport type TestResult = {\n exitCode:number\n output:string\n}\n\n// Returns the command to run the project's tests, or null\n// when the project does not declare one.\nexport function detectTestCmd (projectDir:string):string|null {\n const pkgPath = join(projectDir, 'package.json')\n if (!existsSync(pkgPath)) return null\n try {\n const pkg = JSON.parse(\n readFileSync(pkgPath, 'utf8')\n ) as { scripts?:Record<string, string> }\n return pkg.scripts?.test ?\n 'npm test' :\n null\n } catch {\n return null\n }\n}\n\n// Returns the command that installs dependencies in a fresh\n// worktree, or null when the project has no package.json.\n// Follows the project's lockfile, so the worktree gets the\n// same dependency tree as the main checkout, and never\n// writes a lockfile a ticket branch would then commit.\nexport function detectInstallCmd (projectDir:string):string|null {\n const has = (name:string) => existsSync(join(projectDir, name))\n if (!has('package.json')) return null\n if (has('pnpm-lock.yaml')) {\n return 'pnpm install --prefer-offline --frozen-lockfile'\n }\n if (has('package-lock.json')) {\n return 'npm ci --prefer-offline --no-audit --no-fund'\n }\n return 'npm install --prefer-offline --no-audit ' +\n '--no-fund --no-package-lock'\n}\n\nexport function runTestCmd (opts:{\n cmd:string\n cwd:string\n timeout:number\n registry?:Set<number>\n}):Promise<TestResult> {\n return new Promise(resolve => {\n let settled = false\n const child = spawn('sh', ['-c', opts.cmd], {\n cwd:opts.cwd,\n stdio:['ignore', 'pipe', 'pipe'],\n detached:true,\n })\n\n if (child.pid !== undefined && opts.registry) {\n opts.registry.add(child.pid)\n }\n\n const chunks:string[] = []\n child.stdout.on('data', d => chunks.push(String(d)))\n child.stderr.on('data', d => chunks.push(String(d)))\n\n const timer = setTimeout(() => {\n if (child.pid) {\n try {\n process.kill(-child.pid, 'SIGKILL')\n } catch {\n child.kill('SIGKILL')\n }\n } else {\n child.kill('SIGKILL')\n }\n }, opts.timeout * 1000)\n\n child.on('error', err => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (child.pid !== undefined && opts.registry) {\n opts.registry.delete(child.pid)\n }\n chunks.push(String(err))\n resolve({\n exitCode:1,\n output:chunks.join(''),\n })\n })\n\n child.on('close', code => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (child.pid !== undefined && opts.registry) {\n opts.registry.delete(child.pid)\n }\n resolve({\n exitCode:code ?? 1,\n output:chunks.join(''),\n })\n })\n })\n}\n"],
5
+ "mappings": ";;AAAA,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AACzC,SAAS,YAAY;AASd,SAAS,cAAe,YAA+B;AAC1D,QAAM,UAAU,KAAK,YAAY,cAAc;AAC/C,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACA,UAAM,MAAM,KAAK;AAAA,MACb,aAAa,SAAS,MAAM;AAAA,IAChC;AACA,WAAO,IAAI,SAAS,OAChB,aACA;AAAA,EACR,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAbgB;AAoBT,SAAS,iBAAkB,YAA+B;AAC7D,QAAM,MAAM,wBAAC,SAAgB,WAAW,KAAK,YAAY,IAAI,CAAC,GAAlD;AACZ,MAAI,CAAC,IAAI,cAAc,EAAG,QAAO;AACjC,MAAI,IAAI,gBAAgB,GAAG;AACvB,WAAO;AAAA,EACX;AACA,MAAI,IAAI,mBAAmB,GAAG;AAC1B,WAAO;AAAA,EACX;AACA,SAAO;AAEX;AAXgB;AAaT,SAAS,WAAY,MAKL;AACnB,SAAO,IAAI,QAAQ,aAAW;AAC1B,QAAI,UAAU;AACd,UAAM,QAAQ,MAAM,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG;AAAA,MACxC,KAAI,KAAK;AAAA,MACT,OAAM,CAAC,UAAU,QAAQ,MAAM;AAAA,MAC/B,UAAS;AAAA,IACb,CAAC;AAED,QAAI,MAAM,QAAQ,UAAa,KAAK,UAAU;AAC1C,WAAK,SAAS,IAAI,MAAM,GAAG;AAAA,IAC/B;AAEA,UAAM,SAAkB,CAAC;AACzB,UAAM,OAAO,GAAG,QAAQ,OAAK,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;AACnD,UAAM,OAAO,GAAG,QAAQ,OAAK,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC;AAEnD,UAAM,QAAQ,WAAW,MAAM;AAC3B,UAAI,MAAM,KAAK;AACX,YAAI;AACA,kBAAQ,KAAK,CAAC,MAAM,KAAK,SAAS;AAAA,QACtC,QAAQ;AACJ,gBAAM,KAAK,SAAS;AAAA,QACxB;AAAA,MACJ,OAAO;AACH,cAAM,KAAK,SAAS;AAAA,MACxB;AAAA,IACJ,GAAG,KAAK,UAAU,GAAI;AAEtB,UAAM,GAAG,SAAS,SAAO;AACrB,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,UAAI,MAAM,QAAQ,UAAa,KAAK,UAAU;AAC1C,aAAK,SAAS,OAAO,MAAM,GAAG;AAAA,MAClC;AACA,aAAO,KAAK,OAAO,GAAG,CAAC;AACvB,cAAQ;AAAA,QACJ,UAAS;AAAA,QACT,QAAO,OAAO,KAAK,EAAE;AAAA,MACzB,CAAC;AAAA,IACL,CAAC;AAED,UAAM,GAAG,SAAS,UAAQ;AACtB,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,UAAI,MAAM,QAAQ,UAAa,KAAK,UAAU;AAC1C,aAAK,SAAS,OAAO,MAAM,GAAG;AAAA,MAClC;AACA,cAAQ;AAAA,QACJ,UAAS,QAAQ;AAAA,QACjB,QAAO,OAAO,KAAK,EAAE;AAAA,MACzB,CAAC;AAAA,IACL,CAAC;AAAA,EACL,CAAC;AACL;AA7DgB;",
6
6
  "names": []
7
7
  }