@evo-dev/evodev 0.0.1-alpha.1 → 0.0.1-alpha.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.
Files changed (28) hide show
  1. package/dist/.claude-plugin/marketplace.json +2 -2
  2. package/dist/assets/skills/coding/knowledge-distillation/SKILL.md +117 -114
  3. package/dist/assets/skills/coding/knowledge-distillation/references/knowledge-distillation-methods.md +11 -7
  4. package/dist/assets/team/agents/code-reviewer.md +48 -0
  5. package/dist/assets/team/agents/docs-maintainer.md +51 -0
  6. package/dist/assets/team/agents/implementation-engineer.md +51 -0
  7. package/dist/assets/team/agents/product-scope-analyst.md +58 -0
  8. package/dist/assets/team/agents/release-engineer.md +55 -0
  9. package/dist/assets/team/agents/security-boundary-reviewer.md +50 -0
  10. package/dist/assets/team/agents/solution-architect.md +51 -0
  11. package/dist/assets/team/agents/verification-engineer.md +51 -0
  12. package/dist/assets/team/team.md +102 -0
  13. package/dist/index.js +28597 -14815
  14. package/dist/plugins/evodev/.claude-plugin/plugin.json +1 -1
  15. package/dist/plugins/evodev/.codex-plugin/plugin.json +1 -1
  16. package/dist/plugins/evodev/hooks/codex-hooks.json +10 -10
  17. package/dist/plugins/evodev/hooks/codex.ts +206 -3
  18. package/dist/plugins/evodev/hooks/hooks.json +18 -18
  19. package/dist/plugins/evodev/hooks/hooks.ts +209 -22
  20. package/dist/plugins/evodev/hooks/runtime.ts +144 -68
  21. package/dist/plugins/evodev/hooks/workspace-core.ts +0 -27
  22. package/dist/plugins/evodev/package.json +1 -1
  23. package/dist/plugins/evodev/skills/knowledge-distillation/SKILL.md +117 -114
  24. package/dist/plugins/evodev/skills/knowledge-distillation/references/knowledge-distillation-methods.md +11 -7
  25. package/dist/ui/app.js +9 -0
  26. package/dist/ui/styles.css +2 -0
  27. package/package.json +8 -3
  28. package/dist/evodev +0 -11
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "evodev",
3
3
  "description": "EvoDev hook, skill, and Teams MCP integration for disciplined AI coding workflows.",
4
- "version": "0.0.1-alpha.1",
4
+ "version": "0.0.1-alpha.10",
5
5
  "author": {
6
6
  "name": "EvoDev"
7
7
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "evodev",
3
- "version": "0.0.1-alpha.1",
3
+ "version": "0.0.1-alpha.10",
4
4
  "description": "EvoDev hook, skill, and Teams MCP integration for disciplined AI coding workflows.",
5
5
  "author": {
6
6
  "name": "EvoDev"
@@ -6,7 +6,7 @@
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
9
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
10
10
  "timeout": 30
11
11
  }
12
12
  ]
@@ -17,7 +17,7 @@
17
17
  "hooks": [
18
18
  {
19
19
  "type": "command",
20
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
20
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
21
21
  "timeout": 30
22
22
  }
23
23
  ]
@@ -29,7 +29,7 @@
29
29
  "hooks": [
30
30
  {
31
31
  "type": "command",
32
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
32
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
33
33
  "timeout": 30
34
34
  }
35
35
  ]
@@ -41,7 +41,7 @@
41
41
  "hooks": [
42
42
  {
43
43
  "type": "command",
44
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
44
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
45
45
  "timeout": 30
46
46
  }
47
47
  ]
@@ -53,7 +53,7 @@
53
53
  "hooks": [
54
54
  {
55
55
  "type": "command",
56
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
56
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
57
57
  "timeout": 30
58
58
  }
59
59
  ]
@@ -64,7 +64,7 @@
64
64
  "hooks": [
65
65
  {
66
66
  "type": "command",
67
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
67
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
68
68
  "timeout": 30
69
69
  }
70
70
  ]
@@ -75,7 +75,7 @@
75
75
  "hooks": [
76
76
  {
77
77
  "type": "command",
78
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
78
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
79
79
  "timeout": 30
80
80
  }
81
81
  ]
