omk-agent-core 0.98.2 → 0.98.4

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 (113) hide show
  1. package/CHANGELOG.md +658 -0
  2. package/dist/agent-loop.d.ts +1 -31
  3. package/dist/agent-loop.d.ts.map +1 -1
  4. package/dist/agent-loop.js +15 -70
  5. package/dist/agent-loop.js.map +1 -1
  6. package/dist/agent.d.ts +7 -0
  7. package/dist/agent.d.ts.map +1 -1
  8. package/dist/agent.js +13 -34
  9. package/dist/agent.js.map +1 -1
  10. package/dist/effects/effect-journal.d.ts +43 -0
  11. package/dist/effects/effect-journal.d.ts.map +1 -0
  12. package/dist/effects/effect-journal.js +186 -0
  13. package/dist/effects/effect-journal.js.map +1 -0
  14. package/dist/effects/effect-recovery.d.ts +70 -0
  15. package/dist/effects/effect-recovery.d.ts.map +1 -0
  16. package/dist/effects/effect-recovery.js +120 -0
  17. package/dist/effects/effect-recovery.js.map +1 -0
  18. package/dist/effects/effect-transitions.d.ts +34 -0
  19. package/dist/effects/effect-transitions.d.ts.map +1 -0
  20. package/dist/effects/effect-transitions.js +148 -0
  21. package/dist/effects/effect-transitions.js.map +1 -0
  22. package/dist/effects/effect-types.d.ts +135 -0
  23. package/dist/effects/effect-types.d.ts.map +1 -0
  24. package/dist/effects/effect-types.js +32 -0
  25. package/dist/effects/effect-types.js.map +1 -0
  26. package/dist/harness/abort-delivery.d.ts +26 -0
  27. package/dist/harness/abort-delivery.d.ts.map +1 -0
  28. package/dist/harness/abort-delivery.js +36 -0
  29. package/dist/harness/abort-delivery.js.map +1 -0
  30. package/dist/harness/agent-harness.d.ts +18 -0
  31. package/dist/harness/agent-harness.d.ts.map +1 -1
  32. package/dist/harness/agent-harness.js +37 -28
  33. package/dist/harness/agent-harness.js.map +1 -1
  34. package/dist/harness/canonical-digest.d.ts +32 -0
  35. package/dist/harness/canonical-digest.d.ts.map +1 -0
  36. package/dist/harness/canonical-digest.js +164 -0
  37. package/dist/harness/canonical-digest.js.map +1 -0
  38. package/dist/harness/deferred-commands.d.ts +53 -0
  39. package/dist/harness/deferred-commands.d.ts.map +1 -0
  40. package/dist/harness/deferred-commands.js +96 -0
  41. package/dist/harness/deferred-commands.js.map +1 -0
  42. package/dist/harness/operation-outcome.d.ts +18 -10
  43. package/dist/harness/operation-outcome.d.ts.map +1 -1
  44. package/dist/harness/operation-outcome.js +71 -35
  45. package/dist/harness/operation-outcome.js.map +1 -1
  46. package/dist/harness/operation-trace-divergence.d.ts +60 -0
  47. package/dist/harness/operation-trace-divergence.d.ts.map +1 -0
  48. package/dist/harness/operation-trace-divergence.js +199 -0
  49. package/dist/harness/operation-trace-divergence.js.map +1 -0
  50. package/dist/harness/operation-trace.d.ts +134 -0
  51. package/dist/harness/operation-trace.d.ts.map +1 -0
  52. package/dist/harness/operation-trace.js +161 -0
  53. package/dist/harness/operation-trace.js.map +1 -0
  54. package/dist/harness/reverse-skill-text.d.ts +3 -0
  55. package/dist/harness/reverse-skill-text.d.ts.map +1 -0
  56. package/dist/harness/reverse-skill-text.js +20 -0
  57. package/dist/harness/reverse-skill-text.js.map +1 -0
  58. package/dist/harness/reverse-skill-tool-aliases.d.ts +3 -0
  59. package/dist/harness/reverse-skill-tool-aliases.d.ts.map +1 -0
  60. package/dist/harness/reverse-skill-tool-aliases.js +47 -0
  61. package/dist/harness/reverse-skill-tool-aliases.js.map +1 -0
  62. package/dist/harness/reverse-skill-types.d.ts +76 -0
  63. package/dist/harness/reverse-skill-types.d.ts.map +1 -0
  64. package/dist/harness/reverse-skill-types.js +2 -0
  65. package/dist/harness/reverse-skill-types.js.map +1 -0
  66. package/dist/harness/reverse-skill.d.ts +4 -78
  67. package/dist/harness/reverse-skill.d.ts.map +1 -1
  68. package/dist/harness/reverse-skill.js +113 -61
  69. package/dist/harness/reverse-skill.js.map +1 -1
  70. package/dist/harness/subscriber-fanout.d.ts +14 -1
  71. package/dist/harness/subscriber-fanout.d.ts.map +1 -1
  72. package/dist/harness/subscriber-fanout.js +25 -6
  73. package/dist/harness/subscriber-fanout.js.map +1 -1
  74. package/dist/index.d.ts +5 -0
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5 -0
  77. package/dist/index.js.map +1 -1
  78. package/dist/listener-delivery.d.ts +22 -0
  79. package/dist/listener-delivery.d.ts.map +1 -0
  80. package/dist/listener-delivery.js +36 -0
  81. package/dist/listener-delivery.js.map +1 -0
  82. package/dist/pending-message-queue.d.ts +11 -0
  83. package/dist/pending-message-queue.d.ts.map +1 -0
  84. package/dist/pending-message-queue.js +29 -0
  85. package/dist/pending-message-queue.js.map +1 -0
  86. package/dist/provider-input.d.ts +8 -0
  87. package/dist/provider-input.d.ts.map +1 -0
  88. package/dist/provider-input.js +28 -0
  89. package/dist/provider-input.js.map +1 -0
  90. package/dist/provider-payload-contract.d.ts +6 -0
  91. package/dist/provider-payload-contract.d.ts.map +1 -0
  92. package/dist/provider-payload-contract.js +43 -0
  93. package/dist/provider-payload-contract.js.map +1 -0
  94. package/dist/provider-request-types.d.ts +46 -0
  95. package/dist/provider-request-types.d.ts.map +1 -0
  96. package/dist/provider-request-types.js +2 -0
  97. package/dist/provider-request-types.js.map +1 -0
  98. package/dist/provider-request.d.ts +17 -0
  99. package/dist/provider-request.d.ts.map +1 -0
  100. package/dist/provider-request.js +110 -0
  101. package/dist/provider-request.js.map +1 -0
  102. package/dist/run-model-contract.d.ts +11 -0
  103. package/dist/run-model-contract.d.ts.map +1 -0
  104. package/dist/run-model-contract.js +121 -0
  105. package/dist/run-model-contract.js.map +1 -0
  106. package/dist/types.d.ts +4 -1
  107. package/dist/types.d.ts.map +1 -1
  108. package/dist/types.js.map +1 -1
  109. package/dist/vision-route.d.ts +19 -0
  110. package/dist/vision-route.d.ts.map +1 -0
  111. package/dist/vision-route.js +19 -0
  112. package/dist/vision-route.js.map +1 -0
  113. package/package.json +4 -3
@@ -1,3 +1,7 @@
1
+ import { normalizeReverseSkillName, normalizeReverseSkillText } from "./reverse-skill-text.js";
2
+ import { TOOL_ALIASES } from "./reverse-skill-tool-aliases.js";
3
+ export { normalizeReverseSkillName, normalizeReverseSkillText } from "./reverse-skill-text.js";
4
+ export { getReverseSkillToolAliases } from "./reverse-skill-tool-aliases.js";
1
5
  const ROUTE_SCORE_TARGET_WEIGHT = 4;
2
6
  const ROUTE_SCORE_INTENT_WEIGHT = 3;
3
7
  const ROUTE_SCORE_TOOL_WEIGHT = 2;
@@ -5,10 +9,117 @@ const ROUTE_SCORE_KEYWORD_WEIGHT = 1;
5
9
  const ROUTE_SCORE_FULL_TRIAD_BONUS = 4;
6
10
  const ROUTE_SCORE_CONFIDENCE_DENOMINATOR = 14;
