@blockspool/core 0.4.1 → 0.4.3

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 (93) hide show
  1. package/dist/db/adapter.d.ts +191 -0
  2. package/dist/db/adapter.d.ts.map +1 -0
  3. package/dist/db/adapter.js +40 -0
  4. package/dist/db/adapter.js.map +1 -0
  5. package/dist/db/contract.d.ts +47 -0
  6. package/dist/db/contract.d.ts.map +1 -0
  7. package/dist/db/contract.js +258 -0
  8. package/dist/db/contract.js.map +1 -0
  9. package/dist/db/index.d.ts +6 -0
  10. package/dist/db/index.d.ts.map +1 -0
  11. package/dist/db/index.js +7 -0
  12. package/dist/db/index.js.map +1 -0
  13. package/dist/exec/index.d.ts +5 -0
  14. package/dist/exec/index.d.ts.map +1 -0
  15. package/dist/exec/index.js +5 -0
  16. package/dist/exec/index.js.map +1 -0
  17. package/dist/exec/types.d.ts +64 -0
  18. package/dist/exec/types.d.ts.map +1 -0
  19. package/dist/exec/types.js +8 -0
  20. package/dist/exec/types.js.map +1 -0
  21. package/dist/index.d.ts +23 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +27 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/repos/index.d.ts +15 -0
  26. package/dist/repos/index.d.ts.map +1 -0
  27. package/dist/repos/index.js +11 -0
  28. package/dist/repos/index.js.map +1 -0
  29. package/dist/repos/projects.d.ts +41 -0
  30. package/dist/repos/projects.d.ts.map +1 -0
  31. package/dist/repos/projects.js +74 -0
  32. package/dist/repos/projects.js.map +1 -0
  33. package/dist/repos/run_steps.d.ts +152 -0
  34. package/dist/repos/run_steps.d.ts.map +1 -0
  35. package/dist/repos/run_steps.js +321 -0
  36. package/dist/repos/run_steps.js.map +1 -0
  37. package/dist/repos/runs.d.ts +92 -0
  38. package/dist/repos/runs.d.ts.map +1 -0
  39. package/dist/repos/runs.js +177 -0
  40. package/dist/repos/runs.js.map +1 -0
  41. package/dist/repos/tickets.d.ts +71 -0
  42. package/dist/repos/tickets.d.ts.map +1 -0
  43. package/dist/repos/tickets.js +128 -0
  44. package/dist/repos/tickets.js.map +1 -0
  45. package/dist/scout/index.d.ts +15 -0
  46. package/dist/scout/index.d.ts.map +1 -0
  47. package/dist/scout/index.js +383 -0
  48. package/dist/scout/index.js.map +1 -0
  49. package/dist/scout/prompt.d.ts +32 -0
  50. package/dist/scout/prompt.d.ts.map +1 -0
  51. package/dist/scout/prompt.js +104 -0
  52. package/dist/scout/prompt.js.map +1 -0
  53. package/dist/scout/runner.d.ts +68 -0
  54. package/dist/scout/runner.d.ts.map +1 -0
  55. package/dist/scout/runner.js +270 -0
  56. package/dist/scout/runner.js.map +1 -0
  57. package/dist/scout/scanner.d.ts +35 -0
  58. package/dist/scout/scanner.d.ts.map +1 -0
  59. package/dist/scout/scanner.js +164 -0
  60. package/dist/scout/scanner.js.map +1 -0
  61. package/dist/scout/types.d.ts +179 -0
  62. package/dist/scout/types.d.ts.map +1 -0
  63. package/dist/scout/types.js +44 -0
  64. package/dist/scout/types.js.map +1 -0
  65. package/dist/services/index.d.ts +10 -0
  66. package/dist/services/index.d.ts.map +1 -0
  67. package/dist/services/index.js +9 -0
  68. package/dist/services/index.js.map +1 -0
  69. package/dist/services/qa.d.ts +76 -0
  70. package/dist/services/qa.d.ts.map +1 -0
  71. package/dist/services/qa.js +239 -0
  72. package/dist/services/qa.js.map +1 -0
  73. package/dist/services/scout.d.ts +120 -0
  74. package/dist/services/scout.d.ts.map +1 -0
  75. package/dist/services/scout.js +205 -0
  76. package/dist/services/scout.js.map +1 -0
  77. package/dist/utils/id.d.ts +12 -0
  78. package/dist/utils/id.d.ts.map +1 -0
  79. package/dist/utils/id.js +24 -0
  80. package/dist/utils/id.js.map +1 -0
  81. package/dist/utils/id.test.d.ts +5 -0
  82. package/dist/utils/id.test.d.ts.map +1 -0
  83. package/dist/utils/id.test.js +173 -0
  84. package/dist/utils/id.test.js.map +1 -0
  85. package/dist/utils/index.d.ts +6 -0
  86. package/dist/utils/index.d.ts.map +1 -0
  87. package/dist/utils/index.js +6 -0
  88. package/dist/utils/index.js.map +1 -0
  89. package/dist/utils/json.d.ts +9 -0
  90. package/dist/utils/json.d.ts.map +1 -0
  91. package/dist/utils/json.js +19 -0
  92. package/dist/utils/json.js.map +1 -0
  93. package/package.json +1 -1
