hanoman 0.1.8 → 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hanoman",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "Orchestrator + dashboard workflow docs-driven untuk sesi Claude Code / Codex",
5
5
  "type": "module",
6
6
  "repository": {
@@ -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");
@@ -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 Spec[]
25
- tickets Ticket[]
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 {
@@ -56,6 +57,40 @@ model Spec {
56
57
  project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
57
58
  }
58
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
+
59
94
  model Setting {
60
95
  id Int @id @default(1)
61
96
  data Json