agor-live 0.8.1 → 0.8.2
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/dist/cli/commands/db/migrate.js +5 -4
- package/dist/cli/commands/db/status.js +19 -15
- package/dist/cli/commands/init.js +7 -6
- package/dist/cli/commands/repo/add-local.d.ts +18 -0
- package/dist/cli/commands/repo/add-local.js +216 -0
- package/dist/cli/commands/repo/add.js +12 -3
- package/dist/cli/commands/repo/list.js +10 -4
- package/dist/cli/commands/repo/rm.js +22 -4
- package/dist/cli/commands/session/load-claude.js +3 -9
- package/dist/cli/commands/user/create-admin.js +21 -4
- package/dist/cli/commands/user/list.js +19 -14
- package/dist/core/api/index.d.cts +11 -2
- package/dist/core/api/index.d.ts +11 -2
- package/dist/core/claude/index.cjs +616 -109
- package/dist/core/claude/index.js +647 -127
- package/dist/core/client-CtwJFT0H.d.ts +5807 -0
- package/dist/core/client-DfarSYxI.d.cts +5807 -0
- package/dist/core/config/browser.cjs +1 -1
- package/dist/core/config/browser.d.cts +57 -4
- package/dist/core/config/browser.d.ts +57 -4
- package/dist/core/config/browser.js +1 -1
- package/dist/core/config/index.cjs +729 -111
- package/dist/core/config/index.d.cts +18 -4
- package/dist/core/config/index.d.ts +18 -4
- package/dist/core/config/index.js +756 -128
- package/dist/core/db/index.cjs +1178 -373
- package/dist/core/db/index.d.cts +5688 -13
- package/dist/core/db/index.d.ts +5688 -13
- package/dist/core/db/index.js +1175 -375
- package/dist/core/drizzle/postgres/0000_loud_loki.sql +224 -0
- package/dist/core/drizzle/postgres/0001_smart_obadiah_stane.sql +1 -0
- package/dist/core/drizzle/postgres/meta/0000_snapshot.json +1888 -0
- package/dist/core/drizzle/postgres/meta/0001_snapshot.json +1895 -0
- package/dist/core/drizzle/postgres/meta/_journal.json +20 -0
- package/dist/core/drizzle/sqlite/0011_curious_felicia_hardy.sql +1 -0
- package/dist/core/drizzle/sqlite/meta/0011_snapshot.json +1438 -0
- package/dist/core/drizzle/{meta → sqlite/meta}/_journal.json +7 -0
- package/dist/core/environment/variable-resolver.d.cts +1 -1
- package/dist/core/environment/variable-resolver.d.ts +1 -1
- package/dist/core/git/index.cjs +30 -6
- package/dist/core/git/index.d.cts +13 -2
- package/dist/core/git/index.d.ts +13 -2
- package/dist/core/git/index.js +30 -7
- package/dist/core/index.cjs +1270 -408
- package/dist/core/index.d.cts +12 -10
- package/dist/core/index.d.ts +12 -10
- package/dist/core/index.js +1263 -410
- package/dist/core/{repo-B1M9axPS.d.ts → repo-BqbCoVbX.d.ts} +18 -6
- package/dist/core/{repo-D4EXWOuB.d.cts → repo-CnGt1AAP.d.cts} +18 -6
- package/dist/core/seed/index.cjs +1190 -490
- package/dist/core/seed/index.js +1186 -480
- package/dist/core/tools/index.cjs +891 -312
- package/dist/core/tools/index.d.cts +14 -23
- package/dist/core/tools/index.d.ts +14 -23
- package/dist/core/tools/index.js +921 -329
- package/dist/core/types/index.d.cts +1 -1
- package/dist/core/types/index.d.ts +1 -1
- package/dist/core/{worktrees-CabqdwJo.d.cts → worktrees-BQpUXSiu.d.cts} +3 -78
- package/dist/core/{worktrees-D8UEZ0Kd.d.ts → worktrees-DGQZ-4Cv.d.ts} +3 -78
- package/dist/daemon/declarations.d.ts +5 -0
- package/dist/daemon/index.js +266 -81
- package/dist/daemon/services/board-objects.js +13 -3
- package/dist/daemon/services/config.js +15 -0
- package/dist/daemon/services/leaderboard.js +26 -22
- package/dist/daemon/services/repos.d.ts +9 -1
- package/dist/daemon/services/repos.js +128 -8
- package/dist/daemon/services/sessions.js +0 -4
- package/dist/daemon/services/users.js +18 -14
- package/dist/ui/assets/{_basePickBy-IDayUuFl.js → _basePickBy-CWF4zzgB.js} +1 -1
- package/dist/ui/assets/_basePickBy-CWF4zzgB.js.gz +0 -0
- package/dist/ui/assets/{_baseUniq-pTRckWwv.js → _baseUniq-CM4NLon9.js} +1 -1
- package/dist/ui/assets/_baseUniq-CM4NLon9.js.gz +0 -0
- package/dist/ui/assets/{arc-CKAf5Yae.js → arc-CIjuwL0B.js} +1 -1
- package/dist/ui/assets/arc-CIjuwL0B.js.gz +0 -0
- package/dist/ui/assets/{architectureDiagram-VXUJARFQ-DZ1BbzT5.js → architectureDiagram-VXUJARFQ-C0hof0OC.js} +1 -1
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-C0hof0OC.js.gz +0 -0
- package/dist/ui/assets/{blockDiagram-VD42YOAC-DXz_vSoa.js → blockDiagram-VD42YOAC-C_DAxOxv.js} +1 -1
- package/dist/ui/assets/blockDiagram-VD42YOAC-C_DAxOxv.js.gz +0 -0
- package/dist/ui/assets/{c4Diagram-YG6GDRKO-CKzoM1Bs.js → c4Diagram-YG6GDRKO-CCdIE46B.js} +1 -1
- package/dist/ui/assets/c4Diagram-YG6GDRKO-CCdIE46B.js.gz +0 -0
- package/dist/ui/assets/channel-ywjLaoiM.js +1 -0
- package/dist/ui/assets/{chunk-4BX2VUAB-PFWyLOWD.js → chunk-4BX2VUAB-B6ym49qO.js} +1 -1
- package/dist/ui/assets/{chunk-55IACEB6-BSFhaugq.js → chunk-55IACEB6-BS-3qSF0.js} +1 -1
- package/dist/ui/assets/{chunk-B4BG7PRW-CAwQ2gOm.js → chunk-B4BG7PRW-CH9vAggf.js} +1 -1
- package/dist/ui/assets/chunk-B4BG7PRW-CH9vAggf.js.gz +0 -0
- package/dist/ui/assets/{chunk-DI55MBZ5-B04QVmg3.js → chunk-DI55MBZ5-DSoQkehV.js} +1 -1
- package/dist/ui/assets/chunk-DI55MBZ5-DSoQkehV.js.gz +0 -0
- package/dist/ui/assets/{chunk-FMBD7UC4-CYNthxFT.js → chunk-FMBD7UC4-CxtkUQIy.js} +1 -1
- package/dist/ui/assets/{chunk-QN33PNHL-D4Owua8X.js → chunk-QN33PNHL-CCCQIALa.js} +1 -1
- package/dist/ui/assets/{chunk-QZHKN3VN-CEZcqXSO.js → chunk-QZHKN3VN-CyLbYZoF.js} +1 -1
- package/dist/ui/assets/{chunk-TZMSLE5B-Bh2hJm-8.js → chunk-TZMSLE5B-dpQkWn_i.js} +1 -1
- package/dist/ui/assets/chunk-TZMSLE5B-dpQkWn_i.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-D99C2VtW.js +1 -0
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-D99C2VtW.js +1 -0
- package/dist/ui/assets/clone-CWbdf7Z5.js +1 -0
- package/dist/ui/assets/{cose-bilkent-S5V4N54A-At4gpvlq.js → cose-bilkent-S5V4N54A-Byg-yKL_.js} +1 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-Byg-yKL_.js.gz +0 -0
- package/dist/ui/assets/{dagre-6UL2VRFP-CFMboGC2.js → dagre-6UL2VRFP-B5xXbHAH.js} +1 -1
- package/dist/ui/assets/dagre-6UL2VRFP-B5xXbHAH.js.gz +0 -0
- package/dist/ui/assets/{diagram-PSM6KHXK-ClNj_8iH.js → diagram-PSM6KHXK-DXnowg-u.js} +1 -1
- package/dist/ui/assets/diagram-PSM6KHXK-DXnowg-u.js.gz +0 -0
- package/dist/ui/assets/{diagram-QEK2KX5R-DmZAqpPs.js → diagram-QEK2KX5R-DOFOk8a_.js} +1 -1
- package/dist/ui/assets/diagram-QEK2KX5R-DOFOk8a_.js.gz +0 -0
- package/dist/ui/assets/{diagram-S2PKOQOG-ChtiwWJv.js → diagram-S2PKOQOG-7kGbu56L.js} +1 -1
- package/dist/ui/assets/diagram-S2PKOQOG-7kGbu56L.js.gz +0 -0
- package/dist/ui/assets/{erDiagram-Q2GNP2WA-BYoMyfdT.js → erDiagram-Q2GNP2WA-CMU8zeJ0.js} +1 -1
- package/dist/ui/assets/erDiagram-Q2GNP2WA-CMU8zeJ0.js.gz +0 -0
- package/dist/ui/assets/{flowDiagram-NV44I4VS-BfMHk5l4.js → flowDiagram-NV44I4VS-DaINI256.js} +1 -1
- package/dist/ui/assets/flowDiagram-NV44I4VS-DaINI256.js.gz +0 -0
- package/dist/ui/assets/{ganttDiagram-LVOFAZNH-CWq9HKP-.js → ganttDiagram-LVOFAZNH-Be7NSitd.js} +1 -1
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-Be7NSitd.js.gz +0 -0
- package/dist/ui/assets/{gitGraphDiagram-NY62KEGX-CwtD0CGB.js → gitGraphDiagram-NY62KEGX-By34460V.js} +1 -1
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-By34460V.js.gz +0 -0
- package/dist/ui/assets/{graph-Ds6pFyG9.js → graph-NyoK-Uig.js} +1 -1
- package/dist/ui/assets/graph-NyoK-Uig.js.gz +0 -0
- package/dist/ui/assets/index-CUlxsIiz.js +1402 -0
- package/dist/ui/assets/index-CUlxsIiz.js.gz +0 -0
- package/dist/ui/assets/index-Dv79Y6gF.css +1 -0
- package/dist/ui/assets/index-Dv79Y6gF.css.gz +0 -0
- package/dist/ui/assets/{infoDiagram-ER5ION4S-Cl8I1ZMS.js → infoDiagram-ER5ION4S-DZDf4Njw.js} +1 -1
- package/dist/ui/assets/{journeyDiagram-XKPGCS4Q-B9tYglzB.js → journeyDiagram-XKPGCS4Q-Cgr-Eqfh.js} +1 -1
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-Cgr-Eqfh.js.gz +0 -0
- package/dist/ui/assets/{kanban-definition-3W4ZIXB7-CnyPfKo4.js → kanban-definition-3W4ZIXB7-n_eTrGhM.js} +1 -1
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-n_eTrGhM.js.gz +0 -0
- package/dist/ui/assets/katex-Br2y_YL1.css +1 -0
- package/dist/ui/assets/katex-Br2y_YL1.css.gz +0 -0
- package/dist/ui/assets/{layout-Dfhvjm8l.js → layout-D5v-gRFR.js} +1 -1
- package/dist/ui/assets/layout-D5v-gRFR.js.gz +0 -0
- package/dist/ui/assets/{linear-KhYTO2KP.js → linear-PC8DSbQR.js} +1 -1
- package/dist/ui/assets/linear-PC8DSbQR.js.gz +0 -0
- package/dist/ui/assets/{mermaid.core-CJyUOghc.js → mermaid.core-DKyW12SO.js} +5 -5
- package/dist/ui/assets/mermaid.core-DKyW12SO.js.gz +0 -0
- package/dist/ui/assets/{mindmap-definition-VGOIOE7T-B1v2bs4i.js → mindmap-definition-VGOIOE7T-BouGsMFI.js} +1 -1
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-BouGsMFI.js.gz +0 -0
- package/dist/ui/assets/{pieDiagram-ADFJNKIX-WGNTSHGw.js → pieDiagram-ADFJNKIX-CgOfJZ_D.js} +1 -1
- package/dist/ui/assets/pieDiagram-ADFJNKIX-CgOfJZ_D.js.gz +0 -0
- package/dist/ui/assets/{quadrantDiagram-AYHSOK5B-CDzsCcCj.js → quadrantDiagram-AYHSOK5B-CHnbgtoU.js} +1 -1
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-CHnbgtoU.js.gz +0 -0
- package/dist/ui/assets/{requirementDiagram-UZGBJVZJ-BEdQl_c-.js → requirementDiagram-UZGBJVZJ-uas2IjRA.js} +1 -1
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-uas2IjRA.js.gz +0 -0
- package/dist/ui/assets/{sankeyDiagram-TZEHDZUN-_Nn2MQsp.js → sankeyDiagram-TZEHDZUN-CrfbDu-2.js} +1 -1
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-CrfbDu-2.js.gz +0 -0
- package/dist/ui/assets/{sequenceDiagram-WL72ISMW-izzqfUoT.js → sequenceDiagram-WL72ISMW-BU9w1rcP.js} +1 -1
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-BU9w1rcP.js.gz +0 -0
- package/dist/ui/assets/{stateDiagram-FKZM4ZOC-Du1UnWS0.js → stateDiagram-FKZM4ZOC-DF1cvysV.js} +1 -1
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-DF1cvysV.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-BeexfTpP.js +1 -0
- package/dist/ui/assets/{timeline-definition-IT6M3QCI-BGOCLsAy.js → timeline-definition-IT6M3QCI-BGJIUWlE.js} +1 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-BGJIUWlE.js.gz +0 -0
- package/dist/ui/assets/{treemap-KMMF4GRG-CcSska5M.js → treemap-KMMF4GRG-DCjahiUv.js} +1 -1
- package/dist/ui/assets/treemap-KMMF4GRG-DCjahiUv.js.gz +0 -0
- package/dist/ui/assets/{xychartDiagram-PRI3JC2R-sTQh2tQw.js → xychartDiagram-PRI3JC2R-BNZPPMd5.js} +1 -1
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-BNZPPMd5.js.gz +0 -0
- package/dist/ui/index.html +2 -2
- package/package.json +19 -16
- package/dist/core/client-CcsvWV9k.d.cts +0 -2966
- package/dist/core/client-WnMz-S0s.d.ts +0 -2966
- package/dist/core/drizzle/0006_add_ready_for_prompt.sql.bak +0 -1
- package/dist/core/drizzle/0007_add_needs_attention.sql.bak +0 -1
- package/dist/ui/assets/_basePickBy-IDayUuFl.js.gz +0 -0
- package/dist/ui/assets/_baseUniq-pTRckWwv.js.gz +0 -0
- package/dist/ui/assets/arc-CKAf5Yae.js.gz +0 -0
- package/dist/ui/assets/architectureDiagram-VXUJARFQ-DZ1BbzT5.js.gz +0 -0
- package/dist/ui/assets/blockDiagram-VD42YOAC-DXz_vSoa.js.gz +0 -0
- package/dist/ui/assets/c4Diagram-YG6GDRKO-CKzoM1Bs.js.gz +0 -0
- package/dist/ui/assets/channel-DVJm-FMC.js +0 -1
- package/dist/ui/assets/chunk-B4BG7PRW-CAwQ2gOm.js.gz +0 -0
- package/dist/ui/assets/chunk-DI55MBZ5-B04QVmg3.js.gz +0 -0
- package/dist/ui/assets/chunk-TZMSLE5B-Bh2hJm-8.js.gz +0 -0
- package/dist/ui/assets/classDiagram-2ON5EDUG-g7OJc0Ig.js +0 -1
- package/dist/ui/assets/classDiagram-v2-WZHVMYZB-g7OJc0Ig.js +0 -1
- package/dist/ui/assets/clone-DiT5ssX1.js +0 -1
- package/dist/ui/assets/cose-bilkent-S5V4N54A-At4gpvlq.js.gz +0 -0
- package/dist/ui/assets/dagre-6UL2VRFP-CFMboGC2.js.gz +0 -0
- package/dist/ui/assets/diagram-PSM6KHXK-ClNj_8iH.js.gz +0 -0
- package/dist/ui/assets/diagram-QEK2KX5R-DmZAqpPs.js.gz +0 -0
- package/dist/ui/assets/diagram-S2PKOQOG-ChtiwWJv.js.gz +0 -0
- package/dist/ui/assets/erDiagram-Q2GNP2WA-BYoMyfdT.js.gz +0 -0
- package/dist/ui/assets/flowDiagram-NV44I4VS-BfMHk5l4.js.gz +0 -0
- package/dist/ui/assets/ganttDiagram-LVOFAZNH-CWq9HKP-.js.gz +0 -0
- package/dist/ui/assets/gitGraphDiagram-NY62KEGX-CwtD0CGB.js.gz +0 -0
- package/dist/ui/assets/graph-Ds6pFyG9.js.gz +0 -0
- package/dist/ui/assets/index-BE42lQpK.css +0 -1
- package/dist/ui/assets/index-BE42lQpK.css.gz +0 -0
- package/dist/ui/assets/index-DeOq507f.js +0 -1372
- package/dist/ui/assets/index-DeOq507f.js.gz +0 -0
- package/dist/ui/assets/journeyDiagram-XKPGCS4Q-B9tYglzB.js.gz +0 -0
- package/dist/ui/assets/kanban-definition-3W4ZIXB7-CnyPfKo4.js.gz +0 -0
- package/dist/ui/assets/layout-Dfhvjm8l.js.gz +0 -0
- package/dist/ui/assets/linear-KhYTO2KP.js.gz +0 -0
- package/dist/ui/assets/mermaid.core-CJyUOghc.js.gz +0 -0
- package/dist/ui/assets/mindmap-definition-VGOIOE7T-B1v2bs4i.js.gz +0 -0
- package/dist/ui/assets/pieDiagram-ADFJNKIX-WGNTSHGw.js.gz +0 -0
- package/dist/ui/assets/quadrantDiagram-AYHSOK5B-CDzsCcCj.js.gz +0 -0
- package/dist/ui/assets/requirementDiagram-UZGBJVZJ-BEdQl_c-.js.gz +0 -0
- package/dist/ui/assets/sankeyDiagram-TZEHDZUN-_Nn2MQsp.js.gz +0 -0
- package/dist/ui/assets/sequenceDiagram-WL72ISMW-izzqfUoT.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-FKZM4ZOC-Du1UnWS0.js.gz +0 -0
- package/dist/ui/assets/stateDiagram-v2-4FDKWEC3-BkR3bHYO.js +0 -1
- package/dist/ui/assets/timeline-definition-IT6M3QCI-BGOCLsAy.js.gz +0 -0
- package/dist/ui/assets/treemap-KMMF4GRG-CcSska5M.js.gz +0 -0
- package/dist/ui/assets/xychartDiagram-PRI3JC2R-sTQh2tQw.js.gz +0 -0
- /package/dist/core/drizzle/{0000_pretty_mac_gargan.sql → sqlite/0000_pretty_mac_gargan.sql} +0 -0
- /package/dist/core/drizzle/{0001_organic_stick.sql → sqlite/0001_organic_stick.sql} +0 -0
- /package/dist/core/drizzle/{0002_clammy_captain_flint.sql → sqlite/0002_clammy_captain_flint.sql} +0 -0
- /package/dist/core/drizzle/{0003_tough_iron_lad.sql → sqlite/0003_tough_iron_lad.sql} +0 -0
- /package/dist/core/drizzle/{0004_add_static_urls.sql → sqlite/0004_add_static_urls.sql} +0 -0
- /package/dist/core/drizzle/{0005_clammy_mole_man.sql → sqlite/0005_clammy_mole_man.sql} +0 -0
- /package/dist/core/drizzle/{0008_stale_marauders.sql → sqlite/0008_stale_marauders.sql} +0 -0
- /package/dist/core/drizzle/{0009_reconcile-missing-columns.sql → sqlite/0009_reconcile-missing-columns.sql} +0 -0
- /package/dist/core/drizzle/{0010_add_archive_columns.sql → sqlite/0010_add_archive_columns.sql} +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0000_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0001_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0002_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0003_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0004_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0005_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0008_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0009_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/0010_snapshot.json +0 -0
- /package/dist/core/drizzle/{meta → sqlite/meta}/_journal.json.backup +0 -0
|
@@ -3,16 +3,17 @@ import { checkMigrationStatus, createDatabase, runMigrations } from "@agor/core/
|
|
|
3
3
|
import { expandPath, extractDbFilePath } from "@agor/core/utils/path";
|
|
4
4
|
import { Command } from "@oclif/core";
|
|
5
5
|
import chalk from "chalk";
|
|
6
|
-
var DbMigrate = class extends Command {
|
|
6
|
+
var DbMigrate = class _DbMigrate extends Command {
|
|
7
7
|
static description = "Run pending database migrations";
|
|
8
8
|
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
9
9
|
async run() {
|
|
10
|
+
await this.parse(_DbMigrate);
|
|
10
11
|
try {
|
|
11
|
-
const
|
|
12
|
-
const dbFilePath = extractDbFilePath(
|
|
12
|
+
const dbUrl = process.env.DATABASE_URL || expandPath(process.env.AGOR_DB_PATH || "file:~/.agor/agor.db");
|
|
13
|
+
const dbFilePath = extractDbFilePath(dbUrl);
|
|
13
14
|
this.log(chalk.bold("\u{1F50D} Checking database migration status..."));
|
|
14
15
|
this.log("");
|
|
15
|
-
const db = createDatabase({ url:
|
|
16
|
+
const db = createDatabase({ url: dbUrl });
|
|
16
17
|
const status = await checkMigrationStatus(db);
|
|
17
18
|
if (!status.hasPending) {
|
|
18
19
|
this.log(`${chalk.green("\u2713")} Database is already up to date!`);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/commands/db/status.ts
|
|
2
|
-
import { createDatabase, sql } from "@agor/core/db";
|
|
2
|
+
import { createDatabase, isSQLiteDatabase, sql } from "@agor/core/db";
|
|
3
3
|
import { expandPath } from "@agor/core/utils/path";
|
|
4
4
|
import { Command } from "@oclif/core";
|
|
5
5
|
import chalk from "chalk";
|
|
@@ -8,28 +8,32 @@ var DbStatus = class extends Command {
|
|
|
8
8
|
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
9
9
|
async run() {
|
|
10
10
|
try {
|
|
11
|
-
const
|
|
12
|
-
const db = createDatabase({ url:
|
|
13
|
-
const tableCheck = await db.run(
|
|
14
|
-
SELECT name FROM sqlite_master
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
const dbUrl = process.env.DATABASE_URL || expandPath(process.env.AGOR_DB_PATH || "file:~/.agor/agor.db");
|
|
12
|
+
const db = createDatabase({ url: dbUrl });
|
|
13
|
+
const tableCheck = isSQLiteDatabase(db) ? await db.run(
|
|
14
|
+
sql`SELECT name FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`
|
|
15
|
+
) : await db.execute(
|
|
16
|
+
sql`SELECT table_name as name FROM information_schema.tables WHERE table_schema = 'drizzle' AND table_name = '__drizzle_migrations'`
|
|
17
|
+
);
|
|
18
|
+
const tableCheckResult = tableCheck;
|
|
19
|
+
if (tableCheckResult.rows.length === 0) {
|
|
18
20
|
this.log(
|
|
19
21
|
`${chalk.yellow("\u26A0")} No migrations table found. Run ${chalk.cyan("agor db migrate")} to initialize.`
|
|
20
22
|
);
|
|
21
23
|
return;
|
|
22
24
|
}
|
|
23
|
-
const result = await db.run(
|
|
24
|
-
SELECT hash, created_at FROM __drizzle_migrations
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
const result = isSQLiteDatabase(db) ? await db.run(
|
|
26
|
+
sql`SELECT hash, created_at FROM __drizzle_migrations ORDER BY created_at ASC`
|
|
27
|
+
) : await db.execute(
|
|
28
|
+
sql`SELECT hash, created_at FROM drizzle.__drizzle_migrations ORDER BY created_at ASC`
|
|
29
|
+
);
|
|
30
|
+
const queryResult = result;
|
|
31
|
+
if (queryResult.rows.length === 0) {
|
|
28
32
|
this.log("No migrations applied yet");
|
|
29
33
|
return;
|
|
30
34
|
}
|
|
31
35
|
this.log(chalk.bold("\nApplied migrations:\n"));
|
|
32
|
-
|
|
36
|
+
queryResult.rows.forEach((row) => {
|
|
33
37
|
const migration = row;
|
|
34
38
|
const date = new Date(migration.created_at);
|
|
35
39
|
const formattedDate = date.toLocaleString();
|
|
@@ -38,7 +42,7 @@ var DbStatus = class extends Command {
|
|
|
38
42
|
);
|
|
39
43
|
});
|
|
40
44
|
this.log(`
|
|
41
|
-
${chalk.bold(`Total: ${
|
|
45
|
+
${chalk.bold(`Total: ${queryResult.rows.length} migration(s)`)}`);
|
|
42
46
|
} catch (error) {
|
|
43
47
|
this.error(
|
|
44
48
|
`Failed to get migration status: ${error instanceof Error ? error.message : String(error)}`
|
|
@@ -62,12 +62,12 @@ var Init = class _Init extends Command {
|
|
|
62
62
|
*/
|
|
63
63
|
async getDbStats(dbPath) {
|
|
64
64
|
try {
|
|
65
|
-
const { createDatabase: createDatabase2, sessions, tasks, messages, repos } = await import("@agor/core/db");
|
|
65
|
+
const { createDatabase: createDatabase2, select, sessions, tasks, messages, repos } = await import("@agor/core/db");
|
|
66
66
|
const db = createDatabase2({ url: `file:${dbPath}` });
|
|
67
|
-
const sessionRows = await
|
|
68
|
-
const taskRows = await
|
|
69
|
-
const messageRows = await
|
|
70
|
-
const repoRows = await
|
|
67
|
+
const sessionRows = await select(db).from(sessions).all();
|
|
68
|
+
const taskRows = await select(db).from(tasks).all();
|
|
69
|
+
const messageRows = await select(db).from(messages).all();
|
|
70
|
+
const repoRows = await select(db).from(repos).all();
|
|
71
71
|
return {
|
|
72
72
|
sessions: sessionRows.length,
|
|
73
73
|
tasks: taskRows.length,
|
|
@@ -238,7 +238,8 @@ var Init = class _Init extends Command {
|
|
|
238
238
|
join(baseDir, "repos"),
|
|
239
239
|
join(baseDir, "worktrees"),
|
|
240
240
|
join(baseDir, "concepts"),
|
|
241
|
-
join(baseDir, "logs")
|
|
241
|
+
join(baseDir, "logs"),
|
|
242
|
+
join(baseDir, "codex")
|
|
242
243
|
];
|
|
243
244
|
for (const dir of dirs) {
|
|
244
245
|
await mkdir(dir, { recursive: true });
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as _oclif_core_interfaces from '@oclif/core/interfaces';
|
|
2
|
+
import { BaseCommand } from '../../base-command.js';
|
|
3
|
+
import '@agor/core/api';
|
|
4
|
+
import '@oclif/core';
|
|
5
|
+
|
|
6
|
+
declare class RepoAddLocal extends BaseCommand {
|
|
7
|
+
static description: string;
|
|
8
|
+
static examples: string[];
|
|
9
|
+
static args: {
|
|
10
|
+
path: _oclif_core_interfaces.Arg<string, Record<string, unknown>>;
|
|
11
|
+
};
|
|
12
|
+
static flags: {
|
|
13
|
+
slug: _oclif_core_interfaces.OptionFlag<string | undefined, _oclif_core_interfaces.CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export { RepoAddLocal as default };
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
3
|
+
var __esm = (fn, res) => function __init() {
|
|
4
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
5
|
+
};
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
// src/lib/auth.ts
|
|
12
|
+
var auth_exports = {};
|
|
13
|
+
__export(auth_exports, {
|
|
14
|
+
clearToken: () => clearToken,
|
|
15
|
+
loadToken: () => loadToken,
|
|
16
|
+
saveToken: () => saveToken
|
|
17
|
+
});
|
|
18
|
+
import { mkdir, readFile, unlink, writeFile } from "fs/promises";
|
|
19
|
+
import { homedir } from "os";
|
|
20
|
+
import { join } from "path";
|
|
21
|
+
async function saveToken(auth) {
|
|
22
|
+
await mkdir(AGOR_DIR, { recursive: true });
|
|
23
|
+
await writeFile(TOKEN_FILE, JSON.stringify(auth, null, 2), {
|
|
24
|
+
mode: 384
|
|
25
|
+
// Owner read/write only
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
async function loadToken() {
|
|
29
|
+
try {
|
|
30
|
+
const data = await readFile(TOKEN_FILE, "utf-8");
|
|
31
|
+
const auth = JSON.parse(data);
|
|
32
|
+
if (auth.expiresAt && Date.now() > auth.expiresAt) {
|
|
33
|
+
await clearToken();
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return auth;
|
|
37
|
+
} catch {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function clearToken() {
|
|
42
|
+
try {
|
|
43
|
+
await unlink(TOKEN_FILE);
|
|
44
|
+
} catch {
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
var AGOR_DIR, TOKEN_FILE;
|
|
48
|
+
var init_auth = __esm({
|
|
49
|
+
"src/lib/auth.ts"() {
|
|
50
|
+
"use strict";
|
|
51
|
+
AGOR_DIR = join(homedir(), ".agor");
|
|
52
|
+
TOKEN_FILE = join(AGOR_DIR, "cli-token");
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// src/commands/repo/add-local.ts
|
|
57
|
+
import { Args, Flags } from "@oclif/core";
|
|
58
|
+
import chalk2 from "chalk";
|
|
59
|
+
|
|
60
|
+
// src/base-command.ts
|
|
61
|
+
init_auth();
|
|
62
|
+
import { createRestClient, isDaemonRunning } from "@agor/core/api";
|
|
63
|
+
import { getDaemonUrl } from "@agor/core/config";
|
|
64
|
+
import { Command } from "@oclif/core";
|
|
65
|
+
import chalk from "chalk";
|
|
66
|
+
var BaseCommand = class extends Command {
|
|
67
|
+
daemonUrl = null;
|
|
68
|
+
/**
|
|
69
|
+
* Connect to daemon (checks if running first)
|
|
70
|
+
*
|
|
71
|
+
* @returns Feathers client instance
|
|
72
|
+
*/
|
|
73
|
+
async connectToDaemon() {
|
|
74
|
+
this.daemonUrl = await getDaemonUrl();
|
|
75
|
+
const running = await isDaemonRunning(this.daemonUrl);
|
|
76
|
+
if (!running) {
|
|
77
|
+
this.log(
|
|
78
|
+
chalk.red("\u2717 Daemon not running") + "\n\n" + chalk.bold("To start the daemon:") + "\n " + chalk.cyan("cd apps/agor-daemon && pnpm dev") + "\n\n" + chalk.bold("To configure daemon URL:") + "\n " + chalk.cyan("agor config set daemon.url <url>") + "\n " + chalk.gray(`Current: ${this.daemonUrl}`)
|
|
79
|
+
);
|
|
80
|
+
this.exit(1);
|
|
81
|
+
}
|
|
82
|
+
const client = await createRestClient(this.daemonUrl);
|
|
83
|
+
const storedAuth = await loadToken();
|
|
84
|
+
if (storedAuth) {
|
|
85
|
+
try {
|
|
86
|
+
await client.authenticate({
|
|
87
|
+
strategy: "jwt",
|
|
88
|
+
accessToken: storedAuth.accessToken
|
|
89
|
+
});
|
|
90
|
+
} catch (_error) {
|
|
91
|
+
const { clearToken: clearToken2 } = await Promise.resolve().then(() => (init_auth(), auth_exports));
|
|
92
|
+
await clearToken2();
|
|
93
|
+
this.error(
|
|
94
|
+
chalk.red("\u2717 Authentication failed") + "\n\n" + chalk.dim("Your session has expired or is invalid.") + "\n" + chalk.dim("Please login again:") + "\n " + chalk.cyan("agor login")
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
} else {
|
|
98
|
+
try {
|
|
99
|
+
const response = await fetch(`${this.daemonUrl}/health`);
|
|
100
|
+
const health = await response.json();
|
|
101
|
+
if (health.auth?.requireAuth) {
|
|
102
|
+
this.error(
|
|
103
|
+
chalk.red("\u2717 Not authenticated") + "\n\n" + chalk.dim("This Agor instance requires authentication.") + "\n" + chalk.dim("Please login:") + "\n " + chalk.cyan("agor login")
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
await client.authenticate({ strategy: "anonymous" });
|
|
108
|
+
} catch (_authError) {
|
|
109
|
+
this.error(
|
|
110
|
+
chalk.red("\u2717 Authentication failed") + "\n\n" + chalk.dim("Please login:") + "\n " + chalk.cyan("agor login")
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
} catch (_error) {
|
|
114
|
+
try {
|
|
115
|
+
await client.authenticate({ strategy: "anonymous" });
|
|
116
|
+
} catch {
|
|
117
|
+
this.error(
|
|
118
|
+
chalk.red("\u2717 Not authenticated") + "\n\n" + chalk.dim("Please login to use the Agor CLI:") + "\n " + chalk.cyan("agor login")
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return client;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Cleanup client connection
|
|
127
|
+
*
|
|
128
|
+
* Ensures socket is properly closed to prevent hanging processes
|
|
129
|
+
*/
|
|
130
|
+
async cleanupClient(client) {
|
|
131
|
+
client.io.io.opts.reconnection = false;
|
|
132
|
+
client.io.removeAllListeners();
|
|
133
|
+
client.io.close();
|
|
134
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
// src/commands/repo/add-local.ts
|
|
139
|
+
var RepoAddLocal = class _RepoAddLocal extends BaseCommand {
|
|
140
|
+
static description = "Add an existing local git repository to Agor";
|
|
141
|
+
static examples = [
|
|
142
|
+
"# Auto-detect slug from git remote",
|
|
143
|
+
"<%= config.bin %> <%= command.id %> ~/code/myapp",
|
|
144
|
+
"",
|
|
145
|
+
"# Provide explicit slug",
|
|
146
|
+
"<%= config.bin %> <%= command.id %> ~/code/myapp --slug company/myapp"
|
|
147
|
+
];
|
|
148
|
+
static args = {
|
|
149
|
+
path: Args.string({
|
|
150
|
+
description: "Absolute path to local git repository (supports ~ expansion)",
|
|
151
|
+
required: true
|
|
152
|
+
})
|
|
153
|
+
};
|
|
154
|
+
static flags = {
|
|
155
|
+
slug: Flags.string({
|
|
156
|
+
char: "s",
|
|
157
|
+
description: "Custom slug (org/name) for the repository"
|
|
158
|
+
})
|
|
159
|
+
};
|
|
160
|
+
async run() {
|
|
161
|
+
const { args, flags } = await this.parse(_RepoAddLocal);
|
|
162
|
+
const client = await this.connectToDaemon();
|
|
163
|
+
try {
|
|
164
|
+
const repoPath = args.path;
|
|
165
|
+
this.log("");
|
|
166
|
+
this.log(chalk2.bold(`Registering local repository: ${chalk2.cyan(repoPath)}`));
|
|
167
|
+
if (flags.slug) {
|
|
168
|
+
this.log(chalk2.dim(`Using slug: ${chalk2.cyan(flags.slug)}`));
|
|
169
|
+
} else {
|
|
170
|
+
this.log(chalk2.dim("Attempting to auto-detect slug from git remote (origin)..."));
|
|
171
|
+
}
|
|
172
|
+
this.log("");
|
|
173
|
+
const repo = await client.service("repos/local").create({
|
|
174
|
+
path: repoPath,
|
|
175
|
+
slug: flags.slug
|
|
176
|
+
});
|
|
177
|
+
this.log(`${chalk2.green("\u2713")} Local repository added`);
|
|
178
|
+
this.log(chalk2.dim(` Type: local`));
|
|
179
|
+
this.log(chalk2.dim(` Slug: ${repo.slug}`));
|
|
180
|
+
this.log(chalk2.dim(` Path: ${repo.local_path}`));
|
|
181
|
+
if (repo.remote_url) {
|
|
182
|
+
this.log(chalk2.dim(` Remote: ${repo.remote_url}`));
|
|
183
|
+
} else {
|
|
184
|
+
this.log(chalk2.dim(" Remote: (none detected)"));
|
|
185
|
+
}
|
|
186
|
+
this.log(chalk2.dim(` Default branch: ${repo.default_branch ?? "unknown"}`));
|
|
187
|
+
this.log("");
|
|
188
|
+
await this.cleanupClient(client);
|
|
189
|
+
} catch (error) {
|
|
190
|
+
await this.cleanupClient(client);
|
|
191
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
192
|
+
this.log("");
|
|
193
|
+
if (/Not a valid git repository/i.test(message)) {
|
|
194
|
+
this.log(chalk2.red("\u2717 Not a valid git repository"));
|
|
195
|
+
this.log(chalk2.dim(message));
|
|
196
|
+
} else if (/already exists/i.test(message)) {
|
|
197
|
+
this.log(chalk2.red("\u2717 Repository already exists"));
|
|
198
|
+
this.log(chalk2.dim(message));
|
|
199
|
+
} else if (/Could not auto-detect slug/i.test(message)) {
|
|
200
|
+
this.log(chalk2.red("\u2717 Could not auto-detect slug"));
|
|
201
|
+
this.log(chalk2.dim(message));
|
|
202
|
+
} else if (/Path must be absolute/i.test(message)) {
|
|
203
|
+
this.log(chalk2.red("\u2717 Path must be absolute"));
|
|
204
|
+
this.log(chalk2.dim(message));
|
|
205
|
+
} else {
|
|
206
|
+
this.log(chalk2.red("\u2717 Failed to add local repository"));
|
|
207
|
+
this.log(chalk2.dim(message));
|
|
208
|
+
}
|
|
209
|
+
this.log("");
|
|
210
|
+
this.exit(1);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
export {
|
|
215
|
+
RepoAddLocal as default
|
|
216
|
+
};
|
|
@@ -138,11 +138,19 @@ var BaseCommand = class extends Command {
|
|
|
138
138
|
|
|
139
139
|
// src/commands/repo/add.ts
|
|
140
140
|
var RepoAdd = class _RepoAdd extends BaseCommand {
|
|
141
|
-
static description = "Clone and register
|
|
141
|
+
static description = "Clone a remote git repository and register it with Agor";
|
|
142
142
|
static examples = [
|
|
143
|
+
"# Clone from GitHub (SSH)",
|
|
143
144
|
"<%= config.bin %> <%= command.id %> git@github.com:apache/superset.git",
|
|
145
|
+
"",
|
|
146
|
+
"# Clone from GitHub (HTTPS)",
|
|
144
147
|
"<%= config.bin %> <%= command.id %> https://github.com/facebook/react.git",
|
|
145
|
-
"
|
|
148
|
+
"",
|
|
149
|
+
"# Custom slug",
|
|
150
|
+
"<%= config.bin %> <%= command.id %> https://github.com/apache/superset.git --slug my-org/custom-name",
|
|
151
|
+
"",
|
|
152
|
+
"# Already have the repo locally?",
|
|
153
|
+
"<%= config.bin %> repo add-local ~/code/myapp"
|
|
146
154
|
];
|
|
147
155
|
static args = {
|
|
148
156
|
url: Args.string({
|
|
@@ -193,7 +201,8 @@ Use --slug to specify a custom slug.`
|
|
|
193
201
|
this.log("");
|
|
194
202
|
const repo = await client.service("repos").clone({
|
|
195
203
|
url: args.url,
|
|
196
|
-
name: slug
|
|
204
|
+
name: slug,
|
|
205
|
+
slug
|
|
197
206
|
});
|
|
198
207
|
this.log(`${chalk2.green("\u2713")} Repository cloned and registered`);
|
|
199
208
|
this.log(chalk2.dim(` Path: ${repo.local_path}`));
|
|
@@ -172,7 +172,11 @@ var RepoList = class _RepoList extends BaseCommand {
|
|
|
172
172
|
if (!Array.isArray(repos) || repos.length === 0) {
|
|
173
173
|
this.log(chalk2.dim("No repositories found."));
|
|
174
174
|
this.log("");
|
|
175
|
-
this.log(
|
|
175
|
+
this.log(
|
|
176
|
+
`Add one with: ${chalk2.cyan("agor repo add <git-url>")} or ${chalk2.cyan(
|
|
177
|
+
"agor repo add-local <path>"
|
|
178
|
+
)}`
|
|
179
|
+
);
|
|
176
180
|
this.log("");
|
|
177
181
|
await this.cleanupClient(client);
|
|
178
182
|
return;
|
|
@@ -181,6 +185,7 @@ var RepoList = class _RepoList extends BaseCommand {
|
|
|
181
185
|
head: [
|
|
182
186
|
chalk2.cyan("ID"),
|
|
183
187
|
chalk2.cyan("Slug"),
|
|
188
|
+
chalk2.cyan("Type"),
|
|
184
189
|
chalk2.cyan("Remote URL"),
|
|
185
190
|
chalk2.cyan("Path"),
|
|
186
191
|
chalk2.cyan("Default Branch")
|
|
@@ -189,15 +194,16 @@ var RepoList = class _RepoList extends BaseCommand {
|
|
|
189
194
|
head: [],
|
|
190
195
|
border: ["dim"]
|
|
191
196
|
},
|
|
192
|
-
colWidths: [10,
|
|
197
|
+
colWidths: [10, 22, 10, 38, 32, 15]
|
|
193
198
|
});
|
|
194
199
|
for (const repo of repos) {
|
|
195
200
|
const shortId = formatShortId(repo.repo_id);
|
|
196
201
|
table.push([
|
|
197
202
|
chalk2.dim(shortId),
|
|
198
203
|
repo.slug,
|
|
199
|
-
|
|
200
|
-
|
|
204
|
+
repo.repo_type,
|
|
205
|
+
this.truncate(repo.remote_url || "(no remote)", 35),
|
|
206
|
+
chalk2.dim(this.truncate(repo.local_path, 30)),
|
|
201
207
|
chalk2.dim(repo.default_branch || "-")
|
|
202
208
|
]);
|
|
203
209
|
}
|
|
@@ -183,13 +183,23 @@ var RepoRm = class _RepoRm extends BaseCommand {
|
|
|
183
183
|
this.log(chalk2.bold.red("\u26A0 Repository to be removed:"));
|
|
184
184
|
this.log(` ${chalk2.cyan("ID")}: ${repo.repo_id}`);
|
|
185
185
|
this.log(` ${chalk2.cyan("Slug")}: ${repo.slug}`);
|
|
186
|
+
this.log(` ${chalk2.cyan("Type")}: ${repo.repo_type}`);
|
|
186
187
|
this.log(` ${chalk2.cyan("Path")}: ${repo.local_path}`);
|
|
187
188
|
this.log("");
|
|
188
189
|
if (flags["delete-files"]) {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
190
|
+
if (repo.repo_type === "local") {
|
|
191
|
+
this.log(
|
|
192
|
+
chalk2.yellow(
|
|
193
|
+
"\u26A0 WARNING: --delete-files is ignored for local repositories to protect your working copy."
|
|
194
|
+
)
|
|
195
|
+
);
|
|
196
|
+
this.log("");
|
|
197
|
+
} else {
|
|
198
|
+
this.log(chalk2.yellow("\u26A0 WARNING: Local files will also be deleted:"));
|
|
199
|
+
this.log(chalk2.yellow(` Main repo: ${repo.local_path}`));
|
|
200
|
+
this.log(chalk2.yellow(` Note: Any associated worktrees will also be deleted`));
|
|
201
|
+
this.log("");
|
|
202
|
+
}
|
|
193
203
|
} else {
|
|
194
204
|
this.log(chalk2.dim("(Local files will NOT be deleted)"));
|
|
195
205
|
this.log("");
|
|
@@ -223,6 +233,14 @@ var RepoRm = class _RepoRm extends BaseCommand {
|
|
|
223
233
|
]);
|
|
224
234
|
deleteFiles = shouldDelete;
|
|
225
235
|
}
|
|
236
|
+
if (deleteFiles && repo.repo_type === "local") {
|
|
237
|
+
this.log(
|
|
238
|
+
chalk2.yellow(
|
|
239
|
+
"Skipping filesystem deletion for local repository to avoid removing your original clone."
|
|
240
|
+
)
|
|
241
|
+
);
|
|
242
|
+
deleteFiles = false;
|
|
243
|
+
}
|
|
226
244
|
if (deleteFiles) {
|
|
227
245
|
const fs = await import("fs/promises");
|
|
228
246
|
try {
|
|
@@ -191,15 +191,9 @@ ${chalk2.blue("\u25CF")} Loading Claude Code session: ${chalk2.cyan(sessionId)}
|
|
|
191
191
|
} catch {
|
|
192
192
|
}
|
|
193
193
|
if (!repo) {
|
|
194
|
-
const newRepo = await
|
|
195
|
-
|
|
196
|
-
slug: `imported-${projectName}
|
|
197
|
-
name: projectName,
|
|
198
|
-
remote_url: "",
|
|
199
|
-
// No remote for imported sessions
|
|
200
|
-
local_path: absoluteProjectDir,
|
|
201
|
-
created_at: (/* @__PURE__ */ new Date()).toISOString(),
|
|
202
|
-
last_updated: (/* @__PURE__ */ new Date()).toISOString()
|
|
194
|
+
const newRepo = await client.service("repos/local").create({
|
|
195
|
+
path: absoluteProjectDir,
|
|
196
|
+
slug: `imported-${projectName}`
|
|
203
197
|
});
|
|
204
198
|
repo = { repo_id: newRepo.repo_id, slug: newRepo.slug };
|
|
205
199
|
this.log(`${chalk2.green("\u2713")} Created repo: ${chalk2.cyan(repo.slug)}`);
|
|
@@ -15,10 +15,14 @@ var UserCreateAdmin = class extends Command {
|
|
|
15
15
|
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
16
16
|
async run() {
|
|
17
17
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
18
|
+
let databaseUrl = process.env.DATABASE_URL;
|
|
19
|
+
if (!databaseUrl) {
|
|
20
|
+
const configPath = getConfigPath();
|
|
21
|
+
const agorHome = join(configPath, "..");
|
|
22
|
+
const dbPath = join(agorHome, "agor.db");
|
|
23
|
+
databaseUrl = `file:${dbPath}`;
|
|
24
|
+
}
|
|
25
|
+
const db = createDatabase({ url: databaseUrl });
|
|
22
26
|
await runMigrations(db);
|
|
23
27
|
const existingAdmin = await getUserByEmail(db, DEFAULT_ADMIN_USER.email);
|
|
24
28
|
if (existingAdmin) {
|
|
@@ -57,6 +61,19 @@ var UserCreateAdmin = class extends Command {
|
|
|
57
61
|
this.log(chalk.red("\u2717 Failed to create admin user"));
|
|
58
62
|
if (error instanceof Error) {
|
|
59
63
|
this.log(chalk.red(` ${error.message}`));
|
|
64
|
+
if (error.stack) {
|
|
65
|
+
this.log(chalk.gray(error.stack));
|
|
66
|
+
}
|
|
67
|
+
if ("cause" in error && error.cause) {
|
|
68
|
+
this.log(chalk.red(" Caused by:"));
|
|
69
|
+
if (error.cause instanceof Error) {
|
|
70
|
+
this.log(chalk.red(` ${error.cause.message}`));
|
|
71
|
+
} else {
|
|
72
|
+
this.log(chalk.red(` ${String(error.cause)}`));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
this.log(chalk.red(` ${String(error)}`));
|
|
60
77
|
}
|
|
61
78
|
process.exit(1);
|
|
62
79
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/commands/user/list.ts
|
|
2
2
|
import { join } from "path";
|
|
3
3
|
import { getConfigPath } from "@agor/core/config";
|
|
4
|
-
import { createDatabase, users } from "@agor/core/db";
|
|
4
|
+
import { createDatabase, select, users } from "@agor/core/db";
|
|
5
5
|
import { Command } from "@oclif/core";
|
|
6
6
|
import chalk from "chalk";
|
|
7
7
|
import Table from "cli-table3";
|
|
@@ -10,11 +10,15 @@ var UserList = class extends Command {
|
|
|
10
10
|
static examples = ["<%= config.bin %> <%= command.id %>"];
|
|
11
11
|
async run() {
|
|
12
12
|
try {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
let databaseUrl = process.env.DATABASE_URL;
|
|
14
|
+
if (!databaseUrl) {
|
|
15
|
+
const configPath = getConfigPath();
|
|
16
|
+
const agorHome = join(configPath, "..");
|
|
17
|
+
const dbPath = join(agorHome, "agor.db");
|
|
18
|
+
databaseUrl = `file:${dbPath}`;
|
|
19
|
+
}
|
|
20
|
+
const db = createDatabase({ url: databaseUrl });
|
|
21
|
+
const rows = await select(db).from(users).all();
|
|
18
22
|
if (rows.length === 0) {
|
|
19
23
|
this.log(chalk.yellow("No users found"));
|
|
20
24
|
this.log("");
|
|
@@ -22,17 +26,18 @@ var UserList = class extends Command {
|
|
|
22
26
|
process.exit(0);
|
|
23
27
|
}
|
|
24
28
|
const userList = rows.map((row) => {
|
|
25
|
-
const
|
|
29
|
+
const userRow = row;
|
|
30
|
+
const data = userRow.data;
|
|
26
31
|
return {
|
|
27
|
-
user_id:
|
|
28
|
-
email:
|
|
29
|
-
name:
|
|
30
|
-
role:
|
|
32
|
+
user_id: userRow.user_id,
|
|
33
|
+
email: userRow.email,
|
|
34
|
+
name: userRow.name ?? void 0,
|
|
35
|
+
role: userRow.role,
|
|
31
36
|
avatar: data.avatar,
|
|
32
37
|
preferences: data.preferences,
|
|
33
|
-
onboarding_completed: !!
|
|
34
|
-
created_at:
|
|
35
|
-
updated_at:
|
|
38
|
+
onboarding_completed: !!userRow.onboarding_completed,
|
|
39
|
+
created_at: userRow.created_at,
|
|
40
|
+
updated_at: userRow.updated_at ?? void 0
|
|
36
41
|
};
|
|
37
42
|
});
|
|
38
43
|
const table = new Table({
|
|
@@ -4,7 +4,7 @@ import { a as ContextFileListItem, b as ContextFileDetail } from '../context-Byx
|
|
|
4
4
|
import { b as AuthenticationResult } from '../feathers-BzHEPnpl.cjs';
|
|
5
5
|
import { h as MCPServer } from '../mcp-DpJnAKie.cjs';
|
|
6
6
|
import { d as User } from '../user-tw6jnTBl.cjs';
|
|
7
|
-
import {
|
|
7
|
+
import { b as Repo, d as Worktree } from '../repo-CnGt1AAP.cjs';
|
|
8
8
|
import { a as Session } from '../session-iGZzVt8R.cjs';
|
|
9
9
|
import { h as Task } from '../task-_5gT3HqF.cjs';
|
|
10
10
|
import { Params, Paginated, Application } from '@feathersjs/feathers';
|
|
@@ -29,6 +29,7 @@ interface ServiceTypes {
|
|
|
29
29
|
tasks: Task;
|
|
30
30
|
boards: Board;
|
|
31
31
|
repos: Repo;
|
|
32
|
+
'repos/local': Repo;
|
|
32
33
|
worktrees: Worktree;
|
|
33
34
|
users: User;
|
|
34
35
|
'mcp-servers': MCPServer;
|
|
@@ -116,6 +117,7 @@ interface ReposService extends AgorService<Repo> {
|
|
|
116
117
|
clone(data: {
|
|
117
118
|
url: string;
|
|
118
119
|
name?: string;
|
|
120
|
+
slug?: string;
|
|
119
121
|
}, params?: Params): Promise<Repo>;
|
|
120
122
|
/**
|
|
121
123
|
* Create a git worktree for a repository
|
|
@@ -132,6 +134,12 @@ interface ReposService extends AgorService<Repo> {
|
|
|
132
134
|
*/
|
|
133
135
|
removeWorktree(id: string, name: string, params?: Params): Promise<Repo>;
|
|
134
136
|
}
|
|
137
|
+
interface ReposLocalService extends AgorService<Repo> {
|
|
138
|
+
create(data: {
|
|
139
|
+
path: string;
|
|
140
|
+
slug?: string;
|
|
141
|
+
}, params?: Params): Promise<Repo>;
|
|
142
|
+
}
|
|
135
143
|
/**
|
|
136
144
|
* Worktrees service with environment management
|
|
137
145
|
*/
|
|
@@ -202,6 +210,7 @@ interface AgorClient extends Omit<Application<ServiceTypes>, 'service'> {
|
|
|
202
210
|
service(path: 'tasks'): TasksService;
|
|
203
211
|
service(path: 'messages'): MessagesService;
|
|
204
212
|
service(path: 'repos'): ReposService;
|
|
213
|
+
service(path: 'repos/local'): ReposLocalService;
|
|
205
214
|
service(path: 'worktrees'): WorktreesService;
|
|
206
215
|
service(path: 'messages/bulk'): MessagesService;
|
|
207
216
|
service(path: 'tasks/bulk'): TasksService;
|
|
@@ -249,4 +258,4 @@ declare function createClient(url?: string, autoConnect?: boolean, options?: {
|
|
|
249
258
|
*/
|
|
250
259
|
declare function isDaemonRunning(url?: string): Promise<boolean>;
|
|
251
260
|
|
|
252
|
-
export { type AgorClient, type AgorService, type MessagesService, type ReposService, type ServiceTypes, type SessionsService, type TasksService, type WorktreesService, createClient, createRestClient, isDaemonRunning };
|
|
261
|
+
export { type AgorClient, type AgorService, type MessagesService, type ReposLocalService, type ReposService, type ServiceTypes, type SessionsService, type TasksService, type WorktreesService, createClient, createRestClient, isDaemonRunning };
|