@@ -0,0 +1,64 @@
1
+ /**
2
+ * ExecRunner types - Interface for command execution
3
+ *
4
+ * Core contains only the interface/types.
5
+ * Node implementation lives in packages/cli.
6
+ */
7
+ export type ExecStatus = 'success' | 'failed' | 'timeout' | 'canceled';
8
+ export interface ExecOutput {
9
+ /** Path intended to be stored in DB (usually repo-relative) */
10
+ path: string;
11
+ /** Absolute path for immediate file access */
12
+ absPath: string;
13
+ /** Bytes written to artifact file (capped by maxLogBytes) */
14
+ bytes: number;
15
+ /** Whether output exceeded maxLogBytes (file is truncated) */
16
+ truncated: boolean;
17
+ /** Tail of output (last tailBytes), derived from full stream even if truncated */
18
+ tail: string;
19
+ }
20
+ export interface ExecSpec {
21
+ cmd: string;
22
+ cwd?: string;
23
+ env?: Record<string, string | undefined>;
24
+ /** Defaults to true (runs through shell). */
25
+ shell?: boolean;
26
+ /** Timeout for the process. If hit -> kill -> status=timeout. */
27
+ timeoutMs?: number;
28
+ /** Optional cancellation. If aborted -> kill -> status=canceled. */
29
+ signal?: AbortSignal;
30
+ /**
31
+ * Artifact config.
32
+ * artifactsDir can be repo-relative (recommended) or absolute.
33
+ */
34
+ repoRoot: string;
35
+ artifactsDir: string;
36
+ runId: string;
37
+ attempt: number;
38
+ stepName: string;
39
+ ordinal: number;
40
+ /** Cap bytes written to disk per stream (stdout/stderr). */
41
+ maxLogBytes?: number;
42
+ /** Tail buffer size in bytes per stream. */
43
+ tailBytes?: number;
44
+ /** Optional live hooks (useful later for TUI/streaming). */
45
+ onStdoutChunk?: (chunk: Buffer) => void;
46
+ onStderrChunk?: (chunk: Buffer) => void;
47
+ }
48
+ export interface ExecResult {
49
+ status: ExecStatus;
50
+ exitCode: number | null;
51
+ signal: string | null;
52
+ /** Runner/system failure (spawn error, timeout msg, stream write error, etc.) */
53
+ errorMessage?: string;
54
+ pid: number | null;
55
+ startedAtMs: number;
56
+ endedAtMs: number;
57
+ durationMs: number;
58
+ stdout: ExecOutput;
59
+ stderr: ExecOutput;
60
+ }
61
+ export interface ExecRunner {
62
+ run(spec: ExecSpec): Promise<ExecResult>;
63
+ }
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/exec/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,SAAS,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAEzC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,oEAAoE;IACpE,MAAM,CAAC,EAAE,WAAW,CAAC;IAErB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IAErB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAEhB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAEnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IAEnB,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC1C"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * ExecRunner types - Interface for command execution
3
+ *
4
+ * Core contains only the interface/types.
5
+ * Node implementation lives in packages/cli.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/exec/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @blockspool/core
3
+ *
4
+ * Core business logic and shared types for BlockSpool.
5
+ * This package is open source (Apache-2.0) and provides:
6
+ *
7
+ * - Database adapter interface (works with Postgres or SQLite)
8
+ * - Repository layer for data access
9
+ * - Services for business logic orchestration
10
+ * - Scout service for codebase analysis
11
+ * - Shared type definitions
12
+ * - Core business logic utilities
13
+ */
14
+ export * from './db/index.js';
15
+ export * as repos from './repos/index.js';
16
+ export type { Project, Ticket, TicketStatus, TicketCategory, Run, RunStatus, RunType } from './repos/index.js';
17
+ export * as services from './services/index.js';
18
+ export type { ScoutDeps, ScoutRepoOptions, ScoutRepoResult, GitService, Logger } from './services/index.js';
19
+ export { scoutRepo, approveProposals } from './services/index.js';
20
+ export * as scout from './scout/index.js';
21
+ export * from './exec/index.js';
22
+ export * from './utils/index.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,cAAc,eAAe,CAAC;AAG9B,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG/G,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC5G,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAG1C,cAAc,iBAAiB,CAAC;AAGhC,cAAc,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @blockspool/core
3
+ *
4
+ * Core business logic and shared types for BlockSpool.
5
+ * This package is open source (Apache-2.0) and provides:
6
+ *
7
+ * - Database adapter interface (works with Postgres or SQLite)
8
+ * - Repository layer for data access
9
+ * - Services for business logic orchestration
10
+ * - Scout service for codebase analysis
11
+ * - Shared type definitions
12
+ * - Core business logic utilities
13
+ */
14
+ // Database adapter
15
+ export * from './db/index.js';
16
+ // Repositories (namespaced)
17
+ export * as repos from './repos/index.js';
18
+ // Services (namespaced to avoid conflicts with scout)
19
+ export * as services from './services/index.js';
20
+ export { scoutRepo, approveProposals } from './services/index.js';
21
+ // Scout (low-level scanning/analysis - namespaced)
22
+ export * as scout from './scout/index.js';
23
+ // Exec runner interface
24
+ export * from './exec/index.js';
25
+ // Utilities
26
+ export * from './utils/index.js';
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,mBAAmB;AACnB,cAAc,eAAe,CAAC;AAE9B,4BAA4B;AAC5B,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAG1C,sDAAsD;AACtD,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAElE,mDAAmD;AACnD,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAE1C,wBAAwB;AACxB,cAAc,iBAAiB,CAAC;AAEhC,YAAY;AACZ,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Repository exports
3
+ *
4
+ * Repositories provide database operations using the DatabaseAdapter interface.
5
+ * They handle row mapping and business logic validation.
6
+ */
7
+ export * as projects from './projects.js';
8
+ export * as tickets from './tickets.js';
9
+ export * as runs from './runs.js';
10
+ export * as runSteps from './run_steps.js';
11
+ export type { Project } from './projects.js';
12
+ export type { Ticket, TicketStatus, TicketCategory } from './tickets.js';
13
+ export type { Run, RunStatus, RunType, RunSummary } from './runs.js';
14
+ export type { RunStep, StepStatus, StepKind, StepCounts, StepSummary, } from './run_steps.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repos/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,YAAY,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EACV,OAAO,EACP,UAAU,EACV,QAAQ,EACR,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Repository exports
3
+ *
4
+ * Repositories provide database operations using the DatabaseAdapter interface.
5
+ * They handle row mapping and business logic validation.
6
+ */
7
+ export * as projects from './projects.js';
8
+ export * as tickets from './tickets.js';
9
+ export * as runs from './runs.js';
10
+ export * as runSteps from './run_steps.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repos/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Project repository - Database operations for projects
3
+ */
4
+ import type { DatabaseAdapter } from '../db/adapter.js';
5
+ export interface Project {
6
+ id: string;
7
+ name: string;
8
+ repoUrl: string | null;
9
+ rootPath: string;
10
+ createdAt: Date;
11
+ updatedAt: Date;
12
+ }
13
+ /**
14
+ * Get project by ID
15
+ */
16
+ export declare function getById(db: DatabaseAdapter, id: string): Promise<Project | null>;
17
+ /**
18
+ * Get project by repository root path
19
+ */
20
+ export declare function getByRepoRoot(db: DatabaseAdapter, rootPath: string): Promise<Project | null>;
21
+ /**
22
+ * Ensure a project exists for a repository
23
+ * Returns existing project or creates new one
24
+ *
25
+ * This is idempotent - calling twice with same rootPath returns same project
26
+ */
27
+ export declare function ensureForRepo(db: DatabaseAdapter, opts: {
28
+ name: string;
29
+ rootPath: string;
30
+ id?: string;
31
+ repoUrl?: string | null;
32
+ }): Promise<Project>;
33
+ /**
34
+ * List all projects
35
+ */
36
+ export declare function list(db: DatabaseAdapter): Promise<Project[]>;
37
+ /**
38
+ * Delete a project and all related data
39
+ */
40
+ export declare function remove(db: DatabaseAdapter, id: string): Promise<void>;
41
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/repos/projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAsBD;;GAEG;AACH,wBAAsB,OAAO,CAC3B,EAAE,EAAE,eAAe,EACnB,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAMzB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,eAAe,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAMzB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,EAAE,EAAE,eAAe,EACnB,IAAI,EAAE;IACJ,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,GACA,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,EAAE,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAKlE;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAW3E"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Project repository - Database operations for projects
3
+ */
4
+ import { nanoid } from '../utils/id.js';
5
+ function rowToProject(row) {
6
+ return {
7
+ id: row.id,
8
+ name: row.name,
9
+ repoUrl: row.repo_url,
10
+ rootPath: row.root_path,
11
+ createdAt: new Date(row.created_at),
12
+ updatedAt: new Date(row.updated_at),
13
+ };
14
+ }
15
+ /**
16
+ * Get project by ID
17
+ */
18
+ export async function getById(db, id) {
19
+ const result = await db.query('SELECT * FROM projects WHERE id = $1', [id]);
20
+ return result.rows[0] ? rowToProject(result.rows[0]) : null;
21
+ }
22
+ /**
23
+ * Get project by repository root path
24
+ */
25
+ export async function getByRepoRoot(db, rootPath) {
26
+ const result = await db.query('SELECT * FROM projects WHERE root_path = $1', [rootPath]);
27
+ return result.rows[0] ? rowToProject(result.rows[0]) : null;
28
+ }
29
+ /**
30
+ * Ensure a project exists for a repository
31
+ * Returns existing project or creates new one
32
+ *
33
+ * This is idempotent - calling twice with same rootPath returns same project
34
+ */
35
+ export async function ensureForRepo(db, opts) {
36
+ // Check if already exists by rootPath
37
+ const existing = await getByRepoRoot(db, opts.rootPath);
38
+ if (existing) {
39
+ return existing;
40
+ }
41
+ // Create new project (use ON CONFLICT to handle race conditions / worktree paths)
42
+ const id = opts.id ?? `proj_${nanoid(6)}`;
43
+ await db.query(`INSERT INTO projects (id, name, repo_url, root_path)
44
+ VALUES ($1, $2, $3, $4)
45
+ ON CONFLICT (id) DO NOTHING`, [id, opts.name, opts.repoUrl ?? null, opts.rootPath]);
46
+ const created = await getById(db, id);
47
+ if (!created) {
48
+ throw new Error('Failed to create project');
49
+ }
50
+ return created;
51
+ }
52
+ /**
53
+ * List all projects
54
+ */
55
+ export async function list(db) {
56
+ const result = await db.query('SELECT * FROM projects ORDER BY updated_at DESC');
57
+ return result.rows.map(rowToProject);
58
+ }
59
+ /**
60
+ * Delete a project and all related data
61
+ */
62
+ export async function remove(db, id) {
63
+ await db.withTransaction(async (tx) => {
64
+ // Delete in order respecting foreign keys
65
+ await tx.query('DELETE FROM run_events WHERE run_id IN (SELECT id FROM runs WHERE ticket_id IN (SELECT id FROM tickets WHERE project_id = $1))', [id]);
66
+ await tx.query('DELETE FROM artifacts WHERE run_id IN (SELECT id FROM runs WHERE ticket_id IN (SELECT id FROM tickets WHERE project_id = $1))', [id]);
67
+ await tx.query('DELETE FROM leases WHERE ticket_id IN (SELECT id FROM tickets WHERE project_id = $1)', [id]);
68
+ await tx.query('DELETE FROM runs WHERE ticket_id IN (SELECT id FROM tickets WHERE project_id = $1)', [id]);
69
+ await tx.query('DELETE FROM learnings WHERE project_id = $1', [id]);
70
+ await tx.query('DELETE FROM tickets WHERE project_id = $1', [id]);
71
+ await tx.query('DELETE FROM projects WHERE id = $1', [id]);
72
+ });
73
+ }
74
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/repos/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Run Steps repository - Database operations for run steps
3
+ *
4
+ * Steps are individual commands/actions within a run (e.g., QA commands).
5
+ * Supports retry attempts with full history preserved.
6
+ */
7
+ import type { DatabaseAdapter } from '../db/adapter.js';
8
+ export type StepStatus = 'queued' | 'running' | 'success' | 'failed' | 'skipped' | 'canceled';
9
+ export type StepKind = 'command' | 'llm_fix' | 'git' | 'internal';
10
+ export interface RunStep {
11
+ id: string;
12
+ runId: string;
13
+ attempt: number;
14
+ ordinal: number;
15
+ name: string;
16
+ kind: StepKind;
17
+ status: StepStatus;
18
+ cmd: string | null;
19
+ cwd: string | null;
20
+ timeoutMs: number | null;
21
+ exitCode: number | null;
22
+ signal: string | null;
23
+ startedAtMs: number | null;
24
+ endedAtMs: number | null;
25
+ durationMs: number | null;
26
+ stdoutPath: string | null;
27
+ stderrPath: string | null;
28
+ stdoutBytes: number;
29
+ stderrBytes: number;
30
+ stdoutTruncated: boolean;
31
+ stderrTruncated: boolean;
32
+ stdoutTail: string | null;
33
+ stderrTail: string | null;
34
+ errorMessage: string | null;
35
+ metadata: Record<string, unknown>;
36
+ createdAtMs: number;
37
+ updatedAtMs: number;
38
+ }
39
+ /**
40
+ * Get step by ID
41
+ */
42
+ export declare function getById(db: DatabaseAdapter, id: string): Promise<RunStep | null>;
43
+ /**
44
+ * Create a new step
45
+ */
46
+ export declare function create(db: DatabaseAdapter, opts: {
47
+ runId: string;
48
+ attempt?: number;
49
+ ordinal: number;
50
+ name: string;
51
+ kind?: StepKind;
52
+ cmd?: string;
53
+ cwd?: string;
54
+ timeoutMs?: number;
55
+ metadata?: Record<string, unknown>;
56
+ }): Promise<RunStep>;
57
+ /**
58
+ * Create multiple steps at once (for initializing a QA run)
59
+ */
60
+ export declare function createMany(db: DatabaseAdapter, runId: string, steps: Array<{
61
+ name: string;
62
+ cmd: string;
63
+ cwd?: string;
64
+ timeoutMs?: number;
65
+ }>, attempt?: number): Promise<RunStep[]>;
66
+ /**
67
+ * Mark step as started
68
+ */
69
+ export declare function markStarted(db: DatabaseAdapter, id: string): Promise<RunStep | null>;
70
+ /**
71
+ * Mark step as successful
72
+ */
73
+ export declare function markSuccess(db: DatabaseAdapter, id: string, opts?: {
74
+ exitCode?: number;
75
+ stdoutPath?: string;
76
+ stderrPath?: string;
77
+ stdoutBytes?: number;
78
+ stderrBytes?: number;
79
+ stdoutTruncated?: boolean;
80
+ stderrTruncated?: boolean;
81
+ stdoutTail?: string;
82
+ stderrTail?: string;
83
+ metadata?: Record<string, unknown>;
84
+ }): Promise<RunStep | null>;
85
+ /**
86
+ * Mark step as failed
87
+ */
88
+ export declare function markFailed(db: DatabaseAdapter, id: string, opts: {
89
+ exitCode?: number;
90
+ signal?: string;
91
+ errorMessage?: string;
92
+ stdoutPath?: string;
93
+ stderrPath?: string;
94
+ stdoutBytes?: number;
95
+ stderrBytes?: number;
96
+ stdoutTruncated?: boolean;
97
+ stderrTruncated?: boolean;
98
+ stdoutTail?: string;
99
+ stderrTail?: string;
100
+ metadata?: Record<string, unknown>;
101
+ }): Promise<RunStep | null>;
102
+ /**
103
+ * Mark step as skipped
104
+ */
105
+ export declare function markSkipped(db: DatabaseAdapter, id: string, reason?: string): Promise<RunStep | null>;
106
+ /**
107
+ * Mark step as canceled
108
+ */
109
+ export declare function markCanceled(db: DatabaseAdapter, id: string, reason?: string): Promise<RunStep | null>;
110
+ /**
111
+ * List steps for a run
112
+ */
113
+ export declare function listByRun(db: DatabaseAdapter, runId: string, opts?: {
114
+ attempt?: number;
115
+ status?: StepStatus | StepStatus[];
116
+ }): Promise<RunStep[]>;
117
+ /**
118
+ * Get the latest attempt number for a run
119
+ */
120
+ export declare function getLatestAttempt(db: DatabaseAdapter, runId: string): Promise<number>;
121
+ /**
122
+ * Get step counts for a run attempt
123
+ */
124
+ export interface StepCounts {
125
+ passed: number;
126
+ failed: number;
127
+ active: number;
128
+ skipped: number;
129
+ total: number;
130
+ }
131
+ export declare function getStepCounts(db: DatabaseAdapter, runId: string, attempt?: number): Promise<StepCounts>;
132
+ /**
133
+ * Get the first failed step for a run attempt
134
+ */
135
+ export declare function getFirstFailedStep(db: DatabaseAdapter, runId: string, attempt?: number): Promise<RunStep | null>;
136
+ /**
137
+ * Get the currently running step for a run
138
+ */
139
+ export declare function getRunningStep(db: DatabaseAdapter, runId: string, attempt?: number): Promise<RunStep | null>;
140
+ /**
141
+ * Get run step summary for display
142
+ */
143
+ export interface StepSummary {
144
+ runId: string;
145
+ latestAttempt: number;
146
+ counts: StepCounts;
147
+ firstFailedStep: string | null;
148
+ runningStep: string | null;
149
+ totalDurationMs: number;
150
+ }
151
+ export declare function getSummary(db: DatabaseAdapter, runId: string): Promise<StepSummary>;
152
+ //# sourceMappingURL=run_steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run_steps.d.ts","sourceRoot":"","sources":["../../src/repos/run_steps.ts"],"names":[],"mappings":"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"}