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/README.md +11 -3
- package/dist/build-info.json +3 -3
- package/dist/cli.js +1560 -1280
- package/dist/server.js +1542 -104
- package/package.json +1 -1
- package/prisma/migrations/20260731000000_spec_created_started_at/migration.sql +43 -0
- package/prisma/migrations/20260731120000_lead_decision/migration.sql +33 -0
- package/prisma/schema.prisma +41 -0
- package/web/assets/{index-a6SFYnK5.js → index-DB8a8_aD.js} +1549 -1549
- package/web/index.html +1 -1
package/package.json
CHANGED
|
@@ -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");
|
package/prisma/schema.prisma
CHANGED
|
@@ -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
|