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.
@@ -9,6 +9,6 @@ export interface GitGuardResult {
9
9
  command: string;
10
10
  reason?: string;
11
11
  }
12
- export declare function checkDangerousCommand(command: string, allowForceWithLease?: boolean): GitGuardResult;
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,MAAM,EAAE,mBAAmB,UAAO,GAAG,cAAc,CAUjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEnE"}
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: string, scope: TaskScope): boolean;
28
- export declare function checkEditPermission(filePath: string, scope: TaskScope | undefined, config?: SwarmEnforcerConfig): EnforcementResult;
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,MAAM,EAChB,KAAK,EAAE,SAAS,GACf,OAAO,CAqBT;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,SAAS,GAAG,SAAS,EAC5B,MAAM,CAAC,EAAE,mBAAmB,GAC3B,iBAAiB,CAqBnB;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"}
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
- return new Database3(MEMORY_DB3);
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;AAiBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,qBAAqB,CAgBpF"}
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;AAoDD,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
+ {"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;AAgCD,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"}
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clikit-plugin",
3
- "version": "0.2.6",
3
+ "version": "0.2.8",
4
4
  "description": "OpenCode plugin with 10 agents, 19 commands, 48 skills, 14 hooks",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",