hanoman 0.1.7 → 0.1.9
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/build-info.json +3 -3
- package/dist/cli.js +162 -89
- package/dist/server.js +834 -55
- package/package.json +1 -1
- package/prisma/migrations/20260731210000_spec_depends_on/migration.sql +7 -0
- package/prisma/migrations/20260801120000_custom_agent/migration.sql +27 -0
- package/prisma/schema.prisma +43 -2
- package/web/assets/{index-BWyQwoAk.js → index-D5MU9hT6.js} +1534 -1534
- package/web/index.html +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- SPEC-447 · ADR-0093 · dependency antar-backlog.
|
|
2
|
+
--
|
|
3
|
+
-- ADITIF & nullable tanpa default → `ADD COLUMN` polos sudah cukup. Beda dari migration SPEC-408
|
|
4
|
+
-- yang harus meredefinisi tabel: yang dilarang SQLite adalah `ADD COLUMN … DEFAULT <non-konstan>`,
|
|
5
|
+
-- bukan `ADD COLUMN` itu sendiri. Baris lama tetap NULL, dan pembaca menerjemahkan NULL → []
|
|
6
|
+
-- (`dependsOnOf` di services/spec-deps.ts) — jadi tak ada backfill yang perlu dilakukan.
|
|
7
|
+
ALTER TABLE "Spec" ADD COLUMN "dependsOn" JSONB;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
-- SPEC-450 · ADR-0094 · katalog custom agent (global & per project), ikut changefeed sync.
|
|
2
|
+
--
|
|
3
|
+
-- Tabel baru → `CREATE TABLE` polos; tak ada redefinisi tabel seperti migration SPEC-408.
|
|
4
|
+
-- `id` deterministik "<projectId|global>:<name>" ditulis aplikasi, bukan default DB.
|
|
5
|
+
--
|
|
6
|
+
-- CATATAN indeks unik: pada SQLite, NULL saling BERBEDA di indeks unik, jadi baris ini TIDAK
|
|
7
|
+
-- mencegah dua agen global bernama sama. Yang mencegahnya adalah PK deterministik. Indeks tetap
|
|
8
|
+
-- dipasang sebagai jaring kedua untuk baris ber-project.
|
|
9
|
+
CREATE TABLE "CustomAgent" (
|
|
10
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
11
|
+
"projectId" TEXT,
|
|
12
|
+
"name" TEXT NOT NULL,
|
|
13
|
+
"description" TEXT NOT NULL,
|
|
14
|
+
"instructions" TEXT NOT NULL,
|
|
15
|
+
"tools" JSONB,
|
|
16
|
+
"model" TEXT,
|
|
17
|
+
"mentions" JSONB,
|
|
18
|
+
"enabled" BOOLEAN NOT NULL DEFAULT true,
|
|
19
|
+
"version" INTEGER NOT NULL DEFAULT 0,
|
|
20
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
21
|
+
"updatedAt" DATETIME NOT NULL,
|
|
22
|
+
CONSTRAINT "CustomAgent_projectId_fkey" FOREIGN KEY ("projectId")
|
|
23
|
+
REFERENCES "Project" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
CREATE UNIQUE INDEX "CustomAgent_projectId_name_key" ON "CustomAgent" ("projectId", "name");
|
|
27
|
+
CREATE INDEX "CustomAgent_projectId_idx" ON "CustomAgent" ("projectId");
|
package/prisma/schema.prisma
CHANGED
|
@@ -21,8 +21,9 @@ model Project {
|
|
|
21
21
|
helpEnabled Boolean @default(false) // SPEC-253 · opt-in Help Center publik
|
|
22
22
|
schedulerOptIn Boolean @default(false) // SPEC-294 · ADR-0072 · opt-in scheduler otonom (LOCAL — tak masuk FIELDS sync)
|
|
23
23
|
leadOptIn Boolean @default(false) // SPEC-409 · ADR-0091 · opt-in hanoman-lead (LOCAL — cermin schedulerOptIn)
|
|
24
|
-
specs
|
|
25
|
-
tickets
|
|
24
|
+
specs Spec[]
|
|
25
|
+
tickets Ticket[]
|
|
26
|
+
customAgents CustomAgent[] // SPEC-450 · ADR-0094 · custom agent milik project ini
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
model Spec {
|
|
@@ -46,10 +47,50 @@ model Spec {
|
|
|
46
47
|
// sama dengan `baseSha` (services/session-launch.ts); jalur RESUME (ADR-0084) sengaja tidak
|
|
47
48
|
// menimpanya — melanjutkan sesi bukan "mulai lagi". null = belum pernah dikerjakan.
|
|
48
49
|
startedAt DateTime?
|
|
50
|
+
// SPEC-447 · ADR-0093 · id spec lain yang harus SELESAI & commit-nya sudah ada di branch basis
|
|
51
|
+
// sebelum item ini boleh diluncurkan. Array JSON of string; null/[] = tak bergantung apa pun.
|
|
52
|
+
// Sengaja kolom, bukan tabel join: SQLite melarang scalar list, `Json` sudah dipakai `payload`,
|
|
53
|
+
// dan kolom ikut FIELDS.spec sync apa adanya. Integritas ditegakkan di boundary route +
|
|
54
|
+
// pembersihan saat spec dihapus, bukan FK.
|
|
55
|
+
dependsOn Json?
|
|
49
56
|
updatedAt DateTime @updatedAt
|
|
50
57
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
51
58
|
}
|
|
52
59
|
|
|
60
|
+
// SPEC-450 · ADR-0094 · custom agent: persona yang bisa dipilih ulang & dibagi.
|
|
61
|
+
// `projectId` null = GLOBAL (semua project); terisi = milik satu project, dan agen project
|
|
62
|
+
// MENIMPA agen global bernama sama.
|
|
63
|
+
//
|
|
64
|
+
// `id` DETERMINISTIK "<projectId|global>:<name>" — bukan cuid. Baris ini disync, dan dengan id
|
|
65
|
+
// acak dua mesin yang sama-sama membuat agen global `reviewer` melahirkan DUA baris yang keduanya
|
|
66
|
+
// menyeberang lalu bertemu di satu objek JSON `--agents` yang BERKUNCI NAMA; salah satunya hilang
|
|
67
|
+
// tanpa jejak. Dengan id deterministik keduanya baris yang SAMA → rekonsiliasi LWW (ADR-0067).
|
|
68
|
+
//
|
|
69
|
+
// `name` IMMUTABLE: changefeed tak punya operasi hapus, jadi rename yang mengubah id meninggalkan
|
|
70
|
+
// baris yatim di setiap mesin lain. Ganti nama = hapus + buat baru.
|
|
71
|
+
//
|
|
72
|
+
// GOTCHA: `@@unique([projectId, name])` TIDAK mencegah dua agen global bernama sama — pada indeks
|
|
73
|
+
// unik SQLite NULL saling BERBEDA. Yang mencegahnya adalah PK deterministik di atas; indeks ini
|
|
74
|
+
// jaring kedua untuk baris ber-project.
|
|
75
|
+
model CustomAgent {
|
|
76
|
+
id String @id
|
|
77
|
+
projectId String?
|
|
78
|
+
name String
|
|
79
|
+
description String
|
|
80
|
+
instructions String
|
|
81
|
+
tools Json?
|
|
82
|
+
model String?
|
|
83
|
+
mentions Json?
|
|
84
|
+
enabled Boolean @default(true)
|
|
85
|
+
version Int @default(0) // SPEC-213 · version-stamp sync (ADR-0045)
|
|
86
|
+
createdAt DateTime @default(now())
|
|
87
|
+
updatedAt DateTime @updatedAt
|
|
88
|
+
project Project? @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
89
|
+
|
|
90
|
+
@@unique([projectId, name])
|
|
91
|
+
@@index([projectId])
|
|
92
|
+
}
|
|
93
|
+
|
|
53
94
|
model Setting {
|
|
54
95
|
id Int @id @default(1)
|
|
55
96
|
data Json
|