@planu/cli 0.96.4 → 0.97.0

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 (238) hide show
  1. package/dist/cli/commands/install.d.ts.map +1 -1
  2. package/dist/cli/commands/install.js +70 -2
  3. package/dist/cli/commands/install.js.map +1 -1
  4. package/dist/config/compliance-profiles.json +62 -0
  5. package/dist/config/license-plans.json +19 -2
  6. package/dist/config/spec-templates/crud-rest-api/spec.md +35 -0
  7. package/dist/config/spec-templates/crud-rest-api/template.json +10 -0
  8. package/dist/config/spec-templates/email-notifications/spec.md +31 -0
  9. package/dist/config/spec-templates/email-notifications/template.json +10 -0
  10. package/dist/config/spec-templates/file-upload-s3/spec.md +31 -0
  11. package/dist/config/spec-templates/file-upload-s3/template.json +11 -0
  12. package/dist/config/spec-templates/jwt-auth/spec.md +35 -0
  13. package/dist/config/spec-templates/jwt-auth/template.json +10 -0
  14. package/dist/config/spec-templates/oauth-social-login/spec.md +31 -0
  15. package/dist/config/spec-templates/oauth-social-login/template.json +10 -0
  16. package/dist/config/spec-templates/rate-limiting/spec.md +31 -0
  17. package/dist/config/spec-templates/rate-limiting/template.json +10 -0
  18. package/dist/config/spec-templates/stripe-payments/spec.md +32 -0
  19. package/dist/config/spec-templates/stripe-payments/template.json +10 -0
  20. package/dist/config/spec-templates/webhook-system/spec.md +36 -0
  21. package/dist/config/spec-templates/webhook-system/template.json +10 -0
  22. package/dist/engine/agent-ready-exporter/formatters/devin.d.ts +7 -0
  23. package/dist/engine/agent-ready-exporter/formatters/devin.d.ts.map +1 -0
  24. package/dist/engine/agent-ready-exporter/formatters/devin.js +23 -0
  25. package/dist/engine/agent-ready-exporter/formatters/devin.js.map +1 -0
  26. package/dist/engine/agent-ready-exporter/formatters/generic.d.ts +7 -0
  27. package/dist/engine/agent-ready-exporter/formatters/generic.d.ts.map +1 -0
  28. package/dist/engine/agent-ready-exporter/formatters/generic.js +9 -0
  29. package/dist/engine/agent-ready-exporter/formatters/generic.js.map +1 -0
  30. package/dist/engine/agent-ready-exporter/formatters/kiro.d.ts +6 -0
  31. package/dist/engine/agent-ready-exporter/formatters/kiro.d.ts.map +1 -0
  32. package/dist/engine/agent-ready-exporter/formatters/kiro.js +34 -0
  33. package/dist/engine/agent-ready-exporter/formatters/kiro.js.map +1 -0
  34. package/dist/engine/agent-ready-exporter/formatters/swe-agent.d.ts +6 -0
  35. package/dist/engine/agent-ready-exporter/formatters/swe-agent.d.ts.map +1 -0
  36. package/dist/engine/agent-ready-exporter/formatters/swe-agent.js +40 -0
  37. package/dist/engine/agent-ready-exporter/formatters/swe-agent.js.map +1 -0
  38. package/dist/engine/agent-ready-exporter.d.ts +11 -0
  39. package/dist/engine/agent-ready-exporter.d.ts.map +1 -0
  40. package/dist/engine/agent-ready-exporter.js +86 -0
  41. package/dist/engine/agent-ready-exporter.js.map +1 -0
  42. package/dist/engine/compliance-checker.d.ts +19 -0
  43. package/dist/engine/compliance-checker.d.ts.map +1 -0
  44. package/dist/engine/compliance-checker.js +145 -0
  45. package/dist/engine/compliance-checker.js.map +1 -0
  46. package/dist/engine/generate-tests/generators/property-based-generator.d.ts +12 -0
  47. package/dist/engine/generate-tests/generators/property-based-generator.d.ts.map +1 -0
  48. package/dist/engine/generate-tests/generators/property-based-generator.js +159 -0
  49. package/dist/engine/generate-tests/generators/property-based-generator.js.map +1 -0
  50. package/dist/engine/jira-exporter.d.ts +39 -0
  51. package/dist/engine/jira-exporter.d.ts.map +1 -0
  52. package/dist/engine/jira-exporter.js +190 -0
  53. package/dist/engine/jira-exporter.js.map +1 -0
  54. package/dist/engine/linear-exporter.d.ts +32 -0
  55. package/dist/engine/linear-exporter.d.ts.map +1 -0
  56. package/dist/engine/linear-exporter.js +184 -0
  57. package/dist/engine/linear-exporter.js.map +1 -0
  58. package/dist/engine/planu-config-writer.d.ts +13 -2
  59. package/dist/engine/planu-config-writer.d.ts.map +1 -1
  60. package/dist/engine/planu-config-writer.js +32 -1
  61. package/dist/engine/planu-config-writer.js.map +1 -1
  62. package/dist/engine/property-test-generator.d.ts +14 -0
  63. package/dist/engine/property-test-generator.d.ts.map +1 -0
  64. package/dist/engine/property-test-generator.js +223 -0
  65. package/dist/engine/property-test-generator.js.map +1 -0
  66. package/dist/engine/skill-evaluator.d.ts +21 -0
  67. package/dist/engine/skill-evaluator.d.ts.map +1 -0
  68. package/dist/engine/skill-evaluator.js +126 -0
  69. package/dist/engine/skill-evaluator.js.map +1 -0
  70. package/dist/engine/spec-quality-scorer.d.ts +4 -0
  71. package/dist/engine/spec-quality-scorer.d.ts.map +1 -0
  72. package/dist/engine/spec-quality-scorer.js +334 -0
  73. package/dist/engine/spec-quality-scorer.js.map +1 -0
  74. package/dist/engine/spec-template-engine.d.ts +26 -0
  75. package/dist/engine/spec-template-engine.d.ts.map +1 -0
  76. package/dist/engine/spec-template-engine.js +127 -0
  77. package/dist/engine/spec-template-engine.js.map +1 -0
  78. package/dist/index.js +10 -0
  79. package/dist/index.js.map +1 -1
  80. package/dist/storage/compliance-store.d.ts +11 -0
  81. package/dist/storage/compliance-store.d.ts.map +1 -0
  82. package/dist/storage/compliance-store.js +30 -0
  83. package/dist/storage/compliance-store.js.map +1 -0
  84. package/dist/storage/jira-store.d.ts +30 -0
  85. package/dist/storage/jira-store.d.ts.map +1 -0
  86. package/dist/storage/jira-store.js +84 -0
  87. package/dist/storage/jira-store.js.map +1 -0
  88. package/dist/storage/linear-store.d.ts +30 -0
  89. package/dist/storage/linear-store.d.ts.map +1 -0
  90. package/dist/storage/linear-store.js +84 -0
  91. package/dist/storage/linear-store.js.map +1 -0
  92. package/dist/tools/check-readiness.d.ts.map +1 -1
  93. package/dist/tools/check-readiness.js +8 -2
  94. package/dist/tools/check-readiness.js.map +1 -1
  95. package/dist/tools/compliance-handler.d.ts +6 -0
  96. package/dist/tools/compliance-handler.d.ts.map +1 -0
  97. package/dist/tools/compliance-handler.js +99 -0
  98. package/dist/tools/compliance-handler.js.map +1 -0
  99. package/dist/tools/eval-skill-handler.d.ts +4 -0
  100. package/dist/tools/eval-skill-handler.d.ts.map +1 -0
  101. package/dist/tools/eval-skill-handler.js +26 -0
  102. package/dist/tools/eval-skill-handler.js.map +1 -0
  103. package/dist/tools/export-spec.d.ts.map +1 -1
  104. package/dist/tools/export-spec.js +42 -1
  105. package/dist/tools/export-spec.js.map +1 -1
  106. package/dist/tools/generate-tests/generators/property-based-generator.d.ts +11 -0
  107. package/dist/tools/generate-tests/generators/property-based-generator.d.ts.map +1 -0
  108. package/dist/tools/generate-tests/generators/property-based-generator.js +27 -0
  109. package/dist/tools/generate-tests/generators/property-based-generator.js.map +1 -0
  110. package/dist/tools/generate-tests/spec-dispatcher.d.ts +5 -0
  111. package/dist/tools/generate-tests/spec-dispatcher.d.ts.map +1 -1
  112. package/dist/tools/generate-tests/spec-dispatcher.js +18 -1
  113. package/dist/tools/generate-tests/spec-dispatcher.js.map +1 -1
  114. package/dist/tools/init-project/config-builder.d.ts +3 -2
  115. package/dist/tools/init-project/config-builder.d.ts.map +1 -1
  116. package/dist/tools/init-project/config-builder.js +9 -4
  117. package/dist/tools/init-project/config-builder.js.map +1 -1
  118. package/dist/tools/init-project/handler.d.ts.map +1 -1
  119. package/dist/tools/init-project/handler.js +3 -2
  120. package/dist/tools/init-project/handler.js.map +1 -1
  121. package/dist/tools/jira-sync-handler.d.ts +6 -0
  122. package/dist/tools/jira-sync-handler.d.ts.map +1 -0
  123. package/dist/tools/jira-sync-handler.js +220 -0
  124. package/dist/tools/jira-sync-handler.js.map +1 -0
  125. package/dist/tools/linear-sync-handler.d.ts +6 -0
  126. package/dist/tools/linear-sync-handler.d.ts.map +1 -0
  127. package/dist/tools/linear-sync-handler.js +212 -0
  128. package/dist/tools/linear-sync-handler.js.map +1 -0
  129. package/dist/tools/register-export-tools.d.ts.map +1 -1
  130. package/dist/tools/register-export-tools.js +10 -3
  131. package/dist/tools/register-export-tools.js.map +1 -1
  132. package/dist/tools/register-spec-314.d.ts +3 -0
  133. package/dist/tools/register-spec-314.d.ts.map +1 -0
  134. package/dist/tools/register-spec-314.js +38 -0
  135. package/dist/tools/register-spec-314.js.map +1 -0
  136. package/dist/tools/register-spec-316.d.ts +3 -0
  137. package/dist/tools/register-spec-316.d.ts.map +1 -0
  138. package/dist/tools/register-spec-316.js +71 -0
  139. package/dist/tools/register-spec-316.js.map +1 -0
  140. package/dist/tools/register-spec-317.d.ts +3 -0
  141. package/dist/tools/register-spec-317.d.ts.map +1 -0
  142. package/dist/tools/register-spec-317.js +158 -0
  143. package/dist/tools/register-spec-317.js.map +1 -0
  144. package/dist/tools/register-spec-319.d.ts +3 -0
  145. package/dist/tools/register-spec-319.d.ts.map +1 -0
  146. package/dist/tools/register-spec-319.js +59 -0
  147. package/dist/tools/register-spec-319.js.map +1 -0
  148. package/dist/tools/register-spec-320.d.ts +3 -0
  149. package/dist/tools/register-spec-320.d.ts.map +1 -0
  150. package/dist/tools/register-spec-320.js +60 -0
  151. package/dist/tools/register-spec-320.js.map +1 -0
  152. package/dist/tools/register-spec-tools/core-spec-tools.d.ts.map +1 -1
  153. package/dist/tools/register-spec-tools/core-spec-tools.js +15 -1
  154. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  155. package/dist/tools/schemas/index.d.ts +1 -1
  156. package/dist/tools/schemas/index.d.ts.map +1 -1
  157. package/dist/tools/schemas/index.js +1 -1
  158. package/dist/tools/schemas/index.js.map +1 -1
  159. package/dist/tools/schemas/spec.d.ts +6 -0
  160. package/dist/tools/schemas/spec.d.ts.map +1 -1
  161. package/dist/tools/schemas/spec.js +4 -0
  162. package/dist/tools/schemas/spec.js.map +1 -1
  163. package/dist/tools/set-work-mode-handler.d.ts +7 -0
  164. package/dist/tools/set-work-mode-handler.d.ts.map +1 -0
  165. package/dist/tools/set-work-mode-handler.js +30 -0
  166. package/dist/tools/set-work-mode-handler.js.map +1 -0
  167. package/dist/tools/spec-marketplace-handler.d.ts +6 -0
  168. package/dist/tools/spec-marketplace-handler.d.ts.map +1 -0
  169. package/dist/tools/spec-marketplace-handler.js +113 -0
  170. package/dist/tools/spec-marketplace-handler.js.map +1 -0
  171. package/dist/tools/spec-quality-score-handler.d.ts +7 -0
  172. package/dist/tools/spec-quality-score-handler.d.ts.map +1 -0
  173. package/dist/tools/spec-quality-score-handler.js +106 -0
  174. package/dist/tools/spec-quality-score-handler.js.map +1 -0
  175. package/dist/tools/status-handler.d.ts.map +1 -1
  176. package/dist/tools/status-handler.js +12 -3
  177. package/dist/tools/status-handler.js.map +1 -1
  178. package/dist/types/agent-ready.d.ts +58 -0
  179. package/dist/types/agent-ready.d.ts.map +1 -0
  180. package/dist/types/agent-ready.js +3 -0
  181. package/dist/types/agent-ready.js.map +1 -0
  182. package/dist/types/common/primitives.d.ts +2 -0
  183. package/dist/types/common/primitives.d.ts.map +1 -1
  184. package/dist/types/compliance.d.ts +44 -0
  185. package/dist/types/compliance.d.ts.map +1 -0
  186. package/dist/types/compliance.js +3 -0
  187. package/dist/types/compliance.js.map +1 -0
  188. package/dist/types/export.d.ts +5 -1
  189. package/dist/types/export.d.ts.map +1 -1
  190. package/dist/types/export.js +1 -1
  191. package/dist/types/export.js.map +1 -1
  192. package/dist/types/index.d.ts +7 -0
  193. package/dist/types/index.d.ts.map +1 -1
  194. package/dist/types/index.js +7 -0
  195. package/dist/types/index.js.map +1 -1
  196. package/dist/types/jira-linear.d.ts +216 -0
  197. package/dist/types/jira-linear.d.ts.map +1 -0
  198. package/dist/types/jira-linear.js +3 -0
  199. package/dist/types/jira-linear.js.map +1 -0
  200. package/dist/types/project/inputs.d.ts +3 -1
  201. package/dist/types/project/inputs.d.ts.map +1 -1
  202. package/dist/types/project/planu-config.d.ts +2 -0
  203. package/dist/types/project/planu-config.d.ts.map +1 -1
  204. package/dist/types/property-testing.d.ts +50 -0
  205. package/dist/types/property-testing.d.ts.map +1 -0
  206. package/dist/types/property-testing.js +3 -0
  207. package/dist/types/property-testing.js.map +1 -0
  208. package/dist/types/skill-eval.d.ts +41 -0
  209. package/dist/types/skill-eval.d.ts.map +1 -0
  210. package/dist/types/skill-eval.js +3 -0
  211. package/dist/types/skill-eval.js.map +1 -0
  212. package/dist/types/spec-marketplace.d.ts +31 -0
  213. package/dist/types/spec-marketplace.d.ts.map +1 -0
  214. package/dist/types/spec-marketplace.js +3 -0
  215. package/dist/types/spec-marketplace.js.map +1 -0
  216. package/dist/types/spec-quality.d.ts +36 -0
  217. package/dist/types/spec-quality.d.ts.map +1 -0
  218. package/dist/types/spec-quality.js +3 -0
  219. package/dist/types/spec-quality.js.map +1 -0
  220. package/package.json +7 -2
  221. package/src/config/compliance-profiles.json +62 -0
  222. package/src/config/license-plans.json +19 -2
  223. package/src/config/spec-templates/crud-rest-api/spec.md +35 -0
  224. package/src/config/spec-templates/crud-rest-api/template.json +10 -0
  225. package/src/config/spec-templates/email-notifications/spec.md +31 -0
  226. package/src/config/spec-templates/email-notifications/template.json +10 -0
  227. package/src/config/spec-templates/file-upload-s3/spec.md +31 -0
  228. package/src/config/spec-templates/file-upload-s3/template.json +11 -0
  229. package/src/config/spec-templates/jwt-auth/spec.md +35 -0
  230. package/src/config/spec-templates/jwt-auth/template.json +10 -0
  231. package/src/config/spec-templates/oauth-social-login/spec.md +31 -0
  232. package/src/config/spec-templates/oauth-social-login/template.json +10 -0
  233. package/src/config/spec-templates/rate-limiting/spec.md +31 -0
  234. package/src/config/spec-templates/rate-limiting/template.json +10 -0
  235. package/src/config/spec-templates/stripe-payments/spec.md +32 -0
  236. package/src/config/spec-templates/stripe-payments/template.json +10 -0
  237. package/src/config/spec-templates/webhook-system/spec.md +36 -0
  238. package/src/config/spec-templates/webhook-system/template.json +10 -0
