hanoman 0.1.6 → 0.1.8
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 +38 -118
- package/dist/server.js +444 -1645
- package/package.json +1 -1
- package/prisma/migrations/20260731180000_drop_errors_sdk_crossaudit/migration.sql +58 -0
- package/prisma/migrations/20260731210000_spec_depends_on/migration.sql +7 -0
- package/prisma/schema.prisma +10 -88
- package/web/assets/{index-DB8a8_aD.js → index-D6AOUdRy.js} +1540 -1541
- package/web/index.html +1 -1
package/package.json
CHANGED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
-- SPEC-384 · ADR-0092 · cabut error monitoring (SPEC-249/254/269/271/276/296) dan cross-audit
|
|
2
|
+
-- (SPEC-337). Pemantauan error produksi pindah ke Uptrace; data di bawah ini tak punya pembaca
|
|
3
|
+
-- lagi. DESTRUKTIF & TAK BISA DIBATALKAN.
|
|
4
|
+
--
|
|
5
|
+
-- Byte source-map hidup di HANOMAN_UPLOAD_DIR dengan nama opaque `<uuid>.map` — DIREKTORI YANG
|
|
6
|
+
-- SAMA dengan lampiran tiket. Migration SQL tak bisa menyentuh filesystem, jadi pembersihannya
|
|
7
|
+
-- adalah langkah runbook manual yang dijalankan SEBELUM migration ini: baca
|
|
8
|
+
-- `SELECT storageKey FROM SourceMapArtifact` lalu hapus tepat berkas-berkas itu (JANGAN direktorinya
|
|
9
|
+
-- — lampiran tiket ikut hilang). Lihat internal/docs/operations/production.md. Melewatkannya hanya
|
|
10
|
+
-- menyisakan byte inert.
|
|
11
|
+
|
|
12
|
+
-- `defer_foreign_keys` wajib berpasangan dengan `foreign_keys=OFF` di sini: Spec & Ticket memegang
|
|
13
|
+
-- FK ke "Project", dan rebuild di bawah menjatuhkan tabel itu sebelum penggantinya bernama sama.
|
|
14
|
+
-- Idiom yang sama dipakai migration SPEC-408.
|
|
15
|
+
PRAGMA foreign_keys=OFF;
|
|
16
|
+
PRAGMA defer_foreign_keys=ON;
|
|
17
|
+
|
|
18
|
+
-- 1. Tabel. ErrorEvent dulu (FK → ErrorGroup).
|
|
19
|
+
DROP TABLE IF EXISTS "ErrorEvent";
|
|
20
|
+
DROP TABLE IF EXISTS "SourceMapArtifact";
|
|
21
|
+
DROP TABLE IF EXISTS "ErrorGroup";
|
|
22
|
+
DROP TABLE IF EXISTS "ProjectLink";
|
|
23
|
+
|
|
24
|
+
-- 2. Project kehilangan kolom DSN. Table rebuild (pola Prisma untuk SQLite), bukan DROP COLUMN:
|
|
25
|
+
-- berkas DB ini bisa dibuka SQLite versi mana pun yang dibawa instalasi npm pengguna.
|
|
26
|
+
CREATE TABLE "new_Project" (
|
|
27
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
28
|
+
"name" TEXT NOT NULL,
|
|
29
|
+
"desc" TEXT NOT NULL,
|
|
30
|
+
"kind" TEXT NOT NULL,
|
|
31
|
+
"repoDir" TEXT,
|
|
32
|
+
"gitRemote" TEXT,
|
|
33
|
+
"stack" TEXT NOT NULL DEFAULT '',
|
|
34
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
35
|
+
"version" INTEGER NOT NULL DEFAULT 0,
|
|
36
|
+
"updatedAt" DATETIME NOT NULL,
|
|
37
|
+
"helpEnabled" BOOLEAN NOT NULL DEFAULT false,
|
|
38
|
+
"schedulerOptIn" BOOLEAN NOT NULL DEFAULT false,
|
|
39
|
+
"leadOptIn" BOOLEAN NOT NULL DEFAULT false
|
|
40
|
+
);
|
|
41
|
+
INSERT INTO "new_Project" ("id","name","desc","kind","repoDir","gitRemote","stack","createdAt","version","updatedAt","helpEnabled","schedulerOptIn","leadOptIn")
|
|
42
|
+
SELECT "id","name","desc","kind","repoDir","gitRemote","stack","createdAt","version","updatedAt","helpEnabled","schedulerOptIn","leadOptIn" FROM "Project";
|
|
43
|
+
DROP TABLE "Project";
|
|
44
|
+
ALTER TABLE "new_Project" RENAME TO "Project";
|
|
45
|
+
|
|
46
|
+
-- 3. Baris yang nilainya tak lagi sah menurut zod. Dibiarkan hidup, ia menggagalkan pembacaan
|
|
47
|
+
-- daftar notifikasi / backlog dengan galat parse — bukan dengan pesan yang berguna.
|
|
48
|
+
DELETE FROM "Notification" WHERE "type" = 'error';
|
|
49
|
+
-- Spec bersumber cross-audit DINORMALKAN, bukan dihapus: backlog item-nya pekerjaan nyata dengan
|
|
50
|
+
-- branch & dokumen; yang hilang cuma label asalnya.
|
|
51
|
+
UPDATE "Spec" SET "source" = 'audit' WHERE "source" = 'cross-audit';
|
|
52
|
+
DELETE FROM "SyncLog" WHERE "entity" = 'errorGroup';
|
|
53
|
+
DELETE FROM "SyncOutbox" WHERE "entity" = 'errorGroup';
|
|
54
|
+
DELETE FROM "SyncConflict" WHERE "entity" = 'errorGroup';
|
|
55
|
+
DELETE FROM "SchedulerQueueItem" WHERE "source" = 'errors';
|
|
56
|
+
|
|
57
|
+
PRAGMA foreign_keys=ON;
|
|
58
|
+
PRAGMA defer_foreign_keys=OFF;
|
|
@@ -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;
|
package/prisma/schema.prisma
CHANGED
|
@@ -18,35 +18,11 @@ model Project {
|
|
|
18
18
|
createdAt DateTime @default(now())
|
|
19
19
|
version Int @default(0) // SPEC-213 · version-stamp sync (ADR-0045)
|
|
20
20
|
updatedAt DateTime @updatedAt
|
|
21
|
-
ingestKeyHash String? // SPEC-249 · sha256(ingest key) hex; null = monitoring off. TAK PERNAH ke client.
|
|
22
|
-
ingestKeyPrefix String? // SPEC-249 · ~12-16 char awal key untuk hint UI (bukan rahasia)
|
|
23
21
|
helpEnabled Boolean @default(false) // SPEC-253 · opt-in Help Center publik
|
|
24
22
|
schedulerOptIn Boolean @default(false) // SPEC-294 · ADR-0072 · opt-in scheduler otonom (LOCAL — tak masuk FIELDS sync)
|
|
25
23
|
leadOptIn Boolean @default(false) // SPEC-409 · ADR-0091 · opt-in hanoman-lead (LOCAL — cermin schedulerOptIn)
|
|
26
24
|
specs Spec[]
|
|
27
|
-
errorGroups ErrorGroup[]
|
|
28
25
|
tickets Ticket[]
|
|
29
|
-
sourceMaps SourceMapArtifact[] // SPEC-276 · source-map ter-upload per release (symbolication)
|
|
30
|
-
linksOut ProjectLink[] @relation("ProjectLinkFrom") // SPEC-337 · project ini bergantung pada …
|
|
31
|
-
linksIn ProjectLink[] @relation("ProjectLinkTo") // SPEC-337 · … yang bergantung pada project ini
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// SPEC-337 · ADR-0075 · relasi integrasi/dependency BERARAH antar project: from BERGANTUNG PADA to.
|
|
35
|
-
// LOCAL-only (tak masuk SYNCED): id cuid + unique pasangan bertabrakan saat upsert-by-id lintas device.
|
|
36
|
-
// onUpdate: Cascade → rename project (ADR-0064) merambat gratis; tak ada ref longgar baru.
|
|
37
|
-
model ProjectLink {
|
|
38
|
-
id String @id @default(cuid())
|
|
39
|
-
fromProjectId String
|
|
40
|
-
toProjectId String
|
|
41
|
-
kind String // api | sdk | data | event | lainnya (zLinkKind)
|
|
42
|
-
note String @default("") // bentuk integrasinya — disalin apa adanya ke prompt sesi audit lintas
|
|
43
|
-
createdAt DateTime @default(now())
|
|
44
|
-
updatedAt DateTime @updatedAt
|
|
45
|
-
from Project @relation("ProjectLinkFrom", fields: [fromProjectId], references: [id], onDelete: Cascade, onUpdate: Cascade)
|
|
46
|
-
to Project @relation("ProjectLinkTo", fields: [toProjectId], references: [id], onDelete: Cascade, onUpdate: Cascade)
|
|
47
|
-
|
|
48
|
-
@@unique([fromProjectId, toProjectId])
|
|
49
|
-
@@index([toProjectId])
|
|
50
26
|
}
|
|
51
27
|
|
|
52
28
|
model Spec {
|
|
@@ -70,6 +46,12 @@ model Spec {
|
|
|
70
46
|
// sama dengan `baseSha` (services/session-launch.ts); jalur RESUME (ADR-0084) sengaja tidak
|
|
71
47
|
// menimpanya — melanjutkan sesi bukan "mulai lagi". null = belum pernah dikerjakan.
|
|
72
48
|
startedAt DateTime?
|
|
49
|
+
// SPEC-447 · ADR-0093 · id spec lain yang harus SELESAI & commit-nya sudah ada di branch basis
|
|
50
|
+
// sebelum item ini boleh diluncurkan. Array JSON of string; null/[] = tak bergantung apa pun.
|
|
51
|
+
// Sengaja kolom, bukan tabel join: SQLite melarang scalar list, `Json` sudah dipakai `payload`,
|
|
52
|
+
// dan kolom ikut FIELDS.spec sync apa adanya. Integritas ditegakkan di boundary route +
|
|
53
|
+
// pembersihan saat spec dihapus, bukan FK.
|
|
54
|
+
dependsOn Json?
|
|
73
55
|
updatedAt DateTime @updatedAt
|
|
74
56
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
75
57
|
}
|
|
@@ -310,7 +292,7 @@ model SchedulerQueueItem {
|
|
|
310
292
|
id String @id @default(cuid())
|
|
311
293
|
specId String @unique
|
|
312
294
|
projectId String
|
|
313
|
-
source String // backlog |
|
|
295
|
+
source String // backlog | triase (asal checker) — SPEC-384 · `errors` dicabut (ADR-0092)
|
|
314
296
|
priority String // tinggi | sedang | rendah (urutan drain)
|
|
315
297
|
status String @default("queued") // queued | launched | done | failed
|
|
316
298
|
sessionId String?
|
|
@@ -327,7 +309,7 @@ model SchedulerQueueItem {
|
|
|
327
309
|
//
|
|
328
310
|
// LOCAL-ONLY (tak disync, cermin SessionHistory/SchedulerQueueItem): barisnya menunjuk sesi tmux &
|
|
329
311
|
// 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
|
|
312
|
+
// `version`/notifySynced. Tak ada FK ke Project: sesi VPS memakai projectId sintetis
|
|
331
313
|
// (konvensi yang sama dipakai SessionResult & SessionHistory).
|
|
332
314
|
model LeadDecision {
|
|
333
315
|
id String @id @default(cuid())
|
|
@@ -361,68 +343,8 @@ model RuntimeConfig {
|
|
|
361
343
|
updatedAt DateTime @updatedAt
|
|
362
344
|
}
|
|
363
345
|
|
|
364
|
-
// SPEC-249 · ADR-0060 · grup error per project (fingerprint dedup). SPEC-268/ADR-0066: agregat
|
|
365
|
-
// grup kini tersync (version-stamp); ErrorEvent mentah tetap server-local (tak disync).
|
|
366
|
-
model ErrorGroup {
|
|
367
|
-
id String @id @default(cuid())
|
|
368
|
-
projectId String
|
|
369
|
-
fingerprint String
|
|
370
|
-
type String
|
|
371
|
-
message String
|
|
372
|
-
sampleStack String?
|
|
373
|
-
sampleFrames Json? // SPEC-276 · ADR-0070 · frame mentah sample (disymbolikasi saat display)
|
|
374
|
-
release String? // SPEC-276 · ADR-0070 · release terakhir (korelasi build + surface di UI)
|
|
375
|
-
environment String
|
|
376
|
-
status String @default("new") // new | escalated | resolved
|
|
377
|
-
count Int @default(0)
|
|
378
|
-
firstSeenAt DateTime @default(now())
|
|
379
|
-
lastSeenAt DateTime @default(now())
|
|
380
|
-
specId String?
|
|
381
|
-
createdAt DateTime @default(now())
|
|
382
|
-
updatedAt DateTime @updatedAt
|
|
383
|
-
version Int @default(0) // SPEC-268 · version-stamp sync (ADR-0066)
|
|
384
|
-
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
385
|
-
events ErrorEvent[]
|
|
386
|
-
|
|
387
|
-
@@unique([projectId, fingerprint])
|
|
388
|
-
@@index([projectId, lastSeenAt])
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
// SPEC-249 · ADR-0060 · kejadian error mentah, dipangkas retensi (cap per grup + umur).
|
|
392
|
-
model ErrorEvent {
|
|
393
|
-
id String @id @default(cuid())
|
|
394
|
-
groupId String
|
|
395
|
-
projectId String
|
|
396
|
-
type String
|
|
397
|
-
message String
|
|
398
|
-
stack String?
|
|
399
|
-
frames Json? // SPEC-276 · ADR-0070 · frame terstruktur mentah dari SDK
|
|
400
|
-
environment String
|
|
401
|
-
release String?
|
|
402
|
-
context Json?
|
|
403
|
-
receivedAt DateTime @default(now())
|
|
404
|
-
group ErrorGroup @relation(fields: [groupId], references: [id], onDelete: Cascade)
|
|
405
|
-
|
|
406
|
-
@@index([groupId, receivedAt])
|
|
407
|
-
@@index([projectId, receivedAt])
|
|
408
|
-
}
|
|
409
346
|
|
|
410
|
-
// SPEC-276 · ADR-0070 · source-map ter-upload per release untuk symbolication. Byte map di
|
|
411
|
-
// HANOMAN_UPLOAD_DIR (server-local, TAK disync — cermin TicketAttachment biner & ErrorEvent).
|
|
412
|
-
model SourceMapArtifact {
|
|
413
|
-
id String @id @default(cuid())
|
|
414
|
-
projectId String
|
|
415
|
-
release String
|
|
416
|
-
filename String // basename artifact hasil-build (mis. index-4f3a2b.js) yang dipetakan map ini
|
|
417
|
-
debugId String?
|
|
418
|
-
storageKey String // berkas opaque (uuid.map) di upload dir
|
|
419
|
-
size Int
|
|
420
|
-
createdAt DateTime @default(now())
|
|
421
|
-
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
422
347
|
|
|
423
|
-
@@unique([projectId, release, filename])
|
|
424
|
-
@@index([projectId, release])
|
|
425
|
-
}
|
|
426
348
|
|
|
427
349
|
// SPEC-253 · ADR-0062 · tiket keluhan Help Center. SPEC-268/ADR-0066: metadata tiket kini tersync
|
|
428
350
|
// (version-stamp); lampiran (TicketAttachment, file biner) tetap server-local (tak disync).
|
|
@@ -437,7 +359,7 @@ model Ticket {
|
|
|
437
359
|
status String @default("new") // new | accepted | rejected (zTicketStatus)
|
|
438
360
|
accessKeyHash String @unique // sha256(kunci opaque) — lookup cek status. Plaintext hanya sekali.
|
|
439
361
|
shareToken String? @unique // SPEC-293 · token bagikan link status publik (hnm_shr_…); operator → pelapor
|
|
440
|
-
specId String? // soft-link Spec hasil promosi
|
|
362
|
+
specId String? // soft-link Spec hasil promosi
|
|
441
363
|
createdAt DateTime @default(now())
|
|
442
364
|
updatedAt DateTime @updatedAt
|
|
443
365
|
version Int @default(0) // SPEC-268 · version-stamp sync (ADR-0066)
|
|
@@ -452,7 +374,7 @@ model Ticket {
|
|
|
452
374
|
model TicketAttachment {
|
|
453
375
|
id String @id @default(cuid())
|
|
454
376
|
ticketId String
|
|
455
|
-
projectId String // denormal — isolasi & query murah
|
|
377
|
+
projectId String // denormal — isolasi & query murah
|
|
456
378
|
filename String // nama asli tersanitasi (display saja)
|
|
457
379
|
mimeType String // image/png | image/jpeg | image/webp
|
|
458
380
|
size Int
|