clikit-plugin 0.2.6 → 0.2.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/hooks/git-guard.d.ts +1 -1
- package/dist/hooks/git-guard.d.ts.map +1 -1
- package/dist/hooks/swarm-enforcer.d.ts +2 -2
- package/dist/hooks/swarm-enforcer.d.ts.map +1 -1
- package/dist/index.js +49 -43
- package/dist/tools/beads-memory-sync.d.ts.map +1 -1
- package/dist/tools/memory.d.ts.map +1 -1
- package/dist/tools/observation.d.ts.map +1 -1
- package/memory/handoffs/2026-02-15-complete-audit.md +136 -0
- package/package.json +1 -1
|
@@ -9,6 +9,6 @@ export interface GitGuardResult {
|
|
|
9
9
|
command: string;
|
|
10
10
|
reason?: string;
|
|
11
11
|
}
|
|
12
|
-
export declare function checkDangerousCommand(command:
|
|
12
|
+
export declare function checkDangerousCommand(command: unknown, allowForceWithLease?: boolean): GitGuardResult;
|
|
13
13
|
export declare function formatBlockedWarning(result: GitGuardResult): string;
|
|
14
14
|
//# sourceMappingURL=git-guard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-guard.d.ts","sourceRoot":"","sources":["../../src/hooks/git-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"git-guard.d.ts","sourceRoot":"","sources":["../../src/hooks/git-guard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,UAAO,GAAG,cAAc,CAalG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEnE"}
|
|
@@ -24,8 +24,8 @@ export interface EnforcementResult {
|
|
|
24
24
|
reason?: string;
|
|
25
25
|
suggestion?: string;
|
|
26
26
|
}
|
|
27
|
-
export declare function isFileInScope(filePath:
|
|
28
|
-
export declare function checkEditPermission(filePath:
|
|
27
|
+
export declare function isFileInScope(filePath: unknown, scope: TaskScope): boolean;
|
|
28
|
+
export declare function checkEditPermission(filePath: unknown, scope: TaskScope | undefined, config?: SwarmEnforcerConfig): EnforcementResult;
|
|
29
29
|
export declare function extractFileFromToolInput(toolName: unknown, input: Record<string, unknown>): string | undefined;
|
|
30
30
|
export declare function formatEnforcementWarning(result: EnforcementResult): string;
|
|
31
31
|
//# sourceMappingURL=swarm-enforcer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swarm-enforcer.d.ts","sourceRoot":"","sources":["../../src/hooks/swarm-enforcer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"swarm-enforcer.d.ts","sourceRoot":"","sources":["../../src/hooks/swarm-enforcer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,SAAS,GACf,OAAO,CAsBT;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,MAAM,CAAC,EAAE,mBAAmB,GAC3B,iBAAiB,CAyBnB;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,MAAM,GAAG,SAAS,CA6BpB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAM1E"}
|
package/dist/index.js
CHANGED
|
@@ -3884,6 +3884,9 @@ var DANGEROUS_PATTERNS = [
|
|
|
3884
3884
|
{ pattern: /git\s+branch\s+-D/, reason: "Force-deleting branch may lose unmerged work" }
|
|
3885
3885
|
];
|
|
3886
3886
|
function checkDangerousCommand(command, allowForceWithLease = true) {
|
|
3887
|
+
if (typeof command !== "string") {
|
|
3888
|
+
return { blocked: false, command: "" };
|
|
3889
|
+
}
|
|
3887
3890
|
for (const { pattern, reason } of DANGEROUS_PATTERNS) {
|
|
3888
3891
|
if (pattern.test(command)) {
|
|
3889
3892
|
if (allowForceWithLease && /--force-with-lease/.test(command)) {
|
|
@@ -4859,6 +4862,8 @@ function getDb() {
|
|
|
4859
4862
|
confidence REAL DEFAULT 1.0,
|
|
4860
4863
|
files_read TEXT DEFAULT '[]',
|
|
4861
4864
|
files_modified TEXT DEFAULT '[]',
|
|
4865
|
+
concepts TEXT DEFAULT '[]',
|
|
4866
|
+
bead_id TEXT,
|
|
4862
4867
|
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
4863
4868
|
expires_at TEXT
|
|
4864
4869
|
);
|
|
@@ -4889,6 +4894,15 @@ function getDb() {
|
|
|
4889
4894
|
VALUES (new.id, new.type, new.narrative, new.facts);
|
|
4890
4895
|
END;
|
|
4891
4896
|
`);
|
|
4897
|
+
try {
|
|
4898
|
+
db.exec(`ALTER TABLE observations ADD COLUMN concepts TEXT DEFAULT '[]'`);
|
|
4899
|
+
} catch {}
|
|
4900
|
+
try {
|
|
4901
|
+
db.exec(`ALTER TABLE observations ADD COLUMN bead_id TEXT`);
|
|
4902
|
+
} catch {}
|
|
4903
|
+
try {
|
|
4904
|
+
db.exec(`ALTER TABLE observations ADD COLUMN expires_at TEXT`);
|
|
4905
|
+
} catch {}
|
|
4892
4906
|
return db;
|
|
4893
4907
|
}
|
|
4894
4908
|
function memoryRead(relativePath) {
|
|
@@ -5063,6 +5077,15 @@ function getDb2() {
|
|
|
5063
5077
|
CREATE INDEX IF NOT EXISTS idx_observations_bead_id ON observations(bead_id);
|
|
5064
5078
|
CREATE INDEX IF NOT EXISTS idx_observations_created_at ON observations(created_at);
|
|
5065
5079
|
`);
|
|
5080
|
+
try {
|
|
5081
|
+
db.exec(`ALTER TABLE observations ADD COLUMN concepts TEXT DEFAULT '[]'`);
|
|
5082
|
+
} catch {}
|
|
5083
|
+
try {
|
|
5084
|
+
db.exec(`ALTER TABLE observations ADD COLUMN bead_id TEXT`);
|
|
5085
|
+
} catch {}
|
|
5086
|
+
try {
|
|
5087
|
+
db.exec(`ALTER TABLE observations ADD COLUMN expires_at TEXT`);
|
|
5088
|
+
} catch {}
|
|
5066
5089
|
return db;
|
|
5067
5090
|
}
|
|
5068
5091
|
function createObservation(params) {
|
|
@@ -5246,7 +5269,32 @@ function getMemoryDb() {
|
|
|
5246
5269
|
if (!fs11.existsSync(MEMORY_DIR3)) {
|
|
5247
5270
|
fs11.mkdirSync(MEMORY_DIR3, { recursive: true });
|
|
5248
5271
|
}
|
|
5249
|
-
|
|
5272
|
+
const db = new Database3(MEMORY_DB3);
|
|
5273
|
+
db.exec(`
|
|
5274
|
+
CREATE TABLE IF NOT EXISTS observations (
|
|
5275
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5276
|
+
type TEXT NOT NULL,
|
|
5277
|
+
narrative TEXT NOT NULL,
|
|
5278
|
+
facts TEXT DEFAULT '[]',
|
|
5279
|
+
confidence REAL DEFAULT 1.0,
|
|
5280
|
+
files_read TEXT DEFAULT '[]',
|
|
5281
|
+
files_modified TEXT DEFAULT '[]',
|
|
5282
|
+
concepts TEXT DEFAULT '[]',
|
|
5283
|
+
bead_id TEXT,
|
|
5284
|
+
created_at TEXT DEFAULT CURRENT_TIMESTAMP,
|
|
5285
|
+
expires_at TEXT
|
|
5286
|
+
)
|
|
5287
|
+
`);
|
|
5288
|
+
try {
|
|
5289
|
+
db.exec(`ALTER TABLE observations ADD COLUMN concepts TEXT DEFAULT '[]'`);
|
|
5290
|
+
} catch {}
|
|
5291
|
+
try {
|
|
5292
|
+
db.exec(`ALTER TABLE observations ADD COLUMN bead_id TEXT`);
|
|
5293
|
+
} catch {}
|
|
5294
|
+
try {
|
|
5295
|
+
db.exec(`ALTER TABLE observations ADD COLUMN expires_at TEXT`);
|
|
5296
|
+
} catch {}
|
|
5297
|
+
return db;
|
|
5250
5298
|
}
|
|
5251
5299
|
function getBeadsDb() {
|
|
5252
5300
|
const beadsDbPath = path12.join(BEADS_DIR, "beads.db");
|
|
@@ -5278,20 +5326,6 @@ function syncTasksToMemory() {
|
|
|
5278
5326
|
return { success: false, operation: "sync_to_memory", details: { tasksSynced: 0 } };
|
|
5279
5327
|
}
|
|
5280
5328
|
const memoryDb = getMemoryDb();
|
|
5281
|
-
memoryDb.run(`
|
|
5282
|
-
CREATE TABLE IF NOT EXISTS observations (
|
|
5283
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5284
|
-
type TEXT NOT NULL,
|
|
5285
|
-
narrative TEXT NOT NULL,
|
|
5286
|
-
facts TEXT DEFAULT '[]',
|
|
5287
|
-
confidence REAL DEFAULT 1.0,
|
|
5288
|
-
files_read TEXT DEFAULT '[]',
|
|
5289
|
-
files_modified TEXT DEFAULT '[]',
|
|
5290
|
-
concepts TEXT DEFAULT '[]',
|
|
5291
|
-
bead_id TEXT,
|
|
5292
|
-
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
5293
|
-
)
|
|
5294
|
-
`);
|
|
5295
5329
|
const tasks = beadsDb.query("SELECT * FROM issues WHERE status = 'done'").all();
|
|
5296
5330
|
let synced = 0;
|
|
5297
5331
|
const insertStmt = memoryDb.prepare(`
|
|
@@ -5338,20 +5372,6 @@ function syncMemoryToTasks() {
|
|
|
5338
5372
|
}
|
|
5339
5373
|
function linkObservationToTask(observationId, beadId) {
|
|
5340
5374
|
const memoryDb = getMemoryDb();
|
|
5341
|
-
memoryDb.run(`
|
|
5342
|
-
CREATE TABLE IF NOT EXISTS observations (
|
|
5343
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5344
|
-
type TEXT NOT NULL,
|
|
5345
|
-
narrative TEXT NOT NULL,
|
|
5346
|
-
facts TEXT DEFAULT '[]',
|
|
5347
|
-
confidence REAL DEFAULT 1.0,
|
|
5348
|
-
files_read TEXT DEFAULT '[]',
|
|
5349
|
-
files_modified TEXT DEFAULT '[]',
|
|
5350
|
-
concepts TEXT DEFAULT '[]',
|
|
5351
|
-
bead_id TEXT,
|
|
5352
|
-
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
5353
|
-
)
|
|
5354
|
-
`);
|
|
5355
5375
|
memoryDb.run("UPDATE observations SET bead_id = ? WHERE id = ?", [beadId, observationId]);
|
|
5356
5376
|
return {
|
|
5357
5377
|
success: true,
|
|
@@ -5361,20 +5381,6 @@ function linkObservationToTask(observationId, beadId) {
|
|
|
5361
5381
|
}
|
|
5362
5382
|
function getSyncStatus() {
|
|
5363
5383
|
const memoryDb = getMemoryDb();
|
|
5364
|
-
memoryDb.run(`
|
|
5365
|
-
CREATE TABLE IF NOT EXISTS observations (
|
|
5366
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
5367
|
-
type TEXT NOT NULL,
|
|
5368
|
-
narrative TEXT NOT NULL,
|
|
5369
|
-
facts TEXT DEFAULT '[]',
|
|
5370
|
-
confidence REAL DEFAULT 1.0,
|
|
5371
|
-
files_read TEXT DEFAULT '[]',
|
|
5372
|
-
files_modified TEXT DEFAULT '[]',
|
|
5373
|
-
concepts TEXT DEFAULT '[]',
|
|
5374
|
-
bead_id TEXT,
|
|
5375
|
-
created_at TEXT DEFAULT CURRENT_TIMESTAMP
|
|
5376
|
-
)
|
|
5377
|
-
`);
|
|
5378
5384
|
const memoryCount = memoryDb.query("SELECT COUNT(*) as count FROM observations").get();
|
|
5379
5385
|
const beadsDb = getBeadsDb();
|
|
5380
5386
|
let activeTasks = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beads-memory-sync.d.ts","sourceRoot":"","sources":["../../src/tools/beads-memory-sync.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"beads-memory-sync.d.ts","sourceRoot":"","sources":["../../src/tools/beads-memory-sync.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,gBAAgB,GAAG,kBAAkB,GAAG,MAAM,GAAG,QAAQ,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACP,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAyCD,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,qBAAqB,CAgBpF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/tools/memory.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA2DD,wBAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ9D;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB,EAAE,CA+B7E;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAe1D;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,iBAAiB,EAAE,CA2BhF;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAmBvE;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAsExE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../../src/tools/observation.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"observation.d.ts","sourceRoot":"","sources":["../../src/tools/observation.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACnE,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAsCD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAgC9E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,iBAAiB,EAAE,CAanF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAazE;AAED,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAY7E"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
date: 2026-02-15
|
|
3
|
+
phase: implementing
|
|
4
|
+
branch: main
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Handoff: CliKit Complete Type Guard Audit
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Status Summary
|
|
12
|
+
|
|
13
|
+
CliKit plugin v0.2.6 published with many type guards. Typecheck passes. However, there are still potential runtime issues where OpenCode passes non-string values that could cause `.toLowerCase()`, `.test()`, `.split()` etc. to fail.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Version History
|
|
18
|
+
|
|
19
|
+
| Version | Fix |
|
|
20
|
+
|---------|-----|
|
|
21
|
+
| 0.2.1 | Type guards in hooks (truncator, security-check, compaction) |
|
|
22
|
+
| 0.2.2 | Abort on JSON parse error |
|
|
23
|
+
| 0.2.3 | Fix JSONC comment stripping breaking URLs |
|
|
24
|
+
| 0.2.4 | Remove backup logic, fix `todos.filter` error |
|
|
25
|
+
| 0.2.5 | Fix `path.join` error - guards for projectDir/cwd params |
|
|
26
|
+
| 0.2.6 | Fix `text.toLowerCase` error in subagent-question-blocker |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Remaining Issues (Need Type Guards)
|
|
31
|
+
|
|
32
|
+
### 1. git-guard.ts: `checkDangerousCommand`
|
|
33
|
+
**Line 25:** `command: string` - no type guard
|
|
34
|
+
**Used:** `index.ts:221` - `toolInput.command as string | undefined`
|
|
35
|
+
**Risk:** `pattern.test(command)` fails if command is object
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
// Fix needed:
|
|
39
|
+
export function checkDangerousCommand(command: unknown, allowForceWithLease = true): GitGuardResult {
|
|
40
|
+
if (typeof command !== "string") {
|
|
41
|
+
return { blocked: false, command: "" };
|
|
42
|
+
}
|
|
43
|
+
// ... rest
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 2. swarm-enforcer.ts: `isFileInScope`
|
|
48
|
+
**Line 33-36:** `filePath: string` - no type guard
|
|
49
|
+
**Risk:** `path.resolve(filePath)` fails if filePath is not string
|
|
50
|
+
|
|
51
|
+
```typescript
|
|
52
|
+
// Fix needed:
|
|
53
|
+
export function isFileInScope(filePath: unknown, scope: TaskScope): boolean {
|
|
54
|
+
if (typeof filePath !== "string") return false;
|
|
55
|
+
// ...
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 3. swarm-enforcer.ts: `checkEditPermission`
|
|
60
|
+
**Line 59-62:** `filePath: string` - no type guard
|
|
61
|
+
|
|
62
|
+
### 4. index.ts: Tool input casting
|
|
63
|
+
Multiple places where `toolInput.X as string | undefined` is used but the value could be an object:
|
|
64
|
+
- Line 218: `toolInput.command`
|
|
65
|
+
- Line 269: `toolInput.prompt`
|
|
66
|
+
- Line 335: `toolInput.filePath`
|
|
67
|
+
- Line 351: `toolInput.filePath`
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Files Modified (Uncommitted)
|
|
72
|
+
|
|
73
|
+
| File | Status |
|
|
74
|
+
|------|--------|
|
|
75
|
+
| `.opencode/package.json` | v0.2.6 |
|
|
76
|
+
| `.opencode/src/cli.ts` | Removed backup, fixed JSONC |
|
|
77
|
+
| `.opencode/src/config.ts` | Type guard for loadCliKitConfig |
|
|
78
|
+
| `.opencode/src/index.ts` | Array.isArray for todos |
|
|
79
|
+
| `.opencode/src/hooks/auto-format.ts` | Type guards |
|
|
80
|
+
| `.opencode/src/hooks/comment-checker.ts` | Type guards |
|
|
81
|
+
| `.opencode/src/hooks/compaction.ts` | Type guards |
|
|
82
|
+
| `.opencode/src/hooks/env-context.ts` | Type guards |
|
|
83
|
+
| `.opencode/src/hooks/security-check.ts` | Type guards |
|
|
84
|
+
| `.opencode/src/hooks/session-notification.ts` | Type guards |
|
|
85
|
+
| `.opencode/src/hooks/subagent-question-blocker.ts` | Type guards |
|
|
86
|
+
| `.opencode/src/hooks/swarm-enforcer.ts` | Partial (extractFileFromToolInput only) |
|
|
87
|
+
| `.opencode/src/hooks/todo-enforcer.ts` | Type guards |
|
|
88
|
+
| `.opencode/src/hooks/truncator.ts` | Type guards |
|
|
89
|
+
| `.opencode/src/hooks/typecheck-gate.ts` | Type guards |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Git State
|
|
94
|
+
|
|
95
|
+
- **Branch:** `main`
|
|
96
|
+
- **Last commit:** `31b200c` - Update README with simplified installation
|
|
97
|
+
- **Uncommitted changes:** 15 files
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Next Steps
|
|
102
|
+
|
|
103
|
+
1. [ ] Add type guard to `git-guard.ts:checkDangerousCommand(command: unknown)`
|
|
104
|
+
2. [ ] Add type guard to `swarm-enforcer.ts:isFileInScope(filePath: unknown)`
|
|
105
|
+
3. [ ] Add type guard to `swarm-enforcer.ts:checkEditPermission(filePath: unknown)`
|
|
106
|
+
4. [ ] Run typecheck
|
|
107
|
+
5. [ ] Publish v0.2.7
|
|
108
|
+
6. [ ] Test: `opencode` starts without errors
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Pattern for Type Guards
|
|
113
|
+
|
|
114
|
+
```typescript
|
|
115
|
+
// Before (breaks on non-string):
|
|
116
|
+
export function myFunc(content: string): Result {
|
|
117
|
+
return content.split("\n"); // CRASH if content is object
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// After (safe):
|
|
121
|
+
export function myFunc(content: unknown): Result {
|
|
122
|
+
if (typeof content !== "string") {
|
|
123
|
+
return defaultResult; // Safe fallback
|
|
124
|
+
}
|
|
125
|
+
return content.split("\n");
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Resume Command
|
|
132
|
+
|
|
133
|
+
To resume, use `/resume` and it will:
|
|
134
|
+
1. Load this handoff
|
|
135
|
+
2. Propose fixing remaining type guards in git-guard.ts and swarm-enforcer.ts
|
|
136
|
+
3. Publish v0.2.7
|