@@ -87,7 +87,7 @@
87
87
  "hooks": [
88
88
  {
89
89
  "type": "command",
90
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
90
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
91
91
  "timeout": 30
92
92
  }
93
93
  ]
@@ -99,7 +99,7 @@
99
99
  "hooks": [
100
100
  {
101
101
  "type": "command",
102
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
102
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
103
103
  "timeout": 30
104
104
  }
105
105
  ]
@@ -111,7 +111,7 @@
111
111
  "hooks": [
112
112
  {
113
113
  "type": "command",
114
- "command": "bun run \"${PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target codex",
114
+ "command": "sh -lc 'root=\"${PLUGIN_ROOT:-}\"; if [ -z \"$root\" ]; then for candidate in \"$HOME/.codex/plugins/cache/evodev/evodev\"/* \"$HOME/.codex/plugins/evodev\"; do if [ -f \"$candidate/hooks/runtime.ts\" ]; then root=\"$candidate\"; break; fi; done; fi; if [ -z \"$root\" ] || [ ! -f \"$root/hooks/runtime.ts\" ]; then exit 0; fi; cd \"$root\" && bun run hooks/runtime.ts hook runtime --target codex || exit 0'",
115
115
  "timeout": 30
116
116
  }
117
117
  ]
@@ -1,4 +1,5 @@
1
- import { mkdir, readFile, stat, writeFile } from "node:fs/promises";
1
+ import type { Dirent } from "node:fs";
2
+ import { mkdir, readFile, readdir, stat, writeFile } from "node:fs/promises";
2
3
  import { dirname } from "node:path";
3
4
  import type {
4
5
  CodeAgentCapabilities,
@@ -14,6 +15,7 @@ import type {
14
15
  SyncSkillsInput,
15
16
  } from "@evo-dev/core/plugins";
16
17
  import { runNodeCommand } from "./command-runner.ts";
18
+ import { CODEX_HOOK_RUNTIME_COMMAND } from "./hooks.ts";
17
19
  import { type CodexPaths, resolveCodexAgentTargetPath, resolveCodexPaths } from "./paths.ts";
18
20
  import { transformCodexAgent } from "./transform-agent.ts";
19
21
  import {
@@ -127,6 +129,7 @@ export function createCodexPlugin(options: CodexPluginOptions = {}): CodeAgentPl
127
129
  : `${CODEX_SKILL_BUNDLE_MESSAGE} Codex is disabled in settings.`,
128
130
  },
129
131
  codexAgentsDoctorCheck(enabled, getSyncPaths(context.homeDir)),
132
+ await codexStopHooksDoctorCheck(getSyncPaths(context.homeDir)),
130
133
  ];
131
134
  },
132
135
  async syncSkills(input: SyncSkillsInput): Promise<SyncResult> {
@@ -425,12 +428,116 @@ async function hydrateCodexWorkspaceCoreDependency(input: {
425
428
  cachePluginRoot,
426
429
  runtimeLabel: "Codex",
427
430
  });
431
+ const hookPatch = await patchCodexInstalledHookRuntimeCommands({ cachePluginRoot });
428
432
  return {
429
- warnings: [...warnings, ...hydration.warnings],
430
- errors: [...errors, ...hydration.errors],
433
+ warnings: [...warnings, ...hydration.warnings, ...hookPatch.warnings],
434
+ errors: [...errors, ...hydration.errors, ...hookPatch.errors],
431
435
  };
432
436
  }
433
437
 
