opencastle 0.27.3 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +12 -3
  2. package/bin/cli.mjs +13 -5
  3. package/dist/cli/convoy/engine.d.ts.map +1 -1
  4. package/dist/cli/convoy/engine.js +2 -11
  5. package/dist/cli/convoy/engine.js.map +1 -1
  6. package/dist/cli/convoy/engine.test.js +2 -1
  7. package/dist/cli/convoy/engine.test.js.map +1 -1
  8. package/dist/cli/convoy/export.d.ts +1 -3
  9. package/dist/cli/convoy/export.d.ts.map +1 -1
  10. package/dist/cli/convoy/export.js +9 -88
  11. package/dist/cli/convoy/export.js.map +1 -1
  12. package/dist/cli/convoy/export.test.js +7 -186
  13. package/dist/cli/convoy/export.test.js.map +1 -1
  14. package/dist/cli/convoy/issues.js +3 -3
  15. package/dist/cli/convoy/issues.js.map +1 -1
  16. package/dist/cli/convoy/issues.test.js +4 -3
  17. package/dist/cli/convoy/issues.test.js.map +1 -1
  18. package/dist/cli/convoy/pipeline.d.ts.map +1 -1
  19. package/dist/cli/convoy/pipeline.js +0 -21
  20. package/dist/cli/convoy/pipeline.js.map +1 -1
  21. package/dist/cli/convoy/pipeline.test.js +0 -21
  22. package/dist/cli/convoy/pipeline.test.js.map +1 -1
  23. package/dist/cli/dashboard.d.ts.map +1 -1
  24. package/dist/cli/dashboard.js +32 -8
  25. package/dist/cli/dashboard.js.map +1 -1
  26. package/dist/cli/destroy.d.ts.map +1 -1
  27. package/dist/cli/destroy.js +13 -0
  28. package/dist/cli/destroy.js.map +1 -1
  29. package/dist/cli/dispute.d.ts +3 -0
  30. package/dist/cli/dispute.d.ts.map +1 -0
  31. package/dist/cli/dispute.js +25 -0
  32. package/dist/cli/dispute.js.map +1 -0
  33. package/dist/cli/doctor.d.ts +1 -1
  34. package/dist/cli/doctor.d.ts.map +1 -1
  35. package/dist/cli/doctor.js +14 -1
  36. package/dist/cli/doctor.js.map +1 -1
  37. package/dist/cli/eject.d.ts.map +1 -1
  38. package/dist/cli/eject.js +14 -0
  39. package/dist/cli/eject.js.map +1 -1
  40. package/dist/cli/init.d.ts.map +1 -1
  41. package/dist/cli/init.js +14 -0
  42. package/dist/cli/init.js.map +1 -1
  43. package/dist/cli/log.d.ts +0 -11
  44. package/dist/cli/log.d.ts.map +1 -1
  45. package/dist/cli/log.js +2 -114
  46. package/dist/cli/log.js.map +1 -1
  47. package/dist/cli/pipeline.d.ts +3 -0
  48. package/dist/cli/pipeline.d.ts.map +1 -0
  49. package/dist/cli/pipeline.js +321 -0
  50. package/dist/cli/pipeline.js.map +1 -0
  51. package/dist/cli/plan.d.ts +37 -0
  52. package/dist/cli/plan.d.ts.map +1 -1
  53. package/dist/cli/plan.js +321 -161
  54. package/dist/cli/plan.js.map +1 -1
  55. package/dist/cli/run.js +2 -2
  56. package/dist/cli/run.js.map +1 -1
  57. package/dist/cli/update.d.ts.map +1 -1
  58. package/dist/cli/update.js +16 -0
  59. package/dist/cli/update.js.map +1 -1
  60. package/dist/cli/validate.d.ts +3 -0
  61. package/dist/cli/validate.d.ts.map +1 -0
  62. package/dist/cli/validate.js +60 -0
  63. package/dist/cli/validate.js.map +1 -0
  64. package/dist/cli/watch.d.ts.map +1 -1
  65. package/dist/cli/watch.js +1 -3
  66. package/dist/cli/watch.js.map +1 -1
  67. package/package.json +5 -4
  68. package/src/cli/convoy/engine.test.ts +2 -1
  69. package/src/cli/convoy/engine.ts +2 -5
  70. package/src/cli/convoy/export.test.ts +7 -224
  71. package/src/cli/convoy/export.ts +10 -106
  72. package/src/cli/convoy/issues.test.ts +3 -2
  73. package/src/cli/convoy/issues.ts +3 -3
  74. package/src/cli/convoy/pipeline.test.ts +0 -25
  75. package/src/cli/convoy/pipeline.ts +0 -19
  76. package/src/cli/dashboard.ts +33 -8
  77. package/src/cli/destroy.ts +15 -0
  78. package/src/cli/dispute.ts +28 -0
  79. package/src/cli/doctor.ts +16 -1
  80. package/src/cli/eject.ts +16 -0
  81. package/src/cli/init.ts +16 -0
  82. package/src/cli/log.ts +2 -120
  83. package/src/cli/pipeline.ts +362 -0
  84. package/src/cli/plan.ts +357 -153
  85. package/src/cli/run.ts +2 -2
  86. package/src/cli/update.ts +18 -0
  87. package/src/cli/validate.ts +65 -0
  88. package/src/cli/watch.ts +1 -3
  89. package/src/dashboard/dist/_astro/index.Je1YjU_y.css +1 -0
  90. package/src/dashboard/dist/data/convoy-list.json +54 -9
  91. package/src/dashboard/dist/data/convoys/demo-api-v2.json +177 -0
  92. package/src/dashboard/dist/data/convoys/demo-auth-revamp.json +239 -0
  93. package/src/dashboard/dist/data/convoys/demo-dashboard-ui.json +328 -0
  94. package/src/dashboard/dist/data/convoys/demo-data-pipeline.json +187 -0
  95. package/src/dashboard/dist/data/convoys/demo-deploy-ci.json +153 -0
  96. package/src/dashboard/dist/data/convoys/demo-docs-update.json +154 -0
  97. package/src/dashboard/dist/data/convoys/demo-perf-opt.json +227 -0
  98. package/src/dashboard/dist/data/events.ndjson +115 -0
  99. package/src/dashboard/dist/data/overall-stats.json +56 -13
  100. package/src/dashboard/dist/data/pipelines.ndjson +5285 -0
  101. package/src/dashboard/dist/index.html +165 -1392
  102. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  103. package/src/dashboard/public/data/convoy-list.json +54 -9
  104. package/src/dashboard/public/data/convoys/demo-api-v2.json +177 -0
  105. package/src/dashboard/public/data/convoys/demo-auth-revamp.json +239 -0
  106. package/src/dashboard/public/data/convoys/demo-dashboard-ui.json +328 -0
  107. package/src/dashboard/public/data/convoys/demo-data-pipeline.json +187 -0
  108. package/src/dashboard/public/data/convoys/demo-deploy-ci.json +153 -0
  109. package/src/dashboard/public/data/convoys/demo-docs-update.json +154 -0
  110. package/src/dashboard/public/data/convoys/demo-perf-opt.json +227 -0
  111. package/src/dashboard/public/data/events.ndjson +115 -0
  112. package/src/dashboard/public/data/overall-stats.json +56 -13
  113. package/src/dashboard/public/data/pipelines.ndjson +5285 -0
  114. package/src/dashboard/scripts/etl.test.ts +4 -62
  115. package/src/dashboard/scripts/etl.ts +11 -10
  116. package/src/dashboard/scripts/generate-demo-db.ts +482 -115
  117. package/src/dashboard/src/pages/index.astro +235 -1638
  118. package/src/dashboard/src/styles/dashboard.css +473 -7
  119. package/src/orchestrator/prompts/brainstorm.prompt.md +1 -0
  120. package/src/orchestrator/prompts/fix-convoy.prompt.md +79 -0
  121. package/src/orchestrator/prompts/generate-convoy.prompt.md +60 -58
  122. package/src/orchestrator/prompts/generate-prd.prompt.md +126 -0
  123. package/src/orchestrator/prompts/validate-convoy.prompt.md +89 -0
  124. package/src/orchestrator/prompts/validate-prd.prompt.md +83 -0
  125. package/dist/cli/convoy/log-merge.test.d.ts +0 -2
  126. package/dist/cli/convoy/log-merge.test.d.ts.map +0 -1
  127. package/dist/cli/convoy/log-merge.test.js +0 -147
  128. package/dist/cli/convoy/log-merge.test.js.map +0 -1
  129. package/src/cli/convoy/log-merge.test.ts +0 -179
  130. package/src/dashboard/dist/_astro/index.6L3_HsPT.css +0 -1
