hanoman 0.1.8 → 0.1.10
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 +211 -85
- package/dist/server.js +1343 -67
- package/package.json +1 -1
- package/prisma/migrations/20260801120000_custom_agent/migration.sql +27 -0
- package/prisma/migrations/20260801170000_github_issue/migration.sql +31 -0
- package/prisma/schema.prisma +70 -2
- package/web/assets/{index-D6AOUdRy.js → index-CXJBr-3-.js} +1534 -1534
- package/web/index.html +1 -1
package/package.json
CHANGED
|
@@ -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");
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
-- SPEC-471 · ADR-0095 · cermin issue GitHub sebagai record lokal (pola Ticket, ADR-0062).
|
|
2
|
+
--
|
|
3
|
+
-- Tabel baru → `CREATE TABLE` polos; tak ada redefinisi tabel.
|
|
4
|
+
-- `id` deterministik "<projectId>:<owner>/<repo>#<number>" ditulis aplikasi, bukan default DB —
|
|
5
|
+
-- itulah yang mencegah dua mesin melahirkan dua baris untuk issue yang sama.
|
|
6
|
+
-- `specId` sengaja TANPA FOREIGN KEY, cermin Ticket.specId: changefeed bisa memancarkan
|
|
7
|
+
-- GithubIssue sebelum Spec-nya mendarat (kelas SPEC-382), dan FK akan menolaknya.
|
|
8
|
+
CREATE TABLE "GithubIssue" (
|
|
9
|
+
"id" TEXT NOT NULL PRIMARY KEY,
|
|
10
|
+
"projectId" TEXT NOT NULL,
|
|
11
|
+
"repoSlug" TEXT NOT NULL,
|
|
12
|
+
"number" INTEGER NOT NULL,
|
|
13
|
+
"title" TEXT NOT NULL,
|
|
14
|
+
"body" TEXT NOT NULL,
|
|
15
|
+
"authorLogin" TEXT NOT NULL,
|
|
16
|
+
"labels" JSONB NOT NULL,
|
|
17
|
+
"url" TEXT NOT NULL,
|
|
18
|
+
"issueState" TEXT NOT NULL,
|
|
19
|
+
"status" TEXT NOT NULL DEFAULT 'new',
|
|
20
|
+
"specId" TEXT,
|
|
21
|
+
"issueCreatedAt" DATETIME NOT NULL,
|
|
22
|
+
"issueUpdatedAt" DATETIME NOT NULL,
|
|
23
|
+
"pulledAt" DATETIME NOT NULL,
|
|
24
|
+
"version" INTEGER NOT NULL DEFAULT 0,
|
|
25
|
+
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
26
|
+
"updatedAt" DATETIME NOT NULL,
|
|
27
|
+
CONSTRAINT "GithubIssue_projectId_fkey" FOREIGN KEY ("projectId")
|
|
28
|
+
REFERENCES "Project" ("id") ON DELETE CASCADE ON UPDATE CASCADE
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE INDEX "GithubIssue_projectId_status_idx" ON "GithubIssue" ("projectId", "status");
|
package/prisma/schema.prisma
CHANGED
|
@@ -21,8 +21,10 @@ 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
|
|
25
|
-
tickets
|
|
24
|
+
specs Spec[]
|
|
25
|
+
tickets Ticket[]
|
|
26
|
+
customAgents CustomAgent[] // SPEC-450 · ADR-0094 · custom agent milik project ini
|
|
27
|
+
githubIssues GithubIssue[] // SPEC-471 · ADR-0095 · cermin issue repo GitHub project ini
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
model Spec {
|
|
@@ -56,6 +58,72 @@ model Spec {
|
|
|
56
58
|
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
57
59
|
}
|
|
58
60
|
|
|
61
|
+
// SPEC-450 · ADR-0094 · custom agent: persona yang bisa dipilih ulang & dibagi.
|
|
62
|
+
// `projectId` null = GLOBAL (semua project); terisi = milik satu project, dan agen project
|
|
63
|
+
// MENIMPA agen global bernama sama.
|
|
64
|
+
//
|
|
65
|
+
// `id` DETERMINISTIK "<projectId|global>:<name>" — bukan cuid. Baris ini disync, dan dengan id
|
|
66
|
+
// acak dua mesin yang sama-sama membuat agen global `reviewer` melahirkan DUA baris yang keduanya
|
|
67
|
+
// menyeberang lalu bertemu di satu objek JSON `--agents` yang BERKUNCI NAMA; salah satunya hilang
|
|
68
|
+
// tanpa jejak. Dengan id deterministik keduanya baris yang SAMA → rekonsiliasi LWW (ADR-0067).
|
|
69
|
+
//
|
|
70
|
+
// `name` IMMUTABLE: changefeed tak punya operasi hapus, jadi rename yang mengubah id meninggalkan
|
|
71
|
+
// baris yatim di setiap mesin lain. Ganti nama = hapus + buat baru.
|
|
72
|
+
//
|
|
73
|
+
// GOTCHA: `@@unique([projectId, name])` TIDAK mencegah dua agen global bernama sama — pada indeks
|
|
74
|
+
// unik SQLite NULL saling BERBEDA. Yang mencegahnya adalah PK deterministik di atas; indeks ini
|
|
75
|
+
// jaring kedua untuk baris ber-project.
|
|
76
|
+
model CustomAgent {
|
|
77
|
+
id String @id
|
|
78
|
+
projectId String?
|
|
79
|
+
name String
|
|
80
|
+
description String
|
|
81
|
+
instructions String
|
|
82
|
+
tools Json?
|
|
83
|
+
model String?
|
|
84
|
+
mentions Json?
|
|
85
|
+
enabled Boolean @default(true)
|
|
86
|
+
version Int @default(0) // SPEC-213 · version-stamp sync (ADR-0045)
|
|
87
|
+
createdAt DateTime @default(now())
|
|
88
|
+
updatedAt DateTime @updatedAt
|
|
89
|
+
project Project? @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
90
|
+
|
|
91
|
+
@@unique([projectId, name])
|
|
92
|
+
@@index([projectId])
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// SPEC-471 · ADR-0095 · cermin issue GitHub sebagai record lokal, pola Ticket (ADR-0062).
|
|
96
|
+
// `id` DETERMINISTIK "<projectId>:<owner>/<repo>#<number>" ditulis aplikasi, bukan default DB —
|
|
97
|
+
// alasan yang sama dengan CustomAgent (ADR-0094): dua mesin yang menarik repo yang sama harus
|
|
98
|
+
// bertemu sebagai SATU baris di changefeed, bukan dua yang saling menelan. `projectId` ikut di
|
|
99
|
+
// dalam id karena dua project hanoman boleh menunjuk repo yang sama.
|
|
100
|
+
//
|
|
101
|
+
// `specId` sengaja TANPA FK (cermin Ticket.specId): changefeed bisa memancarkan GithubIssue
|
|
102
|
+
// sebelum Spec-nya mendarat (kelas SPEC-382) dan FK akan menolaknya.
|
|
103
|
+
model GithubIssue {
|
|
104
|
+
id String @id
|
|
105
|
+
projectId String
|
|
106
|
+
repoSlug String // "owner/repo"
|
|
107
|
+
number Int
|
|
108
|
+
title String
|
|
109
|
+
body String
|
|
110
|
+
authorLogin String
|
|
111
|
+
labels Json // string[]
|
|
112
|
+
url String
|
|
113
|
+
issueState String // open | closed — keadaan DI GITHUB saat ditarik
|
|
114
|
+
status String @default("new") // new | accepted | rejected (zGithubIssueStatus)
|
|
115
|
+
specId String? // soft-link Spec hasil promosi
|
|
116
|
+
issueCreatedAt DateTime
|
|
117
|
+
issueUpdatedAt DateTime
|
|
118
|
+
pulledAt DateTime
|
|
119
|
+
version Int @default(0) // SPEC-471 · version-stamp sync (ADR-0045)
|
|
120
|
+
createdAt DateTime @default(now())
|
|
121
|
+
updatedAt DateTime @updatedAt
|
|
122
|
+
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
|
|
123
|
+
|
|
124
|
+
@@index([projectId, status])
|
|
125
|
+
}
|
|
126
|
+
|
|
59
127
|
model Setting {
|
|
60
128
|
id Int @id @default(1)
|
|
61
129
|
data Json
|