438
+ async function patchCodexInstalledHookRuntimeCommands(input: {
439
+ cachePluginRoot: string;
440
+ }): Promise<WorkspaceCoreHydrationResult> {
441
+ const warnings: string[] = [];
442
+ const errors: string[] = [];
443
+ const installedPluginRoot = await findLatestInstalledCodexPluginRoot(input.cachePluginRoot);
444
+ if (installedPluginRoot === null) {
445
+ warnings.push(
446
+ `Skipped Codex hook runtime command patch because the plugin cache was not found: ${input.cachePluginRoot}`,
447
+ );
448
+ return { warnings, errors };
449
+ }
450
+
451
+ const hooksPath = `${installedPluginRoot}/hooks/codex-hooks.json`;
452
+ try {
453
+ const hooksText = await readTextFileIfExists(hooksPath);
454
+ if (hooksText === null || hooksText.trim() === "") {
455
+ warnings.push(
456
+ `Skipped Codex hook runtime command patch because hooks file is missing: ${hooksPath}`,
457
+ );
458
+ } else {
459
+ const hooksConfig = JSON.parse(hooksText) as unknown;
460
+ if (rewriteCodexHookRuntimeCommands(hooksConfig)) {
461
+ await writeFile(hooksPath, `${JSON.stringify(hooksConfig, null, 2)}\n`, "utf8");
462
+ }
463
+ }
464
+ } catch (error) {
465
+ errors.push(
466
+ `Cannot patch Codex hook runtime command in installed plugin cache: ${describeError(error)}`,
467
+ );
468
+ }
469
+
470
+ const hooksSourcePath = `${installedPluginRoot}/hooks/hooks.ts`;
471
+ try {
472
+ const hooksSource = await readTextFileIfExists(hooksSourcePath);
473
+ if (hooksSource !== null) {
474
+ const next = hooksSource.replaceAll(
475
+ 'bun run "${PLUGIN_ROOT}/hooks/runtime.ts" hook runtime --target codex',
476
+ CODEX_HOOK_RUNTIME_COMMAND,
477
+ );
478
+ if (next !== hooksSource) {
479
+ await writeFile(hooksSourcePath, next, "utf8");
480
+ }
481
+ }
482
+ } catch (error) {
483
+ errors.push(
484
+ `Cannot patch Codex hook runtime source in installed plugin cache: ${describeError(error)}`,
485
+ );
486
+ }
487
+
488
+ return { warnings, errors };
489
+ }
490
+
491
+ function rewriteCodexHookRuntimeCommands(value: unknown): boolean {
492
+ if (!isRecord(value)) return false;
493
+ const root = isRecord(value.hooks) ? value.hooks : value;
494
+ let changed = false;
495
+ for (const groups of Object.values(root)) {
496
+ if (!Array.isArray(groups)) continue;
497
+ for (const group of groups) {
498
+ if (!isRecord(group) || !Array.isArray(group.hooks)) continue;
499
+ for (const hook of group.hooks) {
500
+ if (!isRecord(hook) || hook.type !== "command" || typeof hook.command !== "string") {
501
+ continue;
502
+ }
503
+ if (
504
+ hook.command.includes("hook runtime --target codex") &&
505
+ hook.command !== CODEX_HOOK_RUNTIME_COMMAND
506
+ ) {
507
+ hook.command = CODEX_HOOK_RUNTIME_COMMAND;
508
+ changed = true;
509
+ }
510
+ }
511
+ }
512
+ }
513
+ return changed;
514
+ }
515
+
516
+ async function findLatestInstalledCodexPluginRoot(cachePluginRoot: string): Promise<string | null> {
517
+ let entries: Dirent[];
518
+ try {
519
+ entries = await readdir(cachePluginRoot, { withFileTypes: true });
520
+ } catch (error) {
521
+ if (isNotFoundError(error)) return null;
522
+ throw error;
523
+ }
524
+
525
+ const versionDirs = await Promise.all(
526
+ entries
527
+ .filter((entry) => entry.isDirectory())
528
+ .map(async (entry) => {
529
+ const path = `${cachePluginRoot}/${entry.name}`;
530
+ const pathStat = await stat(path);
531
+ return { path, mtimeMs: pathStat.mtimeMs };
532
+ }),
533
+ );
534
+ if (versionDirs.length === 0) return null;
535
+ versionDirs.sort(
536
+ (left, right) => right.mtimeMs - left.mtimeMs || right.path.localeCompare(left.path),
537
+ );
538
+ return versionDirs[0].path;
539
+ }
540
+
434
541
  class NodeCodexCommandRunner implements CodexCommandRunner {
435
542
  async run(command: string, args: string[]): Promise<CodexCommandResult> {
436
543
  return runNodeCommand(command, args);
@@ -449,6 +556,102 @@ function detectionToDoctorCheck(detection: PluginDetectionResult): DoctorCheck {
449
556
  return { id: "codex.available", status: "warn", message: detection.message };
450
557
  }
451
558
 
559
+ async function codexStopHooksDoctorCheck(paths: CodexPaths): Promise<DoctorCheck> {
560
+ const hooksText = await readTextFileIfExists(paths.hooksPath);
561
+ if (hooksText === null || hooksText.trim() === "") {
562
+ return {
563
+ id: "codex.hooks.stop",
564
+ status: "skip",
565
+ message: `No user-level Codex hooks file found at: ${paths.hooksPath}`,
566
+ };
567
+ }
568
+
569
+ let hooksConfig: unknown;
570
+ try {
571
+ hooksConfig = JSON.parse(hooksText) as unknown;
572
+ } catch {
573
+ return {
574
+ id: "codex.hooks.stop",
575
+ status: "warn",
576
+ message: `Codex hooks file is not valid JSON; existing Stop hook failures may come from: ${paths.hooksPath}`,
577
+ };
578
+ }
579
+
580
+ const stopHooks = collectCodexCommandHooks(hooksConfig, "Stop");
581
+ if (stopHooks.length === 0) {
582
+ return {
583
+ id: "codex.hooks.stop",
584
+ status: "skip",
585
+ message: `No user-level Codex Stop hooks configured in: ${paths.hooksPath}`,
586
+ };
587
+ }
588
+
589
+ const hooksMissingTimeout = stopHooks.filter((hook) => hook.timeout === null);
590
+ if (hooksMissingTimeout.length > 0) {
591
+ return {
592
+ id: "codex.hooks.stop",
593
+ status: "warn",
594
+ message: `Codex Stop hook command(s) without timeout may be killed by the host and show "hook exited without a status code": ${hooksMissingTimeout
595
+ .map((hook) => hook.label)
596
+ .join(", ")}`,
597
+ };
598
+ }
599
+
600
+ return {
601
+ id: "codex.hooks.stop",
602
+ status: "pass",
603
+ message: `Codex Stop hooks have explicit timeouts in: ${paths.hooksPath}`,
604
+ };
605
+ }
606
+
607
+ function collectCodexCommandHooks(
608
+ hooksConfig: unknown,
609
+ eventName: string,
610
+ ): Array<{ label: string; timeout: number | null }> {
611
+ if (!isRecord(hooksConfig)) return [];
612
+ const root = isRecord(hooksConfig.hooks) ? hooksConfig.hooks : hooksConfig;
613
+ const groups = isRecord(root) && Array.isArray(root[eventName]) ? root[eventName] : [];
614
+ const hooks: Array<{ label: string; timeout: number | null }> = [];
615
+
616
+ groups.forEach((group, groupIndex) => {
617
+ if (!isRecord(group) || !Array.isArray(group.hooks)) return;
618
+ group.hooks.forEach((hook, hookIndex) => {
619
+ if (!isRecord(hook) || typeof hook.command !== "string" || hook.type !== "command") return;
620
+ hooks.push({
621
+ label: `${eventName}[${groupIndex}].hooks[${hookIndex}] ${summarizeHookCommand(
622
+ hook.command,
623
+ )}`,
624
+ timeout:
625
+ typeof hook.timeout === "number" && Number.isFinite(hook.timeout) ? hook.timeout : null,
626
+ });
627
+ });
628
+ });
629
+
630
+ return hooks;
631
+ }
632
+
633
+ function summarizeHookCommand(command: string): string {
634
+ const compact = command.replace(/\s+/g, " ").trim();
635
+ if (compact.includes("@dp/ab-agent-collect-event")) return "@dp/ab-agent-collect-event";
636
+ if (compact.includes("flux-hooks")) return "flux-hooks";
637
+ if (compact.includes("flux-bits-report")) return "flux-bits-report";
638
+ if (compact.includes("hook runtime --target codex")) return "evodev codex hook runtime";
639
+ return compact.length <= 80 ? compact : `${compact.slice(0, 77)}...`;
640
+ }
641
+
642
+ async function readTextFileIfExists(path: string): Promise<string | null> {
643
+ try {
644
+ return await readFile(path, "utf8");
645
+ } catch (error) {
646
+ if (isNotFoundError(error)) return null;
647
+ throw error;
648
+ }
649
+ }
650
+
651
+ function isRecord(value: unknown): value is Record<string, unknown> {
652
+ return typeof value === "object" && value !== null && !Array.isArray(value);
653
+ }
654
+
452
655
  async function syncCodexAgents(
453
656
  input: SyncAgentsInput,
454
657
  paths: CodexPaths,
@@ -1,12 +1,12 @@
1
1
  {
2
- "description": "EvoDev observes Claude Code lifecycle events through evodev hook runtime for local trace and advisory workflow suggestions.",
2
+ "description": "EvoDev observes Claude Code lifecycle events through evodev hook runtime for local trace and action-required advisories.",
3
3
  "hooks": {
4
4
  "SessionStart": [
5
5
  {
6
6
  "hooks": [
7
7
  {
8
8
  "type": "command",
9
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
9
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
10
10
  "timeout": 30
11
11
  }
12
12
  ]
@@ -17,7 +17,7 @@
17
17
  "hooks": [
18
18
  {
19
19
  "type": "command",
20
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
20
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
21
21
  "timeout": 30
22
22
  }
23
23
  ]
@@ -29,7 +29,7 @@
29
29
  "hooks": [
30
30
  {
31
31
  "type": "command",
32
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
32
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
33
33
  "timeout": 30
34
34
  }
35
35
  ]
@@ -41,7 +41,7 @@
41
41
  "hooks": [
42
42
  {
43
43
  "type": "command",
44
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
44
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
45
45
  "timeout": 30
46
46
  }
47
47
  ]
@@ -53,7 +53,7 @@
53
53
  "hooks": [
54
54
  {
55
55
  "type": "command",
56
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
56
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
57
57
  "timeout": 30
58
58
  }
59
59
  ]
@@ -65,7 +65,7 @@
65
65
  "hooks": [
66
66
  {
67
67
  "type": "command",
68
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
68
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
69
69
  "timeout": 30
70
70
  }
71
71
  ]
@@ -76,7 +76,7 @@
76
76
  "hooks": [
77
77
  {
78
78
  "type": "command",
79
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
79
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
80
80
  "timeout": 30
81
81
  }
82
82
  ]
@@ -88,7 +88,7 @@
88
88
  "hooks": [
89
89
  {
90
90
  "type": "command",
91
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
91
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
92
92
  "timeout": 30
93
93
  }
94
94
  ]
@@ -99,7 +99,7 @@
99
99
  "hooks": [
100
100
  {
101
101
  "type": "command",
102
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
102
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
103
103
  "timeout": 30
104
104
  }
105
105
  ]
@@ -110,7 +110,7 @@
110
110
  "hooks": [
111
111
  {
112
112
  "type": "command",
113
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
113
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
114
114
  "timeout": 30
115
115
  }
116
116
  ]
@@ -121,7 +121,7 @@
121
121
  "hooks": [
122
122
  {
123
123
  "type": "command",
124
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
124
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
125
125
  "timeout": 30
126
126
  }
127
127
  ]
@@ -132,7 +132,7 @@
132
132
  "hooks": [
133
133
  {
134
134
  "type": "command",
135
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
135
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
136
136
  "timeout": 30
137
137
  }
138
138
  ]
@@ -143,7 +143,7 @@
143
143
  "hooks": [
144
144
  {
145
145
  "type": "command",
146
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
146
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
147
147
  "timeout": 30
148
148
  }
149
149
  ]
@@ -154,7 +154,7 @@
154
154
  "hooks": [
155
155
  {
156
156
  "type": "command",
157
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
157
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
158
158
  "timeout": 30
159
159
  }
160
160
  ]
@@ -165,7 +165,7 @@
165
165
  "hooks": [
166
166
  {
167
167
  "type": "command",
168
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
168
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
169
169
  "timeout": 30
170
170
  }
171
171
  ]
@@ -176,7 +176,7 @@
176
176
  "hooks": [
177
177
  {
178
178
  "type": "command",
179
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
179
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
180
180
  "timeout": 30
181
181
  }
182
182
  ]
@@ -187,7 +187,7 @@
187
187
  "hooks": [
188
188
  {
189
189
  "type": "command",
190
- "command": "bun run \"${CLAUDE_PLUGIN_ROOT}/hooks/runtime.ts\" hook runtime --target claude",
190
+ "command": "cd \"${CLAUDE_PLUGIN_ROOT}\" && bun run hooks/runtime.ts hook runtime --target claude",
191
191
  "timeout": 5
192
192
  }
193
193
  ]