@@ -1,4 +1,4 @@
1
- import { mkdtempSync, rmSync, realpathSync, readFileSync, existsSync, mkdirSync } from 'node:fs'
1
+ import { mkdtempSync, rmSync, realpathSync, readFileSync, existsSync } from 'node:fs'
2
2
  import { tmpdir } from 'node:os'
3
3
  import { join } from 'node:path'
4
4
  import { describe, it, expect, beforeEach, afterEach } from 'vitest'
@@ -47,14 +47,13 @@ describe('runEtl — no database', () => {
47
47
  it('returns zero counts when db is missing', async () => {
48
48
  const dbPath = join(tmpDir, 'nonexistent.db')
49
49
  const result = await runEtl({ dbPath, outputDir })
50
- expect(result).toEqual({ convoyCount: 0, taskCount: 0 })
50
+ expect(result).toEqual({ convoyCount: 0 })
51
51
  })
52
52
 
53
- it('creates the output directory structure even when db is missing', async () => {
53
+ it('creates the output directory when db is missing', async () => {
54
54
  const dbPath = join(tmpDir, 'nonexistent.db')
55
55
  await runEtl({ dbPath, outputDir })
56
56
  expect(existsSync(outputDir)).toBe(true)
57
- expect(existsSync(join(outputDir, 'convoys'))).toBe(true)
58
57
  })
59
58
  })
60
59
 
@@ -120,10 +119,9 @@ describe('runEtl — with seeded database', () => {
120
119
  }
121
120
  })
122
121
 
123
- it('returns correct convoy and task counts', async () => {
122
+ it('returns correct convoy count', async () => {
124
123
  const result = await runEtl({ dbPath, outputDir })
125
124
  expect(result.convoyCount).toBe(2)
126
- expect(result.taskCount).toBe(2)
127
125
  })
128
126
 
129
127
  it('overall-stats.json has correct convoy counts', async () => {
@@ -151,60 +149,4 @@ describe('runEtl — with seeded database', () => {
151
149
  expect(item).toHaveProperty('total_cost_usd')
152
150
  }
153
151
  })
154
-
155
- it('creates per-convoy detail JSON files', async () => {
156
- await runEtl({ dbPath, outputDir })
157
- const detailPath = join(outputDir, 'convoys', 'convoy-abc.json')
158
- expect(existsSync(detailPath)).toBe(true)
159
- const detail = JSON.parse(readFileSync(detailPath, 'utf8'))
160
- expect(detail.convoy.id).toBe('convoy-abc')
161
- expect(detail.convoy.name).toBe('Test Convoy')
162
- expect(detail.convoy.status).toBe('done')
163
- expect(detail.convoy).toHaveProperty('branch')
164
- expect(detail.convoy).toHaveProperty('total_tokens')
165
- expect(detail.convoy).toHaveProperty('total_cost_usd')
166
- expect(detail).toHaveProperty('taskSummary')
167
- expect(detail.taskSummary).toHaveProperty('total')
168
- expect(Array.isArray(detail.tasks)).toBe(true)
169
- })
170
-
171
- it('detail file has correct task fields', async () => {
172
- await runEtl({ dbPath, outputDir })
173
- const detail = JSON.parse(
174
- readFileSync(join(outputDir, 'convoys', 'convoy-abc.json'), 'utf8'),
175
- )
176
- expect(detail.tasks).toHaveLength(2)
177
- for (const task of detail.tasks) {
178
- expect(task).toHaveProperty('id')
179
- expect(task).toHaveProperty('phase')
180
- expect(task).toHaveProperty('agent')
181
- expect(task).toHaveProperty('model')
182
- expect(task).toHaveProperty('status')
183
- expect(task).toHaveProperty('retries')
184
- expect(task).toHaveProperty('started_at')
185
- expect(task).toHaveProperty('finished_at')
186
- expect(task).toHaveProperty('total_tokens')
187
- expect(task).toHaveProperty('cost_usd')
188
- expect(task).toHaveProperty('review_level')
189
- expect(task).toHaveProperty('review_verdict')
190
- expect(task).toHaveProperty('drift_score')
191
- }
192
- })
193
-
194
- it('creates detail file for each convoy', async () => {
195
- await runEtl({ dbPath, outputDir })
196
- expect(existsSync(join(outputDir, 'convoys', 'convoy-abc.json'))).toBe(true)
197
- expect(existsSync(join(outputDir, 'convoys', 'convoy-def.json'))).toBe(true)
198
- })
199
-
200
- it('detail file includes artifacts and events fields', async () => {
201
- await runEtl({ dbPath, outputDir })
202
- const detail = JSON.parse(
203
- readFileSync(join(outputDir, 'convoys', 'convoy-abc.json'), 'utf8'),
204
- )
205
- expect(Array.isArray(detail.artifacts)).toBe(true)
206
- expect(typeof detail.artifact_count).toBe('number')
207
- expect(typeof detail.has_more_events).toBe('boolean')
208
- expect(Array.isArray(detail.events)).toBe(true)
209
- })
210
152
  })
@@ -12,7 +12,6 @@ export interface EtlOptions {
12
12
 
13
13
  export interface EtlResult {
14
14
  convoyCount: number
15
- taskCount: number
16
15
  }
17
16
 
18
17
  const EMPTY_OVERALL_STATS = {
@@ -28,7 +27,6 @@ export async function runEtl(options: EtlOptions): Promise<EtlResult> {
28
27
  const { dbPath, outputDir } = options
29
28
 
30
29
  mkdirSync(outputDir, { recursive: true })
31
- mkdirSync(resolve(outputDir, 'convoys'), { recursive: true })
32
30
 
33
31
  if (!existsSync(dbPath)) {
34
32
  console.warn(` \u26a0 No convoy database found at ${dbPath}. Writing empty JSON files.`)
@@ -38,7 +36,7 @@ export async function runEtl(options: EtlOptions): Promise<EtlResult> {
38
36
  'utf8',
39
37
  )
40
38
  writeFileSync(resolve(outputDir, 'convoy-list.json'), JSON.stringify([], null, 2), 'utf8')
41
- return { convoyCount: 0, taskCount: 0 }
39
+ return { convoyCount: 0 }
42
40
  }
43
41
 
44
42
  const { createConvoyStore } = await import('../../cli/convoy/store.js')
@@ -65,6 +63,7 @@ export async function runEtl(options: EtlOptions): Promise<EtlResult> {
65
63
  name: c.name,
66
64
  status: c.status,
67
65
  created_at: c.created_at,
66
+ started_at: c.started_at,
68
67
  finished_at: c.finished_at,
69
68
  total_tokens: c.total_tokens,
70
69
  total_cost_usd: c.total_cost_usd,
@@ -75,21 +74,23 @@ export async function runEtl(options: EtlOptions): Promise<EtlResult> {
75
74
  'utf8',
76
75
  )
77
76
 
78
- let totalTasks = 0
79
- for (const convoy of allConvoys) {
80
- const detail = store.getConvoyDetails(convoy.id)
77
+ mkdirSync(resolve(outputDir, 'convoys'), { recursive: true })
78
+ let detailCount = 0
79
+ for (const c of allConvoys) {
80
+ const detail = store.getConvoyDetails(c.id)
81
81
  if (detail) {
82
- totalTasks += detail.tasks.length
83
82
  writeFileSync(
84
- resolve(outputDir, 'convoys', `${convoy.id}.json`),
83
+ resolve(outputDir, 'convoys', c.id + '.json'),
85
84
  JSON.stringify(detail, null, 2),
86
85
  'utf8',
87
86
  )
87
+ detailCount++
88
88
  }
89
89
  }
90
90
 
91
- console.log(`ETL complete: ${allConvoys.length} convoys exported, ${totalTasks} tasks.`)
92
- return { convoyCount: allConvoys.length, taskCount: totalTasks }
91
+ console.log(`ETL complete: ${allConvoys.length} convoys summarized, ${detailCount} detail files generated.`)
92
+
93
+ return { convoyCount: allConvoys.length }
93
94
  } finally {
94
95
  store.close()
95
96
  }