@agntk/agent-harness 0.1.1

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 (212) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +41 -0
  3. package/README.md +445 -0
  4. package/defaults/agents/summarizer.md +49 -0
  5. package/defaults/instincts/lead-with-answer.md +24 -0
  6. package/defaults/instincts/qualify-before-recommending.md +40 -0
  7. package/defaults/instincts/read-before-edit.md +23 -0
  8. package/defaults/instincts/search-before-create.md +23 -0
  9. package/defaults/playbooks/ship-feature.md +31 -0
  10. package/defaults/rules/ask-before-assuming.md +35 -0
  11. package/defaults/rules/operations.md +35 -0
  12. package/defaults/rules/respect-the-user.md +39 -0
  13. package/defaults/skills/business-analyst.md +181 -0
  14. package/defaults/skills/content-marketer.md +184 -0
  15. package/defaults/skills/research.md +34 -0
  16. package/defaults/tools/example-web-search.md +60 -0
  17. package/defaults/workflows/daily-reflection.md +54 -0
  18. package/dist/agent-framework-K4GUIICH.js +344 -0
  19. package/dist/agent-framework-K4GUIICH.js.map +1 -0
  20. package/dist/analytics-RPT73WNM.js +12 -0
  21. package/dist/analytics-RPT73WNM.js.map +1 -0
  22. package/dist/auto-processor-OLE45UI3.js +13 -0
  23. package/dist/auto-processor-OLE45UI3.js.map +1 -0
  24. package/dist/chunk-274RV3YO.js +162 -0
  25. package/dist/chunk-274RV3YO.js.map +1 -0
  26. package/dist/chunk-4CWAGBNS.js +168 -0
  27. package/dist/chunk-4CWAGBNS.js.map +1 -0
  28. package/dist/chunk-4FDUOGSZ.js +69 -0
  29. package/dist/chunk-4FDUOGSZ.js.map +1 -0
  30. package/dist/chunk-5H34JPMB.js +199 -0
  31. package/dist/chunk-5H34JPMB.js.map +1 -0
  32. package/dist/chunk-6EMOEYGU.js +102 -0
  33. package/dist/chunk-6EMOEYGU.js.map +1 -0
  34. package/dist/chunk-A7BJPQQ6.js +236 -0
  35. package/dist/chunk-A7BJPQQ6.js.map +1 -0
  36. package/dist/chunk-AGAAFJEO.js +76 -0
  37. package/dist/chunk-AGAAFJEO.js.map +1 -0
  38. package/dist/chunk-BSKDOFRT.js +65 -0
  39. package/dist/chunk-BSKDOFRT.js.map +1 -0
  40. package/dist/chunk-CHJ5GNZC.js +100 -0
  41. package/dist/chunk-CHJ5GNZC.js.map +1 -0
  42. package/dist/chunk-CSL3ERUI.js +307 -0
  43. package/dist/chunk-CSL3ERUI.js.map +1 -0
  44. package/dist/chunk-DA7IKHC4.js +229 -0
  45. package/dist/chunk-DA7IKHC4.js.map +1 -0
  46. package/dist/chunk-DGUM43GV.js +11 -0
  47. package/dist/chunk-DGUM43GV.js.map +1 -0
  48. package/dist/chunk-DTTXPHFW.js +211 -0
  49. package/dist/chunk-DTTXPHFW.js.map +1 -0
  50. package/dist/chunk-FD55B3IO.js +204 -0
  51. package/dist/chunk-FD55B3IO.js.map +1 -0
  52. package/dist/chunk-FLZU44SV.js +230 -0
  53. package/dist/chunk-FLZU44SV.js.map +1 -0
  54. package/dist/chunk-GJNNR2RA.js +200 -0
  55. package/dist/chunk-GJNNR2RA.js.map +1 -0
  56. package/dist/chunk-GNUSHD2Y.js +111 -0
  57. package/dist/chunk-GNUSHD2Y.js.map +1 -0
  58. package/dist/chunk-GUJTBGVS.js +2212 -0
  59. package/dist/chunk-GUJTBGVS.js.map +1 -0
  60. package/dist/chunk-IZ6UZ3ZL.js +207 -0
  61. package/dist/chunk-IZ6UZ3ZL.js.map +1 -0
  62. package/dist/chunk-JKMGYWXB.js +197 -0
  63. package/dist/chunk-JKMGYWXB.js.map +1 -0
  64. package/dist/chunk-KFX54TQM.js +165 -0
  65. package/dist/chunk-KFX54TQM.js.map +1 -0
  66. package/dist/chunk-M7NXUK55.js +199 -0
  67. package/dist/chunk-M7NXUK55.js.map +1 -0
  68. package/dist/chunk-MPZ3BPUI.js +374 -0
  69. package/dist/chunk-MPZ3BPUI.js.map +1 -0
  70. package/dist/chunk-OC6YSTDX.js +119 -0
  71. package/dist/chunk-OC6YSTDX.js.map +1 -0
  72. package/dist/chunk-RC6MEZB6.js +469 -0
  73. package/dist/chunk-RC6MEZB6.js.map +1 -0
  74. package/dist/chunk-RY3ZFII7.js +3440 -0
  75. package/dist/chunk-RY3ZFII7.js.map +1 -0
  76. package/dist/chunk-TAT6JU3X.js +167 -0
  77. package/dist/chunk-TAT6JU3X.js.map +1 -0
  78. package/dist/chunk-UDZIS2AQ.js +79 -0
  79. package/dist/chunk-UDZIS2AQ.js.map +1 -0
  80. package/dist/chunk-UPLBF4RZ.js +115 -0
  81. package/dist/chunk-UPLBF4RZ.js.map +1 -0
  82. package/dist/chunk-UWQTZMNI.js +154 -0
  83. package/dist/chunk-UWQTZMNI.js.map +1 -0
  84. package/dist/chunk-W4T7PGI2.js +346 -0
  85. package/dist/chunk-W4T7PGI2.js.map +1 -0
  86. package/dist/chunk-XTBKL5BI.js +111 -0
  87. package/dist/chunk-XTBKL5BI.js.map +1 -0
  88. package/dist/chunk-YIJY5DBV.js +399 -0
  89. package/dist/chunk-YIJY5DBV.js.map +1 -0
  90. package/dist/chunk-YUFNYN2H.js +242 -0
  91. package/dist/chunk-YUFNYN2H.js.map +1 -0
  92. package/dist/chunk-Z2PUCXTZ.js +94 -0
  93. package/dist/chunk-Z2PUCXTZ.js.map +1 -0
  94. package/dist/chunk-ZZJOFKAT.js +13 -0
  95. package/dist/chunk-ZZJOFKAT.js.map +1 -0
  96. package/dist/cli/index.js +3661 -0
  97. package/dist/cli/index.js.map +1 -0
  98. package/dist/config-WVMRUOCA.js +13 -0
  99. package/dist/config-WVMRUOCA.js.map +1 -0
  100. package/dist/context-loader-3ORBPMHJ.js +13 -0
  101. package/dist/context-loader-3ORBPMHJ.js.map +1 -0
  102. package/dist/conversation-QDEIDQPH.js +22 -0
  103. package/dist/conversation-QDEIDQPH.js.map +1 -0
  104. package/dist/cost-tracker-RS3W7SVY.js +24 -0
  105. package/dist/cost-tracker-RS3W7SVY.js.map +1 -0
  106. package/dist/delegate-VJCJLYEK.js +29 -0
  107. package/dist/delegate-VJCJLYEK.js.map +1 -0
  108. package/dist/emotional-state-VQVRA6ED.js +206 -0
  109. package/dist/emotional-state-VQVRA6ED.js.map +1 -0
  110. package/dist/env-discovery-2BLVMAIM.js +251 -0
  111. package/dist/env-discovery-2BLVMAIM.js.map +1 -0
  112. package/dist/export-6GCYHEHQ.js +165 -0
  113. package/dist/export-6GCYHEHQ.js.map +1 -0
  114. package/dist/graph-YUIPOSOO.js +14 -0
  115. package/dist/graph-YUIPOSOO.js.map +1 -0
  116. package/dist/harness-LCHA3DWP.js +10 -0
  117. package/dist/harness-LCHA3DWP.js.map +1 -0
  118. package/dist/harness-WE4SLCML.js +26 -0
  119. package/dist/harness-WE4SLCML.js.map +1 -0
  120. package/dist/health-NZ6WNIMV.js +23 -0
  121. package/dist/health-NZ6WNIMV.js.map +1 -0
  122. package/dist/index.d.ts +3612 -0
  123. package/dist/index.js +13501 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/indexer-LONANRRM.js +16 -0
  126. package/dist/indexer-LONANRRM.js.map +1 -0
  127. package/dist/instinct-learner-SRM72DHF.js +20 -0
  128. package/dist/instinct-learner-SRM72DHF.js.map +1 -0
  129. package/dist/intake-4M3HNU43.js +21 -0
  130. package/dist/intake-4M3HNU43.js.map +1 -0
  131. package/dist/intelligence-HJOCA4SJ.js +1081 -0
  132. package/dist/intelligence-HJOCA4SJ.js.map +1 -0
  133. package/dist/journal-WANJL3MI.js +24 -0
  134. package/dist/journal-WANJL3MI.js.map +1 -0
  135. package/dist/loader-C3TKIKZR.js +23 -0
  136. package/dist/loader-C3TKIKZR.js.map +1 -0
  137. package/dist/mcp-WTQJJZAO.js +15 -0
  138. package/dist/mcp-WTQJJZAO.js.map +1 -0
  139. package/dist/mcp-discovery-WPAQFL6S.js +377 -0
  140. package/dist/mcp-discovery-WPAQFL6S.js.map +1 -0
  141. package/dist/mcp-installer-6O2XXD3V.js +394 -0
  142. package/dist/mcp-installer-6O2XXD3V.js.map +1 -0
  143. package/dist/metrics-KXGNFAAB.js +20 -0
  144. package/dist/metrics-KXGNFAAB.js.map +1 -0
  145. package/dist/primitive-registry-I6VTIR4W.js +512 -0
  146. package/dist/primitive-registry-I6VTIR4W.js.map +1 -0
  147. package/dist/project-discovery-C4UMD7JI.js +246 -0
  148. package/dist/project-discovery-C4UMD7JI.js.map +1 -0
  149. package/dist/provider-LQHQX7Z7.js +26 -0
  150. package/dist/provider-LQHQX7Z7.js.map +1 -0
  151. package/dist/provider-SXPQZ74H.js +28 -0
  152. package/dist/provider-SXPQZ74H.js.map +1 -0
  153. package/dist/rate-limiter-RLRVM325.js +22 -0
  154. package/dist/rate-limiter-RLRVM325.js.map +1 -0
  155. package/dist/rule-engine-YGQ3RYZM.js +182 -0
  156. package/dist/rule-engine-YGQ3RYZM.js.map +1 -0
  157. package/dist/scaffold-A3VRRCBV.js +347 -0
  158. package/dist/scaffold-A3VRRCBV.js.map +1 -0
  159. package/dist/scheduler-XHHIVHRI.js +397 -0
  160. package/dist/scheduler-XHHIVHRI.js.map +1 -0
  161. package/dist/search-V3W5JMJG.js +75 -0
  162. package/dist/search-V3W5JMJG.js.map +1 -0
  163. package/dist/semantic-search-2DTOO5UX.js +241 -0
  164. package/dist/semantic-search-2DTOO5UX.js.map +1 -0
  165. package/dist/serve-DTQ3HENY.js +291 -0
  166. package/dist/serve-DTQ3HENY.js.map +1 -0
  167. package/dist/sessions-CZGVXKQE.js +21 -0
  168. package/dist/sessions-CZGVXKQE.js.map +1 -0
  169. package/dist/sources-RW5DT56F.js +32 -0
  170. package/dist/sources-RW5DT56F.js.map +1 -0
  171. package/dist/starter-packs-76YUVHEU.js +893 -0
  172. package/dist/starter-packs-76YUVHEU.js.map +1 -0
  173. package/dist/state-GMXILIHW.js +13 -0
  174. package/dist/state-GMXILIHW.js.map +1 -0
  175. package/dist/state-merge-NKO5FRBA.js +174 -0
  176. package/dist/state-merge-NKO5FRBA.js.map +1 -0
  177. package/dist/telemetry-UC6PBXC7.js +22 -0
  178. package/dist/telemetry-UC6PBXC7.js.map +1 -0
  179. package/dist/tool-executor-MJ7IG7PQ.js +28 -0
  180. package/dist/tool-executor-MJ7IG7PQ.js.map +1 -0
  181. package/dist/tools-DZ4KETET.js +20 -0
  182. package/dist/tools-DZ4KETET.js.map +1 -0
  183. package/dist/types-EW7AIB3R.js +18 -0
  184. package/dist/types-EW7AIB3R.js.map +1 -0
  185. package/dist/types-WGDLSPO6.js +16 -0
  186. package/dist/types-WGDLSPO6.js.map +1 -0
  187. package/dist/universal-installer-QGS4SJGX.js +578 -0
  188. package/dist/universal-installer-QGS4SJGX.js.map +1 -0
  189. package/dist/validator-7WXMDIHH.js +22 -0
  190. package/dist/validator-7WXMDIHH.js.map +1 -0
  191. package/dist/verification-gate-FYXUX6LH.js +246 -0
  192. package/dist/verification-gate-FYXUX6LH.js.map +1 -0
  193. package/dist/versioning-Z3XNE2Q2.js +271 -0
  194. package/dist/versioning-Z3XNE2Q2.js.map +1 -0
  195. package/dist/watcher-ISJC7YKL.js +109 -0
  196. package/dist/watcher-ISJC7YKL.js.map +1 -0
  197. package/dist/web-server-DD7ZOP46.js +28 -0
  198. package/dist/web-server-DD7ZOP46.js.map +1 -0
  199. package/package.json +76 -0
  200. package/sources.yaml +121 -0
  201. package/templates/assistant/CORE.md +24 -0
  202. package/templates/assistant/SYSTEM.md +24 -0
  203. package/templates/assistant/config.yaml +51 -0
  204. package/templates/base/CORE.md +17 -0
  205. package/templates/base/SYSTEM.md +24 -0
  206. package/templates/base/config.yaml +51 -0
  207. package/templates/claude-opus/config.yaml +51 -0
  208. package/templates/code-reviewer/CORE.md +25 -0
  209. package/templates/code-reviewer/SYSTEM.md +30 -0
  210. package/templates/code-reviewer/config.yaml +51 -0
  211. package/templates/gpt4/config.yaml +51 -0
  212. package/templates/local/config.yaml +51 -0