@@ -0,0 +1,36 @@
1
+ # Webhook System
2
+
3
+ ## Overview
4
+ Webhook delivery system with event subscriptions, HMAC signature verification via `{{signature_header}}`, retry logic (max {{max_retries}} attempts), and {{timeout_seconds}}s per request timeout.
5
+
6
+ ## Acceptance Criteria
7
+
8
+ ### AC-1: Subscription Management
9
+ - Allow consumers to register webhook endpoints with target URL and event types
10
+ - Validate that the target URL is reachable via a test ping on registration
11
+ - Store subscriptions with status (active, paused, failed)
12
+
13
+ ### AC-2: Event Delivery
14
+ - Deliver event payloads via HTTP POST to registered endpoints
15
+ - Include `{{signature_header}}` HMAC-SHA256 signature in each request
16
+ - Set request timeout to {{timeout_seconds}} seconds per attempt
17
+
18
+ ### AC-3: Retry Logic
19
+ - Retry failed deliveries up to {{max_retries}} times
20
+ - Use exponential backoff: 1min, 5min, 30min between retries
21
+ - Mark subscription as `failed` after exhausting all retries
22
+
23
+ ### AC-4: Signature Verification (Consumer Guide)
24
+ - Compute HMAC-SHA256 of the raw request body using the shared secret
25
+ - Compare computed signature with the value in `{{signature_header}}`
26
+ - Reject requests with invalid or missing signatures
27
+
28
+ ### AC-5: Delivery Log
29
+ - Store delivery attempts: endpoint, event type, response code, latency, attempt number
30
+ - Expose delivery history per subscription via admin API
31
+ - Purge logs older than 30 days automatically
32
+
33
+ ## Technical Notes
34
+ - Use a unique shared secret per subscription — never reuse across consumers
35
+ - Process delivery queue asynchronously to avoid blocking event producers
36
+ - Validate registered URLs against an allowlist to prevent SSRF attacks
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "webhook-system",
3
+ "description": "Webhook system with event subscriptions, HMAC signature verification, and retry logic",
4
+ "variables": [
5
+ { "name": "max_retries", "description": "Maximum delivery retry attempts", "default": "3" },
6
+ { "name": "timeout_seconds", "description": "HTTP request timeout per delivery attempt", "default": "10" },
7
+ { "name": "signature_header", "description": "HTTP header name for HMAC signature", "default": "X-Webhook-Signature" }
8
+ ],
9
+ "tags": ["webhooks", "events", "backend", "integrations"]
10
+ }
@@ -0,0 +1,7 @@
1
+ import type { AgentReadySpec } from '../../../types/agent-ready.js';
2
+ /**
3
+ * Augment an AgentReadySpec with Devin sandbox instructions.
4
+ * Devin requires explicit environment setup and command sequences.
5
+ */
6
+ export declare function formatDevin(spec: AgentReadySpec): string;
7
+ //# sourceMappingURL=devin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin.d.ts","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/devin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,+BAA+B,CAAC;AAE/E;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAgBxD"}
@@ -0,0 +1,23 @@
1
+ // engine/agent-ready-exporter/formatters/devin.ts — Devin sandbox formatter — SPEC-318
2
+ /**
3
+ * Augment an AgentReadySpec with Devin sandbox instructions.
4
+ * Devin requires explicit environment setup and command sequences.
5
+ */
6
+ export function formatDevin(spec) {
7
+ const devinSpec = {
8
+ ...spec,
9
+ _format: 'devin',
10
+ sandbox_instructions: {
11
+ setup: [
12
+ 'Install project dependencies with the project package manager',
13
+ 'Run typecheck to verify environment is clean before starting',
14
+ 'Read existing tests to understand project conventions',
15
+ ],
16
+ run_tests: spec.agent_context.test_command,
17
+ validate: spec.agent_context.validation_command,
18
+ environment: 'Use the existing project environment — do not install new global tools',
19
+ },
20
+ };
21
+ return JSON.stringify(devinSpec, null, 2);
22
+ }
23
+ //# sourceMappingURL=devin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devin.js","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/devin.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAIvF;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAoB;IAC9C,MAAM,SAAS,GAAc;QAC3B,GAAG,IAAI;QACP,OAAO,EAAE,OAAO;QAChB,oBAAoB,EAAE;YACpB,KAAK,EAAE;gBACL,+DAA+D;gBAC/D,8DAA8D;gBAC9D,uDAAuD;aACxD;YACD,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY;YAC1C,QAAQ,EAAE,IAAI,CAAC,aAAa,CAAC,kBAAkB;YAC/C,WAAW,EAAE,wEAAwE;SACtF;KACF,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { AgentReadySpec } from '../../../types/agent-ready.js';
2
+ /**
3
+ * Serialize an AgentReadySpec to a JSON-based YAML-like string.
4
+ * Uses JSON.stringify with indentation as a dependency-free serialization.
5
+ */
6
+ export declare function formatGeneric(spec: AgentReadySpec): string;
7
+ //# sourceMappingURL=generic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.d.ts","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/generic.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAE1D"}
@@ -0,0 +1,9 @@
1
+ // engine/agent-ready-exporter/formatters/generic.ts — Generic YAML formatter — SPEC-318
2
+ /**
3
+ * Serialize an AgentReadySpec to a JSON-based YAML-like string.
4
+ * Uses JSON.stringify with indentation as a dependency-free serialization.
5
+ */
6
+ export function formatGeneric(spec) {
7
+ return JSON.stringify(spec, null, 2);
8
+ }
9
+ //# sourceMappingURL=generic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generic.js","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/generic.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAIxF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAoB;IAChD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AgentReadySpec } from '../../../types/agent-ready.js';
2
+ /**
3
+ * Augment an AgentReadySpec with Kiro-specific EARS requirements and steering context.
4
+ */
5
+ export declare function formatKiro(spec: AgentReadySpec): string;
6
+ //# sourceMappingURL=kiro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro.d.ts","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/kiro.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAA6B,MAAM,+BAA+B,CAAC;AAc/F;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAoBvD"}
@@ -0,0 +1,34 @@
1
+ // engine/agent-ready-exporter/formatters/kiro.ts — Kiro EARS format — SPEC-318
2
+ /**
3
+ * Convert a success criterion to EARS (Easy Approach to Requirements Syntax) format.
4
+ * Pattern: "WHEN <trigger> THE SYSTEM SHALL <response>"
5
+ */
6
+ function toEarsFormat(criterion) {
7
+ const lower = criterion.toLowerCase();
8
+ if (lower.startsWith('when ') || lower.startsWith('the system')) {
9
+ return criterion;
10
+ }
11
+ return `THE SYSTEM SHALL ${criterion}`;
12
+ }
13
+ /**
14
+ * Augment an AgentReadySpec with Kiro-specific EARS requirements and steering context.
15
+ */
16
+ export function formatKiro(spec) {
17
+ const requirements = spec.agent_context.success_criteria.map((criterion, idx) => ({
18
+ id: `REQ-${String(idx + 1).padStart(3, '0')}`,
19
+ ears_format: toEarsFormat(criterion),
20
+ original: criterion,
21
+ }));
22
+ const kiroSpec = {
23
+ ...spec,
24
+ _format: 'kiro',
25
+ kiro_requirements: requirements,
26
+ steering: {
27
+ product: `Implement ${spec.title} following the success criteria`,
28
+ tech: spec.agent_context.constraints.join('; ') || 'Follow existing project conventions',
29
+ structure: 'Respect the files_to_create and files_to_modify boundaries',
30
+ },
31
+ };
32
+ return JSON.stringify(kiroSpec, null, 2);
33
+ }
34
+ //# sourceMappingURL=kiro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/kiro.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAI/E;;;GAGG;AACH,SAAS,YAAY,CAAC,SAAiB;IACrC,MAAM,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACtC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,oBAAoB,SAAS,EAAE,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAoB;IAC7C,MAAM,YAAY,GAAsB,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,GAAG,CAC7E,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACnB,EAAE,EAAE,OAAO,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;QAC7C,WAAW,EAAE,YAAY,CAAC,SAAS,CAAC;QACpC,QAAQ,EAAE,SAAS;KACpB,CAAC,CACH,CAAC;IAEF,MAAM,QAAQ,GAAa;QACzB,GAAG,IAAI;QACP,OAAO,EAAE,MAAM;QACf,iBAAiB,EAAE,YAAY;QAC/B,QAAQ,EAAE;YACR,OAAO,EAAE,aAAa,IAAI,CAAC,KAAK,iCAAiC;YACjE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,qCAAqC;YACxF,SAAS,EAAE,4DAA4D;SACxE;KACF,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { AgentReadySpec } from '../../../types/agent-ready.js';
2
+ /**
3
+ * Augment an AgentReadySpec with SWE-agent trajectory hints and instance metadata.
4
+ */
5
+ export declare function formatSweAgent(spec: AgentReadySpec): string;
6
+ //# sourceMappingURL=swe-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swe-agent.d.ts","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/swe-agent.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,+BAA+B,CAAC;AAmCvC;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAQ3D"}
@@ -0,0 +1,40 @@
1
+ // engine/agent-ready-exporter/formatters/swe-agent.ts — SWE-agent trajectory format — SPEC-318
2
+ /**
3
+ * Build trajectory hints from spec context.
4
+ * SWE-agent benefits from structured thought/action pairs as navigation hints.
5
+ */
6
+ function buildTrajectoryHints(spec) {
7
+ const steps = [
8
+ {
9
+ thought: `I need to implement: ${spec.agent_context.objective}`,
10
+ action: `Read existing files: ${spec.agent_context.files_to_modify.join(', ') || 'none to modify'}`,
11
+ },
12
+ ];
13
+ if (spec.agent_context.files_to_create.length > 0) {
14
+ steps.push({
15
+ thought: 'I need to create new files as specified',
16
+ action: `Create files: ${spec.agent_context.files_to_create.join(', ')}`,
17
+ });
18
+ }
19
+ steps.push({
20
+ thought: 'Run tests to verify the implementation',
21
+ action: spec.agent_context.test_command,
22
+ }, {
23
+ thought: 'Validate the full solution',
24
+ action: spec.agent_context.validation_command,
25
+ });
26
+ return steps;
27
+ }
28
+ /**
29
+ * Augment an AgentReadySpec with SWE-agent trajectory hints and instance metadata.
30
+ */
31
+ export function formatSweAgent(spec) {
32
+ const sweSpec = {
33
+ ...spec,
34
+ _format: 'swe-agent',
35
+ instance_id: `${spec.spec_id.toLowerCase().replace(/[^a-z0-9]/g, '-')}-instance`,
36
+ trajectory_hints: buildTrajectoryHints(spec),
37
+ };
38
+ return JSON.stringify(sweSpec, null, 2);
39
+ }
40
+ //# sourceMappingURL=swe-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swe-agent.js","sourceRoot":"","sources":["../../../../src/engine/agent-ready-exporter/formatters/swe-agent.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAQ/F;;;GAGG;AACH,SAAS,oBAAoB,CAAC,IAAoB;IAChD,MAAM,KAAK,GAA6B;QACtC;YACE,OAAO,EAAE,wBAAwB,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE;YAC/D,MAAM,EAAE,wBAAwB,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAE;SACpG;KACF,CAAC;IAEF,IAAI,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC;YACT,OAAO,EAAE,yCAAyC;YAClD,MAAM,EAAE,iBAAiB,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACzE,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CACR;QACE,OAAO,EAAE,wCAAwC;QACjD,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,YAAY;KACxC,EACD;QACE,OAAO,EAAE,4BAA4B;QACrC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,kBAAkB;KAC9C,CACF,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAoB;IACjD,MAAM,OAAO,GAAiB;QAC5B,GAAG,IAAI;QACP,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,CAAC,WAAW;QAChF,gBAAgB,EAAE,oBAAoB,CAAC,IAAI,CAAC;KAC7C,CAAC;IACF,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Spec } from '../types/index.js';
2
+ import type { AgentTarget, AgentReadySpec } from '../types/agent-ready.js';
3
+ /**
4
+ * Convert a Spec into an AgentReadySpec structure optimized for autonomous coding agents.
5
+ */
6
+ export declare function specToAgentReady(spec: Spec, agentTarget: AgentTarget): AgentReadySpec;
7
+ /**
8
+ * Serialize an AgentReadySpec to a string using the appropriate formatter.
9
+ */
10
+ export declare function serializeAgentReady(agentSpec: AgentReadySpec, target: AgentTarget): string;
11
+ //# sourceMappingURL=agent-ready-exporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-ready-exporter.d.ts","sourceRoot":"","sources":["../../src/engine/agent-ready-exporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAgB,MAAM,yBAAyB,CAAC;AAuEzF;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,GAAG,cAAc,CAOrF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,MAAM,CAW1F"}
@@ -0,0 +1,86 @@
1
+ // engine/agent-ready-exporter.ts — Agent-Ready spec export central module — SPEC-318
2
+ import { formatGeneric } from './agent-ready-exporter/formatters/generic.js';
3
+ import { formatDevin } from './agent-ready-exporter/formatters/devin.js';
4
+ import { formatKiro } from './agent-ready-exporter/formatters/kiro.js';
5
+ import { formatSweAgent } from './agent-ready-exporter/formatters/swe-agent.js';
6
+ // ---------------------------------------------------------------------------
7
+ // Context extraction helpers
8
+ // ---------------------------------------------------------------------------
9
+ function extractObjective(spec) {
10
+ return `Implement "${spec.title}" (${spec.id}) — a ${spec.type} spec with ${spec.scope} scope.`;
11
+ }
12
+ function extractSuccessCriteria(spec) {
13
+ // Build criteria from spec metadata — technical path is the source of truth at runtime,
14
+ // but at export time we derive criteria from available structured fields.
15
+ const criteria = [
16
+ `Spec ${spec.id} passes validation (pnpm validate or equivalent)`,
17
+ `All tests pass for modified/created files`,
18
+ `TypeScript strict mode: zero type errors`,
19
+ `ESLint: zero warnings or errors`,
20
+ ];
21
+ if (spec.estimation.devHours > 0) {
22
+ criteria.push(`Implementation completed within estimated ${String(spec.estimation.devHours)}h`);
23
+ }
24
+ return criteria;
25
+ }
26
+ function extractConstraints(spec) {
27
+ const constraints = [
28
+ 'TypeScript strict mode enforced — no any types',
29
+ 'ES modules with .js extensions on all imports',
30
+ `Risk level is ${spec.risk} — review carefully before merging`,
31
+ ];
32
+ if (spec.tags.length > 0) {
33
+ constraints.push(`Tagged: ${spec.tags.join(', ')} — respect domain conventions`);
34
+ }
35
+ return constraints;
36
+ }
37
+ function extractDependencies(spec) {
38
+ return spec.dependencies.length > 0
39
+ ? spec.dependencies
40
+ : ['No blocking dependencies — can start immediately'];
41
+ }
42
+ function buildAgentContext(spec) {
43
+ return {
44
+ objective: extractObjective(spec),
45
+ success_criteria: extractSuccessCriteria(spec),
46
+ constraints: extractConstraints(spec),
47
+ files_to_create: [],
48
+ files_to_modify: [spec.specPath, spec.technicalPath].filter(Boolean),
49
+ forbidden_files: ['src/index.ts', 'src/types/index.ts'],
50
+ test_command: 'pnpm test',
51
+ validation_command: 'pnpm typecheck && pnpm lint',
52
+ effort_estimate: `${String(spec.estimation.devHours)}h (${spec.difficulty} difficulty)`,
53
+ dependencies: extractDependencies(spec),
54
+ rollback: `git revert HEAD or delete branch feat/${spec.id.toLowerCase()}-*`,
55
+ };
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Public API
59
+ // ---------------------------------------------------------------------------
60
+ /**
61
+ * Convert a Spec into an AgentReadySpec structure optimized for autonomous coding agents.
62
+ */
63
+ export function specToAgentReady(spec, agentTarget) {
64
+ return {
65
+ spec_id: spec.id,
66
+ title: spec.title,
67
+ agent_context: buildAgentContext(spec),
68
+ _format: agentTarget,
69
+ };
70
+ }
71
+ /**
72
+ * Serialize an AgentReadySpec to a string using the appropriate formatter.
73
+ */
74
+ export function serializeAgentReady(agentSpec, target) {
75
+ switch (target) {
76
+ case 'devin':
77
+ return formatDevin(agentSpec);
78
+ case 'kiro':
79
+ return formatKiro(agentSpec);
80
+ case 'swe-agent':
81
+ return formatSweAgent(agentSpec);
82
+ case 'generic':
83
+ return formatGeneric(agentSpec);
84
+ }
85
+ }
86
+ //# sourceMappingURL=agent-ready-exporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-ready-exporter.js","sourceRoot":"","sources":["../../src/engine/agent-ready-exporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { ComplianceSpecFramework, ComplianceGapReport } from '../types/compliance.js';
2
+ import type { Spec } from '../types/index.js';
3
+ /**
4
+ * Detect which compliance frameworks apply based on keyword matching
5
+ * in the spec title and description text.
6
+ */
7
+ export declare function detectComplianceContext(title: string, description: string): ComplianceSpecFramework[];
8
+ /**
9
+ * Evaluate a spec's acceptance criteria against required compliance criteria.
10
+ * Reads the spec markdown file to extract AC content.
11
+ * Returns a full gap report including missing criteria and coverage percentage.
12
+ */
13
+ export declare function checkCompliance(spec: Spec, frameworks: ComplianceSpecFramework[]): Promise<ComplianceGapReport>;
14
+ /**
15
+ * Return the full list of compliance criteria for the specified frameworks.
16
+ * Used when injecting missing criteria into a spec.
17
+ */
18
+ export declare function getComplianceCriteria(frameworks: ComplianceSpecFramework[]): string[];
19
+ //# sourceMappingURL=compliance-checker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-checker.d.ts","sourceRoot":"","sources":["../../src/engine/compliance-checker.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,uBAAuB,EAEvB,mBAAmB,EAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAwB9C;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,uBAAuB,EAAE,CAiB3B;AAMD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,uBAAuB,EAAE,GACpC,OAAO,CAAC,mBAAmB,CAAC,CAiC9B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,uBAAuB,EAAE,GAAG,MAAM,EAAE,CAarF"}
@@ -0,0 +1,145 @@
1
+ // engine/compliance-checker.ts — Compliance-as-Specs logic (SPEC-319)
2
+ import { readFileSync, existsSync } from 'node:fs';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ // ---------------------------------------------------------------------------
7
+ // Profile loading
8
+ // ---------------------------------------------------------------------------
9
+ let _profiles = null;
10
+ function loadProfiles() {
11
+ if (_profiles !== null) {
12
+ return _profiles;
13
+ }
14
+ const dir = fileURLToPath(new URL('../config', import.meta.url));
15
+ const raw = readFileSync(join(dir, 'compliance-profiles.json'), 'utf-8');
16
+ _profiles = JSON.parse(raw);
17
+ return _profiles;
18
+ }
19
+ const ALL_FRAMEWORKS = ['gdpr', 'hipaa', 'pci-dss', 'soc2', 'ccpa'];
20
+ // ---------------------------------------------------------------------------
21
+ // Context detection
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Detect which compliance frameworks apply based on keyword matching
25
+ * in the spec title and description text.
26
+ */
27
+ export function detectComplianceContext(title, description) {
28
+ const profiles = loadProfiles();
29
+ const text = `${title} ${description}`.toLowerCase();
30
+ const detected = [];
31
+ for (const framework of ALL_FRAMEWORKS) {
32
+ const profile = profiles[framework];
33
+ if (profile === undefined) {
34
+ continue;
35
+ }
36
+ const matches = profile.keywords.some((kw) => text.includes(kw.toLowerCase()));
37
+ if (matches) {
38
+ detected.push(framework);
39
+ }
40
+ }
41
+ return detected;
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Gap analysis
45
+ // ---------------------------------------------------------------------------
46
+ /**
47
+ * Evaluate a spec's acceptance criteria against required compliance criteria.
48
+ * Reads the spec markdown file to extract AC content.
49
+ * Returns a full gap report including missing criteria and coverage percentage.
50
+ */
51
+ export async function checkCompliance(spec, frameworks) {
52
+ const profiles = loadProfiles();
53
+ const specContent = await readSpecContent(spec);
54
+ const acText = `${spec.title} ${specContent}`.toLowerCase();
55
+ const gaps = [];
56
+ for (const framework of frameworks) {
57
+ const profile = profiles[framework];
58
+ if (profile === undefined) {
59
+ continue;
60
+ }
61
+ for (const criterion of profile.criteria) {
62
+ const status = matchCriterion(criterion, acText);
63
+ if (status !== 'present') {
64
+ gaps.push({ framework, criterion, status });
65
+ }
66
+ }
67
+ }
68
+ const totalCriteria = countTotalCriteria(frameworks, profiles);
69
+ const missingCriteria = gaps.filter((g) => g.status === 'missing').map((g) => g.criterion);
70
+ const presentCount = totalCriteria - gaps.length;
71
+ const coveragePercent = totalCriteria === 0 ? 100 : Math.round((presentCount / totalCriteria) * 100);
72
+ return {
73
+ specId: spec.id,
74
+ frameworks,
75
+ gaps,
76
+ missingCriteria,
77
+ coveragePercent,
78
+ };
79
+ }
80
+ /**
81
+ * Return the full list of compliance criteria for the specified frameworks.
82
+ * Used when injecting missing criteria into a spec.
83
+ */
84
+ export function getComplianceCriteria(frameworks) {
85
+ const profiles = loadProfiles();
86
+ const criteria = [];
87
+ for (const framework of frameworks) {
88
+ const profile = profiles[framework];
89
+ if (profile === undefined) {
90
+ continue;
91
+ }
92
+ criteria.push(...profile.criteria);
93
+ }
94
+ return criteria;
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Helpers
98
+ // ---------------------------------------------------------------------------
99
+ async function readSpecContent(spec) {
100
+ /* v8 ignore start */
101
+ if (existsSync(spec.specPath)) {
102
+ return readFile(spec.specPath, 'utf-8');
103
+ }
104
+ /* v8 ignore stop */
105
+ return '';
106
+ }
107
+ /**
108
+ * Check how well a compliance criterion is represented in the spec content text.
109
+ * Uses keyword extraction to match against the full spec markdown.
110
+ */
111
+ function matchCriterion(criterion, acText) {
112
+ const keywords = extractKeywords(criterion);
113
+ if (keywords.length === 0) {
114
+ return 'missing';
115
+ }
116
+ const matched = keywords.filter((kw) => acText.includes(kw));
117
+ const ratio = matched.length / keywords.length;
118
+ if (ratio >= 0.7) {
119
+ return 'present';
120
+ }
121
+ if (ratio >= 0.3) {
122
+ return 'partial';
123
+ }
124
+ return 'missing';
125
+ }
126
+ const STOPWORDS = new Set([
127
+ 'a', 'an', 'the', 'is', 'are', 'in', 'of', 'for', 'and', 'or',
128
+ 'to', 'with', 'all', 'at', 'be', 'by', 'on', 'that', 'this',
129
+ 'it', 'its', 'not', 'as', 'from', 'before', 'after',
130
+ ]);
131
+ function extractKeywords(text) {
132
+ return text
133
+ .toLowerCase()
134
+ .replace(/[()[\]{}.,;:!?'"]/g, ' ')
135
+ .split(/\s+/)
136
+ .filter((w) => w.length > 2 && !STOPWORDS.has(w));
137
+ }
138
+ function countTotalCriteria(frameworks, profiles) {
139
+ let total = 0;
140
+ for (const fw of frameworks) {
141
+ total += profiles[fw]?.criteria.length ?? 0;
142
+ }
143
+ return total;
144
+ }
145
+ //# sourceMappingURL=compliance-checker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-checker.js","sourceRoot":"","sources":["../../src/engine/compliance-checker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Spec, ProjectKnowledge } from '../../../types/index.js';
2
+ /**
3
+ * Generate a complete property-based test file as a string.
4
+ * Adapts output to fast-check (JS/TS), hypothesis (Python), jqwik (Java/Kotlin),
5
+ * or pseudo-code generic format based on detected framework.
6
+ *
7
+ * @param spec - The spec metadata (title, id used for file naming/headers).
8
+ * @param context - Project knowledge (language, stack) for framework detection.
9
+ * @param criteria - Acceptance criteria strings extracted from spec.md by the caller.
10
+ */
11
+ export declare function generatePropertyBasedTests(spec: Spec, context: ProjectKnowledge, criteria?: string[]): string;
12
+ //# sourceMappingURL=property-based-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-based-generator.d.ts","sourceRoot":"","sources":["../../../../src/engine/generate-tests/generators/property-based-generator.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAgItE;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,gBAAgB,EACzB,QAAQ,GAAE,MAAM,EAAO,GACtB,MAAM,CA0CR"}