7
11
  export const REVERSE_SKILL_ROUTES = [
12
+ {
13
+ id: "api-spec-recover",
14
+ label: "Recover OpenAPI specs from mitmproxy flows or HAR",
15
+ skillPath: "skills/omk-reverse-skill/packs/api-spec-recover/SKILL.md",
16
+ targetPatterns: ["mitmproxy", "mitmweb", "mitmdump", "har", "openapi", "swagger", "flow file"],
17
+ intentPatterns: ["convert", "specification", "spec", "recover", "reverse-engineer rest", "generate spec"],
18
+ toolPatterns: ["mitmproxy2swagger", "mitmproxy", "mitmweb", "mitmdump"],
19
+ keywords: ["x-path-templates", "api prefix", "openapi 3", "ignore:", "swagger.yml"],
20
+ requiredTools: ["mitmproxy2swagger"],
21
+ optionalTools: ["mitmproxy", "mitmweb"],
22
+ skillHints: ["omk-reverse-skill", "api-security", "docs-generator"],
23
+ mcpHints: ["filesystem", "playwright"],
24
+ hookHints: ["pre-shell-guard", "protect-secrets"],
25
+ acceptance: [
26
+ "Input is a local mitmproxy flow or HAR path",
27
+ "api_prefix is justified from observed URLs",
28
+ "OpenAPI YAML has selected paths un-ignored and secrets redacted",
29
+ ],
30
+ firstActions: [
31
+ "Confirm flow/HAR path",
32
+ "Infer api_prefix from captured URLs",
33
+ "Run mitmproxy2swagger first pass, then edit ignore: prefixes",
34
+ ],
35
+ risk: "local-tooling",
36
+ },
37
+ {
38
+ id: "api-client-gen",
39
+ label: "HAR capture to Python API client",
40
+ skillPath: "skills/omk-reverse-skill/packs/api-client-gen/SKILL.md",
41
+ targetPatterns: ["har", "website api", "undocumented api", "api client"],
42
+ intentPatterns: ["generate", "client", "capture", "python", "recorded traffic", "automate website"],
43
+ toolPatterns: ["playwright", "har_filter", "har_analyze", "python"],
44
+ keywords: ["har file", "api client", "pagination", "auth pattern", "coverage"],
45
+ requiredTools: ["python"],
46
+ optionalTools: ["playwright", "node"],
47
+ skillHints: ["omk-reverse-skill", "api-security", "browser-automation"],
48
+ mcpHints: ["playwright", "filesystem"],
49
+ hookHints: ["pre-shell-guard", "protect-secrets"],
50
+ acceptance: [
51
+ "HAR path is local and cited",
52
+ "Generated client methods map to analyzed endpoints",
53
+ "Validation coverage is >= 90 or blockers are listed",
54
+ ],
55
+ firstActions: [
56
+ "Obtain or capture a HAR",
57
+ "Filter with har_filter.py",
58
+ "Analyze then generate from the api_client.py template",
59
+ ],
60
+ risk: "local-tooling",
61
+ },
62
+ {
63
+ id: "protocol-re",
64
+ label: "Network protocol reverse engineering",
65
+ skillPath: "skills/omk-reverse-skill/packs/protocol-re/SKILL.md",
66
+ targetPatterns: ["pcap", "pcapng", "protocol", "proprietary protocol", "custom protocol"],
67
+ intentPatterns: ["dissect", "decode", "parse", "document protocol", "lua dissector", "fuzz"],
68
+ toolPatterns: ["tshark", "tcpdump", "wireshark", "scapy", "mitmdump", "mitmproxy"],
69
+ keywords: ["tlv", "length prefix", "magic", "entropy", "sslkeylogfile", "framing"],
70
+ requiredTools: [],
71
+ optionalTools: ["tshark", "tcpdump", "python"],
72
+ skillHints: ["omk-reverse-skill", "ida-reverse"],
73
+ mcpHints: ["filesystem"],
74
+ hookHints: ["pre-shell-guard", "protect-secrets"],
75
+ acceptance: [
76
+ "Capture path is cited",
77
+ "Framing is evidenced from bytes, not guessed",
78
+ "Spec table includes offsets and sizes",
79
+ ],
80
+ firstActions: [
81
+ "Confirm pcap/flow path",
82
+ "Identify transport and magic/length framing",
83
+ "Write a header layout table before implementing a parser",
84
+ ],
85
+ risk: "passive-analysis",
86
+ },
87
+ {
88
+ id: "ghidra-ida-re",
89
+ label: "Ghidra headless and IDAPython binary analysis",
90
+ skillPath: "skills/omk-reverse-skill/packs/ghidra-ida-re/SKILL.md",
91
+ targetPatterns: ["ghidra", "idapython", "ghidra project", "malware sample"],
92
+ intentPatterns: [
93
+ "analyzeheadless",
94
+ "headless",
95
+ "idapython",
96
+ "function signatures",
97
+ "ghidra_bridge",
98
+ "batch analysis",
99
+ ],
100
+ toolPatterns: ["analyzeheadless", "ghidra", "idapython", "ghidra_bridge", "ghidrathon"],
101
+ keywords: ["postscript", "exportevidence", "flirt", "call graph export"],
102
+ requiredTools: ["ghidra"],
103
+ optionalTools: ["idapro", "idalib-mcp", "python"],
104
+ skillHints: ["omk-reverse-skill", "ida-reverse", "reverse-engineering-binary"],
105
+ mcpHints: ["filesystem", "idapro"],
106
+ hookHints: ["pre-shell-guard", "protect-secrets", "stop-verify"],
107
+ acceptance: [
108
+ "Binary path and format are recorded",
109
+ "Functions are cited by address or recovered name",
110
+ "Evidence is separated from inference",
111
+ ],
112
+ firstActions: [
113
+ "Collect file metadata",
114
+ "Run analyzeHeadless with an evidence post-script",
115
+ "Escalate selected functions to interactive Ghidra or IDA",
116
+ ],
117
+ risk: "passive-analysis",
118
+ },
8
119
  {
9
120
  id: "apk-reverse",
10
121
  label: "APK / Android reverse engineering",
11
- skillPath: "skills/apk-reverse/SKILL.md",
122
+ skillPath: "skills/omk-reverse-skill/packs/android-re/SKILL.md",
12
123
  targetPatterns: ["apk", "android", "aab", "smali", "jni", "dex", "안드로이드", "反编译"],
13
124
  intentPatterns: [
14
125
  "decompile",
@@ -28,7 +139,7 @@ export const REVERSE_SKILL_ROUTES = [
28
139
  keywords: ["classes.dex", "androidmanifest", "native library", "lib/", ".so", "certificate pinning", "smali"],
29
140
  requiredTools: ["jadx", "apktool"],
30
141
  optionalTools: ["adb", "frida", "apksigner", "zipalign", "objection"],
31
- skillHints: ["apk-reverse", "reverse-engineering", "docs-generator"],
142
+ skillHints: ["omk-reverse-skill", "apk-reverse", "reverse-engineering", "docs-generator"],
32
143
  mcpHints: ["filesystem", "playwright for app docs only", "idapro if native .so becomes dominant"],
33
144
  hookHints: ["pre-shell-guard", "protect-secrets", "subagent-stop-audit"],
34
145
  acceptance: [
@@ -372,56 +483,6 @@ export const REVERSE_SKILL_ROUTES = [
372
483
  risk: "passive-analysis",
373
484
  },
374
485
  ];
375
- const TOOL_ALIASES = {
376
- "anything-analyzer": ["anything-analyzer"],
377
- adb: ["adb"],
378
- apktool: ["apktool"],
379
- apksigner: ["apksigner"],
380
- binwalk: ["binwalk"],
381
- burpsuite: ["burpsuite"],
382
- chrome: ["google-chrome", "chromium", "chrome"],
383
- frida: ["frida", "frida-ps"],
384
- gdb: ["gdb"],
385
- gh: ["gh"],
386
- git: ["git"],
387
- ghidra: ["ghidraRun", "analyzeHeadless"],
388
- gitleaks: ["gitleaks"],
389
- graphviz: ["dot"],
390
- idapro: ["ida", "idat", "idat64"],
391
- "idalib-mcp": ["ida-pro-mcp", "idalib-mcp"],
392
- jadx: ["jadx"],
393
- jshookmcp: ["jshook", "npx"],
394
- node: ["node"],
395
- nuclei: ["nuclei"],
396
- pandoc: ["pandoc"],
397
- plantuml: ["plantuml"],
398
- playwright: ["playwright", "npx"],
399
- pwntools: ["python"],
400
- python: ["python3", "python"],
401
- radare2: ["radare2", "r2"],
402
- rabin2: ["rabin2"],
403
- radiff2: ["radiff2"],
404
- rasm2: ["rasm2"],
405
- semgrep: ["semgrep"],
406
- syft: ["syft"],
407
- trivy: ["trivy"],
408
- zap: ["zap.sh", "zap-baseline.py"],
409
- zipalign: ["zipalign"],
410
- z3: ["z3"],
411
- };
412
- export function getReverseSkillToolAliases(tool) {
413
- return TOOL_ALIASES[tool] ?? [tool];
414
- }
415
- export function normalizeReverseSkillText(text) {
416
- return (text ?? "")
417
- .normalize("NFKC")
418
- .toLowerCase()
419
- .replace(/[\u2018\u2019]/g, "'")
420
- .replace(/[\u201c\u201d]/g, '"')
421
- .replace(/[_./\\:-]+/g, " ")
422
- .replace(/\s+/g, " ")
423
- .trim();
424
- }
425
486
  function findPatternMatches(text, patterns) {
426
487
  const matches = [];
427
488
  for (const pattern of patterns) {
@@ -557,15 +618,6 @@ export function planReverseSkillToolChecks(decision, maxTools = 12) {
557
618
  }
558
619
  return unique(tools).slice(0, maxTools);
559
620
  }
560
- export function normalizeReverseSkillName(name) {
561
- const normalized = normalizeReverseSkillText(name)
562
- .replace(/[^a-z0-9-]+/g, "-")
563
- .replace(/-+/g, "-")
564
- .replace(/^-|-$/g, "")
565
- .slice(0, 64)
566
- .replace(/-$/g, "");
567
- return normalized || "reverse-skill";
568
- }
569
621
  function yamlString(value) {
570
622
  return JSON.stringify(value);
571
623
  }
@@ -1 +1 @@
1
- {"version":3,"file":"reverse-skill.js","sourceRoot":"","sources":["../../src/harness/reverse-skill.ts"],"names":[],"mappings":"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","sourcesContent":["export type ReverseSkillPlatform = \"windows\" | \"linux\" | \"macos\" | \"kali\" | \"unknown\";\n\nexport type ReverseSkillRisk = \"passive-analysis\" | \"local-tooling\" | \"active-security\" | \"exploit-development\";\n\nexport interface ReverseSkillRoute {\n\tid: string;\n\tlabel: string;\n\tskillPath: string;\n\ttargetPatterns: string[];\n\tintentPatterns: string[];\n\ttoolPatterns: string[];\n\tkeywords: string[];\n\trequiredTools: string[];\n\toptionalTools: string[];\n\tskillHints: string[];\n\tmcpHints: string[];\n\thookHints: string[];\n\tacceptance: string[];\n\tfirstActions: string[];\n\trisk: ReverseSkillRisk;\n}\n\nexport interface ReverseSkillRouteInput {\n\tquery: string;\n\ttargetType?: string;\n\tintent?: string;\n\ttoolchain?: string;\n\tplatform?: ReverseSkillPlatform;\n\tmaxAlternatives?: number;\n}\n\nexport interface ReverseSkillRouteScore {\n\troute: ReverseSkillRoute;\n\tscore: number;\n\tconfidence: number;\n\tmatched: {\n\t\ttarget: string[];\n\t\tintent: string[];\n\t\ttoolchain: string[];\n\t\tkeywords: string[];\n\t};\n\tmissingDimensions: string[];\n}\n\nexport interface ReverseSkillRouteDecision {\n\tquery: string;\n\tplatform: ReverseSkillPlatform;\n\tnormalizedQuery: string;\n\tprimary?: ReverseSkillRouteScore;\n\talternatives: ReverseSkillRouteScore[];\n\tunmatched: boolean;\n\tnextAction: string;\n}\n\nexport interface ReverseSkillSpecInput {\n\tname: string;\n\tdescription?: string;\n\ttriggerSummary: string;\n\trouteIds?: string[];\n\tworkflowSteps?: string[];\n\ttools?: string[];\n\tmcpServers?: string[];\n\thooks?: string[];\n\tacceptance?: string[];\n\treferences?: string[];\n\tsafetyNotes?: string[];\n}\n\nexport interface ReverseSkillSourceFacts {\n\theadings: string[];\n\tskillPaths: string[];\n\tscriptPaths: string[];\n\ttools: string[];\n\tmcpServers: string[];\n\ttriggerTerms: string[];\n}\n\nexport interface ReverseSkillSourceInput {\n\tname?: string;\n\tdescription?: string;\n\tsourceText: string;\n\ttriggerSummary?: string;\n}\n\nconst ROUTE_SCORE_TARGET_WEIGHT = 4;\nconst ROUTE_SCORE_INTENT_WEIGHT = 3;\nconst ROUTE_SCORE_TOOL_WEIGHT = 2;\nconst ROUTE_SCORE_KEYWORD_WEIGHT = 1;\nconst ROUTE_SCORE_FULL_TRIAD_BONUS = 4;\nconst ROUTE_SCORE_CONFIDENCE_DENOMINATOR = 14;\n\nexport const REVERSE_SKILL_ROUTES: ReverseSkillRoute[] = [\n\t{\n\t\tid: \"apk-reverse\",\n\t\tlabel: \"APK / Android reverse engineering\",\n\t\tskillPath: \"skills/apk-reverse/SKILL.md\",\n\t\ttargetPatterns: [\"apk\", \"android\", \"aab\", \"smali\", \"jni\", \"dex\", \"안드로이드\", \"反编译\"],\n\t\tintentPatterns: [\n\t\t\t\"decompile\",\n\t\t\t\"unpack\",\n\t\t\t\"repack\",\n\t\t\t\"manifest\",\n\t\t\t\"frida\",\n\t\t\t\"hook\",\n\t\t\t\"ssl pinning\",\n\t\t\t\"root detection\",\n\t\t\t\"rebuild\",\n\t\t\t\"sign\",\n\t\t\t\"설치\",\n\t\t\t\"리패키징\",\n\t\t],\n\t\ttoolPatterns: [\"jadx\", \"apktool\", \"adb\", \"frida\", \"apksigner\", \"zipalign\", \"objection\"],\n\t\tkeywords: [\"classes.dex\", \"androidmanifest\", \"native library\", \"lib/\", \".so\", \"certificate pinning\", \"smali\"],\n\t\trequiredTools: [\"jadx\", \"apktool\"],\n\t\toptionalTools: [\"adb\", \"frida\", \"apksigner\", \"zipalign\", \"objection\"],\n\t\tskillHints: [\"apk-reverse\", \"reverse-engineering\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"playwright for app docs only\", \"idapro if native .so becomes dominant\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"subagent-stop-audit\"],\n\t\tacceptance: [\n\t\t\t\"Target package structure is identified\",\n\t\t\t\"Static findings cite class/method/file paths\",\n\t\t\t\"Any dynamic step is scoped to a local test device or emulator\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Confirm target artifact path\",\n\t\t\t\"Decode APK metadata\",\n\t\t\t\"Route native .so files to binary analysis when needed\",\n\t\t],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"ida-reverse\",\n\t\tlabel: \"Binary reverse engineering with decompiler-first workflow\",\n\t\tskillPath: \"skills/ida-reverse/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"exe\",\n\t\t\t\"dll\",\n\t\t\t\"elf\",\n\t\t\t\"so\",\n\t\t\t\"dylib\",\n\t\t\t\"macho\",\n\t\t\t\"pe\",\n\t\t\t\"binary\",\n\t\t\t\"firmware blob\",\n\t\t\t\"바이너리\",\n\t\t\t\"二进制\",\n\t\t],\n\t\tintentPatterns: [\n\t\t\t\"decompile\",\n\t\t\t\"disassemble\",\n\t\t\t\"xref\",\n\t\t\t\"call graph\",\n\t\t\t\"data flow\",\n\t\t\t\"rename\",\n\t\t\t\"symbol\",\n\t\t\t\"recover\",\n\t\t\t\"pseudocode\",\n\t\t\t\"함수\",\n\t\t\t\"反汇编\",\n\t\t],\n\t\ttoolPatterns: [\"ida\", \"idapro\", \"idalib\", \"ida-pro-mcp\", \"ghidra\", \"r2\", \"radare2\"],\n\t\tkeywords: [\"imports\", \"exports\", \"strings\", \"function\", \"offset\", \"xref\", \"pdb\", \"symbols\"],\n\t\trequiredTools: [\"idapro\"],\n\t\toptionalTools: [\"idalib-mcp\", \"ghidra\", \"radare2\", \"rabin2\"],\n\t\tskillHints: [\"ida-reverse\", \"radare2\", \"reverse-engineering\", \"binary-diff\"],\n\t\tmcpHints: [\"idapro\", \"filesystem\", \"serena\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Functions are cited by address/name\",\n\t\t\t\"Hypotheses cite disassembly, decompiler, xref, or string evidence\",\n\t\t\t\"Output distinguishes evidence from inference\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Collect file metadata\",\n\t\t\t\"Run strings/imports reconnaissance\",\n\t\t\t\"Choose IDA or CLI path based on available tools\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"radare2\",\n\t\tlabel: \"Binary reconnaissance with radare2 CLI\",\n\t\tskillPath: \"skills/radare2/SKILL.md\",\n\t\ttargetPatterns: [\"binary\", \"elf\", \"pe\", \"macho\", \"so\", \"dll\", \"firmware\", \"바이너리\"],\n\t\tintentPatterns: [\"quick recon\", \"strings\", \"imports\", \"exports\", \"patch\", \"offset\", \"cli\", \"headless\"],\n\t\ttoolPatterns: [\"radare2\", \"r2\", \"rabin2\", \"rasm2\", \"radiff2\"],\n\t\tkeywords: [\"entrypoint\", \"section\", \"symbol\", \"hex\", \"disassembly\", \"patch bytes\"],\n\t\trequiredTools: [\"radare2\", \"rabin2\"],\n\t\toptionalTools: [\"rasm2\", \"radiff2\", \"r2pipe\"],\n\t\tskillHints: [\"radare2\", \"ida-reverse\", \"reverse-engineering\"],\n\t\tmcpHints: [\"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Recon output names sections, imports, symbols, and notable strings\",\n\t\t\t\"Patch guidance includes offset and before/after bytes\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Run file metadata\",\n\t\t\t\"Run rabin2-style reconnaissance\",\n\t\t\t\"Escalate to decompiler if CLI evidence is insufficient\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"js-reverse\",\n\t\tlabel: \"Frontend JavaScript signature and request reconstruction\",\n\t\tskillPath: \"skills/js-reverse/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"javascript\",\n\t\t\t\"js\",\n\t\t\t\"frontend\",\n\t\t\t\"webpack\",\n\t\t\t\"source map\",\n\t\t\t\"sourcemap\",\n\t\t\t\"web\",\n\t\t\t\"browser\",\n\t\t\t\"前端\",\n\t\t\t\"프론트\",\n\t\t],\n\t\tintentPatterns: [\n\t\t\t\"signature\",\n\t\t\t\"encrypted params\",\n\t\t\t\"request replay\",\n\t\t\t\"token\",\n\t\t\t\"decrypt\",\n\t\t\t\"environment patch\",\n\t\t\t\"ast\",\n\t\t\t\"breakpoint\",\n\t\t\t\"hook\",\n\t\t\t\"서명\",\n\t\t\t\"암호화\",\n\t\t],\n\t\ttoolPatterns: [\"playwright\", \"chrome\", \"cdp\", \"jshook\", \"jshookmcp\", \"node\", \"anything-analyzer\"],\n\t\tkeywords: [\n\t\t\t\"sign\",\n\t\t\t\"nonce\",\n\t\t\t\"timestamp\",\n\t\t\t\"crypto\",\n\t\t\t\"axios\",\n\t\t\t\"fetch\",\n\t\t\t\"xhr\",\n\t\t\t\"webpackJsonp\",\n\t\t\t\"localStorage\",\n\t\t\t\"cookie\",\n\t\t],\n\t\trequiredTools: [\"node\"],\n\t\toptionalTools: [\"playwright\", \"jshookmcp\", \"anything-analyzer\", \"chrome\"],\n\t\tskillHints: [\"js-reverse\", \"browser-automation\", \"docs-generator\"],\n\t\tmcpHints: [\"chrome-devtools\", \"playwright\", \"fetch\", \"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"session-context\"],\n\t\tacceptance: [\n\t\t\t\"Target request and parameter names are identified\",\n\t\t\t\"Recovered algorithm has a local reproduction or explicit blocker\",\n\t\t\t\"Browser/runtime observations are tied to request evidence\",\n\t\t],\n\t\tfirstActions: [\"Identify target request\", \"Find producer function\", \"Rebuild the minimum local reproduction\"],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"browser-automation\",\n\t\tlabel: \"Browser or desktop evidence collection\",\n\t\tskillPath: \"skills/browser-automation/SKILL.md\",\n\t\ttargetPatterns: [\"website\", \"browser\", \"web app\", \"desktop app\", \"page\", \"form\", \"웹\", \"브라우저\"],\n\t\tintentPatterns: [\n\t\t\t\"open\",\n\t\t\t\"screenshot\",\n\t\t\t\"fill\",\n\t\t\t\"crawl\",\n\t\t\t\"capture\",\n\t\t\t\"network\",\n\t\t\t\"login\",\n\t\t\t\"observe\",\n\t\t\t\"click\",\n\t\t\t\"샷\",\n\t\t\t\"스크린샷\",\n\t\t],\n\t\ttoolPatterns: [\"playwright\", \"chrome-devtools\", \"agent-browser\", \"openreverse\", \"anything-analyzer\"],\n\t\tkeywords: [\"dom\", \"selector\", \"network log\", \"console\", \"cookie\", \"screenshot\", \"trace\"],\n\t\trequiredTools: [\"playwright\"],\n\t\toptionalTools: [\"chrome\", \"agent-browser\", \"anything-analyzer\"],\n\t\tskillHints: [\"browser-automation\", \"js-reverse\", \"docs-generator\"],\n\t\tmcpHints: [\"playwright\", \"chrome-devtools\", \"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Browser state is captured with URL and selector evidence\",\n\t\t\t\"Screenshots or logs are saved as artifacts when visual proof matters\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Open the target in an isolated browser context\",\n\t\t\t\"Capture visible state\",\n\t\t\t\"Record console/network evidence\",\n\t\t],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"gitreverse\",\n\t\tlabel: \"Repository-to-prompt reconstruction (GitReverse workflow)\",\n\t\tskillPath: \"skills/gitreverse/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"github\",\n\t\t\t\"gitlab\",\n\t\t\t\"gitee\",\n\t\t\t\"repository\",\n\t\t\t\"repo\",\n\t\t\t\"monorepo\",\n\t\t\t\"codebase\",\n\t\t\t\"레포지토리\",\n\t\t\t\"저장소\",\n\t\t],\n\t\tintentPatterns: [\n\t\t\t\"vibe code\",\n\t\t\t\"prompt\",\n\t\t\t\"paste into\",\n\t\t\t\"cursor\",\n\t\t\t\"claude code\",\n\t\t\t\"codex\",\n\t\t\t\"from scratch\",\n\t\t\t\"reconstruct\",\n\t\t\t\"synthesize\",\n\t\t\t\"프롬프트\",\n\t\t],\n\t\ttoolPatterns: [\"git\", \"gh\", \"github cli\", \"github api\", \"gitreverse\"],\n\t\tkeywords: [\n\t\t\t\"owner/repo\",\n\t\t\t\"file tree\",\n\t\t\t\"readme\",\n\t\t\t\"repo metadata\",\n\t\t\t\"shareable link\",\n\t\t\t\"synthetic prompt\",\n\t\t\t\"vibe coding\",\n\t\t],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"git\", \"gh\"],\n\t\tskillHints: [\"gitreverse\", \"clone-website\", \"docs-generator\"],\n\t\tmcpHints: [\"github\", \"filesystem\"],\n\t\thookHints: [\"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Repository owner/name is parsed from the URL or slug before any fetch\",\n\t\t\t\"The generated prompt is grounded in README and file-tree evidence\",\n\t\t\t\"Only public repository data is used; private or credential-bearing content is refused and redacted\",\n\t\t\t\"Observed repo facts and synthesized prompt text are clearly separated\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Parse owner/repo from the GitHub URL or `owner/repo` slug\",\n\t\t\t\"Fetch repo metadata, root file tree (depth 1), and README\",\n\t\t\t\"Synthesize one short conversational prompt grounded in that context\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"ctf-sandbox-orchestrator\",\n\t\tlabel: \"CTF challenge routing\",\n\t\tskillPath: \"../CTF-Sandbox-Orchestrator/ctf-sandbox-orchestrator/SKILL.md\",\n\t\ttargetPatterns: [\"ctf\", \"challenge\", \"flag\", \"pwn\", \"crypto challenge\", \"forensics\", \"misc\", \"rev\", \"대회\"],\n\t\tintentPatterns: [\"solve\", \"find flag\", \"exploit\", \"writeup\", \"sandbox\", \"analyze challenge\"],\n\t\ttoolPatterns: [\"pwntools\", \"gdb\", \"python\", \"sage\", \"z3\", \"binwalk\", \"wireshark\"],\n\t\tkeywords: [\"flag{\", \"ctf\", \"nc \", \"remote\", \"proof\", \"challenge files\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"python\", \"gdb\", \"pwntools\", \"z3\", \"binwalk\"],\n\t\tskillHints: [\"ctf-sandbox-orchestrator\", \"reverse-engineering\", \"pwn-chain\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"memory\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Challenge category is justified by evidence\",\n\t\t\t\"Solution artifacts are reproducible\",\n\t\t\t\"Writeup includes the shortest verified path\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Inventory challenge files\",\n\t\t\t\"Classify dominant evidence\",\n\t\t\t\"Dispatch to the narrowest CTF sub-skill\",\n\t\t],\n\t\trisk: \"exploit-development\",\n\t},\n\t{\n\t\tid: \"api-security\",\n\t\tlabel: \"API security review and authorized test planning\",\n\t\tskillPath: \"skills/api-security/SKILL.md\",\n\t\ttargetPatterns: [\"api\", \"rest\", \"graphql\", \"websocket\", \"jwt\", \"oauth\", \"endpoint\"],\n\t\tintentPatterns: [\"review\", \"test\", \"auth\", \"idor\", \"bola\", \"bfla\", \"rate limit\", \"schema\", \"권한\", \"越权\"],\n\t\ttoolPatterns: [\"burp\", \"postman\", \"nuclei\", \"zap\", \"curl\", \"graphql\"],\n\t\tkeywords: [\"authorization\", \"authentication\", \"tenant\", \"object id\", \"jwt\", \"scope\", \"graphql\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"burpsuite\", \"nuclei\", \"zap\", \"node\", \"python\"],\n\t\tskillHints: [\"api-security\", \"pentest-tools\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"github\", \"playwright\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Scope boundary is explicit\",\n\t\t\t\"Findings include request/response evidence or code references\",\n\t\t\t\"High-risk active steps require explicit target scope\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Identify API surface\",\n\t\t\t\"Map auth and tenant boundaries\",\n\t\t\t\"Choose static review or scoped dynamic testing\",\n\t\t],\n\t\trisk: \"active-security\",\n\t},\n\t{\n\t\tid: \"supply-chain-security\",\n\t\tlabel: \"Supply-chain and CI/CD security analysis\",\n\t\tskillPath: \"skills/supply-chain-security/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"dependency\",\n\t\t\t\"package\",\n\t\t\t\"sbom\",\n\t\t\t\"container\",\n\t\t\t\"docker\",\n\t\t\t\"ci\",\n\t\t\t\"workflow\",\n\t\t\t\"github actions\",\n\t\t\t\"supply chain\",\n\t\t],\n\t\tintentPatterns: [\"scan\", \"audit\", \"gitleaks\", \"trivy\", \"osv\", \"syft\", \"secret\", \"provenance\", \"attestation\"],\n\t\ttoolPatterns: [\"trivy\", \"syft\", \"gitleaks\", \"osv-scanner\", \"npm audit\", \"semgrep\"],\n\t\tkeywords: [\"package-lock\", \"npm-shrinkwrap\", \"dockerfile\", \"workflow\", \"actions\", \"secret\", \"sbom\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"trivy\", \"syft\", \"gitleaks\", \"osv-scanner\", \"semgrep\"],\n\t\tskillHints: [\"supply-chain-security\", \"security-review\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"github\"],\n\t\thookHints: [\"protect-secrets\", \"pre-shell-guard\", \"npm-audit-summary\"],\n\t\tacceptance: [\n\t\t\t\"Dependency, workflow, and secret surfaces are separated\",\n\t\t\t\"Findings cite exact files and lockfile evidence\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Inventory package managers and workflows\",\n\t\t\t\"Run non-mutating scans first\",\n\t\t\t\"Triangulate tool output with source evidence\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"docs-generator\",\n\t\tlabel: \"Security or reverse-engineering report generation\",\n\t\tskillPath: \"skills/docs-generator/SKILL.md\",\n\t\ttargetPatterns: [\"report\", \"writeup\", \"documentation\", \"diagram\", \"flowchart\", \"보고서\", \"문서\"],\n\t\tintentPatterns: [\"write\", \"summarize\", \"generate\", \"document\", \"explain\", \"diagram\", \"publish\"],\n\t\ttoolPatterns: [\"markdown\", \"mermaid\", \"graphviz\", \"plantuml\", \"pdf\"],\n\t\tkeywords: [\"executive summary\", \"reproduction\", \"impact\", \"timeline\", \"artifact\", \"evidence\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"graphviz\", \"plantuml\", \"pandoc\"],\n\t\tskillHints: [\"docs-generator\", \"diagram-generator\"],\n\t\tmcpHints: [\"filesystem\"],\n\t\thookHints: [\"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Report separates facts, analysis, and recommendations\",\n\t\t\t\"Artifacts and commands are reproducible\",\n\t\t\t\"Sensitive values are redacted\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Collect evidence paths\",\n\t\t\t\"Choose report template\",\n\t\t\t\"Add at least one flow or evidence diagram when useful\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n];\n\nconst TOOL_ALIASES: Record<string, string[]> = {\n\t\"anything-analyzer\": [\"anything-analyzer\"],\n\tadb: [\"adb\"],\n\tapktool: [\"apktool\"],\n\tapksigner: [\"apksigner\"],\n\tbinwalk: [\"binwalk\"],\n\tburpsuite: [\"burpsuite\"],\n\tchrome: [\"google-chrome\", \"chromium\", \"chrome\"],\n\tfrida: [\"frida\", \"frida-ps\"],\n\tgdb: [\"gdb\"],\n\tgh: [\"gh\"],\n\tgit: [\"git\"],\n\tghidra: [\"ghidraRun\", \"analyzeHeadless\"],\n\tgitleaks: [\"gitleaks\"],\n\tgraphviz: [\"dot\"],\n\tidapro: [\"ida\", \"idat\", \"idat64\"],\n\t\"idalib-mcp\": [\"ida-pro-mcp\", \"idalib-mcp\"],\n\tjadx: [\"jadx\"],\n\tjshookmcp: [\"jshook\", \"npx\"],\n\tnode: [\"node\"],\n\tnuclei: [\"nuclei\"],\n\tpandoc: [\"pandoc\"],\n\tplantuml: [\"plantuml\"],\n\tplaywright: [\"playwright\", \"npx\"],\n\tpwntools: [\"python\"],\n\tpython: [\"python3\", \"python\"],\n\tradare2: [\"radare2\", \"r2\"],\n\trabin2: [\"rabin2\"],\n\tradiff2: [\"radiff2\"],\n\trasm2: [\"rasm2\"],\n\tsemgrep: [\"semgrep\"],\n\tsyft: [\"syft\"],\n\ttrivy: [\"trivy\"],\n\tzap: [\"zap.sh\", \"zap-baseline.py\"],\n\tzipalign: [\"zipalign\"],\n\tz3: [\"z3\"],\n};\n\nexport function getReverseSkillToolAliases(tool: string): string[] {\n\treturn TOOL_ALIASES[tool] ?? [tool];\n}\n\nexport function normalizeReverseSkillText(text: string | undefined): string {\n\treturn (text ?? \"\")\n\t\t.normalize(\"NFKC\")\n\t\t.toLowerCase()\n\t\t.replace(/[\\u2018\\u2019]/g, \"'\")\n\t\t.replace(/[\\u201c\\u201d]/g, '\"')\n\t\t.replace(/[_./\\\\:-]+/g, \" \")\n\t\t.replace(/\\s+/g, \" \")\n\t\t.trim();\n}\n\nfunction findPatternMatches(text: string, patterns: string[]): string[] {\n\tconst matches: string[] = [];\n\tfor (const pattern of patterns) {\n\t\tconst normalizedPattern = normalizeReverseSkillText(pattern);\n\t\tif (!normalizedPattern) continue;\n\t\tif (text.includes(normalizedPattern)) matches.push(pattern);\n\t}\n\treturn matches;\n}\n\nfunction unique(items: string[]): string[] {\n\treturn Array.from(new Set(items.filter((item) => item.trim().length > 0)));\n}\n\nfunction clampConfidence(score: number): number {\n\tif (score <= 0) return 0;\n\treturn Math.min(0.99, Number((score / ROUTE_SCORE_CONFIDENCE_DENOMINATOR).toFixed(2)));\n}\n\nfunction scoreRoute(\n\troute: ReverseSkillRoute,\n\tinput: ReverseSkillRouteInput,\n\tnormalizedQuery: string,\n): ReverseSkillRouteScore {\n\tconst targetText = normalizeReverseSkillText(`${input.targetType ?? \"\"} ${normalizedQuery}`);\n\tconst intentText = normalizeReverseSkillText(`${input.intent ?? \"\"} ${normalizedQuery}`);\n\tconst toolText = normalizeReverseSkillText(`${input.toolchain ?? \"\"} ${normalizedQuery}`);\n\n\tconst target = findPatternMatches(targetText, route.targetPatterns);\n\tconst intent = findPatternMatches(intentText, route.intentPatterns);\n\tconst toolchain = findPatternMatches(toolText, route.toolPatterns);\n\tconst keywords = findPatternMatches(normalizedQuery, route.keywords);\n\n\tlet score =\n\t\ttarget.length * ROUTE_SCORE_TARGET_WEIGHT +\n\t\tintent.length * ROUTE_SCORE_INTENT_WEIGHT +\n\t\ttoolchain.length * ROUTE_SCORE_TOOL_WEIGHT +\n\t\tkeywords.length * ROUTE_SCORE_KEYWORD_WEIGHT;\n\n\tif (target.length > 0 && intent.length > 0 && toolchain.length > 0) {\n\t\tscore += ROUTE_SCORE_FULL_TRIAD_BONUS;\n\t}\n\n\tconst missingDimensions: string[] = [];\n\tif (target.length === 0) missingDimensions.push(\"target\");\n\tif (intent.length === 0) missingDimensions.push(\"intent\");\n\tif (toolchain.length === 0) missingDimensions.push(\"toolchain\");\n\n\treturn {\n\t\troute,\n\t\tscore,\n\t\tconfidence: clampConfidence(score),\n\t\tmatched: { target, intent, toolchain, keywords },\n\t\tmissingDimensions,\n\t};\n}\n\nexport function routeReverseSkill(input: ReverseSkillRouteInput): ReverseSkillRouteDecision {\n\tconst normalizedQuery = normalizeReverseSkillText(input.query);\n\tconst platform = input.platform ?? \"unknown\";\n\tconst maxAlternatives = input.maxAlternatives ?? 3;\n\tconst scored = REVERSE_SKILL_ROUTES.map((route) => scoreRoute(route, input, normalizedQuery))\n\t\t.filter((candidate) => candidate.score > 0)\n\t\t.sort(\n\t\t\t(a, b) => b.score - a.score || REVERSE_SKILL_ROUTES.indexOf(a.route) - REVERSE_SKILL_ROUTES.indexOf(b.route),\n\t\t);\n\n\tconst primary = scored[0];\n\tconst alternatives = scored.slice(1, maxAlternatives + 1);\n\tconst unmatched = !primary || primary.score < ROUTE_SCORE_TARGET_WEIGHT || primary.confidence < 0.18;\n\tconst nextAction = unmatched\n\t\t? \"No strong route matched. Create or extend a reverse-skill route before executing specialized tooling.\"\n\t\t: `Read ${primary.route.skillPath}, then execute first action: ${primary.route.firstActions[0] ?? \"classify target\"}.`;\n\n\treturn {\n\t\tquery: input.query,\n\t\tplatform,\n\t\tnormalizedQuery,\n\t\tprimary: unmatched ? undefined : primary,\n\t\talternatives,\n\t\tunmatched,\n\t\tnextAction,\n\t};\n}\n\nfunction formatMatches(score: ReverseSkillRouteScore): string {\n\tconst parts = [\n\t\t`target=${score.matched.target.join(\", \") || \"—\"}`,\n\t\t`intent=${score.matched.intent.join(\", \") || \"—\"}`,\n\t\t`toolchain=${score.matched.toolchain.join(\", \") || \"—\"}`,\n\t\t`keywords=${score.matched.keywords.join(\", \") || \"—\"}`,\n\t];\n\treturn parts.join(\"; \");\n}\n\nexport function formatReverseSkillRouteDecision(decision: ReverseSkillRouteDecision): string {\n\tif (decision.unmatched || !decision.primary) {\n\t\treturn [\n\t\t\t\"# Reverse Skill Route\",\n\t\t\t\"\",\n\t\t\t`Query: ${decision.query}`,\n\t\t\t\"\",\n\t\t\t\"No strong route matched.\",\n\t\t\t\"Next action: create or extend a route before specialized execution.\",\n\t\t].join(\"\\n\");\n\t}\n\n\tconst primary = decision.primary;\n\tconst lines = [\n\t\t\"# Reverse Skill Route\",\n\t\t\"\",\n\t\t`Query: ${decision.query}`,\n\t\t`Platform: ${decision.platform}`,\n\t\t\"\",\n\t\t`## Primary: ${primary.route.label}`,\n\t\t`- Route ID: ${primary.route.id}`,\n\t\t`- Skill path: ${primary.route.skillPath}`,\n\t\t`- Confidence: ${primary.confidence}`,\n\t\t`- Score: ${primary.score}`,\n\t\t`- Matches: ${formatMatches(primary)}`,\n\t\t`- Risk: ${primary.route.risk}`,\n\t\t`- Required tools: ${primary.route.requiredTools.join(\", \") || \"none\"}`,\n\t\t`- Optional tools: ${primary.route.optionalTools.join(\", \") || \"none\"}`,\n\t\t`- Skill hints: ${primary.route.skillHints.join(\", \")}`,\n\t\t`- MCP hints: ${primary.route.mcpHints.join(\", \")}`,\n\t\t`- Hooks: ${primary.route.hookHints.join(\", \")}`,\n\t\t\"\",\n\t\t\"## First actions\",\n\t\t...primary.route.firstActions.map((action, index) => `${index + 1}. ${action}`),\n\t\t\"\",\n\t\t\"## Acceptance\",\n\t\t...primary.route.acceptance.map((item) => `- ${item}`),\n\t];\n\n\tif (decision.alternatives.length > 0) {\n\t\tlines.push(\"\", \"## Alternatives\");\n\t\tfor (const alternative of decision.alternatives) {\n\t\t\tlines.push(`- ${alternative.route.id} (${alternative.confidence}): ${formatMatches(alternative)}`);\n\t\t}\n\t}\n\n\tlines.push(\"\", `Next action: ${decision.nextAction}`);\n\treturn lines.join(\"\\n\");\n}\n\nexport function planReverseSkillToolChecks(decision: ReverseSkillRouteDecision, maxTools = 12): string[] {\n\tconst routes = [decision.primary, ...decision.alternatives].filter((score): score is ReverseSkillRouteScore =>\n\t\tBoolean(score),\n\t);\n\tconst tools: string[] = [];\n\tfor (const score of routes) {\n\t\ttools.push(...score.route.requiredTools, ...score.route.optionalTools);\n\t}\n\treturn unique(tools).slice(0, maxTools);\n}\n\nexport function normalizeReverseSkillName(name: string): string {\n\tconst normalized = normalizeReverseSkillText(name)\n\t\t.replace(/[^a-z0-9-]+/g, \"-\")\n\t\t.replace(/-+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\")\n\t\t.slice(0, 64)\n\t\t.replace(/-$/g, \"\");\n\treturn normalized || \"reverse-skill\";\n}\n\nfunction yamlString(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction compactDescription(input: ReverseSkillSpecInput, routes: ReverseSkillRoute[]): string {\n\tconst fallback = `Use when ${input.triggerSummary}`;\n\tconst base = input.description?.trim() || fallback;\n\tconst routeNames = routes.map((route) => route.id).join(\", \");\n\tconst suffix = routeNames ? ` Routes through ${routeNames}.` : \"\";\n\tconst description = `${base}${suffix}`;\n\treturn description.length <= 1024 ? description : `${description.slice(0, 1021).trimEnd()}...`;\n}\n\nfunction routesFromIds(routeIds: string[] | undefined): ReverseSkillRoute[] {\n\tif (!routeIds) return [];\n\treturn routeIds\n\t\t.map((routeId) => REVERSE_SKILL_ROUTES.find((route) => route.id === routeId))\n\t\t.filter((route): route is ReverseSkillRoute => Boolean(route));\n}\n\nexport function formatReverseSkillMarkdown(input: ReverseSkillSpecInput): string {\n\tconst routes = routesFromIds(input.routeIds);\n\tconst name = normalizeReverseSkillName(input.name);\n\tconst description = compactDescription(input, routes);\n\tconst workflowSteps = input.workflowSteps?.length\n\t\t? input.workflowSteps\n\t\t: [\n\t\t\t\t\"Classify target, intent, and available toolchain before execution\",\n\t\t\t\t\"Read the routed sub-skill or reference\",\n\t\t\t\t\"Collect evidence and record blockers\",\n\t\t\t\t\"Verify output against acceptance criteria\",\n\t\t\t];\n\tconst tools = unique([\n\t\t...(input.tools ?? []),\n\t\t...routes.flatMap((route) => [...route.requiredTools, ...route.optionalTools]),\n\t]);\n\tconst mcpServers = unique([...(input.mcpServers ?? []), ...routes.flatMap((route) => route.mcpHints)]);\n\tconst hooks = unique([...(input.hooks ?? []), ...routes.flatMap((route) => route.hookHints)]);\n\tconst acceptance = unique([...(input.acceptance ?? []), ...routes.flatMap((route) => route.acceptance)]);\n\tconst safetyNotes = input.safetyNotes?.length\n\t\t? input.safetyNotes\n\t\t: [\n\t\t\t\t\"Operate only on user-provided local artifacts or explicitly scoped targets\",\n\t\t\t\t\"Do not write secrets, tokens, credentials, or raw private data into skill artifacts\",\n\t\t\t];\n\n\tconst lines = [\n\t\t\"---\",\n\t\t`name: ${name}`,\n\t\t`description: ${yamlString(description)}`,\n\t\t\"---\",\n\t\t\"\",\n\t\t`# ${name}`,\n\t\t\"\",\n\t\t\"## Routing contract\",\n\t\t\"\",\n\t\t`Trigger this skill when ${input.triggerSummary}.`,\n\t\t\"\",\n\t\t\"1. Classify the target type, user intent, and toolchain signals before choosing tools.\",\n\t\t\"2. Read the narrowest referenced sub-skill or reference before running specialized tooling.\",\n\t\t\"3. Prefer passive/local evidence collection first; escalate only when the task scope requires it.\",\n\t\t\"4. Save evidence paths and blockers in the final response.\",\n\t\t\"\",\n\t\t\"## Workflow\",\n\t\t\"\",\n\t\t...workflowSteps.map((step, index) => `${index + 1}. ${step}`),\n\t\t\"\",\n\t\t\"## Tool selection\",\n\t\t\"\",\n\t\t`- Tools: ${tools.join(\", \") || \"none required\"}`,\n\t\t`- MCP: ${mcpServers.join(\", \") || \"filesystem/read-only\"}`,\n\t\t`- Hooks: ${hooks.join(\", \") || \"pre-shell-guard, protect-secrets\"}`,\n\t\t\"\",\n\t\t\"## Acceptance\",\n\t\t\"\",\n\t\t...(acceptance.length > 0\n\t\t\t? acceptance.map((item) => `- ${item}`)\n\t\t\t: [\"- Output includes routed skill, evidence, commands, and remaining blockers\"]),\n\t\t\"\",\n\t\t\"## Safety constraints\",\n\t\t\"\",\n\t\t...safetyNotes.map((note) => `- ${note}`),\n\t];\n\n\tif (routes.length > 0) {\n\t\tlines.push(\"\", \"## Built-in routes\", \"\");\n\t\tfor (const route of routes) {\n\t\t\tlines.push(`- ${route.id}: ${route.skillPath}`);\n\t\t}\n\t}\n\n\tif (input.references?.length) {\n\t\tlines.push(\"\", \"## References\", \"\");\n\t\tfor (const reference of input.references) lines.push(`- ${reference}`);\n\t}\n\n\treturn `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nexport function extractReverseSkillFactsFromMarkdown(sourceText: string): ReverseSkillSourceFacts {\n\tconst headings = unique(\n\t\tArray.from(sourceText.matchAll(/^#{1,4}\\s+(.+)$/gm)).map((match) => match[1]?.trim() ?? \"\"),\n\t).slice(0, 24);\n\tconst skillPaths = unique(\n\t\tArray.from(sourceText.matchAll(/[`(\\s]([^`\\s)]+SKILL\\.md)/g)).map((match) => match[1] ?? \"\"),\n\t);\n\tconst scriptPaths = unique(\n\t\tArray.from(sourceText.matchAll(/[`(\\s]([^`\\s)]+\\.(?:ps1|sh|py|js|ts))/g)).map((match) => match[1] ?? \"\"),\n\t);\n\tconst knownTools = Object.keys(TOOL_ALIASES);\n\tconst normalizedSource = normalizeReverseSkillText(sourceText);\n\tconst tools = knownTools.filter((tool) => normalizedSource.includes(normalizeReverseSkillText(tool)));\n\tconst mcpServers = unique(\n\t\tArray.from(sourceText.matchAll(/\\b([a-z0-9-]+)\\s+MCP\\b/gi)).map((match) => match[1]?.toLowerCase() ?? \"\"),\n\t);\n\tconst triggerTerms = unique(\n\t\tREVERSE_SKILL_ROUTES.flatMap((route) => [\n\t\t\t...route.targetPatterns,\n\t\t\t...route.intentPatterns,\n\t\t\t...route.toolPatterns,\n\t\t]).filter((term) => normalizedSource.includes(normalizeReverseSkillText(term))),\n\t).slice(0, 40);\n\n\treturn { headings, skillPaths, scriptPaths, tools, mcpServers, triggerTerms };\n}\n\nexport function formatReverseSkillFromSource(input: ReverseSkillSourceInput): string {\n\tconst facts = extractReverseSkillFactsFromMarkdown(input.sourceText);\n\tconst query = [input.triggerSummary, facts.triggerTerms.slice(0, 12).join(\" \"), facts.headings.slice(0, 8).join(\" \")]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\tconst decision = routeReverseSkill({ query: query || input.sourceText.slice(0, 500) });\n\tconst routeIds = [decision.primary?.route.id, ...decision.alternatives.map((item) => item.route.id)].filter(\n\t\t(routeId): routeId is string => Boolean(routeId),\n\t);\n\tconst name = input.name ?? (decision.primary ? `${decision.primary.route.id}-workflow` : \"reverse-skill-workflow\");\n\tconst triggerSummary =\n\t\tinput.triggerSummary ??\n\t\t(facts.triggerTerms.slice(0, 8).join(\", \") || \"reverse-engineering or security routing is needed\");\n\tconst workflowSteps = [\n\t\t\"Classify the incoming request against target, intent, and toolchain signals\",\n\t\t\"Load the routed sub-skill before running specialized tooling\",\n\t\t\"Check local tool availability only for tools required by the selected route\",\n\t\t\"Return evidence paths, commands, confidence, and blockers\",\n\t];\n\n\treturn formatReverseSkillMarkdown({\n\t\tname,\n\t\tdescription: input.description,\n\t\ttriggerSummary,\n\t\trouteIds,\n\t\tworkflowSteps,\n\t\ttools: facts.tools,\n\t\tmcpServers: facts.mcpServers,\n\t\treferences: unique([...facts.skillPaths, ...facts.scriptPaths]).slice(0, 20),\n\t});\n}\n"]}
1
+ {"version":3,"file":"reverse-skill.js","sourceRoot":"","sources":["../../src/harness/reverse-skill.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tReverseSkillRoute,\n\tReverseSkillRouteDecision,\n\tReverseSkillRouteInput,\n\tReverseSkillRouteScore,\n\tReverseSkillSourceFacts,\n\tReverseSkillSourceInput,\n\tReverseSkillSpecInput,\n} from \"./reverse-skill-types.ts\";\n\nexport type {\n\tReverseSkillPlatform,\n\tReverseSkillRisk,\n\tReverseSkillRoute,\n\tReverseSkillRouteDecision,\n\tReverseSkillRouteInput,\n\tReverseSkillRouteScore,\n\tReverseSkillSourceFacts,\n\tReverseSkillSourceInput,\n\tReverseSkillSpecInput,\n} from \"./reverse-skill-types.ts\";\n\nimport { normalizeReverseSkillName, normalizeReverseSkillText } from \"./reverse-skill-text.ts\";\nimport { TOOL_ALIASES } from \"./reverse-skill-tool-aliases.ts\";\n\nexport { normalizeReverseSkillName, normalizeReverseSkillText } from \"./reverse-skill-text.ts\";\n\nexport { getReverseSkillToolAliases } from \"./reverse-skill-tool-aliases.ts\";\n\nconst ROUTE_SCORE_TARGET_WEIGHT = 4;\nconst ROUTE_SCORE_INTENT_WEIGHT = 3;\nconst ROUTE_SCORE_TOOL_WEIGHT = 2;\nconst ROUTE_SCORE_KEYWORD_WEIGHT = 1;\nconst ROUTE_SCORE_FULL_TRIAD_BONUS = 4;\nconst ROUTE_SCORE_CONFIDENCE_DENOMINATOR = 14;\n\nexport const REVERSE_SKILL_ROUTES: ReverseSkillRoute[] = [\n\t{\n\t\tid: \"api-spec-recover\",\n\t\tlabel: \"Recover OpenAPI specs from mitmproxy flows or HAR\",\n\t\tskillPath: \"skills/omk-reverse-skill/packs/api-spec-recover/SKILL.md\",\n\t\ttargetPatterns: [\"mitmproxy\", \"mitmweb\", \"mitmdump\", \"har\", \"openapi\", \"swagger\", \"flow file\"],\n\t\tintentPatterns: [\"convert\", \"specification\", \"spec\", \"recover\", \"reverse-engineer rest\", \"generate spec\"],\n\t\ttoolPatterns: [\"mitmproxy2swagger\", \"mitmproxy\", \"mitmweb\", \"mitmdump\"],\n\t\tkeywords: [\"x-path-templates\", \"api prefix\", \"openapi 3\", \"ignore:\", \"swagger.yml\"],\n\t\trequiredTools: [\"mitmproxy2swagger\"],\n\t\toptionalTools: [\"mitmproxy\", \"mitmweb\"],\n\t\tskillHints: [\"omk-reverse-skill\", \"api-security\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"playwright\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Input is a local mitmproxy flow or HAR path\",\n\t\t\t\"api_prefix is justified from observed URLs\",\n\t\t\t\"OpenAPI YAML has selected paths un-ignored and secrets redacted\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Confirm flow/HAR path\",\n\t\t\t\"Infer api_prefix from captured URLs\",\n\t\t\t\"Run mitmproxy2swagger first pass, then edit ignore: prefixes\",\n\t\t],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"api-client-gen\",\n\t\tlabel: \"HAR capture to Python API client\",\n\t\tskillPath: \"skills/omk-reverse-skill/packs/api-client-gen/SKILL.md\",\n\t\ttargetPatterns: [\"har\", \"website api\", \"undocumented api\", \"api client\"],\n\t\tintentPatterns: [\"generate\", \"client\", \"capture\", \"python\", \"recorded traffic\", \"automate website\"],\n\t\ttoolPatterns: [\"playwright\", \"har_filter\", \"har_analyze\", \"python\"],\n\t\tkeywords: [\"har file\", \"api client\", \"pagination\", \"auth pattern\", \"coverage\"],\n\t\trequiredTools: [\"python\"],\n\t\toptionalTools: [\"playwright\", \"node\"],\n\t\tskillHints: [\"omk-reverse-skill\", \"api-security\", \"browser-automation\"],\n\t\tmcpHints: [\"playwright\", \"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"HAR path is local and cited\",\n\t\t\t\"Generated client methods map to analyzed endpoints\",\n\t\t\t\"Validation coverage is >= 90 or blockers are listed\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Obtain or capture a HAR\",\n\t\t\t\"Filter with har_filter.py\",\n\t\t\t\"Analyze then generate from the api_client.py template\",\n\t\t],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"protocol-re\",\n\t\tlabel: \"Network protocol reverse engineering\",\n\t\tskillPath: \"skills/omk-reverse-skill/packs/protocol-re/SKILL.md\",\n\t\ttargetPatterns: [\"pcap\", \"pcapng\", \"protocol\", \"proprietary protocol\", \"custom protocol\"],\n\t\tintentPatterns: [\"dissect\", \"decode\", \"parse\", \"document protocol\", \"lua dissector\", \"fuzz\"],\n\t\ttoolPatterns: [\"tshark\", \"tcpdump\", \"wireshark\", \"scapy\", \"mitmdump\", \"mitmproxy\"],\n\t\tkeywords: [\"tlv\", \"length prefix\", \"magic\", \"entropy\", \"sslkeylogfile\", \"framing\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"tshark\", \"tcpdump\", \"python\"],\n\t\tskillHints: [\"omk-reverse-skill\", \"ida-reverse\"],\n\t\tmcpHints: [\"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Capture path is cited\",\n\t\t\t\"Framing is evidenced from bytes, not guessed\",\n\t\t\t\"Spec table includes offsets and sizes\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Confirm pcap/flow path\",\n\t\t\t\"Identify transport and magic/length framing\",\n\t\t\t\"Write a header layout table before implementing a parser\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"ghidra-ida-re\",\n\t\tlabel: \"Ghidra headless and IDAPython binary analysis\",\n\t\tskillPath: \"skills/omk-reverse-skill/packs/ghidra-ida-re/SKILL.md\",\n\t\ttargetPatterns: [\"ghidra\", \"idapython\", \"ghidra project\", \"malware sample\"],\n\t\tintentPatterns: [\n\t\t\t\"analyzeheadless\",\n\t\t\t\"headless\",\n\t\t\t\"idapython\",\n\t\t\t\"function signatures\",\n\t\t\t\"ghidra_bridge\",\n\t\t\t\"batch analysis\",\n\t\t],\n\t\ttoolPatterns: [\"analyzeheadless\", \"ghidra\", \"idapython\", \"ghidra_bridge\", \"ghidrathon\"],\n\t\tkeywords: [\"postscript\", \"exportevidence\", \"flirt\", \"call graph export\"],\n\t\trequiredTools: [\"ghidra\"],\n\t\toptionalTools: [\"idapro\", \"idalib-mcp\", \"python\"],\n\t\tskillHints: [\"omk-reverse-skill\", \"ida-reverse\", \"reverse-engineering-binary\"],\n\t\tmcpHints: [\"filesystem\", \"idapro\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Binary path and format are recorded\",\n\t\t\t\"Functions are cited by address or recovered name\",\n\t\t\t\"Evidence is separated from inference\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Collect file metadata\",\n\t\t\t\"Run analyzeHeadless with an evidence post-script\",\n\t\t\t\"Escalate selected functions to interactive Ghidra or IDA\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"apk-reverse\",\n\t\tlabel: \"APK / Android reverse engineering\",\n\t\tskillPath: \"skills/omk-reverse-skill/packs/android-re/SKILL.md\",\n\t\ttargetPatterns: [\"apk\", \"android\", \"aab\", \"smali\", \"jni\", \"dex\", \"안드로이드\", \"反编译\"],\n\t\tintentPatterns: [\n\t\t\t\"decompile\",\n\t\t\t\"unpack\",\n\t\t\t\"repack\",\n\t\t\t\"manifest\",\n\t\t\t\"frida\",\n\t\t\t\"hook\",\n\t\t\t\"ssl pinning\",\n\t\t\t\"root detection\",\n\t\t\t\"rebuild\",\n\t\t\t\"sign\",\n\t\t\t\"설치\",\n\t\t\t\"리패키징\",\n\t\t],\n\t\ttoolPatterns: [\"jadx\", \"apktool\", \"adb\", \"frida\", \"apksigner\", \"zipalign\", \"objection\"],\n\t\tkeywords: [\"classes.dex\", \"androidmanifest\", \"native library\", \"lib/\", \".so\", \"certificate pinning\", \"smali\"],\n\t\trequiredTools: [\"jadx\", \"apktool\"],\n\t\toptionalTools: [\"adb\", \"frida\", \"apksigner\", \"zipalign\", \"objection\"],\n\t\tskillHints: [\"omk-reverse-skill\", \"apk-reverse\", \"reverse-engineering\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"playwright for app docs only\", \"idapro if native .so becomes dominant\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"subagent-stop-audit\"],\n\t\tacceptance: [\n\t\t\t\"Target package structure is identified\",\n\t\t\t\"Static findings cite class/method/file paths\",\n\t\t\t\"Any dynamic step is scoped to a local test device or emulator\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Confirm target artifact path\",\n\t\t\t\"Decode APK metadata\",\n\t\t\t\"Route native .so files to binary analysis when needed\",\n\t\t],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"ida-reverse\",\n\t\tlabel: \"Binary reverse engineering with decompiler-first workflow\",\n\t\tskillPath: \"skills/ida-reverse/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"exe\",\n\t\t\t\"dll\",\n\t\t\t\"elf\",\n\t\t\t\"so\",\n\t\t\t\"dylib\",\n\t\t\t\"macho\",\n\t\t\t\"pe\",\n\t\t\t\"binary\",\n\t\t\t\"firmware blob\",\n\t\t\t\"바이너리\",\n\t\t\t\"二进制\",\n\t\t],\n\t\tintentPatterns: [\n\t\t\t\"decompile\",\n\t\t\t\"disassemble\",\n\t\t\t\"xref\",\n\t\t\t\"call graph\",\n\t\t\t\"data flow\",\n\t\t\t\"rename\",\n\t\t\t\"symbol\",\n\t\t\t\"recover\",\n\t\t\t\"pseudocode\",\n\t\t\t\"함수\",\n\t\t\t\"反汇编\",\n\t\t],\n\t\ttoolPatterns: [\"ida\", \"idapro\", \"idalib\", \"ida-pro-mcp\", \"ghidra\", \"r2\", \"radare2\"],\n\t\tkeywords: [\"imports\", \"exports\", \"strings\", \"function\", \"offset\", \"xref\", \"pdb\", \"symbols\"],\n\t\trequiredTools: [\"idapro\"],\n\t\toptionalTools: [\"idalib-mcp\", \"ghidra\", \"radare2\", \"rabin2\"],\n\t\tskillHints: [\"ida-reverse\", \"radare2\", \"reverse-engineering\", \"binary-diff\"],\n\t\tmcpHints: [\"idapro\", \"filesystem\", \"serena\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Functions are cited by address/name\",\n\t\t\t\"Hypotheses cite disassembly, decompiler, xref, or string evidence\",\n\t\t\t\"Output distinguishes evidence from inference\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Collect file metadata\",\n\t\t\t\"Run strings/imports reconnaissance\",\n\t\t\t\"Choose IDA or CLI path based on available tools\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"radare2\",\n\t\tlabel: \"Binary reconnaissance with radare2 CLI\",\n\t\tskillPath: \"skills/radare2/SKILL.md\",\n\t\ttargetPatterns: [\"binary\", \"elf\", \"pe\", \"macho\", \"so\", \"dll\", \"firmware\", \"바이너리\"],\n\t\tintentPatterns: [\"quick recon\", \"strings\", \"imports\", \"exports\", \"patch\", \"offset\", \"cli\", \"headless\"],\n\t\ttoolPatterns: [\"radare2\", \"r2\", \"rabin2\", \"rasm2\", \"radiff2\"],\n\t\tkeywords: [\"entrypoint\", \"section\", \"symbol\", \"hex\", \"disassembly\", \"patch bytes\"],\n\t\trequiredTools: [\"radare2\", \"rabin2\"],\n\t\toptionalTools: [\"rasm2\", \"radiff2\", \"r2pipe\"],\n\t\tskillHints: [\"radare2\", \"ida-reverse\", \"reverse-engineering\"],\n\t\tmcpHints: [\"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Recon output names sections, imports, symbols, and notable strings\",\n\t\t\t\"Patch guidance includes offset and before/after bytes\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Run file metadata\",\n\t\t\t\"Run rabin2-style reconnaissance\",\n\t\t\t\"Escalate to decompiler if CLI evidence is insufficient\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"js-reverse\",\n\t\tlabel: \"Frontend JavaScript signature and request reconstruction\",\n\t\tskillPath: \"skills/js-reverse/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"javascript\",\n\t\t\t\"js\",\n\t\t\t\"frontend\",\n\t\t\t\"webpack\",\n\t\t\t\"source map\",\n\t\t\t\"sourcemap\",\n\t\t\t\"web\",\n\t\t\t\"browser\",\n\t\t\t\"前端\",\n\t\t\t\"프론트\",\n\t\t],\n\t\tintentPatterns: [\n\t\t\t\"signature\",\n\t\t\t\"encrypted params\",\n\t\t\t\"request replay\",\n\t\t\t\"token\",\n\t\t\t\"decrypt\",\n\t\t\t\"environment patch\",\n\t\t\t\"ast\",\n\t\t\t\"breakpoint\",\n\t\t\t\"hook\",\n\t\t\t\"서명\",\n\t\t\t\"암호화\",\n\t\t],\n\t\ttoolPatterns: [\"playwright\", \"chrome\", \"cdp\", \"jshook\", \"jshookmcp\", \"node\", \"anything-analyzer\"],\n\t\tkeywords: [\n\t\t\t\"sign\",\n\t\t\t\"nonce\",\n\t\t\t\"timestamp\",\n\t\t\t\"crypto\",\n\t\t\t\"axios\",\n\t\t\t\"fetch\",\n\t\t\t\"xhr\",\n\t\t\t\"webpackJsonp\",\n\t\t\t\"localStorage\",\n\t\t\t\"cookie\",\n\t\t],\n\t\trequiredTools: [\"node\"],\n\t\toptionalTools: [\"playwright\", \"jshookmcp\", \"anything-analyzer\", \"chrome\"],\n\t\tskillHints: [\"js-reverse\", \"browser-automation\", \"docs-generator\"],\n\t\tmcpHints: [\"chrome-devtools\", \"playwright\", \"fetch\", \"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"session-context\"],\n\t\tacceptance: [\n\t\t\t\"Target request and parameter names are identified\",\n\t\t\t\"Recovered algorithm has a local reproduction or explicit blocker\",\n\t\t\t\"Browser/runtime observations are tied to request evidence\",\n\t\t],\n\t\tfirstActions: [\"Identify target request\", \"Find producer function\", \"Rebuild the minimum local reproduction\"],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"browser-automation\",\n\t\tlabel: \"Browser or desktop evidence collection\",\n\t\tskillPath: \"skills/browser-automation/SKILL.md\",\n\t\ttargetPatterns: [\"website\", \"browser\", \"web app\", \"desktop app\", \"page\", \"form\", \"웹\", \"브라우저\"],\n\t\tintentPatterns: [\n\t\t\t\"open\",\n\t\t\t\"screenshot\",\n\t\t\t\"fill\",\n\t\t\t\"crawl\",\n\t\t\t\"capture\",\n\t\t\t\"network\",\n\t\t\t\"login\",\n\t\t\t\"observe\",\n\t\t\t\"click\",\n\t\t\t\"샷\",\n\t\t\t\"스크린샷\",\n\t\t],\n\t\ttoolPatterns: [\"playwright\", \"chrome-devtools\", \"agent-browser\", \"openreverse\", \"anything-analyzer\"],\n\t\tkeywords: [\"dom\", \"selector\", \"network log\", \"console\", \"cookie\", \"screenshot\", \"trace\"],\n\t\trequiredTools: [\"playwright\"],\n\t\toptionalTools: [\"chrome\", \"agent-browser\", \"anything-analyzer\"],\n\t\tskillHints: [\"browser-automation\", \"js-reverse\", \"docs-generator\"],\n\t\tmcpHints: [\"playwright\", \"chrome-devtools\", \"filesystem\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Browser state is captured with URL and selector evidence\",\n\t\t\t\"Screenshots or logs are saved as artifacts when visual proof matters\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Open the target in an isolated browser context\",\n\t\t\t\"Capture visible state\",\n\t\t\t\"Record console/network evidence\",\n\t\t],\n\t\trisk: \"local-tooling\",\n\t},\n\t{\n\t\tid: \"gitreverse\",\n\t\tlabel: \"Repository-to-prompt reconstruction (GitReverse workflow)\",\n\t\tskillPath: \"skills/gitreverse/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"github\",\n\t\t\t\"gitlab\",\n\t\t\t\"gitee\",\n\t\t\t\"repository\",\n\t\t\t\"repo\",\n\t\t\t\"monorepo\",\n\t\t\t\"codebase\",\n\t\t\t\"레포지토리\",\n\t\t\t\"저장소\",\n\t\t],\n\t\tintentPatterns: [\n\t\t\t\"vibe code\",\n\t\t\t\"prompt\",\n\t\t\t\"paste into\",\n\t\t\t\"cursor\",\n\t\t\t\"claude code\",\n\t\t\t\"codex\",\n\t\t\t\"from scratch\",\n\t\t\t\"reconstruct\",\n\t\t\t\"synthesize\",\n\t\t\t\"프롬프트\",\n\t\t],\n\t\ttoolPatterns: [\"git\", \"gh\", \"github cli\", \"github api\", \"gitreverse\"],\n\t\tkeywords: [\n\t\t\t\"owner/repo\",\n\t\t\t\"file tree\",\n\t\t\t\"readme\",\n\t\t\t\"repo metadata\",\n\t\t\t\"shareable link\",\n\t\t\t\"synthetic prompt\",\n\t\t\t\"vibe coding\",\n\t\t],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"git\", \"gh\"],\n\t\tskillHints: [\"gitreverse\", \"clone-website\", \"docs-generator\"],\n\t\tmcpHints: [\"github\", \"filesystem\"],\n\t\thookHints: [\"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Repository owner/name is parsed from the URL or slug before any fetch\",\n\t\t\t\"The generated prompt is grounded in README and file-tree evidence\",\n\t\t\t\"Only public repository data is used; private or credential-bearing content is refused and redacted\",\n\t\t\t\"Observed repo facts and synthesized prompt text are clearly separated\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Parse owner/repo from the GitHub URL or `owner/repo` slug\",\n\t\t\t\"Fetch repo metadata, root file tree (depth 1), and README\",\n\t\t\t\"Synthesize one short conversational prompt grounded in that context\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"ctf-sandbox-orchestrator\",\n\t\tlabel: \"CTF challenge routing\",\n\t\tskillPath: \"../CTF-Sandbox-Orchestrator/ctf-sandbox-orchestrator/SKILL.md\",\n\t\ttargetPatterns: [\"ctf\", \"challenge\", \"flag\", \"pwn\", \"crypto challenge\", \"forensics\", \"misc\", \"rev\", \"대회\"],\n\t\tintentPatterns: [\"solve\", \"find flag\", \"exploit\", \"writeup\", \"sandbox\", \"analyze challenge\"],\n\t\ttoolPatterns: [\"pwntools\", \"gdb\", \"python\", \"sage\", \"z3\", \"binwalk\", \"wireshark\"],\n\t\tkeywords: [\"flag{\", \"ctf\", \"nc \", \"remote\", \"proof\", \"challenge files\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"python\", \"gdb\", \"pwntools\", \"z3\", \"binwalk\"],\n\t\tskillHints: [\"ctf-sandbox-orchestrator\", \"reverse-engineering\", \"pwn-chain\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"memory\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Challenge category is justified by evidence\",\n\t\t\t\"Solution artifacts are reproducible\",\n\t\t\t\"Writeup includes the shortest verified path\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Inventory challenge files\",\n\t\t\t\"Classify dominant evidence\",\n\t\t\t\"Dispatch to the narrowest CTF sub-skill\",\n\t\t],\n\t\trisk: \"exploit-development\",\n\t},\n\t{\n\t\tid: \"api-security\",\n\t\tlabel: \"API security review and authorized test planning\",\n\t\tskillPath: \"skills/api-security/SKILL.md\",\n\t\ttargetPatterns: [\"api\", \"rest\", \"graphql\", \"websocket\", \"jwt\", \"oauth\", \"endpoint\"],\n\t\tintentPatterns: [\"review\", \"test\", \"auth\", \"idor\", \"bola\", \"bfla\", \"rate limit\", \"schema\", \"권한\", \"越权\"],\n\t\ttoolPatterns: [\"burp\", \"postman\", \"nuclei\", \"zap\", \"curl\", \"graphql\"],\n\t\tkeywords: [\"authorization\", \"authentication\", \"tenant\", \"object id\", \"jwt\", \"scope\", \"graphql\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"burpsuite\", \"nuclei\", \"zap\", \"node\", \"python\"],\n\t\tskillHints: [\"api-security\", \"pentest-tools\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"github\", \"playwright\"],\n\t\thookHints: [\"pre-shell-guard\", \"protect-secrets\", \"stop-verify\"],\n\t\tacceptance: [\n\t\t\t\"Scope boundary is explicit\",\n\t\t\t\"Findings include request/response evidence or code references\",\n\t\t\t\"High-risk active steps require explicit target scope\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Identify API surface\",\n\t\t\t\"Map auth and tenant boundaries\",\n\t\t\t\"Choose static review or scoped dynamic testing\",\n\t\t],\n\t\trisk: \"active-security\",\n\t},\n\t{\n\t\tid: \"supply-chain-security\",\n\t\tlabel: \"Supply-chain and CI/CD security analysis\",\n\t\tskillPath: \"skills/supply-chain-security/SKILL.md\",\n\t\ttargetPatterns: [\n\t\t\t\"dependency\",\n\t\t\t\"package\",\n\t\t\t\"sbom\",\n\t\t\t\"container\",\n\t\t\t\"docker\",\n\t\t\t\"ci\",\n\t\t\t\"workflow\",\n\t\t\t\"github actions\",\n\t\t\t\"supply chain\",\n\t\t],\n\t\tintentPatterns: [\"scan\", \"audit\", \"gitleaks\", \"trivy\", \"osv\", \"syft\", \"secret\", \"provenance\", \"attestation\"],\n\t\ttoolPatterns: [\"trivy\", \"syft\", \"gitleaks\", \"osv-scanner\", \"npm audit\", \"semgrep\"],\n\t\tkeywords: [\"package-lock\", \"npm-shrinkwrap\", \"dockerfile\", \"workflow\", \"actions\", \"secret\", \"sbom\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"trivy\", \"syft\", \"gitleaks\", \"osv-scanner\", \"semgrep\"],\n\t\tskillHints: [\"supply-chain-security\", \"security-review\", \"docs-generator\"],\n\t\tmcpHints: [\"filesystem\", \"github\"],\n\t\thookHints: [\"protect-secrets\", \"pre-shell-guard\", \"npm-audit-summary\"],\n\t\tacceptance: [\n\t\t\t\"Dependency, workflow, and secret surfaces are separated\",\n\t\t\t\"Findings cite exact files and lockfile evidence\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Inventory package managers and workflows\",\n\t\t\t\"Run non-mutating scans first\",\n\t\t\t\"Triangulate tool output with source evidence\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n\t{\n\t\tid: \"docs-generator\",\n\t\tlabel: \"Security or reverse-engineering report generation\",\n\t\tskillPath: \"skills/docs-generator/SKILL.md\",\n\t\ttargetPatterns: [\"report\", \"writeup\", \"documentation\", \"diagram\", \"flowchart\", \"보고서\", \"문서\"],\n\t\tintentPatterns: [\"write\", \"summarize\", \"generate\", \"document\", \"explain\", \"diagram\", \"publish\"],\n\t\ttoolPatterns: [\"markdown\", \"mermaid\", \"graphviz\", \"plantuml\", \"pdf\"],\n\t\tkeywords: [\"executive summary\", \"reproduction\", \"impact\", \"timeline\", \"artifact\", \"evidence\"],\n\t\trequiredTools: [],\n\t\toptionalTools: [\"graphviz\", \"plantuml\", \"pandoc\"],\n\t\tskillHints: [\"docs-generator\", \"diagram-generator\"],\n\t\tmcpHints: [\"filesystem\"],\n\t\thookHints: [\"protect-secrets\"],\n\t\tacceptance: [\n\t\t\t\"Report separates facts, analysis, and recommendations\",\n\t\t\t\"Artifacts and commands are reproducible\",\n\t\t\t\"Sensitive values are redacted\",\n\t\t],\n\t\tfirstActions: [\n\t\t\t\"Collect evidence paths\",\n\t\t\t\"Choose report template\",\n\t\t\t\"Add at least one flow or evidence diagram when useful\",\n\t\t],\n\t\trisk: \"passive-analysis\",\n\t},\n];\n\nfunction findPatternMatches(text: string, patterns: string[]): string[] {\n\tconst matches: string[] = [];\n\tfor (const pattern of patterns) {\n\t\tconst normalizedPattern = normalizeReverseSkillText(pattern);\n\t\tif (!normalizedPattern) continue;\n\t\tif (text.includes(normalizedPattern)) matches.push(pattern);\n\t}\n\treturn matches;\n}\n\nfunction unique(items: string[]): string[] {\n\treturn Array.from(new Set(items.filter((item) => item.trim().length > 0)));\n}\n\nfunction clampConfidence(score: number): number {\n\tif (score <= 0) return 0;\n\treturn Math.min(0.99, Number((score / ROUTE_SCORE_CONFIDENCE_DENOMINATOR).toFixed(2)));\n}\n\nfunction scoreRoute(\n\troute: ReverseSkillRoute,\n\tinput: ReverseSkillRouteInput,\n\tnormalizedQuery: string,\n): ReverseSkillRouteScore {\n\tconst targetText = normalizeReverseSkillText(`${input.targetType ?? \"\"} ${normalizedQuery}`);\n\tconst intentText = normalizeReverseSkillText(`${input.intent ?? \"\"} ${normalizedQuery}`);\n\tconst toolText = normalizeReverseSkillText(`${input.toolchain ?? \"\"} ${normalizedQuery}`);\n\n\tconst target = findPatternMatches(targetText, route.targetPatterns);\n\tconst intent = findPatternMatches(intentText, route.intentPatterns);\n\tconst toolchain = findPatternMatches(toolText, route.toolPatterns);\n\tconst keywords = findPatternMatches(normalizedQuery, route.keywords);\n\n\tlet score =\n\t\ttarget.length * ROUTE_SCORE_TARGET_WEIGHT +\n\t\tintent.length * ROUTE_SCORE_INTENT_WEIGHT +\n\t\ttoolchain.length * ROUTE_SCORE_TOOL_WEIGHT +\n\t\tkeywords.length * ROUTE_SCORE_KEYWORD_WEIGHT;\n\n\tif (target.length > 0 && intent.length > 0 && toolchain.length > 0) {\n\t\tscore += ROUTE_SCORE_FULL_TRIAD_BONUS;\n\t}\n\n\tconst missingDimensions: string[] = [];\n\tif (target.length === 0) missingDimensions.push(\"target\");\n\tif (intent.length === 0) missingDimensions.push(\"intent\");\n\tif (toolchain.length === 0) missingDimensions.push(\"toolchain\");\n\n\treturn {\n\t\troute,\n\t\tscore,\n\t\tconfidence: clampConfidence(score),\n\t\tmatched: { target, intent, toolchain, keywords },\n\t\tmissingDimensions,\n\t};\n}\n\nexport function routeReverseSkill(input: ReverseSkillRouteInput): ReverseSkillRouteDecision {\n\tconst normalizedQuery = normalizeReverseSkillText(input.query);\n\tconst platform = input.platform ?? \"unknown\";\n\tconst maxAlternatives = input.maxAlternatives ?? 3;\n\tconst scored = REVERSE_SKILL_ROUTES.map((route) => scoreRoute(route, input, normalizedQuery))\n\t\t.filter((candidate) => candidate.score > 0)\n\t\t.sort(\n\t\t\t(a, b) => b.score - a.score || REVERSE_SKILL_ROUTES.indexOf(a.route) - REVERSE_SKILL_ROUTES.indexOf(b.route),\n\t\t);\n\n\tconst primary = scored[0];\n\tconst alternatives = scored.slice(1, maxAlternatives + 1);\n\tconst unmatched = !primary || primary.score < ROUTE_SCORE_TARGET_WEIGHT || primary.confidence < 0.18;\n\tconst nextAction = unmatched\n\t\t? \"No strong route matched. Create or extend a reverse-skill route before executing specialized tooling.\"\n\t\t: `Read ${primary.route.skillPath}, then execute first action: ${primary.route.firstActions[0] ?? \"classify target\"}.`;\n\n\treturn {\n\t\tquery: input.query,\n\t\tplatform,\n\t\tnormalizedQuery,\n\t\tprimary: unmatched ? undefined : primary,\n\t\talternatives,\n\t\tunmatched,\n\t\tnextAction,\n\t};\n}\n\nfunction formatMatches(score: ReverseSkillRouteScore): string {\n\tconst parts = [\n\t\t`target=${score.matched.target.join(\", \") || \"—\"}`,\n\t\t`intent=${score.matched.intent.join(\", \") || \"—\"}`,\n\t\t`toolchain=${score.matched.toolchain.join(\", \") || \"—\"}`,\n\t\t`keywords=${score.matched.keywords.join(\", \") || \"—\"}`,\n\t];\n\treturn parts.join(\"; \");\n}\n\nexport function formatReverseSkillRouteDecision(decision: ReverseSkillRouteDecision): string {\n\tif (decision.unmatched || !decision.primary) {\n\t\treturn [\n\t\t\t\"# Reverse Skill Route\",\n\t\t\t\"\",\n\t\t\t`Query: ${decision.query}`,\n\t\t\t\"\",\n\t\t\t\"No strong route matched.\",\n\t\t\t\"Next action: create or extend a route before specialized execution.\",\n\t\t].join(\"\\n\");\n\t}\n\n\tconst primary = decision.primary;\n\tconst lines = [\n\t\t\"# Reverse Skill Route\",\n\t\t\"\",\n\t\t`Query: ${decision.query}`,\n\t\t`Platform: ${decision.platform}`,\n\t\t\"\",\n\t\t`## Primary: ${primary.route.label}`,\n\t\t`- Route ID: ${primary.route.id}`,\n\t\t`- Skill path: ${primary.route.skillPath}`,\n\t\t`- Confidence: ${primary.confidence}`,\n\t\t`- Score: ${primary.score}`,\n\t\t`- Matches: ${formatMatches(primary)}`,\n\t\t`- Risk: ${primary.route.risk}`,\n\t\t`- Required tools: ${primary.route.requiredTools.join(\", \") || \"none\"}`,\n\t\t`- Optional tools: ${primary.route.optionalTools.join(\", \") || \"none\"}`,\n\t\t`- Skill hints: ${primary.route.skillHints.join(\", \")}`,\n\t\t`- MCP hints: ${primary.route.mcpHints.join(\", \")}`,\n\t\t`- Hooks: ${primary.route.hookHints.join(\", \")}`,\n\t\t\"\",\n\t\t\"## First actions\",\n\t\t...primary.route.firstActions.map((action, index) => `${index + 1}. ${action}`),\n\t\t\"\",\n\t\t\"## Acceptance\",\n\t\t...primary.route.acceptance.map((item) => `- ${item}`),\n\t];\n\n\tif (decision.alternatives.length > 0) {\n\t\tlines.push(\"\", \"## Alternatives\");\n\t\tfor (const alternative of decision.alternatives) {\n\t\t\tlines.push(`- ${alternative.route.id} (${alternative.confidence}): ${formatMatches(alternative)}`);\n\t\t}\n\t}\n\n\tlines.push(\"\", `Next action: ${decision.nextAction}`);\n\treturn lines.join(\"\\n\");\n}\n\nexport function planReverseSkillToolChecks(decision: ReverseSkillRouteDecision, maxTools = 12): string[] {\n\tconst routes = [decision.primary, ...decision.alternatives].filter((score): score is ReverseSkillRouteScore =>\n\t\tBoolean(score),\n\t);\n\tconst tools: string[] = [];\n\tfor (const score of routes) {\n\t\ttools.push(...score.route.requiredTools, ...score.route.optionalTools);\n\t}\n\treturn unique(tools).slice(0, maxTools);\n}\n\nfunction yamlString(value: string): string {\n\treturn JSON.stringify(value);\n}\n\nfunction compactDescription(input: ReverseSkillSpecInput, routes: ReverseSkillRoute[]): string {\n\tconst fallback = `Use when ${input.triggerSummary}`;\n\tconst base = input.description?.trim() || fallback;\n\tconst routeNames = routes.map((route) => route.id).join(\", \");\n\tconst suffix = routeNames ? ` Routes through ${routeNames}.` : \"\";\n\tconst description = `${base}${suffix}`;\n\treturn description.length <= 1024 ? description : `${description.slice(0, 1021).trimEnd()}...`;\n}\n\nfunction routesFromIds(routeIds: string[] | undefined): ReverseSkillRoute[] {\n\tif (!routeIds) return [];\n\treturn routeIds\n\t\t.map((routeId) => REVERSE_SKILL_ROUTES.find((route) => route.id === routeId))\n\t\t.filter((route): route is ReverseSkillRoute => Boolean(route));\n}\n\nexport function formatReverseSkillMarkdown(input: ReverseSkillSpecInput): string {\n\tconst routes = routesFromIds(input.routeIds);\n\tconst name = normalizeReverseSkillName(input.name);\n\tconst description = compactDescription(input, routes);\n\tconst workflowSteps = input.workflowSteps?.length\n\t\t? input.workflowSteps\n\t\t: [\n\t\t\t\t\"Classify target, intent, and available toolchain before execution\",\n\t\t\t\t\"Read the routed sub-skill or reference\",\n\t\t\t\t\"Collect evidence and record blockers\",\n\t\t\t\t\"Verify output against acceptance criteria\",\n\t\t\t];\n\tconst tools = unique([\n\t\t...(input.tools ?? []),\n\t\t...routes.flatMap((route) => [...route.requiredTools, ...route.optionalTools]),\n\t]);\n\tconst mcpServers = unique([...(input.mcpServers ?? []), ...routes.flatMap((route) => route.mcpHints)]);\n\tconst hooks = unique([...(input.hooks ?? []), ...routes.flatMap((route) => route.hookHints)]);\n\tconst acceptance = unique([...(input.acceptance ?? []), ...routes.flatMap((route) => route.acceptance)]);\n\tconst safetyNotes = input.safetyNotes?.length\n\t\t? input.safetyNotes\n\t\t: [\n\t\t\t\t\"Operate only on user-provided local artifacts or explicitly scoped targets\",\n\t\t\t\t\"Do not write secrets, tokens, credentials, or raw private data into skill artifacts\",\n\t\t\t];\n\n\tconst lines = [\n\t\t\"---\",\n\t\t`name: ${name}`,\n\t\t`description: ${yamlString(description)}`,\n\t\t\"---\",\n\t\t\"\",\n\t\t`# ${name}`,\n\t\t\"\",\n\t\t\"## Routing contract\",\n\t\t\"\",\n\t\t`Trigger this skill when ${input.triggerSummary}.`,\n\t\t\"\",\n\t\t\"1. Classify the target type, user intent, and toolchain signals before choosing tools.\",\n\t\t\"2. Read the narrowest referenced sub-skill or reference before running specialized tooling.\",\n\t\t\"3. Prefer passive/local evidence collection first; escalate only when the task scope requires it.\",\n\t\t\"4. Save evidence paths and blockers in the final response.\",\n\t\t\"\",\n\t\t\"## Workflow\",\n\t\t\"\",\n\t\t...workflowSteps.map((step, index) => `${index + 1}. ${step}`),\n\t\t\"\",\n\t\t\"## Tool selection\",\n\t\t\"\",\n\t\t`- Tools: ${tools.join(\", \") || \"none required\"}`,\n\t\t`- MCP: ${mcpServers.join(\", \") || \"filesystem/read-only\"}`,\n\t\t`- Hooks: ${hooks.join(\", \") || \"pre-shell-guard, protect-secrets\"}`,\n\t\t\"\",\n\t\t\"## Acceptance\",\n\t\t\"\",\n\t\t...(acceptance.length > 0\n\t\t\t? acceptance.map((item) => `- ${item}`)\n\t\t\t: [\"- Output includes routed skill, evidence, commands, and remaining blockers\"]),\n\t\t\"\",\n\t\t\"## Safety constraints\",\n\t\t\"\",\n\t\t...safetyNotes.map((note) => `- ${note}`),\n\t];\n\n\tif (routes.length > 0) {\n\t\tlines.push(\"\", \"## Built-in routes\", \"\");\n\t\tfor (const route of routes) {\n\t\t\tlines.push(`- ${route.id}: ${route.skillPath}`);\n\t\t}\n\t}\n\n\tif (input.references?.length) {\n\t\tlines.push(\"\", \"## References\", \"\");\n\t\tfor (const reference of input.references) lines.push(`- ${reference}`);\n\t}\n\n\treturn `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\nexport function extractReverseSkillFactsFromMarkdown(sourceText: string): ReverseSkillSourceFacts {\n\tconst headings = unique(\n\t\tArray.from(sourceText.matchAll(/^#{1,4}\\s+(.+)$/gm)).map((match) => match[1]?.trim() ?? \"\"),\n\t).slice(0, 24);\n\tconst skillPaths = unique(\n\t\tArray.from(sourceText.matchAll(/[`(\\s]([^`\\s)]+SKILL\\.md)/g)).map((match) => match[1] ?? \"\"),\n\t);\n\tconst scriptPaths = unique(\n\t\tArray.from(sourceText.matchAll(/[`(\\s]([^`\\s)]+\\.(?:ps1|sh|py|js|ts))/g)).map((match) => match[1] ?? \"\"),\n\t);\n\tconst knownTools = Object.keys(TOOL_ALIASES);\n\tconst normalizedSource = normalizeReverseSkillText(sourceText);\n\tconst tools = knownTools.filter((tool) => normalizedSource.includes(normalizeReverseSkillText(tool)));\n\tconst mcpServers = unique(\n\t\tArray.from(sourceText.matchAll(/\\b([a-z0-9-]+)\\s+MCP\\b/gi)).map((match) => match[1]?.toLowerCase() ?? \"\"),\n\t);\n\tconst triggerTerms = unique(\n\t\tREVERSE_SKILL_ROUTES.flatMap((route) => [\n\t\t\t...route.targetPatterns,\n\t\t\t...route.intentPatterns,\n\t\t\t...route.toolPatterns,\n\t\t]).filter((term) => normalizedSource.includes(normalizeReverseSkillText(term))),\n\t).slice(0, 40);\n\n\treturn { headings, skillPaths, scriptPaths, tools, mcpServers, triggerTerms };\n}\n\nexport function formatReverseSkillFromSource(input: ReverseSkillSourceInput): string {\n\tconst facts = extractReverseSkillFactsFromMarkdown(input.sourceText);\n\tconst query = [input.triggerSummary, facts.triggerTerms.slice(0, 12).join(\" \"), facts.headings.slice(0, 8).join(\" \")]\n\t\t.filter(Boolean)\n\t\t.join(\" \");\n\tconst decision = routeReverseSkill({ query: query || input.sourceText.slice(0, 500) });\n\tconst routeIds = [decision.primary?.route.id, ...decision.alternatives.map((item) => item.route.id)].filter(\n\t\t(routeId): routeId is string => Boolean(routeId),\n\t);\n\tconst name = input.name ?? (decision.primary ? `${decision.primary.route.id}-workflow` : \"reverse-skill-workflow\");\n\tconst triggerSummary =\n\t\tinput.triggerSummary ??\n\t\t(facts.triggerTerms.slice(0, 8).join(\", \") || \"reverse-engineering or security routing is needed\");\n\tconst workflowSteps = [\n\t\t\"Classify the incoming request against target, intent, and toolchain signals\",\n\t\t\"Load the routed sub-skill before running specialized tooling\",\n\t\t\"Check local tool availability only for tools required by the selected route\",\n\t\t\"Return evidence paths, commands, confidence, and blockers\",\n\t];\n\n\treturn formatReverseSkillMarkdown({\n\t\tname,\n\t\tdescription: input.description,\n\t\ttriggerSummary,\n\t\trouteIds,\n\t\tworkflowSteps,\n\t\ttools: facts.tools,\n\t\tmcpServers: facts.mcpServers,\n\t\treferences: unique([...facts.skillPaths, ...facts.scriptPaths]).slice(0, 20),\n\t});\n}\n"]}
@@ -9,6 +9,9 @@
9
9
  * falsely rejecting an unrelated concurrent caller that runs later while the
10
10
  * listener's promise is merely pending.
11
11
  *
12
+ * Delivery is observational: every subscriber runs even when an earlier one
13
+ * fails, and the failures are raised together afterwards.
14
+ *
12
15
  * This module imports no harness or session types so it stays a leaf for the
13
16
  * import-cycle ratchet; the harness passes the current operation id in.
14
17
  */
@@ -22,7 +25,17 @@ export declare class SubscriberFanout<TEvent extends {
22
25
  private operationId;
23
26
  private eventType;
24
27
  subscribe(listener: SubscriberListener<TEvent>): () => void;
25
- /** Deliver `event` to every subscriber in order; a throwing subscriber fails the emission as `hook`. */
28
+ /**
29
+ * Deliver `event` to every subscriber in registration order, then fail the
30
+ * emission once the fanout has completed.
31
+ *
32
+ * Observational subscribers must not starve each other: one throwing telemetry
33
+ * or audit listener cannot hide `settled` / `attempt_finished` from the
34
+ * listeners registered after it. Failures are collected and raised after the
35
+ * last listener ran — a single failure keeps its own classification, several
36
+ * become one `AggregateError` classified by the first. Policy and mutation
37
+ * hooks live on `AgentHarness.on()` and stay fail-fast.
38
+ */
26
39
  emit(event: TEvent, currentOperationId: string | undefined, signal?: AbortSignal): Promise<void>;
27
40
  /**
28
41
  * Fail closed when an awaited listener tries to wait on its own operation.
@@ -1 +1 @@
1
- {"version":3,"file":"subscriber-fanout.d.ts","sourceRoot":"","sources":["../../src/harness/subscriber-fanout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,MAAM,kBAAkB,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEvG,qBAAa,gBAAgB,CAAC,MAAM,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,+EAA+E;IAC/E,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,SAAS,CAAqB;IAEtC,SAAS,CAAC,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAG1D;IAED,wGAAwG;IAClG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BrG;IAED;;;;;;;OAOG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAO3E;CACD","sourcesContent":["/**\n * Subscriber fan-out with a self-wait barrier, extracted from `AgentHarness`.\n *\n * A listener that awaits the end of the very operation whose emission it is\n * blocking forms a cycle. The call that closes that cycle (`waitForIdle()`,\n * `abort()`) is always made during the listener's *synchronous* prologue — an\n * async function body runs synchronously up to its first `await` — so marking\n * just that window identifies callback-originated waits exactly, without\n * falsely rejecting an unrelated concurrent caller that runs later while the\n * listener's promise is merely pending.\n *\n * This module imports no harness or session types so it stays a leaf for the\n * import-cycle ratchet; the harness passes the current operation id in.\n */\n\nimport { AgentHarnessError } from \"./errors.ts\";\nimport { normalizeHarnessError } from \"./operation-outcome.ts\";\n\nexport type SubscriberListener<TEvent> = (event: TEvent, signal?: AbortSignal) => Promise<void> | void;\n\nexport class SubscriberFanout<TEvent extends { readonly type: string }> {\n\tprivate readonly listeners = new Set<SubscriberListener<TEvent>>();\n\t/** Non-zero only while a subscriber's synchronous prologue is on the stack. */\n\tprivate syncFrameDepth = 0;\n\tprivate operationId: string | undefined;\n\tprivate eventType: string | undefined;\n\n\tsubscribe(listener: SubscriberListener<TEvent>): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\t/** Deliver `event` to every subscriber in order; a throwing subscriber fails the emission as `hook`. */\n\tasync emit(event: TEvent, currentOperationId: string | undefined, signal?: AbortSignal): Promise<void> {\n\t\tfor (const listener of this.listeners) {\n\t\t\tconst previousOperationId = this.operationId;\n\t\t\tconst previousEventType = this.eventType;\n\t\t\tthis.operationId = currentOperationId;\n\t\t\tthis.eventType = event.type;\n\t\t\tlet pending: Promise<unknown> | unknown;\n\t\t\tthis.syncFrameDepth += 1;\n\t\t\ttry {\n\t\t\t\tpending = listener(event, signal);\n\t\t\t} catch (error) {\n\t\t\t\tthis.operationId = previousOperationId;\n\t\t\t\tthis.eventType = previousEventType;\n\t\t\t\tthrow normalizeHarnessError(error, \"hook\");\n\t\t\t} finally {\n\t\t\t\tthis.syncFrameDepth -= 1;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait pending;\n\t\t\t} catch (error) {\n\t\t\t\tthrow normalizeHarnessError(error, \"hook\");\n\t\t\t} finally {\n\t\t\t\tthis.operationId = previousOperationId;\n\t\t\t\tthis.eventType = previousEventType;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Fail closed when an awaited listener tries to wait on its own operation.\n\t * Rejecting immediately turns a permanent deadlock into a classified error.\n\t *\n\t * Scope: this catches a wait issued from the listener's synchronous prologue,\n\t * which covers `await harness.waitForIdle()` / `await harness.abort()`. A wait\n\t * deferred behind an unrelated `await` inside the listener is not detected.\n\t */\n\tassertNotSelfWait(api: string, currentOperationId: string | undefined): void {\n\t\tif (this.syncFrameDepth > 0 && currentOperationId !== undefined && currentOperationId === this.operationId) {\n\t\t\tthrow new AgentHarnessError(\n\t\t\t\t\"invalid_state\",\n\t\t\t\t`${api} cannot await the current operation from an awaited ${this.eventType ?? \"unknown\"} callback`,\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"subscriber-fanout.d.ts","sourceRoot":"","sources":["../../src/harness/subscriber-fanout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,MAAM,MAAM,kBAAkB,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AAEvG,qBAAa,gBAAgB,CAAC,MAAM,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,+EAA+E;IAC/E,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,SAAS,CAAqB;IAEtC,SAAS,CAAC,QAAQ,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,CAG1D;IAED;;;;;;;;;;OAUG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BrG;IAED;;;;;;;OAOG;IACH,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQ3E;CACD","sourcesContent":["/**\n * Subscriber fan-out with a self-wait barrier, extracted from `AgentHarness`.\n *\n * A listener that awaits the end of the very operation whose emission it is\n * blocking forms a cycle. The call that closes that cycle (`waitForIdle()`,\n * `abort()`) is always made during the listener's *synchronous* prologue — an\n * async function body runs synchronously up to its first `await` — so marking\n * just that window identifies callback-originated waits exactly, without\n * falsely rejecting an unrelated concurrent caller that runs later while the\n * listener's promise is merely pending.\n *\n * Delivery is observational: every subscriber runs even when an earlier one\n * fails, and the failures are raised together afterwards.\n *\n * This module imports no harness or session types so it stays a leaf for the\n * import-cycle ratchet; the harness passes the current operation id in.\n */\n\nimport { AgentHarnessError } from \"./errors.ts\";\nimport { normalizeHarnessError } from \"./operation-outcome.ts\";\n\nexport type SubscriberListener<TEvent> = (event: TEvent, signal?: AbortSignal) => Promise<void> | void;\n\nexport class SubscriberFanout<TEvent extends { readonly type: string }> {\n\tprivate readonly listeners = new Set<SubscriberListener<TEvent>>();\n\t/** Non-zero only while a subscriber's synchronous prologue is on the stack. */\n\tprivate syncFrameDepth = 0;\n\tprivate operationId: string | undefined;\n\tprivate eventType: string | undefined;\n\n\tsubscribe(listener: SubscriberListener<TEvent>): () => void {\n\t\tthis.listeners.add(listener);\n\t\treturn () => this.listeners.delete(listener);\n\t}\n\n\t/**\n\t * Deliver `event` to every subscriber in registration order, then fail the\n\t * emission once the fanout has completed.\n\t *\n\t * Observational subscribers must not starve each other: one throwing telemetry\n\t * or audit listener cannot hide `settled` / `attempt_finished` from the\n\t * listeners registered after it. Failures are collected and raised after the\n\t * last listener ran — a single failure keeps its own classification, several\n\t * become one `AggregateError` classified by the first. Policy and mutation\n\t * hooks live on `AgentHarness.on()` and stay fail-fast.\n\t */\n\tasync emit(event: TEvent, currentOperationId: string | undefined, signal?: AbortSignal): Promise<void> {\n\t\tconst failures: unknown[] = [];\n\t\tfor (const listener of this.listeners) {\n\t\t\tconst previousOperationId = this.operationId;\n\t\t\tconst previousEventType = this.eventType;\n\t\t\tthis.operationId = currentOperationId;\n\t\t\tthis.eventType = event.type;\n\t\t\tlet pending: Promise<unknown> | unknown;\n\t\t\tthis.syncFrameDepth += 1;\n\t\t\ttry {\n\t\t\t\tpending = listener(event, signal);\n\t\t\t} catch (error) {\n\t\t\t\tfailures.push(error);\n\t\t\t} finally {\n\t\t\t\tthis.syncFrameDepth -= 1;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait pending;\n\t\t\t} catch (error) {\n\t\t\t\tfailures.push(error);\n\t\t\t} finally {\n\t\t\t\tthis.operationId = previousOperationId;\n\t\t\t\tthis.eventType = previousEventType;\n\t\t\t}\n\t\t}\n\t\tif (failures.length === 1) throw normalizeHarnessError(failures[0], \"hook\");\n\t\tif (failures.length > 1) {\n\t\t\tconst cause = new AggregateError(failures, `${failures.length} subscribers failed for ${event.type}`);\n\t\t\tthrow new AgentHarnessError(normalizeHarnessError(failures[0], \"hook\").code, cause.message, cause);\n\t\t}\n\t}\n\n\t/**\n\t * Fail closed when an awaited listener tries to wait on its own operation.\n\t * Rejecting immediately turns a permanent deadlock into a classified error.\n\t *\n\t * Scope: this catches a wait issued from the listener's synchronous prologue,\n\t * which covers `await harness.waitForIdle()` / `await harness.abort()`. A wait\n\t * deferred behind an unrelated `await` inside the listener is not detected.\n\t */\n\tassertNotSelfWait(api: string, currentOperationId: string | undefined): void {\n\t\tif (this.syncFrameDepth > 0 && currentOperationId !== undefined && currentOperationId === this.operationId) {\n\t\t\tthrow new AgentHarnessError(\n\t\t\t\t\"invalid_state\",\n\t\t\t\t`${api} cannot await the current operation from an awaited ${this.eventType ?? \"unknown\"} callback; ` +\n\t\t\t\t\t\"use runWhenIdle() to schedule work for after it settles\",\n\t\t\t);\n\t\t}\n\t}\n}\n"]}