hanoman 0.1.4 → 0.1.6

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.4",
3
+ "version": "0.1.6",
4
4
  "description": "Orchestrator + dashboard workflow docs-driven untuk sesi Claude Code / Codex",
5
5
  "type": "module",
6
6
  "repository": {
@@ -0,0 +1,43 @@
1
+ -- SPEC-408 · ADR-0090 · stempel waktu backlog: `Spec.createdAt` + `Spec.startedAt`.
2
+ --
3
+ -- SQLite melarang `ALTER TABLE … ADD COLUMN … DEFAULT CURRENT_TIMESTAMP` (default non-konstan),
4
+ -- jadi kolom ber-default waktu HARUS lewat redefinisi tabel. Redefinisi itu sekaligus tempat
5
+ -- backfill baris lama: `updatedAt` adalah satu-satunya jejak waktu yang pernah ada, dan `baseSha`
6
+ -- adalah penanda "pernah dikerjakan" yang sudah dipakai sistem (scheduler sources/backlog.ts).
7
+ -- Backfill ini APROKSIMASI dan dinyatakan terbuka di ADR-0090 — mengisinya dengan waktu migration
8
+ -- dijalankan akan membuat seluruh backlog lama tampak dibuat hari ini, yang lebih menyesatkan.
9
+ PRAGMA foreign_keys=OFF;
10
+ PRAGMA defer_foreign_keys=ON;
11
+
12
+ CREATE TABLE "new_Spec" (
13
+ "id" TEXT NOT NULL PRIMARY KEY,
14
+ "projectId" TEXT NOT NULL,
15
+ "title" TEXT NOT NULL,
16
+ "source" TEXT NOT NULL,
17
+ "stage" TEXT NOT NULL,
18
+ "priority" TEXT NOT NULL,
19
+ "author" TEXT NOT NULL,
20
+ "objective" TEXT NOT NULL,
21
+ "payload" JSONB,
22
+ "branchFrom" TEXT,
23
+ "baseSha" TEXT,
24
+ "headSha" TEXT,
25
+ "version" INTEGER NOT NULL DEFAULT 0,
26
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
27
+ "startedAt" DATETIME,
28
+ "updatedAt" DATETIME NOT NULL,
29
+ CONSTRAINT "Spec_projectId_fkey" FOREIGN KEY ("projectId") REFERENCES "Project" ("id") ON DELETE CASCADE ON UPDATE CASCADE
30
+ );
31
+
32
+ INSERT INTO "new_Spec" ("id","projectId","title","source","stage","priority","author","objective","payload","branchFrom","baseSha","headSha","version","createdAt","startedAt","updatedAt")
33
+ SELECT "id","projectId","title","source","stage","priority","author","objective","payload","branchFrom","baseSha","headSha","version",
34
+ "updatedAt",
35
+ CASE WHEN "baseSha" IS NOT NULL THEN "updatedAt" ELSE NULL END,
36
+ "updatedAt"
37
+ FROM "Spec";
38
+
39
+ DROP TABLE "Spec";
40
+ ALTER TABLE "new_Spec" RENAME TO "Spec";
41
+
42
+ PRAGMA foreign_keys=ON;
43
+ PRAGMA defer_foreign_keys=OFF;
@@ -0,0 +1,33 @@
1
+ -- SPEC-409 · ADR-0091 · hanoman-lead: jejak keputusan + opt-in lead per project.
2
+ --
3
+ -- Ditulis tangan (bukan `migrate dev`): worktree tetangga membuat `migrate dev` me-reset DB saat
4
+ -- ada drift. Keduanya ADITIF — tak ada tabel yang diredefinisi, tak ada data yang disentuh.
5
+ --
6
+ -- `Project.leadOptIn` boleh lewat ALTER TABLE karena default-nya KONSTAN (`false`); larangan SQLite
7
+ -- hanya berlaku untuk default non-konstan seperti CURRENT_TIMESTAMP (lihat migration SPEC-408).
8
+ ALTER TABLE "Project" ADD COLUMN "leadOptIn" BOOLEAN NOT NULL DEFAULT false;
9
+
10
+ CREATE TABLE "LeadDecision" (
11
+ "id" TEXT NOT NULL PRIMARY KEY,
12
+ "projectId" TEXT NOT NULL,
13
+ "specId" TEXT,
14
+ "sessionId" TEXT,
15
+ "gate" TEXT NOT NULL,
16
+ "kind" TEXT NOT NULL,
17
+ "question" TEXT NOT NULL,
18
+ "answer" TEXT NOT NULL,
19
+ "reason" TEXT NOT NULL,
20
+ "refs" JSONB NOT NULL,
21
+ "confidence" TEXT NOT NULL,
22
+ "action" TEXT NOT NULL DEFAULT 'none',
23
+ "status" TEXT NOT NULL DEFAULT 'berlaku',
24
+ "weighty" BOOLEAN NOT NULL DEFAULT false,
25
+ "supersededById" TEXT,
26
+ "actor" TEXT NOT NULL DEFAULT 'lead',
27
+ "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
28
+ "updatedAt" DATETIME NOT NULL
29
+ );
30
+
31
+ CREATE INDEX "LeadDecision_projectId_createdAt_idx" ON "LeadDecision"("projectId", "createdAt");
32
+ CREATE INDEX "LeadDecision_specId_idx" ON "LeadDecision"("specId");
33
+ CREATE INDEX "LeadDecision_sessionId_idx" ON "LeadDecision"("sessionId");
@@ -22,6 +22,7 @@ model Project {
22
22
  ingestKeyPrefix String? // SPEC-249 · ~12-16 char awal key untuk hint UI (bukan rahasia)
23
23
  helpEnabled Boolean @default(false) // SPEC-253 · opt-in Help Center publik
24
24
  schedulerOptIn Boolean @default(false) // SPEC-294 · ADR-0072 · opt-in scheduler otonom (LOCAL — tak masuk FIELDS sync)
25
+ leadOptIn Boolean @default(false) // SPEC-409 · ADR-0091 · opt-in hanoman-lead (LOCAL — cermin schedulerOptIn)
25
26
  specs Spec[]
26
27
  errorGroups ErrorGroup[]
27
28
  tickets Ticket[]
@@ -62,6 +63,13 @@ model Spec {
62
63
  baseSha String? // SPEC-176 · ADR-0030 · commit detach worktree sesi (nilai balik addWorktree)
63
64
  headSha String? // SPEC-176 · ADR-0030 · commit HEAD worktree di akhir sesi (sebelum removeWorktree)
64
65
  version Int @default(0) // SPEC-213 · version-stamp sync (ADR-0045)
66
+ // SPEC-408 · ADR-0090 · kapan item difilekan. Ditulis DB (@default), tak pernah oleh route —
67
+ // "dibuat" harus jadi fakta yang tak bisa diedit operator.
68
+ createdAt DateTime @default(now())
69
+ // SPEC-408 · ADR-0090 · kapan sesi PERTAMA lahir untuk item ini. Ditulis di titik cekik yang
70
+ // sama dengan `baseSha` (services/session-launch.ts); jalur RESUME (ADR-0084) sengaja tidak
71
+ // menimpanya — melanjutkan sesi bukan "mulai lagi". null = belum pernah dikerjakan.
72
+ startedAt DateTime?
65
73
  updatedAt DateTime @updatedAt
66
74
  project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
67
75
  }
@@ -313,6 +321,39 @@ model SchedulerQueueItem {
313
321
  @@index([status])
314
322
  }
315
323
 
324
+ // SPEC-409 · ADR-0091 · jejak keputusan hanoman-lead. Data BARU yang harus bertahan (bukan nilai
325
+ // turunan seperti coverage/PRD, ADR-0011/0018): pertanyaan yang ditanyakan sesi yang sudah mati,
326
+ // dan alasan yang dipakai lead, tak bisa dihitung ulang dari sumber mana pun.
327
+ //
328
+ // LOCAL-ONLY (tak disync, cermin SessionHistory/SchedulerQueueItem): barisnya menunjuk sesi tmux &
329
+ // worktree di MESIN INI — menyiarkannya ke hub akan mengirim rujukan yang tak ada di sana. Tanpa
330
+ // `version`/notifySynced. Tak ada FK ke Project: sesi VPS/cross-audit memakai projectId sintetis
331
+ // (konvensi yang sama dipakai SessionResult & SessionHistory).
332
+ model LeadDecision {
333
+ id String @id @default(cuid())
334
+ projectId String
335
+ specId String?
336
+ sessionId String?
337
+ gate String // contract | detected | pulse (pintu masuk)
338
+ kind String // answer | order | collision | quality | refusal
339
+ question String
340
+ answer String
341
+ reason String
342
+ refs Json // string[] — hanya rujukan yang benar-benar ada di repo (AC-6)
343
+ confidence String // tinggi | sedang | ragu
344
+ action String @default("none") // permukaan tindakan lead (allowlist, shared/src/lead.ts)
345
+ status String @default("berlaku") // berlaku | ditimpa | dibatalkan | gagal
346
+ weighty Boolean @default(false) // memicu notifikasi (AC-25)
347
+ supersededById String? // baris yang menimpanya (jawaban operator, AC-28)
348
+ actor String @default("lead") // lead | operator — siapa yang mengeluarkan baris ini
349
+ createdAt DateTime @default(now())
350
+ updatedAt DateTime @updatedAt
351
+
352
+ @@index([projectId, createdAt])
353
+ @@index([specId])
354
+ @@index([sessionId])
355
+ }
356
+
316
357
  // SPEC-215 · ADR-0049 · LOCAL-ONLY: override config runtime (env → DB). Tak pernah disync.
317
358
  model RuntimeConfig {
318
359
  key String @id