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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hanoman",
3
- "version": "0.1.7",
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,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");
@@ -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 {
@@ -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