@thxgg/steward 0.1.17 → 0.1.19
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.
- package/.env.example +0 -6
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{BlTKcjLJ.js → BCiXS3ZV.js} +2 -2
- package/.output/public/_nuxt/BfUfZSFp.js +60 -0
- package/.output/public/_nuxt/{BMdjSp24.js → BfV4oCiT.js} +1 -1
- package/.output/public/_nuxt/{BSZqAKg4.js → Bs6UO7IT.js} +1 -1
- package/.output/public/_nuxt/C9AsKFSQ.js +1 -0
- package/.output/public/_nuxt/{BdjPva1I.js → C9jB6HQI.js} +1 -1
- package/.output/public/_nuxt/CCruYste.js +3 -0
- package/.output/public/_nuxt/CIIE0-WR.js +1 -0
- package/.output/public/_nuxt/{By7gAVcL.js → Cg4hnDua.js} +1 -1
- package/.output/public/_nuxt/CwdD8083.js +30 -0
- package/.output/public/_nuxt/{4r0X30JV.js → D2RLSKEu.js} +1 -1
- package/.output/public/_nuxt/{CbkpNvIu.js → D30YtxUg.js} +1 -1
- package/.output/public/_nuxt/{Beeir9iR.js → DEekox9p.js} +1 -1
- package/.output/public/_nuxt/{nX8Sf7cz.js → DddVAa3N.js} +1 -1
- package/.output/public/_nuxt/{Bh3vsUvl.js → MO41rxll.js} +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/627332c0-2e14-4849-8cac-e350f64ed513.json +1 -0
- package/.output/public/_nuxt/entry.Dp3jx0Yw.css +1 -0
- package/.output/public/_nuxt/f7vKgp5U.js +1 -0
- package/.output/public/_nuxt/xc3v2JZH.js +1 -0
- package/.output/server/chunks/_/git-api.mjs +1 -1
- package/.output/server/chunks/_/prd-service.mjs +177 -12
- package/.output/server/chunks/_/prd-service.mjs.map +1 -1
- package/.output/server/chunks/_/repos.mjs +272 -0
- package/.output/server/chunks/_/repos.mjs.map +1 -0
- package/.output/server/chunks/_/task-graph.mjs +19 -16
- package/.output/server/chunks/_/task-graph.mjs.map +1 -1
- package/.output/server/chunks/_/watcher.mjs +11 -35
- package/.output/server/chunks/_/watcher.mjs.map +1 -1
- package/.output/server/chunks/build/{Detail-MGwP_u2d.mjs → Detail-BcQGdJY5.mjs} +112 -46
- package/.output/server/chunks/build/Detail-BcQGdJY5.mjs.map +1 -0
- package/.output/server/chunks/build/{_prd_-C-Aj4fVa.mjs → _prd_-CD_Bds_B.mjs} +80 -7
- package/.output/server/chunks/build/_prd_-CD_Bds_B.mjs.map +1 -0
- package/.output/server/chunks/build/client.precomputed.mjs +1 -1
- package/.output/server/chunks/build/{default-Cao5eO80.mjs → default-BKKgG7HJ.mjs} +220 -24
- package/.output/server/chunks/build/default-BKKgG7HJ.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-Bf6kdO80.mjs +1 -1
- package/.output/server/chunks/build/error-500-D_bcARXN.mjs +1 -1
- package/.output/server/chunks/build/{index-ljj9uTXI.mjs → index-DE1tjHAd.mjs} +3 -4
- package/.output/server/chunks/build/index-DE1tjHAd.mjs.map +1 -0
- package/.output/server/chunks/build/nuxt-link-SvT1nf8Z.mjs +1 -1
- package/.output/server/chunks/build/{repo-graph-EuhMeFt7.mjs → repo-graph-CBfhpnd5.mjs} +25 -12
- package/.output/server/chunks/build/repo-graph-CBfhpnd5.mjs.map +1 -0
- package/.output/server/chunks/build/server.mjs +14 -14
- package/.output/server/chunks/build/styles.mjs +2 -2
- package/.output/server/chunks/build/{usePrd-f7ylhIqs.mjs → usePrd-hXZOmvAv.mjs} +113 -9
- package/.output/server/chunks/build/usePrd-hXZOmvAv.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +1051 -1365
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -1
- package/.output/server/chunks/routes/api/browse.get.mjs +24 -6
- package/.output/server/chunks/routes/api/browse.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +3 -2
- package/.output/server/chunks/routes/api/index.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/index.post.mjs +22 -8
- package/.output/server/chunks/routes/api/index.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs +20 -11
- package/.output/server/chunks/routes/api/repos/_repoId/git/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/git/diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-content.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/git/file-diff.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs +27 -3
- package/.output/server/chunks/routes/api/repos/_repoId/graph.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/archive.post.mjs +93 -0
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/archive.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/graph.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs +4 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/progress.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs +4 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks/_taskId/commits.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs +4 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug/tasks.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/prd/_prdSlug_.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs +27 -3
- package/.output/server/chunks/routes/api/repos/_repoId/prds.get.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId/refresh-git-repos.post.mjs.map +1 -1
- package/.output/server/chunks/routes/api/repos/_repoId_.delete.mjs +3 -2
- package/.output/server/chunks/routes/api/repos/_repoId_.delete.mjs.map +1 -1
- package/.output/server/chunks/routes/api/runtime.get.mjs +2 -2
- package/.output/server/chunks/routes/api/state-migration/status.get.mjs +21 -0
- package/.output/server/chunks/routes/api/state-migration/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/watch.get.mjs +3 -2
- package/.output/server/chunks/routes/api/watch.get.mjs.map +1 -1
- package/.output/server/chunks/routes/renderer.mjs +1 -1
- package/.output/server/index.mjs +2 -2
- package/.output/server/package.json +1 -1
- package/README.md +5 -7
- package/dist/host/src/api/repos.js +0 -2
- package/dist/host/src/api/state.js +1 -7
- package/dist/host/src/index.js +2 -7
- package/dist/host/src/ui.js +2 -7
- package/dist/server/utils/db.js +15 -0
- package/dist/server/utils/prd-archive.js +53 -0
- package/dist/server/utils/prd-service.js +27 -11
- package/dist/server/utils/prd-state.js +11 -122
- package/dist/server/utils/repos.js +14 -4
- package/dist/server/utils/state-migration.js +225 -0
- package/dist/server/utils/state-schema.js +181 -4
- package/dist/server/utils/task-graph.js +21 -14
- package/package.json +1 -1
- package/.output/public/_nuxt/CbJfCtEa.js +0 -1
- package/.output/public/_nuxt/CmhLcqDu.js +0 -1
- package/.output/public/_nuxt/DC6iPLz1.js +0 -30
- package/.output/public/_nuxt/DD--ojY9.js +0 -3
- package/.output/public/_nuxt/DhKWRjCh.js +0 -60
- package/.output/public/_nuxt/builds/meta/f3f42dbd-d501-442b-871c-3d06157e7aa1.json +0 -1
- package/.output/public/_nuxt/c1sXju8w.js +0 -1
- package/.output/public/_nuxt/eGCjCghR.js +0 -1
- package/.output/public/_nuxt/entry.LcDOtJnR.css +0 -1
- package/.output/server/chunks/build/Detail-MGwP_u2d.mjs.map +0 -1
- package/.output/server/chunks/build/_prd_-C-Aj4fVa.mjs.map +0 -1
- package/.output/server/chunks/build/default-Cao5eO80.mjs.map +0 -1
- package/.output/server/chunks/build/index-ByZO4Bvq.mjs +0 -76
- package/.output/server/chunks/build/index-ByZO4Bvq.mjs.map +0 -1
- package/.output/server/chunks/build/index-ljj9uTXI.mjs.map +0 -1
- package/.output/server/chunks/build/repo-graph-EuhMeFt7.mjs.map +0 -1
- package/.output/server/chunks/build/usePrd-f7ylhIqs.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks/[taskId]/commits.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commits.get.mjs","sources":["../../../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks/[taskId]/commits.get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,SAAA,sBAAA,OAAA,EAAA;AACA,EAAA,OAAA,OAAA,CAAA,OAAA,CAAA,MAAA,EAAA,GAAA,EAAA,IAAA,EAAA;AACA;AAEA,oBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,MAAA,CAAA;AACA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA;AACA,IAAA,OAAA,MAAA,kBAAA,CAAA,IAAA,EAAA,OAAA,EAAA,MAAA,CAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,OAAA,GAAA,qBAAA,CAAA,KAAA,CAAA,OAAA,CAAA;AAEA,IAAA,IAAA,OAAA,CAAA,QAAA,CAAA,kBAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA,kBAAA;AAAA,QACA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,gCAAA;AAAA,MACA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError
|
|
2
|
-
import {
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError } from '../../../../../../nitro/nitro.mjs';
|
|
2
|
+
import { f as readPrdTasks } from '../../../../../../_/prd-service.mjs';
|
|
3
|
+
import { a as getRepoById } from '../../../../../../_/repos.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
5
6
|
import 'node:events';
|
|
@@ -7,9 +8,9 @@ import 'node:buffer';
|
|
|
7
8
|
import 'node:fs';
|
|
8
9
|
import 'node:path';
|
|
9
10
|
import 'node:crypto';
|
|
10
|
-
import 'node:url';
|
|
11
11
|
import 'node:os';
|
|
12
12
|
import 'zod';
|
|
13
|
+
import 'node:url';
|
|
13
14
|
import '../../../../../../_/git.mjs';
|
|
14
15
|
import 'node:child_process';
|
|
15
16
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.get.mjs","sources":["../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tasks.get.mjs","sources":["../../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug]/tasks.get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,SAAA,sBAAA,OAAA,EAAA;AACA,EAAA,OAAA,OAAA,CAAA,OAAA,CAAA,MAAA,EAAA,GAAA,EAAA,IAAA,EAAA;AACA;AAEA,kBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,MAAA,CAAA;AACA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA;AACA,IAAA,OAAA,MAAA,YAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,OAAA,GAAA,qBAAA,CAAA,KAAA,CAAA,OAAA,CAAA;AAEA,IAAA,IAAA,OAAA,CAAA,QAAA,CAAA,kBAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA,kBAAA;AAAA,QACA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,2BAAA;AAAA,MACA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError } from '../../../../../nitro/nitro.mjs';
|
|
2
2
|
import { r as readPrdDocument } from '../../../../../_/prd-service.mjs';
|
|
3
|
+
import { a as getRepoById } from '../../../../../_/repos.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
5
6
|
import 'node:events';
|
|
@@ -7,9 +8,9 @@ import 'node:buffer';
|
|
|
7
8
|
import 'node:fs';
|
|
8
9
|
import 'node:path';
|
|
9
10
|
import 'node:crypto';
|
|
10
|
-
import 'node:url';
|
|
11
11
|
import 'node:os';
|
|
12
12
|
import 'zod';
|
|
13
|
+
import 'node:url';
|
|
13
14
|
import '../../../../../_/git.mjs';
|
|
14
15
|
import 'node:child_process';
|
|
15
16
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_prdSlug_.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug].get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_prdSlug_.get.mjs","sources":["../../../../../../../../server/api/repos/[repoId]/prd/[prdSlug].get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,SAAA,sBAAA,OAAA,EAAA;AACA,EAAA,OAAA,OAAA,CAAA,OAAA,CAAA,MAAA,EAAA,GAAA,EAAA,IAAA,EAAA;AACA;AAEA,sBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,OAAA,GAAA,cAAA,CAAA,KAAA,EAAA,SAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,MAAA,CAAA;AACA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA;AACA,IAAA,OAAA,MAAA,eAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,OAAA,GAAA,qBAAA,CAAA,KAAA,CAAA,OAAA,CAAA;AAEA,IAAA,IAAA,OAAA,CAAA,QAAA,CAAA,kBAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA,kBAAA;AAAA,QACA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,IAAA,OAAA,CAAA,QAAA,CAAA,eAAA,CAAA,EAAA;AACA,MAAA,MAAA,WAAA,CAAA;AAAA,QACA,UAAA,EAAA,GAAA;AAAA,QACA,aAAA,EAAA;AAAA,OACA,CAAA;AAAA,IACA;AAEA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,6BAAA;AAAA,MACA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam,
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, g as getQuery, c as createError } from '../../../../nitro/nitro.mjs';
|
|
2
2
|
import { l as listPrdDocuments } from '../../../../_/prd-service.mjs';
|
|
3
|
+
import { a as getRepoById } from '../../../../_/repos.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
5
6
|
import 'node:events';
|
|
@@ -7,17 +8,40 @@ import 'node:buffer';
|
|
|
7
8
|
import 'node:fs';
|
|
8
9
|
import 'node:path';
|
|
9
10
|
import 'node:crypto';
|
|
10
|
-
import 'node:url';
|
|
11
11
|
import 'node:os';
|
|
12
12
|
import 'zod';
|
|
13
|
+
import 'node:url';
|
|
13
14
|
import '../../../../_/git.mjs';
|
|
14
15
|
import 'node:child_process';
|
|
15
16
|
|
|
16
17
|
function normalizeErrorMessage(message) {
|
|
17
18
|
return message.replace(/\s+/g, " ").trim();
|
|
18
19
|
}
|
|
20
|
+
function parseIncludeArchived(rawValue) {
|
|
21
|
+
const value = Array.isArray(rawValue) ? rawValue[0] : rawValue;
|
|
22
|
+
if (value === void 0) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (typeof value === "boolean") {
|
|
26
|
+
return value;
|
|
27
|
+
}
|
|
28
|
+
if (typeof value === "string") {
|
|
29
|
+
const normalized = value.trim().toLowerCase();
|
|
30
|
+
if (normalized.length === 0 || normalized === "0" || normalized === "false" || normalized === "no" || normalized === "off") {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
if (normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on") {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
throw createError({
|
|
38
|
+
statusCode: 400,
|
|
39
|
+
statusMessage: "Invalid includeArchived query value"
|
|
40
|
+
});
|
|
41
|
+
}
|
|
19
42
|
const prds_get = defineEventHandler(async (event) => {
|
|
20
43
|
const repoId = getRouterParam(event, "repoId");
|
|
44
|
+
const includeArchived = parseIncludeArchived(getQuery(event).includeArchived);
|
|
21
45
|
if (!repoId) {
|
|
22
46
|
throw createError({
|
|
23
47
|
statusCode: 400,
|
|
@@ -32,7 +56,7 @@ const prds_get = defineEventHandler(async (event) => {
|
|
|
32
56
|
});
|
|
33
57
|
}
|
|
34
58
|
try {
|
|
35
|
-
return await listPrdDocuments(repo);
|
|
59
|
+
return await listPrdDocuments(repo, { includeArchived });
|
|
36
60
|
} catch (error) {
|
|
37
61
|
throw createError({
|
|
38
62
|
statusCode: 500,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prds.get.mjs","sources":["../../../../../../../server/api/repos/[repoId]/prds.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prds.get.mjs","sources":["../../../../../../../server/api/repos/[repoId]/prds.get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,SAAA,sBAAA,OAAA,EAAA;AACA,EAAA,OAAA,OAAA,CAAA,OAAA,CAAA,MAAA,EAAA,GAAA,EAAA,IAAA,EAAA;AACA;AAEA,SAAA,qBAAA,QAAA,EAAA;AACA,EAAA,MAAA,QAAA,KAAA,CAAA,OAAA,CAAA,QAAA,CAAA,GAAA,QAAA,CAAA,CAAA,CAAA,GAAA,QAAA;AAEA,EAAA,IAAA,UAAA,MAAA,EAAA;AACA,IAAA,OAAA,KAAA;AAAA,EACA;AAEA,EAAA,IAAA,OAAA,UAAA,SAAA,EAAA;AACA,IAAA,OAAA,KAAA;AAAA,EACA;AAEA,EAAA,IAAA,OAAA,UAAA,QAAA,EAAA;AACA,IAAA,MAAA,UAAA,GAAA,KAAA,CAAA,IAAA,EAAA,CAAA,WAAA,EAAA;AACA,IAAA,IAAA,UAAA,CAAA,MAAA,KAAA,CAAA,IAAA,UAAA,KAAA,GAAA,IAAA,eAAA,OAAA,IAAA,UAAA,KAAA,IAAA,IAAA,UAAA,KAAA,KAAA,EAAA;AACA,MAAA,OAAA,KAAA;AAAA,IACA;AAEA,IAAA,IAAA,eAAA,GAAA,IAAA,UAAA,KAAA,UAAA,UAAA,KAAA,KAAA,IAAA,eAAA,IAAA,EAAA;AACA,MAAA,OAAA,IAAA;AAAA,IACA;AAAA,EACA;AAEA,EAAA,MAAA,WAAA,CAAA;AAAA,IACA,UAAA,EAAA,GAAA;AAAA,IACA,aAAA,EAAA;AAAA,GACA,CAAA;AACA;AAEA,iBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AACA,EAAA,MAAA,eAAA,GAAA,oBAAA,CAAA,QAAA,CAAA,KAAA,EAAA,eAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,MAAA,CAAA;AACA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,IAAA;AACA,IAAA,OAAA,MAAA,gBAAA,CAAA,IAAA,EAAA,EAAA,iBAAA,CAAA;AAAA,EACA,SAAA,KAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA,yBAAA;AAAA,MACA,OAAA,EAAA,qBAAA,CAAA,KAAA,CAAA,OAAA;AAAA,KACA,CAAA;AAAA,EACA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError } from '../../../../nitro/nitro.mjs';
|
|
2
|
+
import { a as getRepoById, d as discoverGitRepos, u as updateRepoGitRepos } from '../../../../_/repos.mjs';
|
|
2
3
|
import 'node:http';
|
|
3
4
|
import 'node:https';
|
|
4
5
|
import 'node:events';
|
|
@@ -6,9 +7,9 @@ import 'node:buffer';
|
|
|
6
7
|
import 'node:fs';
|
|
7
8
|
import 'node:path';
|
|
8
9
|
import 'node:crypto';
|
|
9
|
-
import 'node:url';
|
|
10
10
|
import 'node:os';
|
|
11
11
|
import 'zod';
|
|
12
|
+
import 'node:url';
|
|
12
13
|
|
|
13
14
|
const refreshGitRepos_post = defineEventHandler(async (event) => {
|
|
14
15
|
const repoId = getRouterParam(event, "repoId");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-git-repos.post.mjs","sources":["../../../../../../../server/api/repos/[repoId]/refresh-git-repos.post.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"refresh-git-repos.post.mjs","sources":["../../../../../../../server/api/repos/[repoId]/refresh-git-repos.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAEA,6BAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,MAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AAEA,EAAA,IAAA,CAAA,MAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,IAAA,GAAA,MAAA,WAAA,CAAA,MAAA,CAAA;AACA,EAAA,IAAA,CAAA,IAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAGA,EAAA,MAAA,QAAA,GAAA,MAAA,gBAAA,CAAA,IAAA,CAAA,IAAA,CAAA;AAEA,EAAA,MAAA,mBAAA,IAAA,CAAA,EAAA,EAAA,SAAA,MAAA,GAAA,CAAA,GAAA,WAAA,MAAA,CAAA;AAEA,EAAA,OAAA;AAAA,IACA,YAAA,QAAA,CAAA,MAAA;AAAA,IACA;AAAA,GACA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { d as defineEventHandler, a as getRouterParam, c as createError
|
|
1
|
+
import { d as defineEventHandler, a as getRouterParam, c as createError } from '../../../nitro/nitro.mjs';
|
|
2
|
+
import { r as removeRepo } from '../../../_/repos.mjs';
|
|
2
3
|
import { r as refreshWatcher } from '../../../_/watcher.mjs';
|
|
3
4
|
import 'node:http';
|
|
4
5
|
import 'node:https';
|
|
@@ -7,9 +8,9 @@ import 'node:buffer';
|
|
|
7
8
|
import 'node:fs';
|
|
8
9
|
import 'node:path';
|
|
9
10
|
import 'node:crypto';
|
|
10
|
-
import 'node:url';
|
|
11
11
|
import 'node:os';
|
|
12
12
|
import 'zod';
|
|
13
|
+
import 'node:url';
|
|
13
14
|
import 'chokidar';
|
|
14
15
|
|
|
15
16
|
const _repoId__delete = defineEventHandler(async (event) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_repoId_.delete.mjs","sources":["../../../../../../server/api/repos/[repoId].delete.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"_repoId_.delete.mjs","sources":["../../../../../../server/api/repos/[repoId].delete.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,wBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AACA,EAAA,MAAA,EAAA,GAAA,cAAA,CAAA,KAAA,EAAA,QAAA,CAAA;AAEA,EAAA,IAAA,CAAA,EAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAEA,EAAA,MAAA,OAAA,GAAA,MAAA,UAAA,CAAA,EAAA,CAAA;AAEA,EAAA,IAAA,CAAA,OAAA,EAAA;AACA,IAAA,MAAA,WAAA,CAAA;AAAA,MACA,UAAA,EAAA,GAAA;AAAA,MACA,aAAA,EAAA;AAAA,KACA,CAAA;AAAA,EACA;AAGA,EAAA,MAAA,cAAA,EAAA;AAEA,EAAA,OAAA,EAAA,SAAA,IAAA,EAAA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as defineEventHandler,
|
|
1
|
+
import { d as defineEventHandler, u as useRuntimeConfig, s as setHeader } from '../../nitro/nitro.mjs';
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
3
|
import 'node:http';
|
|
4
4
|
import 'node:https';
|
|
@@ -6,9 +6,9 @@ import 'node:events';
|
|
|
6
6
|
import 'node:buffer';
|
|
7
7
|
import 'node:fs';
|
|
8
8
|
import 'node:path';
|
|
9
|
-
import 'node:url';
|
|
10
9
|
import 'node:os';
|
|
11
10
|
import 'zod';
|
|
11
|
+
import 'node:url';
|
|
12
12
|
|
|
13
13
|
const SERVER_INSTANCE_ID = randomUUID();
|
|
14
14
|
const SERVER_STARTED_AT = (/* @__PURE__ */ new Date()).toISOString();
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { d as defineEventHandler, k as startStateMigration, l as getStateMigrationStatus, s as setHeader } from '../../../nitro/nitro.mjs';
|
|
2
|
+
import 'node:http';
|
|
3
|
+
import 'node:https';
|
|
4
|
+
import 'node:events';
|
|
5
|
+
import 'node:buffer';
|
|
6
|
+
import 'node:fs';
|
|
7
|
+
import 'node:path';
|
|
8
|
+
import 'node:crypto';
|
|
9
|
+
import 'node:os';
|
|
10
|
+
import 'zod';
|
|
11
|
+
import 'node:url';
|
|
12
|
+
|
|
13
|
+
const status_get = defineEventHandler((event) => {
|
|
14
|
+
void startStateMigration();
|
|
15
|
+
const status = getStateMigrationStatus();
|
|
16
|
+
setHeader(event, "Cache-Control", "no-store, no-cache, must-revalidate");
|
|
17
|
+
return status;
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export { status_get as default };
|
|
21
|
+
//# sourceMappingURL=status.get.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.get.mjs","sources":["../../../../../../server/api/state-migration/status.get.ts"],"names":[],"mappings":";;;;;;;;;;;;AAEA,mBAAA,kBAAA,CAAA,CAAA,KAAA,KAAA;AACA,EAAA,KAAA,mBAAA,EAAA;AAEA,EAAA,MAAA,SAAA,uBAAA,EAAA;AAEA,EAAA,SAAA,CAAA,KAAA,EAAA,iBAAA,qCAAA,CAAA;AAEA,EAAA,OAAA,MAAA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { d as defineEventHandler, s as setHeader,
|
|
1
|
+
import { d as defineEventHandler, s as setHeader, m as addChangeListener } from '../../nitro/nitro.mjs';
|
|
2
2
|
import { i as initWatcher } from '../../_/watcher.mjs';
|
|
3
3
|
import 'node:http';
|
|
4
4
|
import 'node:https';
|
|
@@ -7,10 +7,11 @@ import 'node:buffer';
|
|
|
7
7
|
import 'node:fs';
|
|
8
8
|
import 'node:path';
|
|
9
9
|
import 'node:crypto';
|
|
10
|
-
import 'node:url';
|
|
11
10
|
import 'node:os';
|
|
12
11
|
import 'zod';
|
|
12
|
+
import 'node:url';
|
|
13
13
|
import 'chokidar';
|
|
14
|
+
import '../../_/repos.mjs';
|
|
14
15
|
|
|
15
16
|
const watch_get = defineEventHandler(async (event) => {
|
|
16
17
|
await initWatcher();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.get.mjs","sources":["../../../../../server/api/watch.get.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watch.get.mjs","sources":["../../../../../server/api/watch.get.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAGA,kBAAA,kBAAA,CAAA,OAAA,KAAA,KAAA;AAEA,EAAA,MAAA,WAAA,EAAA;AAGA,EAAA,SAAA,CAAA,KAAA,EAAA,gBAAA,mBAAA,CAAA;AACA,EAAA,SAAA,CAAA,KAAA,EAAA,iBAAA,UAAA,CAAA;AACA,EAAA,SAAA,CAAA,KAAA,EAAA,cAAA,YAAA,CAAA;AAGA,EAAA,MAAA,MAAA,GAAA,IAAA,cAAA,CAAA;AAAA,IACA,MAAA,UAAA,EAAA;AAEA,MAAA,MAAA,UAAA,GAAA,SAAA,IAAA,CAAA,SAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA;;AAAA,CAAA;AACA,MAAA,UAAA,CAAA,QAAA,IAAA,WAAA,EAAA,CAAA,MAAA,CAAA,UAAA,CAAA,CAAA;AAGA,MAAA,MAAA,cAAA,GAAA,iBAAA,CAAA,CAAA,SAAA,KAAA;AACA,QAAA,MAAA,GAAA,GAAA,CAAA,MAAA,EAAA,IAAA,CAAA,SAAA,CAAA,SAAA,CAAA;;AAAA,CAAA;AACA,QAAA,IAAA;AACA,UAAA,UAAA,CAAA,QAAA,IAAA,WAAA,EAAA,CAAA,MAAA,CAAA,GAAA,CAAA,CAAA;AAAA,QACA,CAAA,CAAA,MAAA;AAEA,UAAA,cAAA,EAAA;AAAA,QACA;AAAA,MACA,CAAA,CAAA;AAGA,MAAA,KAAA,CAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,OAAA,EAAA,MAAA;AACA,QAAA,cAAA,EAAA;AACA,QAAA,IAAA;AACA,UAAA,UAAA,CAAA,KAAA,EAAA;AAAA,QACA,CAAA,CAAA,MAAA;AAAA,QAEA;AAAA,MACA,CAAA,CAAA;AAGA,MAAA,MAAA,iBAAA,GAAA,YAAA,MAAA;AACA,QAAA,IAAA;AACA,UAAA,MAAA,IAAA,GAAA,CAAA;;AAAA,CAAA;AACA,UAAA,UAAA,CAAA,QAAA,IAAA,WAAA,EAAA,CAAA,MAAA,CAAA,IAAA,CAAA,CAAA;AAAA,QACA,CAAA,CAAA,MAAA;AACA,UAAA,aAAA,CAAA,iBAAA,CAAA;AAAA,QACA;AAAA,MACA,GAAA,GAAA,CAAA;AAEA,MAAA,KAAA,CAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,OAAA,EAAA,MAAA;AACA,QAAA,aAAA,CAAA,iBAAA,CAAA;AAAA,MACA,CAAA,CAAA;AAAA,IACA;AAAA,GACA,CAAA;AAEA,EAAA,OAAA,IAAA,SAAA,MAAA,EAAA;AAAA,IACA,OAAA,EAAA;AAAA,MACA,cAAA,EAAA,mBAAA;AAAA,MACA,eAAA,EAAA,UAAA;AAAA,MACA,YAAA,EAAA;AAAA;AACA,GACA,CAAA;AACA,CAAA,CAAA;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createRenderer, getRequestDependencies, getPreloadLinks, getPrefetchLinks } from 'vue-bundle-renderer/runtime';
|
|
2
|
-
import {
|
|
2
|
+
import { n as joinRelativeURL, u as useRuntimeConfig, o as getResponseStatusText, q as getResponseStatus, t as defineRenderHandler, g as getQuery, c as createError, v as destr, w as getRouteRules, x as joinURL, y as useNitroApp } from '../nitro/nitro.mjs';
|
|
3
3
|
import { renderToString } from 'vue/server-renderer';
|
|
4
4
|
import { createHead as createHead$1, propsToString, renderSSRHead } from 'unhead/server';
|
|
5
5
|
import { stringify, uneval } from 'devalue';
|
package/.output/server/index.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import process from 'node:process';globalThis._importMeta_={url:import.meta.url,env:process.env};import 'node:http';
|
|
2
2
|
import 'node:https';
|
|
3
|
-
export {
|
|
3
|
+
export { O as default } from './chunks/nitro/nitro.mjs';
|
|
4
4
|
import 'node:events';
|
|
5
5
|
import 'node:buffer';
|
|
6
6
|
import 'node:fs';
|
|
7
7
|
import 'node:path';
|
|
8
8
|
import 'node:crypto';
|
|
9
|
-
import 'node:url';
|
|
10
9
|
import 'node:os';
|
|
11
10
|
import 'zod';
|
|
11
|
+
import 'node:url';
|
|
12
12
|
//# sourceMappingURL=index.mjs.map
|
package/README.md
CHANGED
|
@@ -55,7 +55,6 @@ Note: `execute` runs in a VM sandbox by design, so globals like `process` are in
|
|
|
55
55
|
```bash
|
|
56
56
|
prd ui
|
|
57
57
|
prd ui --port 3100 --host 127.0.0.1
|
|
58
|
-
prd ui --host 0.0.0.0 --allow-remote
|
|
59
58
|
prd mcp
|
|
60
59
|
```
|
|
61
60
|
|
|
@@ -144,11 +143,12 @@ Detailed API docs and examples: `docs/MCP.md`
|
|
|
144
143
|
|
|
145
144
|
Steward reads local filesystem and git metadata by design.
|
|
146
145
|
|
|
147
|
-
-
|
|
148
|
-
- Non-loopback
|
|
149
|
-
- Optional token auth for remote API access: set `STEWARD_API_TOKEN`
|
|
150
|
-
- For browser sessions, you can initialize the auth cookie with `?token=<STEWARD_API_TOKEN>`
|
|
146
|
+
- UI/API accept loopback requests only
|
|
147
|
+
- Non-loopback requests are rejected
|
|
151
148
|
- Treat as a workstation tool, not a hosted multi-user service
|
|
149
|
+
- `npm run dev` skips loopback enforcement because Nuxt dev proxying can mask loopback source addresses
|
|
150
|
+
|
|
151
|
+
On startup, Steward also performs a one-time automatic state migration when legacy `progress_json` data is detected. During this migration, the UI shows a blocking progress overlay until migration completes.
|
|
152
152
|
|
|
153
153
|
## Storage
|
|
154
154
|
|
|
@@ -174,8 +174,6 @@ npm run build
|
|
|
174
174
|
| `PRD_STATE_DB_PATH` | Absolute path to SQLite DB file |
|
|
175
175
|
| `PRD_STATE_HOME` | Base directory for DB (`state.db` inside) |
|
|
176
176
|
| `XDG_DATA_HOME` | Fallback base path for default DB location |
|
|
177
|
-
| `STEWARD_ALLOW_REMOTE` | Set to `1` to allow non-loopback requests |
|
|
178
|
-
| `STEWARD_API_TOKEN` | Optional token required for remote `/api/*` access |
|
|
179
177
|
|
|
180
178
|
## OpenCode Bundle
|
|
181
179
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { addRepo, discoverGitRepos, getRepoById, getRepos, removeRepo, updateRepoGitRepos, validateRepoPath } from '../../../server/utils/repos.js';
|
|
2
|
-
import { migrateLegacyStateForRepo } from '../../../server/utils/prd-state.js';
|
|
3
2
|
import { requireCurrentRepo, requireRepo } from './repo-context.js';
|
|
4
3
|
export const repos = {
|
|
5
4
|
async list() {
|
|
@@ -17,7 +16,6 @@ export const repos = {
|
|
|
17
16
|
throw new Error(validation.error || 'Invalid repository path');
|
|
18
17
|
}
|
|
19
18
|
const repo = await addRepo(path, name);
|
|
20
|
-
await migrateLegacyStateForRepo(repo);
|
|
21
19
|
return repo;
|
|
22
20
|
},
|
|
23
21
|
async remove(repoId) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getPrdState, getPrdStateSummaries,
|
|
1
|
+
import { getPrdState, getPrdStateSummaries, upsertPrdState } from '../../../server/utils/prd-state.js';
|
|
2
2
|
import { parseProgressFile, parseTasksFile } from '../../../server/utils/state-schema.js';
|
|
3
3
|
import { requireCurrentRepo, requireRepo, requireRepoByPath } from './repo-context.js';
|
|
4
4
|
function mapStateUpdate(payload) {
|
|
@@ -18,34 +18,28 @@ function mapSummaryMap(summaries) {
|
|
|
18
18
|
export const state = {
|
|
19
19
|
async get(repoId, slug) {
|
|
20
20
|
const repo = await requireRepo(repoId);
|
|
21
|
-
await migrateLegacyStateForRepo(repo);
|
|
22
21
|
return await getPrdState(repo.id, slug);
|
|
23
22
|
},
|
|
24
23
|
async getByPath(repoPath, slug) {
|
|
25
24
|
const repo = await requireRepoByPath(repoPath);
|
|
26
|
-
await migrateLegacyStateForRepo(repo);
|
|
27
25
|
return await getPrdState(repo.id, slug);
|
|
28
26
|
},
|
|
29
27
|
async getCurrent(slug) {
|
|
30
28
|
const repo = await requireCurrentRepo();
|
|
31
|
-
await migrateLegacyStateForRepo(repo);
|
|
32
29
|
return await getPrdState(repo.id, slug);
|
|
33
30
|
},
|
|
34
31
|
async summaries(repoId) {
|
|
35
32
|
const repo = await requireRepo(repoId);
|
|
36
|
-
await migrateLegacyStateForRepo(repo);
|
|
37
33
|
const summaries = await getPrdStateSummaries(repo.id);
|
|
38
34
|
return mapSummaryMap(summaries);
|
|
39
35
|
},
|
|
40
36
|
async summariesByPath(repoPath) {
|
|
41
37
|
const repo = await requireRepoByPath(repoPath);
|
|
42
|
-
await migrateLegacyStateForRepo(repo);
|
|
43
38
|
const summaries = await getPrdStateSummaries(repo.id);
|
|
44
39
|
return mapSummaryMap(summaries);
|
|
45
40
|
},
|
|
46
41
|
async summariesCurrent() {
|
|
47
42
|
const repo = await requireCurrentRepo();
|
|
48
|
-
await migrateLegacyStateForRepo(repo);
|
|
49
43
|
const summaries = await getPrdStateSummaries(repo.id);
|
|
50
44
|
return mapSummaryMap(summaries);
|
|
51
45
|
},
|
package/dist/host/src/index.js
CHANGED
|
@@ -4,7 +4,7 @@ function printUsage() {
|
|
|
4
4
|
console.log(`prd - Steward CLI
|
|
5
5
|
|
|
6
6
|
Usage:
|
|
7
|
-
prd ui [--preview] [--port <port>] [--host <host>]
|
|
7
|
+
prd ui [--preview] [--port <port>] [--host <host>]
|
|
8
8
|
prd mcp
|
|
9
9
|
|
|
10
10
|
Commands:
|
|
@@ -15,7 +15,6 @@ Options:
|
|
|
15
15
|
--preview Deprecated; ignored (kept for compatibility)
|
|
16
16
|
--port <port> Port for ui mode
|
|
17
17
|
--host <host> Host for ui mode
|
|
18
|
-
--allow-remote Allow non-loopback host binding
|
|
19
18
|
-h, --help Show this help message
|
|
20
19
|
`);
|
|
21
20
|
}
|
|
@@ -27,7 +26,7 @@ function parsePort(value) {
|
|
|
27
26
|
return parsed;
|
|
28
27
|
}
|
|
29
28
|
function parseUiArgs(args) {
|
|
30
|
-
const options = { preview: false
|
|
29
|
+
const options = { preview: false };
|
|
31
30
|
for (let i = 0; i < args.length; i++) {
|
|
32
31
|
const arg = args[i];
|
|
33
32
|
if (arg === '--preview') {
|
|
@@ -52,10 +51,6 @@ function parseUiArgs(args) {
|
|
|
52
51
|
i += 1;
|
|
53
52
|
continue;
|
|
54
53
|
}
|
|
55
|
-
if (arg === '--allow-remote') {
|
|
56
|
-
options.allowRemote = true;
|
|
57
|
-
continue;
|
|
58
|
-
}
|
|
59
54
|
throw new Error(`Unknown option for ui: ${arg}`);
|
|
60
55
|
}
|
|
61
56
|
return options;
|
package/dist/host/src/ui.js
CHANGED
|
@@ -35,10 +35,8 @@ export async function runUi(options) {
|
|
|
35
35
|
const env = { ...process.env };
|
|
36
36
|
const hostFromEnv = env.NITRO_HOST || env.HOST;
|
|
37
37
|
const requestedHost = (options.host || hostFromEnv || DEFAULT_UI_HOST).trim();
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
throw new Error(`Refusing to bind UI to non-loopback host "${requestedHost}" without explicit opt-in. `
|
|
41
|
-
+ 'Use --allow-remote or set STEWARD_ALLOW_REMOTE=1.');
|
|
38
|
+
if (!isLoopbackHost(requestedHost)) {
|
|
39
|
+
throw new Error(`Refusing to bind UI to non-loopback host "${requestedHost}". Steward only supports loopback hosts.`);
|
|
42
40
|
}
|
|
43
41
|
env.NODE_ENV = env.NODE_ENV || 'production';
|
|
44
42
|
if (options.port !== undefined) {
|
|
@@ -48,9 +46,6 @@ export async function runUi(options) {
|
|
|
48
46
|
}
|
|
49
47
|
env.HOST = requestedHost;
|
|
50
48
|
env.NITRO_HOST = requestedHost;
|
|
51
|
-
if (allowRemote) {
|
|
52
|
-
env.STEWARD_ALLOW_REMOTE = '1';
|
|
53
|
-
}
|
|
54
49
|
const child = spawn(process.execPath, args, {
|
|
55
50
|
cwd: packageRoot,
|
|
56
51
|
stdio: 'inherit',
|
package/dist/server/utils/db.js
CHANGED
|
@@ -182,7 +182,22 @@ async function initializeDatabase() {
|
|
|
182
182
|
FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE CASCADE
|
|
183
183
|
);
|
|
184
184
|
|
|
185
|
+
CREATE TABLE IF NOT EXISTS prd_archives (
|
|
186
|
+
repo_id TEXT NOT NULL,
|
|
187
|
+
slug TEXT NOT NULL,
|
|
188
|
+
archived_at TEXT NOT NULL,
|
|
189
|
+
PRIMARY KEY (repo_id, slug),
|
|
190
|
+
FOREIGN KEY (repo_id) REFERENCES repos(id) ON DELETE CASCADE
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
CREATE TABLE IF NOT EXISTS app_meta (
|
|
194
|
+
key TEXT PRIMARY KEY,
|
|
195
|
+
value TEXT NOT NULL,
|
|
196
|
+
updated_at TEXT NOT NULL
|
|
197
|
+
);
|
|
198
|
+
|
|
185
199
|
CREATE INDEX IF NOT EXISTS idx_prd_states_repo_id ON prd_states(repo_id);
|
|
200
|
+
CREATE INDEX IF NOT EXISTS idx_prd_archives_repo_id ON prd_archives(repo_id);
|
|
186
201
|
`);
|
|
187
202
|
return adapter;
|
|
188
203
|
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { emitChange } from './change-events.js';
|
|
2
|
+
import { dbAll, dbGet, dbRun } from './db.js';
|
|
3
|
+
function toArchiveState(archivedAt) {
|
|
4
|
+
if (!archivedAt) {
|
|
5
|
+
return { archived: false };
|
|
6
|
+
}
|
|
7
|
+
return {
|
|
8
|
+
archived: true,
|
|
9
|
+
archivedAt
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export async function getPrdArchiveMap(repoId) {
|
|
13
|
+
const rows = await dbAll('SELECT slug, archived_at FROM prd_archives WHERE repo_id = ?', [repoId]);
|
|
14
|
+
const archiveMap = new Map();
|
|
15
|
+
for (const row of rows) {
|
|
16
|
+
archiveMap.set(row.slug, row.archived_at);
|
|
17
|
+
}
|
|
18
|
+
return archiveMap;
|
|
19
|
+
}
|
|
20
|
+
export async function getPrdArchiveState(repoId, slug) {
|
|
21
|
+
const row = await dbGet('SELECT archived_at FROM prd_archives WHERE repo_id = ? AND slug = ?', [repoId, slug]);
|
|
22
|
+
return toArchiveState(row?.archived_at);
|
|
23
|
+
}
|
|
24
|
+
export async function setPrdArchived(repoId, slug, archived) {
|
|
25
|
+
if (archived) {
|
|
26
|
+
const archivedAt = new Date().toISOString();
|
|
27
|
+
const result = await dbRun(`
|
|
28
|
+
INSERT INTO prd_archives (repo_id, slug, archived_at)
|
|
29
|
+
VALUES (?, ?, ?)
|
|
30
|
+
ON CONFLICT(repo_id, slug) DO NOTHING
|
|
31
|
+
`, [repoId, slug, archivedAt]);
|
|
32
|
+
const row = await dbGet('SELECT archived_at FROM prd_archives WHERE repo_id = ? AND slug = ?', [repoId, slug]);
|
|
33
|
+
if (result.changes > 0) {
|
|
34
|
+
emitChange({
|
|
35
|
+
type: 'change',
|
|
36
|
+
path: `state://${repoId}/${slug}.archive`,
|
|
37
|
+
repoId,
|
|
38
|
+
category: 'prd'
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return toArchiveState(row?.archived_at || archivedAt);
|
|
42
|
+
}
|
|
43
|
+
const result = await dbRun('DELETE FROM prd_archives WHERE repo_id = ? AND slug = ?', [repoId, slug]);
|
|
44
|
+
if (result.changes > 0) {
|
|
45
|
+
emitChange({
|
|
46
|
+
type: 'change',
|
|
47
|
+
path: `state://${repoId}/${slug}.archive`,
|
|
48
|
+
repoId,
|
|
49
|
+
category: 'prd'
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return { archived: false };
|
|
53
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from 'node:fs';
|
|
2
2
|
import { basename, isAbsolute, join, relative, resolve } from 'node:path';
|
|
3
3
|
import { resolveCommitRepo } from './git.js';
|
|
4
|
-
import {
|
|
4
|
+
import { getPrdArchiveMap, getPrdArchiveState } from './prd-archive.js';
|
|
5
|
+
import { getPrdState, getPrdStateSummaries } from './prd-state.js';
|
|
5
6
|
import { discoverGitRepos, updateRepoGitRepos } from './repos.js';
|
|
6
7
|
const PRD_SLUG_PATTERN = /^[A-Za-z0-9][A-Za-z0-9-]*$/;
|
|
7
8
|
function normalizePathSlashes(path) {
|
|
@@ -83,15 +84,18 @@ export async function readPrdDocument(repo, prdSlug) {
|
|
|
83
84
|
catch {
|
|
84
85
|
throw new Error('PRD not found');
|
|
85
86
|
}
|
|
87
|
+
const archiveState = await getPrdArchiveState(repo.id, prdSlug);
|
|
86
88
|
return {
|
|
87
89
|
slug: prdSlug,
|
|
88
90
|
name: extractPrdTitle(content, prdSlug),
|
|
89
91
|
content,
|
|
90
|
-
metadata: parseMetadata(content)
|
|
92
|
+
metadata: parseMetadata(content),
|
|
93
|
+
archived: archiveState.archived,
|
|
94
|
+
...(archiveState.archivedAt && { archivedAt: archiveState.archivedAt })
|
|
91
95
|
};
|
|
92
96
|
}
|
|
93
|
-
export async function listPrdDocuments(repo) {
|
|
94
|
-
|
|
97
|
+
export async function listPrdDocuments(repo, options = {}) {
|
|
98
|
+
const includeArchived = options.includeArchived === true;
|
|
95
99
|
const prdDir = join(repo.path, 'docs', 'prd');
|
|
96
100
|
let prdFiles = [];
|
|
97
101
|
try {
|
|
@@ -107,9 +111,17 @@ export async function listPrdDocuments(repo) {
|
|
|
107
111
|
catch {
|
|
108
112
|
return [];
|
|
109
113
|
}
|
|
110
|
-
const stateSummaries = await
|
|
111
|
-
|
|
114
|
+
const [stateSummaries, archiveMap] = await Promise.all([
|
|
115
|
+
getPrdStateSummaries(repo.id),
|
|
116
|
+
getPrdArchiveMap(repo.id)
|
|
117
|
+
]);
|
|
118
|
+
const items = (await Promise.all(prdFiles.map(async (filename) => {
|
|
112
119
|
const slug = basename(filename, '.md');
|
|
120
|
+
const archivedAt = archiveMap.get(slug);
|
|
121
|
+
const archived = typeof archivedAt === 'string';
|
|
122
|
+
if (!includeArchived && archived) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
113
125
|
const filePath = join(prdDir, filename);
|
|
114
126
|
let name = slug;
|
|
115
127
|
let modifiedAt = 0;
|
|
@@ -131,22 +143,27 @@ export async function listPrdDocuments(repo) {
|
|
|
131
143
|
source: `docs/prd/${filename}`,
|
|
132
144
|
hasState: !!stateSummary?.hasState,
|
|
133
145
|
modifiedAt,
|
|
146
|
+
archived,
|
|
147
|
+
...(archivedAt && { archivedAt }),
|
|
134
148
|
...(stateSummary?.taskCount !== undefined && { taskCount: stateSummary.taskCount }),
|
|
135
149
|
...(stateSummary?.completedCount !== undefined && { completedCount: stateSummary.completedCount })
|
|
136
150
|
};
|
|
137
|
-
}));
|
|
138
|
-
items.sort((a, b) =>
|
|
151
|
+
}))).filter((item) => item !== null);
|
|
152
|
+
items.sort((a, b) => {
|
|
153
|
+
if (a.archived !== b.archived) {
|
|
154
|
+
return a.archived ? 1 : -1;
|
|
155
|
+
}
|
|
156
|
+
return b.modifiedAt - a.modifiedAt;
|
|
157
|
+
});
|
|
139
158
|
return items;
|
|
140
159
|
}
|
|
141
160
|
export async function readPrdTasks(repo, prdSlug) {
|
|
142
161
|
assertValidPrdSlug(prdSlug);
|
|
143
|
-
await migrateLegacyStateForRepo(repo);
|
|
144
162
|
const state = await getPrdState(repo.id, prdSlug);
|
|
145
163
|
return state?.tasks ?? null;
|
|
146
164
|
}
|
|
147
165
|
export async function readPrdProgress(repo, prdSlug) {
|
|
148
166
|
assertValidPrdSlug(prdSlug);
|
|
149
|
-
await migrateLegacyStateForRepo(repo);
|
|
150
167
|
const state = await getPrdState(repo.id, prdSlug);
|
|
151
168
|
return state?.progress ?? null;
|
|
152
169
|
}
|
|
@@ -180,7 +197,6 @@ async function refreshDiscoveredGitRepos(repo) {
|
|
|
180
197
|
}
|
|
181
198
|
export async function resolveTaskCommits(repo, prdSlug, taskId) {
|
|
182
199
|
assertValidPrdSlug(prdSlug);
|
|
183
|
-
await migrateLegacyStateForRepo(repo);
|
|
184
200
|
const state = await getPrdState(repo.id, prdSlug);
|
|
185
201
|
const progress = state?.progress ?? null;
|
|
186
202
|
if (!progress) {
|