@uasyraf/helm 0.1.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.
- package/.claude-plugin/plugin.json +9 -0
- package/.mcp.json +8 -0
- package/LICENSE +21 -0
- package/README.md +114 -0
- package/dashboard/build/client/_app/immutable/assets/0.DPthOi2j.css +1 -0
- package/dashboard/build/client/_app/immutable/assets/0.DPthOi2j.css.br +0 -0
- package/dashboard/build/client/_app/immutable/assets/0.DPthOi2j.css.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/B3NJzl7g.js +1 -0
- package/dashboard/build/client/_app/immutable/chunks/B3NJzl7g.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/B3NJzl7g.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/Bvgn0Gys.js +1 -0
- package/dashboard/build/client/_app/immutable/chunks/Bvgn0Gys.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/Bvgn0Gys.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/C72aErMY.js +3 -0
- package/dashboard/build/client/_app/immutable/chunks/C72aErMY.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/C72aErMY.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/CjpPs8iz.js +1 -0
- package/dashboard/build/client/_app/immutable/chunks/CjpPs8iz.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/CjpPs8iz.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/DNLp8810.js +1 -0
- package/dashboard/build/client/_app/immutable/chunks/DNLp8810.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/DNLp8810.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/DYkFpqG7.js +1 -0
- package/dashboard/build/client/_app/immutable/chunks/DYkFpqG7.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/DYkFpqG7.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/DsiL0ppy.js +2 -0
- package/dashboard/build/client/_app/immutable/chunks/DsiL0ppy.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/DsiL0ppy.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/bJX5vhEj.js +1 -0
- package/dashboard/build/client/_app/immutable/chunks/bJX5vhEj.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/bJX5vhEj.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/chunks/gQDp4_Ul.js +1 -0
- package/dashboard/build/client/_app/immutable/chunks/gQDp4_Ul.js.br +0 -0
- package/dashboard/build/client/_app/immutable/chunks/gQDp4_Ul.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/entry/app.D4j9hUjJ.js +2 -0
- package/dashboard/build/client/_app/immutable/entry/app.D4j9hUjJ.js.br +0 -0
- package/dashboard/build/client/_app/immutable/entry/app.D4j9hUjJ.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/entry/start.D59wIHuS.js +1 -0
- package/dashboard/build/client/_app/immutable/entry/start.D59wIHuS.js.br +2 -0
- package/dashboard/build/client/_app/immutable/entry/start.D59wIHuS.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/nodes/0.HocD0HAQ.js +1 -0
- package/dashboard/build/client/_app/immutable/nodes/0.HocD0HAQ.js.br +0 -0
- package/dashboard/build/client/_app/immutable/nodes/0.HocD0HAQ.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/nodes/1.xo_a-jPh.js +1 -0
- package/dashboard/build/client/_app/immutable/nodes/1.xo_a-jPh.js.br +0 -0
- package/dashboard/build/client/_app/immutable/nodes/1.xo_a-jPh.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/nodes/2.BwywD4n3.js +1 -0
- package/dashboard/build/client/_app/immutable/nodes/2.BwywD4n3.js.br +0 -0
- package/dashboard/build/client/_app/immutable/nodes/2.BwywD4n3.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/nodes/3.BGY0bNfC.js +1 -0
- package/dashboard/build/client/_app/immutable/nodes/3.BGY0bNfC.js.br +0 -0
- package/dashboard/build/client/_app/immutable/nodes/3.BGY0bNfC.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/nodes/4.C7uIivCS.js +1 -0
- package/dashboard/build/client/_app/immutable/nodes/4.C7uIivCS.js.br +0 -0
- package/dashboard/build/client/_app/immutable/nodes/4.C7uIivCS.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/nodes/5.YszfczJW.js +1 -0
- package/dashboard/build/client/_app/immutable/nodes/5.YszfczJW.js.br +0 -0
- package/dashboard/build/client/_app/immutable/nodes/5.YszfczJW.js.gz +0 -0
- package/dashboard/build/client/_app/immutable/nodes/6.7fhKcbBK.js +1 -0
- package/dashboard/build/client/_app/immutable/nodes/6.7fhKcbBK.js.br +0 -0
- package/dashboard/build/client/_app/immutable/nodes/6.7fhKcbBK.js.gz +0 -0
- package/dashboard/build/client/_app/version.json +1 -0
- package/dashboard/build/client/_app/version.json.br +0 -0
- package/dashboard/build/client/_app/version.json.gz +0 -0
- package/dashboard/build/env.js +94 -0
- package/dashboard/build/handler.js +1494 -0
- package/dashboard/build/index.js +345 -0
- package/dashboard/build/server/chunks/0-DUUsxI66.js +40 -0
- package/dashboard/build/server/chunks/0-DUUsxI66.js.map +1 -0
- package/dashboard/build/server/chunks/1-BDkdOGL6.js +9 -0
- package/dashboard/build/server/chunks/1-BDkdOGL6.js.map +1 -0
- package/dashboard/build/server/chunks/2-BLt1vNET.js +51 -0
- package/dashboard/build/server/chunks/2-BLt1vNET.js.map +1 -0
- package/dashboard/build/server/chunks/3-B-4sxMk4.js +41 -0
- package/dashboard/build/server/chunks/3-B-4sxMk4.js.map +1 -0
- package/dashboard/build/server/chunks/4-CRZIwHJO.js +39 -0
- package/dashboard/build/server/chunks/4-CRZIwHJO.js.map +1 -0
- package/dashboard/build/server/chunks/5-CwiVOtz6.js +30 -0
- package/dashboard/build/server/chunks/5-CwiVOtz6.js.map +1 -0
- package/dashboard/build/server/chunks/6-mID2_gX2.js +53 -0
- package/dashboard/build/server/chunks/6-mID2_gX2.js.map +1 -0
- package/dashboard/build/server/chunks/_layout.svelte-DeOKequ-.js +31 -0
- package/dashboard/build/server/chunks/_layout.svelte-DeOKequ-.js.map +1 -0
- package/dashboard/build/server/chunks/_page.svelte-BGS-bwra.js +65 -0
- package/dashboard/build/server/chunks/_page.svelte-BGS-bwra.js.map +1 -0
- package/dashboard/build/server/chunks/_page.svelte-BiRjdIbl.js +35 -0
- package/dashboard/build/server/chunks/_page.svelte-BiRjdIbl.js.map +1 -0
- package/dashboard/build/server/chunks/_page.svelte-C_NO0kPy.js +49 -0
- package/dashboard/build/server/chunks/_page.svelte-C_NO0kPy.js.map +1 -0
- package/dashboard/build/server/chunks/_page.svelte-DvSQBjcA.js +80 -0
- package/dashboard/build/server/chunks/_page.svelte-DvSQBjcA.js.map +1 -0
- package/dashboard/build/server/chunks/_page.svelte-ZUq8J-ew.js +33 -0
- package/dashboard/build/server/chunks/_page.svelte-ZUq8J-ew.js.map +1 -0
- package/dashboard/build/server/chunks/error.svelte-DJ3O9Tia.js +12 -0
- package/dashboard/build/server/chunks/error.svelte-DJ3O9Tia.js.map +1 -0
- package/dashboard/build/server/chunks/exports-BnaAAAnL.js +3262 -0
- package/dashboard/build/server/chunks/exports-BnaAAAnL.js.map +1 -0
- package/dashboard/build/server/chunks/index-DwR_KaNY.js +44 -0
- package/dashboard/build/server/chunks/index-DwR_KaNY.js.map +1 -0
- package/dashboard/build/server/chunks/index-lhTMmBNn.js +207 -0
- package/dashboard/build/server/chunks/index-lhTMmBNn.js.map +1 -0
- package/dashboard/build/server/chunks/queries-DGWi-KlP.js +198 -0
- package/dashboard/build/server/chunks/queries-DGWi-KlP.js.map +1 -0
- package/dashboard/build/server/chunks/renderer-DdMvhZZr.js +1930 -0
- package/dashboard/build/server/chunks/renderer-DdMvhZZr.js.map +1 -0
- package/dashboard/build/server/index.js +5911 -0
- package/dashboard/build/server/index.js.map +1 -0
- package/dashboard/build/server/manifest.js +78 -0
- package/dashboard/build/server/manifest.js.map +1 -0
- package/dashboard/build/shims.js +32 -0
- package/dashboard/package.json +29 -0
- package/dashboard/svelte.config.js +15 -0
- package/dist/bin/helm.d.ts +2 -0
- package/dist/bin/helm.js +167 -0
- package/dist/bin/helm.js.map +1 -0
- package/dist/server/src/banner.d.ts +1 -0
- package/dist/server/src/banner.js +34 -0
- package/dist/server/src/banner.js.map +1 -0
- package/dist/server/src/config/load.d.ts +14 -0
- package/dist/server/src/config/load.js +43 -0
- package/dist/server/src/config/load.js.map +1 -0
- package/dist/server/src/dashboard.d.ts +5 -0
- package/dist/server/src/dashboard.js +79 -0
- package/dist/server/src/dashboard.js.map +1 -0
- package/dist/server/src/db/bootstrap.d.ts +2 -0
- package/dist/server/src/db/bootstrap.js +106 -0
- package/dist/server/src/db/bootstrap.js.map +1 -0
- package/dist/server/src/db/client.d.ts +14 -0
- package/dist/server/src/db/client.js +32 -0
- package/dist/server/src/db/client.js.map +1 -0
- package/dist/server/src/db/open-project.d.ts +17 -0
- package/dist/server/src/db/open-project.js +27 -0
- package/dist/server/src/db/open-project.js.map +1 -0
- package/dist/server/src/db/open-repo.d.ts +8 -0
- package/dist/server/src/db/open-repo.js +45 -0
- package/dist/server/src/db/open-repo.js.map +1 -0
- package/dist/server/src/db/pg-bootstrap.d.ts +4 -0
- package/dist/server/src/db/pg-bootstrap.js +106 -0
- package/dist/server/src/db/pg-bootstrap.js.map +1 -0
- package/dist/server/src/db/pg-client.d.ts +10 -0
- package/dist/server/src/db/pg-client.js +42 -0
- package/dist/server/src/db/pg-client.js.map +1 -0
- package/dist/server/src/db/repo-pg.d.ts +3 -0
- package/dist/server/src/db/repo-pg.js +245 -0
- package/dist/server/src/db/repo-pg.js.map +1 -0
- package/dist/server/src/db/repo-sqlite.d.ts +3 -0
- package/dist/server/src/db/repo-sqlite.js +224 -0
- package/dist/server/src/db/repo-sqlite.js.map +1 -0
- package/dist/server/src/db/repo.d.ts +54 -0
- package/dist/server/src/db/repo.js +2 -0
- package/dist/server/src/db/repo.js.map +1 -0
- package/dist/server/src/db/schema-pg.d.ts +2712 -0
- package/dist/server/src/db/schema-pg.js +107 -0
- package/dist/server/src/db/schema-pg.js.map +1 -0
- package/dist/server/src/db/schema.d.ts +2721 -0
- package/dist/server/src/db/schema.js +107 -0
- package/dist/server/src/db/schema.js.map +1 -0
- package/dist/server/src/events/emit.d.ts +21 -0
- package/dist/server/src/events/emit.js +17 -0
- package/dist/server/src/events/emit.js.map +1 -0
- package/dist/server/src/http/server.d.ts +10 -0
- package/dist/server/src/http/server.js +119 -0
- package/dist/server/src/http/server.js.map +1 -0
- package/dist/server/src/index.d.ts +2 -0
- package/dist/server/src/index.js +13 -0
- package/dist/server/src/index.js.map +1 -0
- package/dist/server/src/init.d.ts +12 -0
- package/dist/server/src/init.js +59 -0
- package/dist/server/src/init.js.map +1 -0
- package/dist/server/src/install.d.ts +8 -0
- package/dist/server/src/install.js +100 -0
- package/dist/server/src/install.js.map +1 -0
- package/dist/server/src/project/bootstrap.d.ts +9 -0
- package/dist/server/src/project/bootstrap.js +83 -0
- package/dist/server/src/project/bootstrap.js.map +1 -0
- package/dist/server/src/project/detect.d.ts +10 -0
- package/dist/server/src/project/detect.js +82 -0
- package/dist/server/src/project/detect.js.map +1 -0
- package/dist/server/src/project/identity.d.ts +8 -0
- package/dist/server/src/project/identity.js +42 -0
- package/dist/server/src/project/identity.js.map +1 -0
- package/dist/server/src/server.d.ts +8 -0
- package/dist/server/src/server.js +22 -0
- package/dist/server/src/server.js.map +1 -0
- package/dist/server/src/tools/debt.d.ts +2 -0
- package/dist/server/src/tools/debt.js +88 -0
- package/dist/server/src/tools/debt.js.map +1 -0
- package/dist/server/src/tools/decision.d.ts +2 -0
- package/dist/server/src/tools/decision.js +39 -0
- package/dist/server/src/tools/decision.js.map +1 -0
- package/dist/server/src/tools/epic.d.ts +2 -0
- package/dist/server/src/tools/epic.js +95 -0
- package/dist/server/src/tools/epic.js.map +1 -0
- package/dist/server/src/tools/index.d.ts +3 -0
- package/dist/server/src/tools/index.js +21 -0
- package/dist/server/src/tools/index.js.map +1 -0
- package/dist/server/src/tools/nelson.d.ts +2 -0
- package/dist/server/src/tools/nelson.js +28 -0
- package/dist/server/src/tools/nelson.js.map +1 -0
- package/dist/server/src/tools/progress.d.ts +2 -0
- package/dist/server/src/tools/progress.js +45 -0
- package/dist/server/src/tools/progress.js.map +1 -0
- package/dist/server/src/tools/sprint.d.ts +2 -0
- package/dist/server/src/tools/sprint.js +98 -0
- package/dist/server/src/tools/sprint.js.map +1 -0
- package/dist/server/src/tools/status.d.ts +2 -0
- package/dist/server/src/tools/status.js +31 -0
- package/dist/server/src/tools/status.js.map +1 -0
- package/dist/server/src/tools/story.d.ts +2 -0
- package/dist/server/src/tools/story.js +155 -0
- package/dist/server/src/tools/story.js.map +1 -0
- package/dist/server/src/tools/task.d.ts +2 -0
- package/dist/server/src/tools/task.js +90 -0
- package/dist/server/src/tools/task.js.map +1 -0
- package/dist/server/src/tools/types.d.ts +15 -0
- package/dist/server/src/tools/types.js +11 -0
- package/dist/server/src/tools/types.js.map +1 -0
- package/dist/server/src/util/git.d.ts +8 -0
- package/dist/server/src/util/git.js +51 -0
- package/dist/server/src/util/git.js.map +1 -0
- package/dist/server/src/util/ids.d.ts +2 -0
- package/dist/server/src/util/ids.js +8 -0
- package/dist/server/src/util/ids.js.map +1 -0
- package/dist/server/src/util/paths.d.ts +2 -0
- package/dist/server/src/util/paths.js +9 -0
- package/dist/server/src/util/paths.js.map +1 -0
- package/dist/server/src/worker/client.d.ts +12 -0
- package/dist/server/src/worker/client.js +89 -0
- package/dist/server/src/worker/client.js.map +1 -0
- package/dist/server/src/worker/hook.d.ts +1 -0
- package/dist/server/src/worker/hook.js +36 -0
- package/dist/server/src/worker/hook.js.map +1 -0
- package/dist/server/src/worker/ingest.d.ts +14 -0
- package/dist/server/src/worker/ingest.js +86 -0
- package/dist/server/src/worker/ingest.js.map +1 -0
- package/dist/server/src/worker/markers/any-type.d.ts +6 -0
- package/dist/server/src/worker/markers/any-type.js +19 -0
- package/dist/server/src/worker/markers/any-type.js.map +1 -0
- package/dist/server/src/worker/markers/debt.d.ts +11 -0
- package/dist/server/src/worker/markers/debt.js +53 -0
- package/dist/server/src/worker/markers/debt.js.map +1 -0
- package/dist/server/src/worker/markers/file-size.d.ts +5 -0
- package/dist/server/src/worker/markers/file-size.js +32 -0
- package/dist/server/src/worker/markers/file-size.js.map +1 -0
- package/dist/server/src/worker/scanner.d.ts +23 -0
- package/dist/server/src/worker/scanner.js +23 -0
- package/dist/server/src/worker/scanner.js.map +1 -0
- package/dist/server/src/worker/server.d.ts +1 -0
- package/dist/server/src/worker/server.js +137 -0
- package/dist/server/src/worker/server.js.map +1 -0
- package/dist/server/src/worker/socket.d.ts +3 -0
- package/dist/server/src/worker/socket.js +12 -0
- package/dist/server/src/worker/socket.js.map +1 -0
- package/hooks/hooks.json +33 -0
- package/package.json +56 -0
- package/skills/backlog/SKILL.md +18 -0
- package/skills/debt/SKILL.md +39 -0
- package/skills/epic/SKILL.md +22 -0
- package/skills/nelson-integration/SKILL.md +44 -0
- package/skills/project-tracker/SKILL.md +60 -0
- package/skills/review/SKILL.md +27 -0
- package/skills/sprint/SKILL.md +23 -0
- package/skills/story/SKILL.md +29 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../../server/src/db/bootstrap.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAsB;IACpC;;;;;;;;;;IAUE;IACF;;;;;;IAME;IACF;;;;;;;;;IASE;IACF;;;;;;;;;IASE;IACF;;;;;;;;;;;;;;IAcE;IACF;;;;;;;;IAQE;IACF;;;;;;;;;;;;IAYE;IACF;;;;;;;;IAQE;IACF;;;;;;;;;IASE;IACF,6EAA6E;IAC7E,iEAAiE;IACjE,8DAA8D;IAC9D,yEAAyE;CAC1E,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAc;IAC5C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type Client } from "@libsql/client";
|
|
2
|
+
import { type LibSQLDatabase } from "drizzle-orm/libsql";
|
|
3
|
+
import { schema } from "./schema.js";
|
|
4
|
+
import type { SyncConfig } from "../config/load.js";
|
|
5
|
+
export type Db = LibSQLDatabase<typeof schema>;
|
|
6
|
+
export interface DbHandle {
|
|
7
|
+
readonly db: Db;
|
|
8
|
+
readonly client: Client;
|
|
9
|
+
readonly sync: (() => Promise<void>) | null;
|
|
10
|
+
}
|
|
11
|
+
export interface OpenDbOptions {
|
|
12
|
+
sync?: SyncConfig | null;
|
|
13
|
+
}
|
|
14
|
+
export declare function openDb(dbPath: string, opts?: OpenDbOptions): Promise<DbHandle>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createClient } from "@libsql/client";
|
|
2
|
+
import { drizzle } from "drizzle-orm/libsql";
|
|
3
|
+
import { mkdirSync } from "node:fs";
|
|
4
|
+
import { dirname } from "node:path";
|
|
5
|
+
import { schema } from "./schema.js";
|
|
6
|
+
import { bootstrap } from "./bootstrap.js";
|
|
7
|
+
export async function openDb(dbPath, opts = {}) {
|
|
8
|
+
mkdirSync(dirname(dbPath), { recursive: true });
|
|
9
|
+
const client = opts.sync
|
|
10
|
+
? createClient({
|
|
11
|
+
url: `file:${dbPath}`,
|
|
12
|
+
syncUrl: opts.sync.url,
|
|
13
|
+
authToken: opts.sync.authToken,
|
|
14
|
+
syncInterval: opts.sync.syncIntervalMs ? opts.sync.syncIntervalMs / 1000 : undefined,
|
|
15
|
+
})
|
|
16
|
+
: createClient({ url: `file:${dbPath}` });
|
|
17
|
+
if (opts.sync) {
|
|
18
|
+
try {
|
|
19
|
+
await client.sync();
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
console.warn(`[helm] initial sync failed: ${err.message}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
await bootstrap(client);
|
|
26
|
+
const db = drizzle(client, { schema });
|
|
27
|
+
const sync = opts.sync ? async () => {
|
|
28
|
+
await client.sync();
|
|
29
|
+
} : null;
|
|
30
|
+
return { db, client, sync };
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../../server/src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAuB,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAe3C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,MAAc,EAAE,OAAsB,EAAE;IACnE,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI;QACtB,CAAC,CAAC,YAAY,CAAC;YACX,GAAG,EAAE,QAAQ,MAAM,EAAE;YACrB,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG;YACtB,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;YAC9B,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS;SACrF,CAAC;QACJ,CAAC,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,QAAQ,MAAM,EAAE,EAAE,CAAC,CAAC;IAE5C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,+BAAgC,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAmB,EAAE;QACjD,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACT,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type DbHandle } from "./client.js";
|
|
2
|
+
import { type PgHandle } from "./pg-client.js";
|
|
3
|
+
export interface OpenedProject {
|
|
4
|
+
handle: DbHandle;
|
|
5
|
+
slug: string;
|
|
6
|
+
cwd: string;
|
|
7
|
+
}
|
|
8
|
+
export interface OpenedPgProject {
|
|
9
|
+
handle: PgHandle;
|
|
10
|
+
slug: string;
|
|
11
|
+
cwd: string;
|
|
12
|
+
url: string;
|
|
13
|
+
}
|
|
14
|
+
export type ProjectTarget = "libsql" | "postgres";
|
|
15
|
+
export declare function projectTarget(): ProjectTarget;
|
|
16
|
+
export declare function openProjectDb(cwd: string): Promise<OpenedProject>;
|
|
17
|
+
export declare function openPgProjectDb(cwd: string): Promise<OpenedPgProject>;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { openDb } from "./client.js";
|
|
2
|
+
import { openPgDb } from "./pg-client.js";
|
|
3
|
+
import { detectProject } from "../project/detect.js";
|
|
4
|
+
import { loadConfig } from "../config/load.js";
|
|
5
|
+
import { dbPathFor } from "../util/paths.js";
|
|
6
|
+
export function projectTarget() {
|
|
7
|
+
const url = process.env.HELM_DB_URL ?? "";
|
|
8
|
+
if (url.startsWith("postgres://") || url.startsWith("postgresql://"))
|
|
9
|
+
return "postgres";
|
|
10
|
+
return "libsql";
|
|
11
|
+
}
|
|
12
|
+
export async function openProjectDb(cwd) {
|
|
13
|
+
const detected = detectProject(cwd);
|
|
14
|
+
const config = loadConfig(cwd);
|
|
15
|
+
const path = dbPathFor(detected.slug);
|
|
16
|
+
const handle = await openDb(path, { sync: config.sync });
|
|
17
|
+
return { handle, slug: detected.slug, cwd };
|
|
18
|
+
}
|
|
19
|
+
export async function openPgProjectDb(cwd) {
|
|
20
|
+
const detected = detectProject(cwd);
|
|
21
|
+
const url = process.env.HELM_DB_URL;
|
|
22
|
+
if (!url)
|
|
23
|
+
throw new Error("HELM_DB_URL not set");
|
|
24
|
+
const handle = await openPgDb(url);
|
|
25
|
+
return { handle, slug: detected.slug, cwd, url };
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=open-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-project.js","sourceRoot":"","sources":["../../../../server/src/db/open-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAiB,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAiB7C,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAC1C,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IACxF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAW;IAC7C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AAC9C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACnD,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { detectProject } from "../project/detect.js";
|
|
2
|
+
import { loadConfig } from "../config/load.js";
|
|
3
|
+
import { dbPathFor } from "../util/paths.js";
|
|
4
|
+
import { openDb } from "./client.js";
|
|
5
|
+
import { openPgDb, openPgliteDb } from "./pg-client.js";
|
|
6
|
+
import { makeSqliteRepo } from "./repo-sqlite.js";
|
|
7
|
+
import { makePgRepo } from "./repo-pg.js";
|
|
8
|
+
export async function openProjectRepo(cwd) {
|
|
9
|
+
const detected = detectProject(cwd);
|
|
10
|
+
const dbUrl = process.env.HELM_DB_URL ?? "";
|
|
11
|
+
if (dbUrl.startsWith("postgres://") || dbUrl.startsWith("postgresql://")) {
|
|
12
|
+
const pg = await openPgDb(dbUrl);
|
|
13
|
+
return {
|
|
14
|
+
handle: { repo: makePgRepo(pg.db), sync: null, close: pg.close },
|
|
15
|
+
slug: detected.slug,
|
|
16
|
+
cwd,
|
|
17
|
+
target: "postgres",
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (dbUrl === "memory:pglite") {
|
|
21
|
+
const pg = await openPgliteDb();
|
|
22
|
+
return {
|
|
23
|
+
handle: { repo: makePgRepo(pg.db), sync: null, close: pg.close },
|
|
24
|
+
slug: detected.slug,
|
|
25
|
+
cwd,
|
|
26
|
+
target: "postgres",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const config = loadConfig(cwd);
|
|
30
|
+
const path = dbPathFor(detected.slug);
|
|
31
|
+
const sqlite = await openDb(path, { sync: config.sync });
|
|
32
|
+
return {
|
|
33
|
+
handle: {
|
|
34
|
+
repo: makeSqliteRepo(sqlite.db),
|
|
35
|
+
sync: sqlite.sync,
|
|
36
|
+
close: async () => {
|
|
37
|
+
sqlite.client.close();
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
slug: detected.slug,
|
|
41
|
+
cwd,
|
|
42
|
+
target: "libsql",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=open-repo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"open-repo.js","sourceRoot":"","sources":["../../../../server/src/db/open-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU1C,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IAE5C,IAAI,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACzE,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;YAChE,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG;YACH,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,KAAK,eAAe,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,MAAM,YAAY,EAAE,CAAC;QAChC,OAAO;YACL,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE;YAChE,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG;YACH,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IACzD,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,KAAK,IAAI,EAAE;gBAChB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;SACF;QACD,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,GAAG;QACH,MAAM,EAAE,QAAQ;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const STATEMENTS = [
|
|
2
|
+
`CREATE TABLE IF NOT EXISTS project (
|
|
3
|
+
id TEXT PRIMARY KEY,
|
|
4
|
+
slug TEXT NOT NULL UNIQUE,
|
|
5
|
+
name TEXT NOT NULL,
|
|
6
|
+
git_remote TEXT,
|
|
7
|
+
dod TEXT,
|
|
8
|
+
sprint_length_days INTEGER NOT NULL DEFAULT 14,
|
|
9
|
+
wip_enabled BOOLEAN NOT NULL DEFAULT FALSE,
|
|
10
|
+
estimation_enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
11
|
+
created_at TEXT NOT NULL
|
|
12
|
+
)`,
|
|
13
|
+
`CREATE TABLE IF NOT EXISTS developer (
|
|
14
|
+
id TEXT PRIMARY KEY,
|
|
15
|
+
project_id TEXT NOT NULL REFERENCES project(id),
|
|
16
|
+
handle TEXT NOT NULL,
|
|
17
|
+
email TEXT,
|
|
18
|
+
last_seen_at TEXT NOT NULL
|
|
19
|
+
)`,
|
|
20
|
+
`CREATE TABLE IF NOT EXISTS sprint (
|
|
21
|
+
id TEXT PRIMARY KEY,
|
|
22
|
+
project_id TEXT NOT NULL REFERENCES project(id),
|
|
23
|
+
name TEXT NOT NULL,
|
|
24
|
+
goal TEXT,
|
|
25
|
+
started_at TEXT NOT NULL,
|
|
26
|
+
ended_at TEXT,
|
|
27
|
+
status TEXT NOT NULL,
|
|
28
|
+
wip_limit INTEGER
|
|
29
|
+
)`,
|
|
30
|
+
`CREATE TABLE IF NOT EXISTS epic (
|
|
31
|
+
id TEXT PRIMARY KEY,
|
|
32
|
+
project_id TEXT NOT NULL REFERENCES project(id),
|
|
33
|
+
title TEXT NOT NULL,
|
|
34
|
+
description TEXT,
|
|
35
|
+
status TEXT NOT NULL DEFAULT 'open',
|
|
36
|
+
priority INTEGER NOT NULL DEFAULT 3,
|
|
37
|
+
target_sprint_id TEXT REFERENCES sprint(id),
|
|
38
|
+
created_at TEXT NOT NULL
|
|
39
|
+
)`,
|
|
40
|
+
`CREATE TABLE IF NOT EXISTS story (
|
|
41
|
+
id TEXT PRIMARY KEY,
|
|
42
|
+
epic_id TEXT REFERENCES epic(id),
|
|
43
|
+
sprint_id TEXT REFERENCES sprint(id),
|
|
44
|
+
title TEXT NOT NULL,
|
|
45
|
+
description TEXT,
|
|
46
|
+
acceptance TEXT,
|
|
47
|
+
status TEXT NOT NULL DEFAULT 'backlog',
|
|
48
|
+
size TEXT,
|
|
49
|
+
assignee_id TEXT REFERENCES developer(id),
|
|
50
|
+
priority INTEGER NOT NULL DEFAULT 3,
|
|
51
|
+
started_at TEXT,
|
|
52
|
+
completed_at TEXT,
|
|
53
|
+
created_at TEXT NOT NULL
|
|
54
|
+
)`,
|
|
55
|
+
`CREATE TABLE IF NOT EXISTS task (
|
|
56
|
+
id TEXT PRIMARY KEY,
|
|
57
|
+
story_id TEXT NOT NULL REFERENCES story(id),
|
|
58
|
+
assignee_id TEXT REFERENCES developer(id),
|
|
59
|
+
title TEXT NOT NULL,
|
|
60
|
+
status TEXT NOT NULL DEFAULT 'todo',
|
|
61
|
+
blocked_by TEXT,
|
|
62
|
+
created_at TEXT NOT NULL
|
|
63
|
+
)`,
|
|
64
|
+
`CREATE TABLE IF NOT EXISTS tech_debt (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
project_id TEXT NOT NULL REFERENCES project(id),
|
|
67
|
+
title TEXT NOT NULL,
|
|
68
|
+
description TEXT,
|
|
69
|
+
severity TEXT NOT NULL DEFAULT 'med',
|
|
70
|
+
location TEXT,
|
|
71
|
+
owner_id TEXT REFERENCES developer(id),
|
|
72
|
+
expires_at TEXT,
|
|
73
|
+
opened_at TEXT NOT NULL,
|
|
74
|
+
closed_at TEXT,
|
|
75
|
+
linked_story_id TEXT REFERENCES story(id)
|
|
76
|
+
)`,
|
|
77
|
+
`CREATE TABLE IF NOT EXISTS decision (
|
|
78
|
+
id TEXT PRIMARY KEY,
|
|
79
|
+
project_id TEXT NOT NULL REFERENCES project(id),
|
|
80
|
+
title TEXT NOT NULL,
|
|
81
|
+
context TEXT,
|
|
82
|
+
decision TEXT NOT NULL,
|
|
83
|
+
status TEXT NOT NULL DEFAULT 'accepted',
|
|
84
|
+
decided_at TEXT NOT NULL
|
|
85
|
+
)`,
|
|
86
|
+
`CREATE TABLE IF NOT EXISTS progress_event (
|
|
87
|
+
id TEXT PRIMARY KEY,
|
|
88
|
+
project_id TEXT NOT NULL REFERENCES project(id),
|
|
89
|
+
developer_id TEXT REFERENCES developer(id),
|
|
90
|
+
sprint_id TEXT REFERENCES sprint(id),
|
|
91
|
+
kind TEXT NOT NULL,
|
|
92
|
+
ref_id TEXT,
|
|
93
|
+
summary TEXT NOT NULL,
|
|
94
|
+
ts TEXT NOT NULL
|
|
95
|
+
)`,
|
|
96
|
+
`CREATE INDEX IF NOT EXISTS idx_progress_event_ts ON progress_event(ts DESC)`,
|
|
97
|
+
`CREATE INDEX IF NOT EXISTS idx_story_sprint ON story(sprint_id)`,
|
|
98
|
+
`CREATE INDEX IF NOT EXISTS idx_story_status ON story(status)`,
|
|
99
|
+
`CREATE INDEX IF NOT EXISTS idx_tech_debt_closed ON tech_debt(closed_at)`,
|
|
100
|
+
];
|
|
101
|
+
export async function bootstrapPg(runner) {
|
|
102
|
+
for (const sql of STATEMENTS) {
|
|
103
|
+
await runner.query(sql);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=pg-bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg-bootstrap.js","sourceRoot":"","sources":["../../../../server/src/db/pg-bootstrap.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,GAAsB;IACpC;;;;;;;;;;IAUE;IACF;;;;;;IAME;IACF;;;;;;;;;IASE;IACF;;;;;;;;;IASE;IACF;;;;;;;;;;;;;;IAcE;IACF;;;;;;;;IAQE;IACF;;;;;;;;;;;;IAYE;IACF;;;;;;;;IAQE;IACF;;;;;;;;;IASE;IACF,6EAA6E;IAC7E,iEAAiE;IACjE,8DAA8D;IAC9D,yEAAyE;CAC1E,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAqB;IACrD,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
2
|
+
import type { PgliteDatabase } from "drizzle-orm/pglite";
|
|
3
|
+
import { schema as pgSchema } from "./schema-pg.js";
|
|
4
|
+
export type PgDb = NodePgDatabase<typeof pgSchema> | PgliteDatabase<typeof pgSchema>;
|
|
5
|
+
export interface PgHandle {
|
|
6
|
+
readonly db: PgDb;
|
|
7
|
+
readonly close: () => Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare function openPgDb(url: string): Promise<PgHandle>;
|
|
10
|
+
export declare function openPgliteDb(dataDir?: string): Promise<PgHandle>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { schema as pgSchema } from "./schema-pg.js";
|
|
2
|
+
import { bootstrapPg } from "./pg-bootstrap.js";
|
|
3
|
+
export async function openPgDb(url) {
|
|
4
|
+
const [{ Pool }, { drizzle }] = await Promise.all([
|
|
5
|
+
import("pg"),
|
|
6
|
+
import("drizzle-orm/node-postgres"),
|
|
7
|
+
]);
|
|
8
|
+
const pool = new Pool({ connectionString: url });
|
|
9
|
+
await bootstrapPg({
|
|
10
|
+
query: async (sql) => {
|
|
11
|
+
await pool.query(sql);
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
const db = drizzle(pool, { schema: pgSchema });
|
|
15
|
+
return {
|
|
16
|
+
db,
|
|
17
|
+
close: async () => {
|
|
18
|
+
await pool.end();
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export async function openPgliteDb(dataDir) {
|
|
23
|
+
const [{ PGlite }, { drizzle }] = await Promise.all([
|
|
24
|
+
import("@electric-sql/pglite"),
|
|
25
|
+
import("drizzle-orm/pglite"),
|
|
26
|
+
]);
|
|
27
|
+
const client = dataDir ? new PGlite(dataDir) : new PGlite();
|
|
28
|
+
await client.waitReady;
|
|
29
|
+
await bootstrapPg({
|
|
30
|
+
query: async (sql) => {
|
|
31
|
+
await client.exec(sql);
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const db = drizzle(client, { schema: pgSchema });
|
|
35
|
+
return {
|
|
36
|
+
db,
|
|
37
|
+
close: async () => {
|
|
38
|
+
await client.close();
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=pg-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pg-client.js","sourceRoot":"","sources":["../../../../server/src/db/pg-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAShD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC;QACZ,MAAM,CAAC,2BAA2B,CAAC;KACpC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,WAAW,CAAC;QAChB,KAAK,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YAC3B,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;KACF,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC/C,OAAO;QACL,EAAE;QACF,KAAK,EAAE,KAAK,IAAmB,EAAE;YAC/B,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAClD,MAAM,CAAC,sBAAsB,CAAC;QAC9B,MAAM,CAAC,oBAAoB,CAAC;KAC7B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;IAC5D,MAAM,MAAM,CAAC,SAAS,CAAC;IACvB,MAAM,WAAW,CAAC;QAChB,KAAK,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;YAC3B,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;KACF,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,OAAO;QACL,EAAE;QACF,KAAK,EAAE,KAAK,IAAmB,EAAE;YAC/B,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { and, desc, eq, isNull, ne, sql } from "drizzle-orm";
|
|
2
|
+
import { decision, developer, epic, progressEvent, project, sprint, story, task, techDebt, } from "./schema-pg.js";
|
|
3
|
+
export function makePgRepo(db) {
|
|
4
|
+
const pg = db;
|
|
5
|
+
return {
|
|
6
|
+
async findProjectBySlug(slug) {
|
|
7
|
+
const rows = await pg.select().from(project).where(eq(project.slug, slug)).limit(1);
|
|
8
|
+
return rows[0] ?? null;
|
|
9
|
+
},
|
|
10
|
+
async insertProject(row) {
|
|
11
|
+
await pg.insert(project).values(row);
|
|
12
|
+
},
|
|
13
|
+
async findDeveloperByHandle(projectId, handle) {
|
|
14
|
+
const rows = await pg
|
|
15
|
+
.select()
|
|
16
|
+
.from(developer)
|
|
17
|
+
.where(and(eq(developer.projectId, projectId), eq(developer.handle, handle)))
|
|
18
|
+
.limit(1);
|
|
19
|
+
return rows[0] ?? null;
|
|
20
|
+
},
|
|
21
|
+
async insertDeveloper(row) {
|
|
22
|
+
await pg.insert(developer).values(row);
|
|
23
|
+
},
|
|
24
|
+
async touchDeveloper(id, lastSeenAt) {
|
|
25
|
+
await pg.update(developer).set({ lastSeenAt }).where(eq(developer.id, id));
|
|
26
|
+
},
|
|
27
|
+
async findDevelopersByProject(projectId) {
|
|
28
|
+
const rows = await pg
|
|
29
|
+
.select()
|
|
30
|
+
.from(developer)
|
|
31
|
+
.where(eq(developer.projectId, projectId))
|
|
32
|
+
.orderBy(desc(developer.lastSeenAt));
|
|
33
|
+
return rows;
|
|
34
|
+
},
|
|
35
|
+
async findActiveSprint(projectId) {
|
|
36
|
+
const rows = await pg
|
|
37
|
+
.select()
|
|
38
|
+
.from(sprint)
|
|
39
|
+
.where(and(eq(sprint.projectId, projectId), eq(sprint.status, "active")))
|
|
40
|
+
.limit(1);
|
|
41
|
+
return rows[0] ?? null;
|
|
42
|
+
},
|
|
43
|
+
async findSprintById(id) {
|
|
44
|
+
const rows = await pg.select().from(sprint).where(eq(sprint.id, id)).limit(1);
|
|
45
|
+
return rows[0] ?? null;
|
|
46
|
+
},
|
|
47
|
+
async findSprintsByProject(projectId) {
|
|
48
|
+
const rows = await pg
|
|
49
|
+
.select()
|
|
50
|
+
.from(sprint)
|
|
51
|
+
.where(eq(sprint.projectId, projectId))
|
|
52
|
+
.orderBy(desc(sprint.startedAt));
|
|
53
|
+
return rows;
|
|
54
|
+
},
|
|
55
|
+
async insertSprint(row) {
|
|
56
|
+
await pg.insert(sprint).values(row);
|
|
57
|
+
},
|
|
58
|
+
async updateSprint(id, updates) {
|
|
59
|
+
await pg.update(sprint).set(updates).where(eq(sprint.id, id));
|
|
60
|
+
},
|
|
61
|
+
async closeActiveSprints(projectId, endedAt) {
|
|
62
|
+
await pg
|
|
63
|
+
.update(sprint)
|
|
64
|
+
.set({ status: "closed", endedAt })
|
|
65
|
+
.where(and(eq(sprint.projectId, projectId), eq(sprint.status, "active")));
|
|
66
|
+
},
|
|
67
|
+
async countSprintsByProject(projectId) {
|
|
68
|
+
const rows = await pg.select({ c: sql `count(*)::int` }).from(sprint).where(eq(sprint.projectId, projectId));
|
|
69
|
+
return Number(rows[0]?.c ?? 0);
|
|
70
|
+
},
|
|
71
|
+
async insertEpic(row) {
|
|
72
|
+
await pg.insert(epic).values(row);
|
|
73
|
+
},
|
|
74
|
+
async updateEpic(id, updates) {
|
|
75
|
+
await pg.update(epic).set(updates).where(eq(epic.id, id));
|
|
76
|
+
},
|
|
77
|
+
async findEpicsByProject(projectId) {
|
|
78
|
+
const rows = await pg.select().from(epic).where(eq(epic.projectId, projectId)).orderBy(epic.priority);
|
|
79
|
+
return rows;
|
|
80
|
+
},
|
|
81
|
+
async insertStory(row) {
|
|
82
|
+
await pg.insert(story).values(row);
|
|
83
|
+
},
|
|
84
|
+
async updateStory(id, updates) {
|
|
85
|
+
await pg.update(story).set(updates).where(eq(story.id, id));
|
|
86
|
+
},
|
|
87
|
+
async findStoryById(id) {
|
|
88
|
+
const rows = await pg.select().from(story).where(eq(story.id, id)).limit(1);
|
|
89
|
+
return rows[0] ?? null;
|
|
90
|
+
},
|
|
91
|
+
async findStoriesInSprint(sprintId) {
|
|
92
|
+
const rows = await pg.select().from(story).where(eq(story.sprintId, sprintId)).orderBy(story.priority);
|
|
93
|
+
return rows;
|
|
94
|
+
},
|
|
95
|
+
async findStoriesInSprintNotDoneOrDropped(sprintId) {
|
|
96
|
+
const rows = await pg
|
|
97
|
+
.select()
|
|
98
|
+
.from(story)
|
|
99
|
+
.where(and(eq(story.sprintId, sprintId), ne(story.status, "done"), ne(story.status, "dropped")));
|
|
100
|
+
return rows;
|
|
101
|
+
},
|
|
102
|
+
async rolloverIncompleteStoriesToBacklog(sprintId) {
|
|
103
|
+
const incomplete = await pg
|
|
104
|
+
.select({ id: story.id })
|
|
105
|
+
.from(story)
|
|
106
|
+
.where(and(eq(story.sprintId, sprintId), ne(story.status, "done"), ne(story.status, "dropped")));
|
|
107
|
+
if (incomplete.length === 0)
|
|
108
|
+
return 0;
|
|
109
|
+
await pg
|
|
110
|
+
.update(story)
|
|
111
|
+
.set({ sprintId: null, status: "backlog" })
|
|
112
|
+
.where(and(eq(story.sprintId, sprintId), ne(story.status, "done"), ne(story.status, "dropped")));
|
|
113
|
+
return incomplete.length;
|
|
114
|
+
},
|
|
115
|
+
async findBacklogStories(projectId, limit) {
|
|
116
|
+
const rows = await pg
|
|
117
|
+
.select()
|
|
118
|
+
.from(story)
|
|
119
|
+
.where(and(isNull(story.sprintId), eq(story.status, "backlog")))
|
|
120
|
+
.orderBy(sql `priority asc, created_at asc`)
|
|
121
|
+
.limit(limit);
|
|
122
|
+
return rows;
|
|
123
|
+
},
|
|
124
|
+
async countStoriesInSprintByStatus(sprintId) {
|
|
125
|
+
const rows = await pg
|
|
126
|
+
.select({ status: story.status, count: sql `count(*)::int` })
|
|
127
|
+
.from(story)
|
|
128
|
+
.where(eq(story.sprintId, sprintId))
|
|
129
|
+
.groupBy(story.status);
|
|
130
|
+
const out = {};
|
|
131
|
+
for (const r of rows)
|
|
132
|
+
out[r.status] = Number(r.count);
|
|
133
|
+
return out;
|
|
134
|
+
},
|
|
135
|
+
async countBacklog(projectId) {
|
|
136
|
+
const rows = await pg
|
|
137
|
+
.select({ c: sql `count(*)::int` })
|
|
138
|
+
.from(story)
|
|
139
|
+
.where(and(eq(story.status, "backlog"), isNull(story.sprintId)));
|
|
140
|
+
return Number(rows[0]?.c ?? 0);
|
|
141
|
+
},
|
|
142
|
+
async countDoneStoriesInSprint(sprintId) {
|
|
143
|
+
const rows = await pg
|
|
144
|
+
.select({ c: sql `count(*)::int` })
|
|
145
|
+
.from(story)
|
|
146
|
+
.where(and(eq(story.sprintId, sprintId), eq(story.status, "done")));
|
|
147
|
+
return Number(rows[0]?.c ?? 0);
|
|
148
|
+
},
|
|
149
|
+
async insertTask(row) {
|
|
150
|
+
await pg.insert(task).values(row);
|
|
151
|
+
},
|
|
152
|
+
async updateTask(id, updates) {
|
|
153
|
+
await pg.update(task).set(updates).where(eq(task.id, id));
|
|
154
|
+
},
|
|
155
|
+
async insertDebt(row) {
|
|
156
|
+
await pg.insert(techDebt).values(row);
|
|
157
|
+
},
|
|
158
|
+
async closeDebt(id, closedAt) {
|
|
159
|
+
await pg.update(techDebt).set({ closedAt }).where(eq(techDebt.id, id));
|
|
160
|
+
},
|
|
161
|
+
async findOpenDebtByProject(projectId, limit) {
|
|
162
|
+
const rows = await pg
|
|
163
|
+
.select()
|
|
164
|
+
.from(techDebt)
|
|
165
|
+
.where(and(eq(techDebt.projectId, projectId), isNull(techDebt.closedAt)))
|
|
166
|
+
.orderBy(sql `severity desc, opened_at desc`)
|
|
167
|
+
.limit(limit);
|
|
168
|
+
return rows;
|
|
169
|
+
},
|
|
170
|
+
async findAllDebtByProject(projectId, limit) {
|
|
171
|
+
const rows = await pg
|
|
172
|
+
.select()
|
|
173
|
+
.from(techDebt)
|
|
174
|
+
.where(eq(techDebt.projectId, projectId))
|
|
175
|
+
.orderBy(sql `closed_at is null desc, severity desc, opened_at desc`)
|
|
176
|
+
.limit(limit);
|
|
177
|
+
return rows;
|
|
178
|
+
},
|
|
179
|
+
async findOpenDebtAtLocation(projectId, location) {
|
|
180
|
+
const rows = await pg
|
|
181
|
+
.select()
|
|
182
|
+
.from(techDebt)
|
|
183
|
+
.where(and(eq(techDebt.projectId, projectId), eq(techDebt.location, location), isNull(techDebt.closedAt)))
|
|
184
|
+
.limit(1);
|
|
185
|
+
return rows[0] ?? null;
|
|
186
|
+
},
|
|
187
|
+
async countOpenDebtByProject(projectId) {
|
|
188
|
+
const rows = await pg
|
|
189
|
+
.select({ c: sql `count(*)::int` })
|
|
190
|
+
.from(techDebt)
|
|
191
|
+
.where(and(eq(techDebt.projectId, projectId), isNull(techDebt.closedAt)));
|
|
192
|
+
return Number(rows[0]?.c ?? 0);
|
|
193
|
+
},
|
|
194
|
+
async insertDecision(row) {
|
|
195
|
+
await pg.insert(decision).values(row);
|
|
196
|
+
},
|
|
197
|
+
async findDecisionsByProject(projectId, limit) {
|
|
198
|
+
const rows = await pg
|
|
199
|
+
.select()
|
|
200
|
+
.from(decision)
|
|
201
|
+
.where(eq(decision.projectId, projectId))
|
|
202
|
+
.orderBy(desc(decision.decidedAt))
|
|
203
|
+
.limit(limit);
|
|
204
|
+
return rows;
|
|
205
|
+
},
|
|
206
|
+
async emitEvent(row) {
|
|
207
|
+
await pg.insert(progressEvent).values(row);
|
|
208
|
+
},
|
|
209
|
+
async findRecentEvents(projectId, limit) {
|
|
210
|
+
const rows = await pg
|
|
211
|
+
.select()
|
|
212
|
+
.from(progressEvent)
|
|
213
|
+
.where(eq(progressEvent.projectId, projectId))
|
|
214
|
+
.orderBy(desc(progressEvent.ts))
|
|
215
|
+
.limit(limit);
|
|
216
|
+
return rows;
|
|
217
|
+
},
|
|
218
|
+
async findEventsForSprint(sprintId, limit) {
|
|
219
|
+
const rows = await pg
|
|
220
|
+
.select()
|
|
221
|
+
.from(progressEvent)
|
|
222
|
+
.where(eq(progressEvent.sprintId, sprintId))
|
|
223
|
+
.orderBy(desc(progressEvent.ts))
|
|
224
|
+
.limit(limit);
|
|
225
|
+
return rows;
|
|
226
|
+
},
|
|
227
|
+
async countEventsByKindInSprint(sprintId, kind) {
|
|
228
|
+
const rows = await pg
|
|
229
|
+
.select({ c: sql `count(*)::int` })
|
|
230
|
+
.from(progressEvent)
|
|
231
|
+
.where(and(eq(progressEvent.sprintId, sprintId), eq(progressEvent.kind, kind)));
|
|
232
|
+
return Number(rows[0]?.c ?? 0);
|
|
233
|
+
},
|
|
234
|
+
async findEventsByDeveloper(projectId, developerId, limit) {
|
|
235
|
+
const rows = await pg
|
|
236
|
+
.select()
|
|
237
|
+
.from(progressEvent)
|
|
238
|
+
.where(and(eq(progressEvent.projectId, projectId), eq(progressEvent.developerId, developerId)))
|
|
239
|
+
.orderBy(desc(progressEvent.ts))
|
|
240
|
+
.limit(limit);
|
|
241
|
+
return rows;
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=repo-pg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo-pg.js","sourceRoot":"","sources":["../../../../server/src/db/repo-pg.ts"],"names":[],"mappings":"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"}
|