@@ -0,0 +1,246 @@
1
+ #!/usr/bin/env node
2
+
3
+ import "./chunk-ZZJOFKAT.js";
4
+
5
+ // src/runtime/project-discovery.ts
6
+ import { existsSync, readFileSync, readdirSync } from "fs";
7
+ import { join } from "path";
8
+ function detectPackageJson(content) {
9
+ const signals = [];
10
+ let pkg;
11
+ try {
12
+ pkg = JSON.parse(content);
13
+ } catch {
14
+ return signals;
15
+ }
16
+ const allDeps = {
17
+ ...pkg.dependencies,
18
+ ...pkg.devDependencies
19
+ };
20
+ if (allDeps["typescript"] || existsSync("tsconfig.json")) {
21
+ signals.push({ name: "TypeScript", category: "language", source: "package.json" });
22
+ }
23
+ const frameworks = {
24
+ "react": { name: "React", category: "framework" },
25
+ "next": { name: "Next.js", category: "framework" },
26
+ "vue": { name: "Vue", category: "framework" },
27
+ "nuxt": { name: "Nuxt", category: "framework" },
28
+ "svelte": { name: "Svelte", category: "framework" },
29
+ "@angular/core": { name: "Angular", category: "framework" },
30
+ "express": { name: "Express", category: "framework" },
31
+ "fastify": { name: "Fastify", category: "framework" },
32
+ "hono": { name: "Hono", category: "framework" },
33
+ "astro": { name: "Astro", category: "framework" },
34
+ "remix": { name: "Remix", category: "framework" },
35
+ "@remix-run/node": { name: "Remix", category: "framework" },
36
+ "electron": { name: "Electron", category: "framework" }
37
+ };
38
+ for (const [dep, info] of Object.entries(frameworks)) {
39
+ if (allDeps[dep]) {
40
+ signals.push({ name: info.name, category: info.category, source: "package.json", details: `v${allDeps[dep]}` });
41
+ }
42
+ }
43
+ const testLibs = {
44
+ "vitest": "Vitest",
45
+ "jest": "Jest",
46
+ "mocha": "Mocha",
47
+ "@playwright/test": "Playwright",
48
+ "cypress": "Cypress"
49
+ };
50
+ for (const [dep, name] of Object.entries(testLibs)) {
51
+ if (allDeps[dep]) {
52
+ signals.push({ name, category: "testing", source: "package.json" });
53
+ }
54
+ }
55
+ const dbLibs = {
56
+ "prisma": "Prisma",
57
+ "@prisma/client": "Prisma",
58
+ "drizzle-orm": "Drizzle",
59
+ "mongoose": "MongoDB (Mongoose)",
60
+ "pg": "PostgreSQL",
61
+ "mysql2": "MySQL",
62
+ "better-sqlite3": "SQLite",
63
+ "redis": "Redis",
64
+ "ioredis": "Redis"
65
+ };
66
+ for (const [dep, name] of Object.entries(dbLibs)) {
67
+ if (allDeps[dep]) {
68
+ signals.push({ name, category: "database", source: "package.json" });
69
+ }
70
+ }
71
+ const tools = {
72
+ "eslint": "ESLint",
73
+ "prettier": "Prettier",
74
+ "tailwindcss": "Tailwind CSS",
75
+ "storybook": "Storybook",
76
+ "@storybook/react": "Storybook",
77
+ "docker-compose": "Docker Compose"
78
+ };
79
+ for (const [dep, name] of Object.entries(tools)) {
80
+ if (allDeps[dep]) {
81
+ signals.push({ name, category: "tool", source: "package.json" });
82
+ }
83
+ }
84
+ return signals;
85
+ }
86
+ function detectFromFiles(dir) {
87
+ const signals = [];
88
+ const entries = /* @__PURE__ */ new Set();
89
+ try {
90
+ for (const e of readdirSync(dir)) {
91
+ entries.add(e);
92
+ }
93
+ } catch {
94
+ return signals;
95
+ }
96
+ if (entries.has("Dockerfile") || entries.has("docker-compose.yml") || entries.has("docker-compose.yaml")) {
97
+ signals.push({ name: "Docker", category: "runtime", source: "Dockerfile" });
98
+ }
99
+ if (entries.has(".github")) {
100
+ signals.push({ name: "GitHub Actions", category: "tool", source: ".github/" });
101
+ }
102
+ if (entries.has("Makefile")) {
103
+ signals.push({ name: "Make", category: "tool", source: "Makefile" });
104
+ }
105
+ if (entries.has("pyproject.toml") || entries.has("setup.py") || entries.has("requirements.txt")) {
106
+ signals.push({ name: "Python", category: "language", source: "pyproject.toml" });
107
+ }
108
+ if (entries.has("Cargo.toml")) {
109
+ signals.push({ name: "Rust", category: "language", source: "Cargo.toml" });
110
+ }
111
+ if (entries.has("go.mod")) {
112
+ signals.push({ name: "Go", category: "language", source: "go.mod" });
113
+ }
114
+ if (entries.has("Gemfile")) {
115
+ signals.push({ name: "Ruby", category: "language", source: "Gemfile" });
116
+ }
117
+ if (entries.has(".terraform") || entries.has("main.tf")) {
118
+ signals.push({ name: "Terraform", category: "cloud", source: "main.tf" });
119
+ }
120
+ if (entries.has("serverless.yml") || entries.has("serverless.yaml")) {
121
+ signals.push({ name: "Serverless Framework", category: "cloud", source: "serverless.yml" });
122
+ }
123
+ if (entries.has("vercel.json")) {
124
+ signals.push({ name: "Vercel", category: "cloud", source: "vercel.json" });
125
+ }
126
+ if (entries.has("netlify.toml")) {
127
+ signals.push({ name: "Netlify", category: "cloud", source: "netlify.toml" });
128
+ }
129
+ if (entries.has("wrangler.toml") || entries.has("wrangler.jsonc")) {
130
+ signals.push({ name: "Cloudflare Workers", category: "cloud", source: "wrangler.toml" });
131
+ }
132
+ if (entries.has(".prisma") || entries.has("prisma")) {
133
+ signals.push({ name: "Prisma", category: "database", source: "prisma/" });
134
+ }
135
+ if (entries.has("supabase")) {
136
+ signals.push({ name: "Supabase", category: "database", source: "supabase/" });
137
+ }
138
+ return signals;
139
+ }
140
+ var SUGGESTION_RULES = [
141
+ {
142
+ signals: ["TypeScript"],
143
+ type: "rule",
144
+ message: "Add a TypeScript coding standards rule",
145
+ target: "rules/typescript-standards.md"
146
+ },
147
+ {
148
+ signals: ["React"],
149
+ type: "rule",
150
+ message: "Add React component patterns rule",
151
+ target: "rules/react-patterns.md"
152
+ },
153
+ {
154
+ signals: ["Next.js"],
155
+ type: "skill",
156
+ message: "Add Next.js development skill",
157
+ target: "skills/nextjs.md"
158
+ },
159
+ {
160
+ signals: ["Docker"],
161
+ type: "rule",
162
+ message: "Add Docker/containerization rule",
163
+ target: "rules/docker.md"
164
+ },
165
+ {
166
+ signals: ["GitHub Actions"],
167
+ type: "skill",
168
+ message: "Add CI/CD pipeline skill",
169
+ target: "skills/ci-cd.md"
170
+ },
171
+ {
172
+ signals: ["PostgreSQL", "Prisma"],
173
+ type: "mcp-server",
174
+ message: "Install PostgreSQL MCP server for database access",
175
+ target: "postgres"
176
+ },
177
+ {
178
+ signals: ["Supabase"],
179
+ type: "mcp-server",
180
+ message: "Install Supabase MCP server",
181
+ target: "supabase"
182
+ },
183
+ {
184
+ signals: ["ESLint"],
185
+ type: "rule",
186
+ message: "Add linting standards rule",
187
+ target: "rules/linting.md"
188
+ },
189
+ {
190
+ signals: ["Vitest", "Jest"],
191
+ type: "rule",
192
+ message: "Add testing standards rule",
193
+ target: "rules/testing.md"
194
+ },
195
+ {
196
+ signals: ["Tailwind CSS"],
197
+ type: "rule",
198
+ message: "Add styling conventions rule",
199
+ target: "rules/styling.md"
200
+ }
201
+ ];
202
+ function generateSuggestions(signals) {
203
+ const signalNames = new Set(signals.map((s) => s.name));
204
+ const suggestions = [];
205
+ for (const rule of SUGGESTION_RULES) {
206
+ const matchedSignals = rule.signals.filter((s) => signalNames.has(s));
207
+ if (matchedSignals.length > 0) {
208
+ suggestions.push({
209
+ type: rule.type,
210
+ message: rule.message,
211
+ target: rule.target,
212
+ signals: matchedSignals
213
+ });
214
+ }
215
+ }
216
+ return suggestions;
217
+ }
218
+ function discoverProjectContext(options) {
219
+ const dir = options?.dir ?? process.cwd();
220
+ const signals = [];
221
+ const filesExamined = [];
222
+ const packageJsonPath = join(dir, "package.json");
223
+ if (existsSync(packageJsonPath)) {
224
+ filesExamined.push(packageJsonPath);
225
+ const content = readFileSync(packageJsonPath, "utf-8");
226
+ signals.push(...detectPackageJson(content));
227
+ }
228
+ filesExamined.push(dir);
229
+ signals.push(...detectFromFiles(dir));
230
+ const seen = /* @__PURE__ */ new Set();
231
+ const uniqueSignals = signals.filter((s) => {
232
+ if (seen.has(s.name)) return false;
233
+ seen.add(s.name);
234
+ return true;
235
+ });
236
+ const suggestions = generateSuggestions(uniqueSignals);
237
+ return {
238
+ signals: uniqueSignals,
239
+ filesExamined,
240
+ suggestions
241
+ };
242
+ }
243
+ export {
244
+ discoverProjectContext
245
+ };
246
+ //# sourceMappingURL=project-discovery-C4UMD7JI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/project-discovery.ts"],"sourcesContent":["import { existsSync, readFileSync, readdirSync } from 'fs';\nimport { join, basename } from 'path';\n\n// --- Types ---\n\n/** A detected project characteristic */\nexport interface ProjectSignal {\n /** What was detected (e.g. \"TypeScript\", \"React\", \"Docker\") */\n name: string;\n /** Category of signal */\n category: 'language' | 'framework' | 'tool' | 'runtime' | 'database' | 'cloud' | 'testing';\n /** Source file that triggered the detection */\n source: string;\n /** Additional details */\n details?: string;\n}\n\n/** Suggested rule, skill, or MCP server */\nexport interface ProjectSuggestion {\n /** What type of thing to add */\n type: 'rule' | 'skill' | 'mcp-server';\n /** Human-readable suggestion */\n message: string;\n /** File to create (for rules/skills) or server query (for MCP) */\n target: string;\n /** Triggered by these signals */\n signals: string[];\n}\n\n/** Full project discovery result */\nexport interface ProjectDiscoveryResult {\n /** Detected project signals */\n signals: ProjectSignal[];\n /** Files that were examined */\n filesExamined: string[];\n /** Suggestions based on signals */\n suggestions: ProjectSuggestion[];\n}\n\n// --- Detection Functions ---\n\ninterface DetectionRule {\n file: string;\n detect: (content: string, dir: string) => ProjectSignal[];\n}\n\nfunction detectPackageJson(content: string): ProjectSignal[] {\n const signals: ProjectSignal[] = [];\n\n let pkg: Record<string, unknown>;\n try {\n pkg = JSON.parse(content);\n } catch {\n return signals;\n }\n\n const allDeps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n // Language\n if (allDeps['typescript'] || existsSync('tsconfig.json')) {\n signals.push({ name: 'TypeScript', category: 'language', source: 'package.json' });\n }\n\n // Frameworks\n const frameworks: Record<string, { name: string; category: ProjectSignal['category'] }> = {\n 'react': { name: 'React', category: 'framework' },\n 'next': { name: 'Next.js', category: 'framework' },\n 'vue': { name: 'Vue', category: 'framework' },\n 'nuxt': { name: 'Nuxt', category: 'framework' },\n 'svelte': { name: 'Svelte', category: 'framework' },\n '@angular/core': { name: 'Angular', category: 'framework' },\n 'express': { name: 'Express', category: 'framework' },\n 'fastify': { name: 'Fastify', category: 'framework' },\n 'hono': { name: 'Hono', category: 'framework' },\n 'astro': { name: 'Astro', category: 'framework' },\n 'remix': { name: 'Remix', category: 'framework' },\n '@remix-run/node': { name: 'Remix', category: 'framework' },\n 'electron': { name: 'Electron', category: 'framework' },\n };\n\n for (const [dep, info] of Object.entries(frameworks)) {\n if (allDeps[dep]) {\n signals.push({ name: info.name, category: info.category, source: 'package.json', details: `v${allDeps[dep]}` });\n }\n }\n\n // Testing\n const testLibs: Record<string, string> = {\n 'vitest': 'Vitest',\n 'jest': 'Jest',\n 'mocha': 'Mocha',\n '@playwright/test': 'Playwright',\n 'cypress': 'Cypress',\n };\n\n for (const [dep, name] of Object.entries(testLibs)) {\n if (allDeps[dep]) {\n signals.push({ name, category: 'testing', source: 'package.json' });\n }\n }\n\n // Databases\n const dbLibs: Record<string, string> = {\n 'prisma': 'Prisma',\n '@prisma/client': 'Prisma',\n 'drizzle-orm': 'Drizzle',\n 'mongoose': 'MongoDB (Mongoose)',\n 'pg': 'PostgreSQL',\n 'mysql2': 'MySQL',\n 'better-sqlite3': 'SQLite',\n 'redis': 'Redis',\n 'ioredis': 'Redis',\n };\n\n for (const [dep, name] of Object.entries(dbLibs)) {\n if (allDeps[dep]) {\n signals.push({ name, category: 'database', source: 'package.json' });\n }\n }\n\n // Tools\n const tools: Record<string, string> = {\n 'eslint': 'ESLint',\n 'prettier': 'Prettier',\n 'tailwindcss': 'Tailwind CSS',\n 'storybook': 'Storybook',\n '@storybook/react': 'Storybook',\n 'docker-compose': 'Docker Compose',\n };\n\n for (const [dep, name] of Object.entries(tools)) {\n if (allDeps[dep]) {\n signals.push({ name, category: 'tool', source: 'package.json' });\n }\n }\n\n return signals;\n}\n\nfunction detectFromFiles(dir: string): ProjectSignal[] {\n const signals: ProjectSignal[] = [];\n const entries = new Set<string>();\n\n try {\n for (const e of readdirSync(dir)) {\n entries.add(e);\n }\n } catch {\n return signals;\n }\n\n // Config files\n if (entries.has('Dockerfile') || entries.has('docker-compose.yml') || entries.has('docker-compose.yaml')) {\n signals.push({ name: 'Docker', category: 'runtime', source: 'Dockerfile' });\n }\n\n if (entries.has('.github')) {\n signals.push({ name: 'GitHub Actions', category: 'tool', source: '.github/' });\n }\n\n if (entries.has('Makefile')) {\n signals.push({ name: 'Make', category: 'tool', source: 'Makefile' });\n }\n\n if (entries.has('pyproject.toml') || entries.has('setup.py') || entries.has('requirements.txt')) {\n signals.push({ name: 'Python', category: 'language', source: 'pyproject.toml' });\n }\n\n if (entries.has('Cargo.toml')) {\n signals.push({ name: 'Rust', category: 'language', source: 'Cargo.toml' });\n }\n\n if (entries.has('go.mod')) {\n signals.push({ name: 'Go', category: 'language', source: 'go.mod' });\n }\n\n if (entries.has('Gemfile')) {\n signals.push({ name: 'Ruby', category: 'language', source: 'Gemfile' });\n }\n\n if (entries.has('.terraform') || entries.has('main.tf')) {\n signals.push({ name: 'Terraform', category: 'cloud', source: 'main.tf' });\n }\n\n if (entries.has('serverless.yml') || entries.has('serverless.yaml')) {\n signals.push({ name: 'Serverless Framework', category: 'cloud', source: 'serverless.yml' });\n }\n\n if (entries.has('vercel.json')) {\n signals.push({ name: 'Vercel', category: 'cloud', source: 'vercel.json' });\n }\n\n if (entries.has('netlify.toml')) {\n signals.push({ name: 'Netlify', category: 'cloud', source: 'netlify.toml' });\n }\n\n if (entries.has('wrangler.toml') || entries.has('wrangler.jsonc')) {\n signals.push({ name: 'Cloudflare Workers', category: 'cloud', source: 'wrangler.toml' });\n }\n\n if (entries.has('.prisma') || entries.has('prisma')) {\n signals.push({ name: 'Prisma', category: 'database', source: 'prisma/' });\n }\n\n if (entries.has('supabase')) {\n signals.push({ name: 'Supabase', category: 'database', source: 'supabase/' });\n }\n\n return signals;\n}\n\n// --- Suggestion Engine ---\n\ninterface SuggestionRule {\n signals: string[];\n type: ProjectSuggestion['type'];\n message: string;\n target: string;\n}\n\nconst SUGGESTION_RULES: SuggestionRule[] = [\n {\n signals: ['TypeScript'],\n type: 'rule',\n message: 'Add a TypeScript coding standards rule',\n target: 'rules/typescript-standards.md',\n },\n {\n signals: ['React'],\n type: 'rule',\n message: 'Add React component patterns rule',\n target: 'rules/react-patterns.md',\n },\n {\n signals: ['Next.js'],\n type: 'skill',\n message: 'Add Next.js development skill',\n target: 'skills/nextjs.md',\n },\n {\n signals: ['Docker'],\n type: 'rule',\n message: 'Add Docker/containerization rule',\n target: 'rules/docker.md',\n },\n {\n signals: ['GitHub Actions'],\n type: 'skill',\n message: 'Add CI/CD pipeline skill',\n target: 'skills/ci-cd.md',\n },\n {\n signals: ['PostgreSQL', 'Prisma'],\n type: 'mcp-server',\n message: 'Install PostgreSQL MCP server for database access',\n target: 'postgres',\n },\n {\n signals: ['Supabase'],\n type: 'mcp-server',\n message: 'Install Supabase MCP server',\n target: 'supabase',\n },\n {\n signals: ['ESLint'],\n type: 'rule',\n message: 'Add linting standards rule',\n target: 'rules/linting.md',\n },\n {\n signals: ['Vitest', 'Jest'],\n type: 'rule',\n message: 'Add testing standards rule',\n target: 'rules/testing.md',\n },\n {\n signals: ['Tailwind CSS'],\n type: 'rule',\n message: 'Add styling conventions rule',\n target: 'rules/styling.md',\n },\n];\n\nfunction generateSuggestions(signals: ProjectSignal[]): ProjectSuggestion[] {\n const signalNames = new Set(signals.map((s) => s.name));\n const suggestions: ProjectSuggestion[] = [];\n\n for (const rule of SUGGESTION_RULES) {\n // Check if ANY of the required signals are present\n const matchedSignals = rule.signals.filter((s) => signalNames.has(s));\n if (matchedSignals.length > 0) {\n suggestions.push({\n type: rule.type,\n message: rule.message,\n target: rule.target,\n signals: matchedSignals,\n });\n }\n }\n\n return suggestions;\n}\n\n// --- Main Discovery ---\n\n/** Options for project discovery */\nexport interface ProjectDiscoveryOptions {\n /** Project directory to scan */\n dir?: string;\n}\n\n/**\n * Scan a project directory to detect its technology stack and suggest\n * rules, skills, and MCP servers.\n */\nexport function discoverProjectContext(options?: ProjectDiscoveryOptions): ProjectDiscoveryResult {\n const dir = options?.dir ?? process.cwd();\n const signals: ProjectSignal[] = [];\n const filesExamined: string[] = [];\n\n // Scan package.json\n const packageJsonPath = join(dir, 'package.json');\n if (existsSync(packageJsonPath)) {\n filesExamined.push(packageJsonPath);\n const content = readFileSync(packageJsonPath, 'utf-8');\n signals.push(...detectPackageJson(content));\n }\n\n // Scan directory for files/folders\n filesExamined.push(dir);\n signals.push(...detectFromFiles(dir));\n\n // Deduplicate signals by name\n const seen = new Set<string>();\n const uniqueSignals = signals.filter((s) => {\n if (seen.has(s.name)) return false;\n seen.add(s.name);\n return true;\n });\n\n // Generate suggestions\n const suggestions = generateSuggestions(uniqueSignals);\n\n return {\n signals: uniqueSignals,\n filesExamined,\n suggestions,\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,26 @@
1
+ import {
2
+ generate,
3
+ generateWithMessages,
4
+ getFastModel,
5
+ getModel,
6
+ getProvider,
7
+ getSummaryModel,
8
+ resetProvider,
9
+ streamGenerate,
10
+ streamGenerateWithDetails,
11
+ streamWithMessages
12
+ } from "./chunk-FD55B3IO.js";
13
+ import "./chunk-DGUM43GV.js";
14
+ export {
15
+ generate,
16
+ generateWithMessages,
17
+ getFastModel,
18
+ getModel,
19
+ getProvider,
20
+ getSummaryModel,
21
+ resetProvider,
22
+ streamGenerate,
23
+ streamGenerateWithDetails,
24
+ streamWithMessages
25
+ };
26
+ //# sourceMappingURL=provider-LQHQX7Z7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ generate,
5
+ generateWithMessages,
6
+ getFastModel,
7
+ getModel,
8
+ getProvider,
9
+ getSummaryModel,
10
+ resetProvider,
11
+ streamGenerate,
12
+ streamGenerateWithDetails,
13
+ streamWithMessages
14
+ } from "./chunk-IZ6UZ3ZL.js";
15
+ import "./chunk-ZZJOFKAT.js";
16
+ export {
17
+ generate,
18
+ generateWithMessages,
19
+ getFastModel,
20
+ getModel,
21
+ getProvider,
22
+ getSummaryModel,
23
+ resetProvider,
24
+ streamGenerate,
25
+ streamGenerateWithDetails,
26
+ streamWithMessages
27
+ };
28
+ //# sourceMappingURL=provider-SXPQZ74H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ checkRateLimit,
5
+ clearRateLimits,
6
+ getUsage,
7
+ loadRateLimits,
8
+ recordEvent,
9
+ saveRateLimits,
10
+ tryAcquire
11
+ } from "./chunk-OC6YSTDX.js";
12
+ import "./chunk-ZZJOFKAT.js";
13
+ export {
14
+ checkRateLimit,
15
+ clearRateLimits,
16
+ getUsage,
17
+ loadRateLimits,
18
+ recordEvent,
19
+ saveRateLimits,
20
+ tryAcquire
21
+ };
22
+ //# sourceMappingURL=rate-limiter-RLRVM325.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ loadDirectory
5
+ } from "./chunk-UPLBF4RZ.js";
6
+ import "./chunk-4CWAGBNS.js";
7
+ import "./chunk-ZZJOFKAT.js";
8
+
9
+ // src/runtime/rule-engine.ts
10
+ import { existsSync } from "fs";
11
+ import { join } from "path";
12
+ function parseRulesFromDoc(doc) {
13
+ const rules = [];
14
+ const text = (doc.l0 + "\n" + doc.l1 + "\n" + doc.body).trim();
15
+ for (const line of text.split("\n")) {
16
+ const trimmed = line.trim().toLowerCase();
17
+ if (!trimmed || trimmed.startsWith("#") || trimmed.startsWith("<!--")) continue;
18
+ const cleaned = trimmed.replace(/^[-*]\s+/, "").replace(/^\d+\.\s+/, "");
19
+ const denyMatch = cleaned.match(
20
+ /^(never|don'?t|do not|must not|should not|shouldn'?t)\s+(.+)/
21
+ );
22
+ if (denyMatch) {
23
+ const subject = denyMatch[2].replace(/[.!]$/, "");
24
+ if (/without\s+(explicit\s+)?(human\s+)?approval/.test(subject)) {
25
+ rules.push({
26
+ ruleId: doc.frontmatter.id,
27
+ subject: subject.replace(/\s+without\s+(explicit\s+)?(human\s+)?approval.*$/, ""),
28
+ action: "require_approval",
29
+ directive: cleaned,
30
+ tags: doc.frontmatter.tags
31
+ });
32
+ } else {
33
+ rules.push({
34
+ ruleId: doc.frontmatter.id,
35
+ subject,
36
+ action: "deny",
37
+ directive: cleaned,
38
+ tags: doc.frontmatter.tags
39
+ });
40
+ }
41
+ continue;
42
+ }
43
+ const requireMatch = cleaned.match(
44
+ /^(always|must|require|ensure)\s+(.+)/
45
+ );
46
+ if (requireMatch) {
47
+ const subject = requireMatch[2].replace(/[.!]$/, "");
48
+ if (/\bapproval\b/.test(subject) || /\brequires?\s+(explicit\s+)?(human\s+)?approval\b/.test(subject)) {
49
+ rules.push({
50
+ ruleId: doc.frontmatter.id,
51
+ subject,
52
+ action: "require_approval",
53
+ directive: cleaned,
54
+ tags: doc.frontmatter.tags
55
+ });
56
+ } else {
57
+ rules.push({
58
+ ruleId: doc.frontmatter.id,
59
+ subject,
60
+ action: "allow",
61
+ directive: cleaned,
62
+ tags: doc.frontmatter.tags
63
+ });
64
+ }
65
+ continue;
66
+ }
67
+ const warnMatch = cleaned.match(
68
+ /^(avoid|prefer not to|try not to)\s+(.+)/
69
+ );
70
+ if (warnMatch) {
71
+ rules.push({
72
+ ruleId: doc.frontmatter.id,
73
+ subject: warnMatch[2].replace(/[.!]$/, ""),
74
+ action: "warn",
75
+ directive: cleaned,
76
+ tags: doc.frontmatter.tags
77
+ });
78
+ }
79
+ }
80
+ return rules;
81
+ }
82
+ function loadRules(harnessDir) {
83
+ const rulesDir = join(harnessDir, "rules");
84
+ if (!existsSync(rulesDir)) return [];
85
+ const docs = loadDirectory(rulesDir);
86
+ const rules = [];
87
+ for (const doc of docs) {
88
+ if (doc.frontmatter.status !== "active") continue;
89
+ rules.push(...parseRulesFromDoc(doc));
90
+ }
91
+ return rules;
92
+ }
93
+ function checkRules(rules, input) {
94
+ const violations = [];
95
+ const warnings = [];
96
+ let requiresApproval = false;
97
+ const searchText = [
98
+ input.action,
99
+ input.description ?? "",
100
+ input.toolName ?? "",
101
+ ...input.tags ?? []
102
+ ].join(" ").toLowerCase();
103
+ const searchWords = new Set(
104
+ searchText.split(/\s+/).filter((w) => w.length > 2)
105
+ );
106
+ for (const rule of rules) {
107
+ const relevance = computeRelevance(rule, searchWords, input);
108
+ if (relevance < 0.3) continue;
109
+ if (rule.action === "deny") {
110
+ violations.push({
111
+ ruleId: rule.ruleId,
112
+ directive: rule.directive,
113
+ severity: "deny",
114
+ reason: `Action matches denied rule: "${rule.directive}" (relevance: ${relevance.toFixed(2)})`
115
+ });
116
+ } else if (rule.action === "warn") {
117
+ warnings.push({
118
+ ruleId: rule.ruleId,
119
+ directive: rule.directive,
120
+ severity: "warn",
121
+ reason: `Action matches warning rule: "${rule.directive}" (relevance: ${relevance.toFixed(2)})`
122
+ });
123
+ } else if (rule.action === "require_approval") {
124
+ requiresApproval = true;
125
+ violations.push({
126
+ ruleId: rule.ruleId,
127
+ directive: rule.directive,
128
+ severity: "require_approval",
129
+ reason: `Action requires approval: "${rule.directive}" (relevance: ${relevance.toFixed(2)})`
130
+ });
131
+ }
132
+ }
133
+ const denyViolations = violations.filter((v) => v.severity === "deny");
134
+ const allowed = denyViolations.length === 0 && !requiresApproval;
135
+ let summary;
136
+ if (allowed && warnings.length === 0) {
137
+ summary = "All rule checks passed.";
138
+ } else if (allowed) {
139
+ summary = `Allowed with ${warnings.length} warning(s): ${warnings.map((w) => w.directive).join("; ")}`;
140
+ } else if (requiresApproval && denyViolations.length === 0) {
141
+ summary = `Requires human approval: ${violations.filter((v) => v.severity === "require_approval").map((v) => v.directive).join("; ")}`;
142
+ } else {
143
+ summary = `Blocked by ${denyViolations.length} rule violation(s): ${denyViolations.map((v) => v.directive).join("; ")}`;
144
+ }
145
+ return {
146
+ allowed,
147
+ violations,
148
+ warnings,
149
+ requiresApproval,
150
+ summary
151
+ };
152
+ }
153
+ function computeRelevance(rule, searchWords, input) {
154
+ const ruleWords = rule.subject.toLowerCase().split(/\s+/).filter((w) => w.length > 2);
155
+ if (ruleWords.length === 0) return 0;
156
+ let matchCount = 0;
157
+ for (const word of ruleWords) {
158
+ if (searchWords.has(word)) {
159
+ matchCount++;
160
+ }
161
+ }
162
+ let score = matchCount / ruleWords.length;
163
+ if (input.tags && input.tags.length > 0) {
164
+ const inputTags = new Set(input.tags.map((t) => t.toLowerCase()));
165
+ const tagOverlap = rule.tags.filter((t) => inputTags.has(t.toLowerCase())).length;
166
+ if (tagOverlap > 0) {
167
+ score += 0.2 * (tagOverlap / Math.max(rule.tags.length, 1));
168
+ }
169
+ }
170
+ return Math.min(score, 1);
171
+ }
172
+ function enforceRules(harnessDir, input) {
173
+ const rules = loadRules(harnessDir);
174
+ return checkRules(rules, input);
175
+ }
176
+ export {
177
+ checkRules,
178
+ enforceRules,
179
+ loadRules,
180
+ parseRulesFromDoc
181
+ };
182
+ //# sourceMappingURL=rule-engine-YGQ3RYZM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/runtime/rule-engine.ts"],"sourcesContent":["import { existsSync } from 'fs';\nimport { join } from 'path';\nimport { loadDirectory } from '../primitives/loader.js';\nimport type { HarnessDocument } from '../core/types.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport type RuleAction = 'allow' | 'deny' | 'warn' | 'require_approval';\n\nexport interface ParsedRule {\n /** Source rule document ID */\n ruleId: string;\n /** What this rule regulates */\n subject: string;\n /** Whether it permits or blocks */\n action: RuleAction;\n /** Original directive text (for messages) */\n directive: string;\n /** Tags from the source document (for scoping) */\n tags: string[];\n}\n\nexport interface RuleCheckInput {\n /** The action being attempted (e.g., \"run\", \"tool_call\", \"delegate\") */\n action: string;\n /** Free-text description of what's being attempted */\n description?: string;\n /** Relevant tags or topics for the check */\n tags?: string[];\n /** Tool name if this is a tool call */\n toolName?: string;\n}\n\nexport interface RuleViolation {\n ruleId: string;\n directive: string;\n severity: 'deny' | 'warn' | 'require_approval';\n reason: string;\n}\n\nexport interface RuleCheckResult {\n allowed: boolean;\n violations: RuleViolation[];\n warnings: RuleViolation[];\n requiresApproval: boolean;\n /** Human-readable summary */\n summary: string;\n}\n\n// ─── Rule Parsing ────────────────────────────────────────────────────────────\n\n/**\n * Extract enforceable rules from a harness document.\n * Parses \"never\", \"must not\", \"do not\", \"always\", \"require\" directives\n * and converts them into structured rule objects.\n */\nexport function parseRulesFromDoc(doc: HarnessDocument): ParsedRule[] {\n const rules: ParsedRule[] = [];\n const text = (doc.l0 + '\\n' + doc.l1 + '\\n' + doc.body).trim();\n\n for (const line of text.split('\\n')) {\n const trimmed = line.trim().toLowerCase();\n if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('<!--')) continue;\n\n // Strip list markers\n const cleaned = trimmed.replace(/^[-*]\\s+/, '').replace(/^\\d+\\.\\s+/, '');\n\n // \"Never\" / \"Do not\" / \"Must not\" → deny\n const denyMatch = cleaned.match(\n /^(never|don'?t|do not|must not|should not|shouldn'?t)\\s+(.+)/,\n );\n if (denyMatch) {\n const subject = denyMatch[2].replace(/[.!]$/, '');\n // Check if this is an approval gate (e.g., \"never X without approval\")\n if (/without\\s+(explicit\\s+)?(human\\s+)?approval/.test(subject)) {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject: subject.replace(/\\s+without\\s+(explicit\\s+)?(human\\s+)?approval.*$/, ''),\n action: 'require_approval',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n } else {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject,\n action: 'deny',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n }\n continue;\n }\n\n // \"Always\" / \"Must\" / \"Require\" → allow (we note the requirement)\n const requireMatch = cleaned.match(\n /^(always|must|require|ensure)\\s+(.+)/,\n );\n if (requireMatch) {\n const subject = requireMatch[2].replace(/[.!]$/, '');\n // \"require approval\" / \"require explicit approval\" patterns\n if (/\\bapproval\\b/.test(subject) || /\\brequires?\\s+(explicit\\s+)?(human\\s+)?approval\\b/.test(subject)) {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject,\n action: 'require_approval',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n } else {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject,\n action: 'allow',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n }\n continue;\n }\n\n // \"Avoid\" → warn\n const warnMatch = cleaned.match(\n /^(avoid|prefer not to|try not to)\\s+(.+)/,\n );\n if (warnMatch) {\n rules.push({\n ruleId: doc.frontmatter.id,\n subject: warnMatch[2].replace(/[.!]$/, ''),\n action: 'warn',\n directive: cleaned,\n tags: doc.frontmatter.tags,\n });\n }\n }\n\n return rules;\n}\n\n/**\n * Load and parse all enforceable rules from a harness directory.\n * Loads all documents from the rules/ directory and extracts structured rules.\n */\nexport function loadRules(harnessDir: string): ParsedRule[] {\n const rulesDir = join(harnessDir, 'rules');\n if (!existsSync(rulesDir)) return [];\n\n const docs = loadDirectory(rulesDir);\n const rules: ParsedRule[] = [];\n\n for (const doc of docs) {\n if (doc.frontmatter.status !== 'active') continue;\n rules.push(...parseRulesFromDoc(doc));\n }\n\n return rules;\n}\n\n// ─── Rule Checking ───────────────────────────────────────────────────────────\n\n/**\n * Check whether an action violates any loaded rules.\n * Uses keyword overlap between the action description/tags and rule subjects.\n *\n * @param rules - Parsed rules from loadRules()\n * @param input - Description of the action being attempted\n * @returns Check result with violations, warnings, and approval requirements\n */\nexport function checkRules(rules: ParsedRule[], input: RuleCheckInput): RuleCheckResult {\n const violations: RuleViolation[] = [];\n const warnings: RuleViolation[] = [];\n let requiresApproval = false;\n\n // Build search text from input\n const searchText = [\n input.action,\n input.description ?? '',\n input.toolName ?? '',\n ...(input.tags ?? []),\n ].join(' ').toLowerCase();\n\n const searchWords = new Set(\n searchText.split(/\\s+/).filter((w) => w.length > 2),\n );\n\n for (const rule of rules) {\n // Check if this rule is relevant to the current action\n const relevance = computeRelevance(rule, searchWords, input);\n if (relevance < 0.3) continue;\n\n if (rule.action === 'deny') {\n violations.push({\n ruleId: rule.ruleId,\n directive: rule.directive,\n severity: 'deny',\n reason: `Action matches denied rule: \"${rule.directive}\" (relevance: ${relevance.toFixed(2)})`,\n });\n } else if (rule.action === 'warn') {\n warnings.push({\n ruleId: rule.ruleId,\n directive: rule.directive,\n severity: 'warn',\n reason: `Action matches warning rule: \"${rule.directive}\" (relevance: ${relevance.toFixed(2)})`,\n });\n } else if (rule.action === 'require_approval') {\n requiresApproval = true;\n violations.push({\n ruleId: rule.ruleId,\n directive: rule.directive,\n severity: 'require_approval',\n reason: `Action requires approval: \"${rule.directive}\" (relevance: ${relevance.toFixed(2)})`,\n });\n }\n }\n\n const denyViolations = violations.filter((v) => v.severity === 'deny');\n const allowed = denyViolations.length === 0 && !requiresApproval;\n\n let summary: string;\n if (allowed && warnings.length === 0) {\n summary = 'All rule checks passed.';\n } else if (allowed) {\n summary = `Allowed with ${warnings.length} warning(s): ${warnings.map((w) => w.directive).join('; ')}`;\n } else if (requiresApproval && denyViolations.length === 0) {\n summary = `Requires human approval: ${violations.filter((v) => v.severity === 'require_approval').map((v) => v.directive).join('; ')}`;\n } else {\n summary = `Blocked by ${denyViolations.length} rule violation(s): ${denyViolations.map((v) => v.directive).join('; ')}`;\n }\n\n return {\n allowed,\n violations,\n warnings,\n requiresApproval,\n summary,\n };\n}\n\n/**\n * Compute relevance score (0–1) between a rule and search context.\n * Uses word overlap between rule subject/tags and input words/tags.\n */\nfunction computeRelevance(\n rule: ParsedRule,\n searchWords: Set<string>,\n input: RuleCheckInput,\n): number {\n // Extract words from rule subject\n const ruleWords = rule.subject\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 2);\n\n if (ruleWords.length === 0) return 0;\n\n // Count word overlap\n let matchCount = 0;\n for (const word of ruleWords) {\n if (searchWords.has(word)) {\n matchCount++;\n }\n }\n\n let score = matchCount / ruleWords.length;\n\n // Tag overlap boost\n if (input.tags && input.tags.length > 0) {\n const inputTags = new Set(input.tags.map((t) => t.toLowerCase()));\n const tagOverlap = rule.tags.filter((t) => inputTags.has(t.toLowerCase())).length;\n if (tagOverlap > 0) {\n score += 0.2 * (tagOverlap / Math.max(rule.tags.length, 1));\n }\n }\n\n return Math.min(score, 1.0);\n}\n\n/**\n * Convenience: load rules from disk and check an action in one call.\n */\nexport function enforceRules(\n harnessDir: string,\n input: RuleCheckInput,\n): RuleCheckResult {\n const rules = loadRules(harnessDir);\n return checkRules(rules, input);\n}\n"],"mappings":"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","names":[]}