@yiaany/ghostapi 0.1.8 → 0.2.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 (293) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/CONTRIBUTING.md +132 -119
  3. package/LICENSE +21 -21
  4. package/PROVENANCE.md +13 -0
  5. package/README.md +78 -80
  6. package/SECURITY.md +56 -53
  7. package/dist/actions/gateway.js +320 -72
  8. package/dist/actions/gateway.js.map +1 -1
  9. package/dist/actions/index.d.ts +2 -2
  10. package/dist/actions/index.js +1 -1
  11. package/dist/actions/index.js.map +1 -1
  12. package/dist/agents/agentPrompt.js +7 -5
  13. package/dist/agents/agentPrompt.js.map +1 -1
  14. package/dist/ai/aiClient.js +5 -5
  15. package/dist/ai/aiClient.js.map +1 -1
  16. package/dist/ai/aiGenerator.js +66 -26
  17. package/dist/ai/aiGenerator.js.map +1 -1
  18. package/dist/ai/genericInference.js +151 -36
  19. package/dist/ai/genericInference.js.map +1 -1
  20. package/dist/ai/prompts.js +55 -49
  21. package/dist/ai/prompts.js.map +1 -1
  22. package/dist/approvals/approvalInbox.js +649 -133
  23. package/dist/approvals/approvalInbox.js.map +1 -1
  24. package/dist/approvals/index.d.ts +2 -2
  25. package/dist/approvals/index.js +1 -1
  26. package/dist/approvals/index.js.map +1 -1
  27. package/dist/behavior/behaviorStore.js +34 -14
  28. package/dist/behavior/behaviorStore.js.map +1 -1
  29. package/dist/cache/index.js +14 -5
  30. package/dist/cache/index.js.map +1 -1
  31. package/dist/cli/index.js +226 -93
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/cli/openUrl.js +17 -3
  34. package/dist/cli/openUrl.js.map +1 -1
  35. package/dist/cli/parser.js +79 -18
  36. package/dist/cli/parser.js.map +1 -1
  37. package/dist/config/dataPaths.js +4 -2
  38. package/dist/config/dataPaths.js.map +1 -1
  39. package/dist/config/localConfig.js +5 -2
  40. package/dist/config/localConfig.js.map +1 -1
  41. package/dist/config/serverConfig.js +11 -5
  42. package/dist/config/serverConfig.js.map +1 -1
  43. package/dist/contracts/contract.js +311 -83
  44. package/dist/contracts/contract.js.map +1 -1
  45. package/dist/contracts/index.d.ts +2 -2
  46. package/dist/contracts/index.js +1 -1
  47. package/dist/contracts/index.js.map +1 -1
  48. package/dist/credentials/credentialBroker.js +391 -79
  49. package/dist/credentials/credentialBroker.js.map +1 -1
  50. package/dist/credentials/index.d.ts +2 -2
  51. package/dist/credentials/index.js +1 -1
  52. package/dist/credentials/index.js.map +1 -1
  53. package/dist/dashboard/app.js +823 -685
  54. package/dist/dashboard/dashboard.js.map +1 -1
  55. package/dist/dashboard/index.html +704 -267
  56. package/dist/dashboard/styles.css +1040 -349
  57. package/dist/egress/capabilities.js +55 -25
  58. package/dist/egress/capabilities.js.map +1 -1
  59. package/dist/egress/linuxBootstrap.js +47 -11
  60. package/dist/egress/linuxBootstrap.js.map +1 -1
  61. package/dist/egress/run.js +170 -31
  62. package/dist/egress/run.js.map +1 -1
  63. package/dist/errors/errorEngine.js +15 -3
  64. package/dist/errors/errorEngine.js.map +1 -1
  65. package/dist/errors/providerErrors.js.map +1 -1
  66. package/dist/evals/evals.js +304 -78
  67. package/dist/evals/evals.js.map +1 -1
  68. package/dist/evals/index.d.ts +2 -2
  69. package/dist/evals/index.js +1 -1
  70. package/dist/evals/index.js.map +1 -1
  71. package/dist/evidence/index.d.ts +2 -2
  72. package/dist/evidence/index.js +1 -1
  73. package/dist/evidence/index.js.map +1 -1
  74. package/dist/evidence/report.d.ts +1 -1
  75. package/dist/evidence/report.js +263 -79
  76. package/dist/evidence/report.js.map +1 -1
  77. package/dist/fault/faultLab.js +24 -9
  78. package/dist/fault/faultLab.js.map +1 -1
  79. package/dist/index.d.ts +42 -42
  80. package/dist/index.js +21 -21
  81. package/dist/index.js.map +1 -1
  82. package/dist/inventory/analysis.d.ts +1 -1
  83. package/dist/inventory/analysis.js +174 -50
  84. package/dist/inventory/analysis.js.map +1 -1
  85. package/dist/inventory/index.d.ts +4 -4
  86. package/dist/inventory/index.js +3 -3
  87. package/dist/inventory/index.js.map +1 -1
  88. package/dist/inventory/inventoryController.js +362 -115
  89. package/dist/inventory/inventoryController.js.map +1 -1
  90. package/dist/inventory/types.js +680 -140
  91. package/dist/inventory/types.js.map +1 -1
  92. package/dist/ledger/actionLedger.js +355 -78
  93. package/dist/ledger/actionLedger.js.map +1 -1
  94. package/dist/ledger/index.d.ts +2 -2
  95. package/dist/ledger/index.js +1 -1
  96. package/dist/ledger/index.js.map +1 -1
  97. package/dist/mcp/server.js +26 -11
  98. package/dist/mcp/server.js.map +1 -1
  99. package/dist/policy/index.d.ts +2 -2
  100. package/dist/policy/index.js +1 -1
  101. package/dist/policy/index.js.map +1 -1
  102. package/dist/policy/policy.js +112 -32
  103. package/dist/policy/policy.js.map +1 -1
  104. package/dist/productTelemetry/index.js +71 -20
  105. package/dist/productTelemetry/index.js.map +1 -1
  106. package/dist/providers/conformance.js +10 -5
  107. package/dist/providers/conformance.js.map +1 -1
  108. package/dist/providers/discord.js +2 -2
  109. package/dist/providers/generic.js +3 -3
  110. package/dist/providers/github.js +2 -2
  111. package/dist/providers/index.d.ts +3 -3
  112. package/dist/providers/index.js +2 -2
  113. package/dist/providers/index.js.map +1 -1
  114. package/dist/providers/openai.js +3 -3
  115. package/dist/providers/packs/resendPack.js +51 -25
  116. package/dist/providers/packs/resendPack.js.map +1 -1
  117. package/dist/providers/packs/stripePack.js +590 -121
  118. package/dist/providers/packs/stripePack.js.map +1 -1
  119. package/dist/providers/registry.js +4 -4
  120. package/dist/providers/registry.js.map +1 -1
  121. package/dist/providers/runtime.js +7 -6
  122. package/dist/providers/runtime.js.map +1 -1
  123. package/dist/providers/stripeWebhook.js +39 -10
  124. package/dist/providers/stripeWebhook.js.map +1 -1
  125. package/dist/providers/twilio.js +2 -2
  126. package/dist/proxy/cacheKey.js +9 -2
  127. package/dist/proxy/cacheKey.js.map +1 -1
  128. package/dist/proxy/providerDetector.js +22 -9
  129. package/dist/proxy/providerDetector.js.map +1 -1
  130. package/dist/proxy/proxyHandler.js +57 -22
  131. package/dist/proxy/proxyHandler.js.map +1 -1
  132. package/dist/proxy/requestNormalizer.js +4 -2
  133. package/dist/proxy/requestNormalizer.js.map +1 -1
  134. package/dist/reliability/costGovernance.js +211 -49
  135. package/dist/reliability/costGovernance.js.map +1 -1
  136. package/dist/reliability/index.d.ts +8 -8
  137. package/dist/reliability/index.js +4 -4
  138. package/dist/reliability/index.js.map +1 -1
  139. package/dist/reliability/reconciliation.js +274 -65
  140. package/dist/reliability/reconciliation.js.map +1 -1
  141. package/dist/reliability/runtimeHealth.js +127 -35
  142. package/dist/reliability/runtimeHealth.js.map +1 -1
  143. package/dist/reliability/slo.js +257 -50
  144. package/dist/reliability/slo.js.map +1 -1
  145. package/dist/report/safetyReport.d.ts +6 -0
  146. package/dist/report/safetyReport.js +56 -12
  147. package/dist/report/safetyReport.js.map +1 -1
  148. package/dist/rules/aiRules.js +5 -5
  149. package/dist/rules/aiRules.js.map +1 -1
  150. package/dist/safety/index.d.ts +2 -2
  151. package/dist/safety/index.js +1 -1
  152. package/dist/safety/index.js.map +1 -1
  153. package/dist/safety/safetyController.js +675 -165
  154. package/dist/safety/safetyController.js.map +1 -1
  155. package/dist/scenarios/scenarioBundle.js +204 -71
  156. package/dist/scenarios/scenarioBundle.js.map +1 -1
  157. package/dist/scenarios/scenarioStore.js +88 -29
  158. package/dist/scenarios/scenarioStore.js.map +1 -1
  159. package/dist/security/headerSanitizer.js +52 -10
  160. package/dist/security/headerSanitizer.js.map +1 -1
  161. package/dist/security/secrets.js +10 -5
  162. package/dist/security/secrets.js.map +1 -1
  163. package/dist/server/accessControl.js +37 -10
  164. package/dist/server/accessControl.js.map +1 -1
  165. package/dist/server/createServer.js +1 -1
  166. package/dist/server/createServer.js.map +1 -1
  167. package/dist/server/eventsStore.js +15 -5
  168. package/dist/server/eventsStore.js.map +1 -1
  169. package/dist/server/routes.js +67 -19
  170. package/dist/server/routes.js.map +1 -1
  171. package/dist/server/sse.js +1 -1
  172. package/dist/server/sse.js.map +1 -1
  173. package/dist/setup/sdkDetector.js +7 -2
  174. package/dist/setup/sdkDetector.js.map +1 -1
  175. package/dist/setup/setupGenerator.js +136 -48
  176. package/dist/setup/setupGenerator.js.map +1 -1
  177. package/dist/state/stateExtractor.js +3 -1
  178. package/dist/state/stateExtractor.js.map +1 -1
  179. package/dist/state/stateResolver.js +10 -7
  180. package/dist/state/stateResolver.js.map +1 -1
  181. package/dist/state/stateStore.js +13 -4
  182. package/dist/state/stateStore.js.map +1 -1
  183. package/dist/storage/fileStore.js +12 -4
  184. package/dist/storage/fileStore.js.map +1 -1
  185. package/dist/teamControl/controlPlane.js +846 -174
  186. package/dist/teamControl/controlPlane.js.map +1 -1
  187. package/dist/teamControl/deployment.js +19 -5
  188. package/dist/teamControl/deployment.js.map +1 -1
  189. package/dist/teamControl/index.d.ts +4 -4
  190. package/dist/teamControl/index.js +2 -2
  191. package/dist/teamControl/index.js.map +1 -1
  192. package/dist/tests/testGenerator.js +15 -7
  193. package/dist/tests/testGenerator.js.map +1 -1
  194. package/dist/trust/index.d.ts +2 -2
  195. package/dist/trust/index.js +1 -1
  196. package/dist/trust/index.js.map +1 -1
  197. package/dist/trust/trustLadder.js +309 -63
  198. package/dist/trust/trustLadder.js.map +1 -1
  199. package/dist/worlds/index.d.ts +2 -2
  200. package/dist/worlds/index.js +1 -1
  201. package/dist/worlds/index.js.map +1 -1
  202. package/dist/worlds/worlds.js +364 -65
  203. package/dist/worlds/worlds.js.map +1 -1
  204. package/docs/assets/dashboard.png +0 -0
  205. package/docs/assets/ghostapi-avatar.png +0 -0
  206. package/docs/ci.md +49 -49
  207. package/docs/github-actions.md +84 -84
  208. package/docs/mcp.md +58 -52
  209. package/docs/policy.md +63 -61
  210. package/docs/providers/authoring-packs.md +180 -175
  211. package/docs/providers/stripe-core-pack.md +84 -82
  212. package/docs/releases/README.md +13 -0
  213. package/docs/security/action-gateway-threat-model.md +34 -34
  214. package/docs/security/action-ledger-incident-replay-threat-model.md +42 -42
  215. package/docs/security/approval-inbox-threat-model.md +35 -35
  216. package/docs/security/credential-broker-threat-model.md +52 -52
  217. package/docs/security/egress-threat-model.md +126 -126
  218. package/docs/security/inventory-threat-model.md +104 -104
  219. package/docs/security/kill-switch-budgets-threat-model.md +37 -37
  220. package/docs/security/reliability-threat-model.md +111 -111
  221. package/docs/security/trust-ladder-threat-model.md +33 -33
  222. package/docs/telemetry.md +14 -0
  223. package/docs/usage.md +680 -571
  224. package/examples/README.md +10 -10
  225. package/examples/agent-instructions/README.md +39 -39
  226. package/examples/ci-smoke/README.md +21 -21
  227. package/examples/ci-smoke/ghostapi.policy.yaml +22 -22
  228. package/examples/ci-smoke/package.json +9 -9
  229. package/examples/ci-smoke/production-egress.mjs +4 -2
  230. package/examples/ci-smoke/safe.mjs +21 -17
  231. package/examples/evals/README.md +24 -24
  232. package/examples/evals/retry-after.eval.json +71 -52
  233. package/examples/generic-rest/README.md +27 -27
  234. package/examples/github-fetch/README.md +38 -35
  235. package/examples/openai-streaming/README.md +16 -16
  236. package/examples/openai-streaming/streaming-tool-call.mjs +44 -31
  237. package/examples/policy/ghostapi.policy.yaml +27 -27
  238. package/examples/record-replay/README.md +19 -19
  239. package/examples/record-replay/replay-requests.json +22 -22
  240. package/examples/record-replay/stripe-checkout.har.json +30 -30
  241. package/examples/resend-node/README.md +22 -22
  242. package/examples/stripe-node/README.md +35 -35
  243. package/examples/stripe-node/checkout-flow.mjs +87 -61
  244. package/examples/twilio-node/README.md +21 -21
  245. package/examples/worlds/README.md +19 -19
  246. package/examples/worlds/subscription-recovery.mjs +21 -12
  247. package/package.json +28 -6
  248. package/dist/landing/assets/index-BXR41fAD.css +0 -1
  249. package/dist/landing/assets/index-CxWsopzP.css +0 -1
  250. package/dist/landing/assets/index-D8_ggMRE.js +0 -55
  251. package/dist/landing/assets/index-DZlpyhqd.js +0 -55
  252. package/dist/landing/assets/index-Dk-Xezs3.js +0 -55
  253. package/dist/landing/index.html +0 -15
  254. package/dist/landing/landing.d.ts +0 -3
  255. package/dist/landing/landing.js +0 -12
  256. package/dist/landing/landing.js.map +0 -1
  257. package/docs/commercial/README.md +0 -29
  258. package/docs/commercial/data-inventory.md +0 -36
  259. package/docs/commercial/manual-invoicing.md +0 -44
  260. package/docs/commercial/metrics.md +0 -51
  261. package/docs/commercial/pricing.md +0 -103
  262. package/docs/commercial/privacy-policy-draft.md +0 -41
  263. package/docs/commercial/terms-topics-for-counsel.md +0 -51
  264. package/docs/design-partners/README.md +0 -52
  265. package/docs/design-partners/demo-narratives.md +0 -33
  266. package/docs/design-partners/design-partner-offer.md +0 -39
  267. package/docs/design-partners/discovery-questions.md +0 -28
  268. package/docs/design-partners/feedback-capture-template.md +0 -48
  269. package/docs/design-partners/icp-one-pager.md +0 -43
  270. package/docs/design-partners/onboarding-checklist.md +0 -33
  271. package/docs/design-partners/pilot-success-criteria.md +0 -27
  272. package/docs/design-partners/pricing-interview-script.md +0 -18
  273. package/docs/design-partners/telemetry-plan.md +0 -48
  274. package/docs/development/baseline.md +0 -114
  275. package/docs/development/onboarding-smoke.md +0 -37
  276. package/docs/development/verification-0.1.8.md +0 -25
  277. package/docs/enterprise-product-roadmap-ru.md +0 -1879
  278. package/docs/fundraising/README.md +0 -87
  279. package/docs/fundraising/data-room-checklist.md +0 -72
  280. package/docs/fundraising/demo-script.md +0 -52
  281. package/docs/fundraising/design-partners-50.md +0 -74
  282. package/docs/fundraising/launch-posts.md +0 -37
  283. package/docs/fundraising/metrics-and-evidence.md +0 -30
  284. package/docs/fundraising/roadmap-12-month.md +0 -25
  285. package/docs/fundraising/technical-due-diligence-index.md +0 -37
  286. package/docs/fundraising/yc-application.md +0 -25
  287. package/docs/hosted-pilot.md +0 -111
  288. package/docs/operations/disaster-recovery-runbook.md +0 -81
  289. package/docs/operations/kill-switch-runbook.md +0 -32
  290. package/docs/release-checklist.md +0 -83
  291. package/docs/release-migration-and-rollback.md +0 -63
  292. package/docs/release-readiness.md +0 -39
  293. package/docs/team-control-plane.md +0 -72
package/CHANGELOG.md CHANGED
@@ -4,6 +4,27 @@ All notable changes to GhostAPI will be documented in this file.
4
4
 
5
5
  The format follows the spirit of [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project uses semantic versioning once public releases begin.
6
6
 
7
+ ## Unreleased
8
+
9
+ ## 0.2.0 - 2026-09-01
10
+
11
+ ### Security
12
+
13
+ - Corrected evidence semantics so unmeasured production-egress attempt counts are reported as `not measured` instead of a fabricated zero.
14
+ - Reframed the bounded repository safety scan as a provider-risk heuristic scan and exposed its file, size, and extension limits.
15
+ - Removed external font requests from the local dashboard and added a regression test for external dashboard asset URLs.
16
+ - Added CodeQL, OSV, OpenSSF Scorecard, Dependabot, container scanning, coverage thresholds, and retained Linux egress test output.
17
+ - Added locked compatibility tests for the official Stripe `22.6.0` and OpenAI `7.8.0` Node SDKs against a loopback-only GhostAPI server.
18
+
19
+ ### Changed
20
+
21
+ - Repositioned GhostAPI as an AI-assisted local API simulation experiment with explicit non-goals and no customer-validation claims.
22
+ - Added project provenance, contribution authorship guidance, full-tree formatting, and type-aware ESLint parsing.
23
+ - Corrected 36 pre-0.2 Git author and committer identities from an accidental local tool identity to the contributing maintainer while preserving file trees, messages, and dates.
24
+ - Removed fundraising, commercial, design-partner, community-operations, and enterprise-roadmap material from the public tree and npm package.
25
+ - Added a release workflow for signed annotated tags, exact-tarball smoke testing, checksums, SBOM generation, build attestations, npm provenance, and post-publish `gitHead` verification.
26
+ - Centered the README hero and dashboard product identity, and added responsive navigation and request/detail layouts for mobile screens.
27
+
7
28
  ## 0.1.8 - 2026-08-22
8
29
 
9
30
  ### Security
package/CONTRIBUTING.md CHANGED
@@ -1,119 +1,132 @@
1
- # Contributing to GhostAPI
2
-
3
- Thanks for helping improve GhostAPI. This project aims to be small, safe, local-first, and useful for developers and AI coding agents.
4
-
5
- ## Setup
6
-
7
- Requirements:
8
-
9
- - Node.js 20 or newer
10
- - npm
11
-
12
- Install dependencies:
13
-
14
- ```bash
15
- npm install
16
- ```
17
-
18
- Run the local development server:
19
-
20
- ```bash
21
- npm run dev
22
- ```
23
-
24
- Open:
25
-
26
- ```text
27
- http://localhost:8080/dashboard
28
- ```
29
-
30
- ## Scripts
31
-
32
- ```bash
33
- npm run typecheck
34
- npm run lint
35
- npm test
36
- npm run build
37
- npm run dev
38
- ```
39
-
40
- Use these before opening a pull request:
41
-
42
- ```bash
43
- npm run typecheck
44
- npm run lint
45
- npm test
46
- npm run build
47
- ```
48
-
49
- ## Tests
50
-
51
- Tests are written with Vitest and must stay local-only. Do not add tests that call real Stripe, Twilio, Resend, GitHub, OpenAI, or any other external API.
52
-
53
- Current test areas include:
54
-
55
- - Secret masking
56
- - Provider detection
57
- - Cache key stability
58
- - State save/read/list/delete
59
- - Provider error formatting
60
- - Prompt construction and JSON repair
61
- - Proxy flow integration
62
- - Dashboard/SSE event formatting
63
-
64
- Shared fixtures live in `test/fixtures/`.
65
-
66
- ## Coding Style
67
-
68
- - TypeScript strict mode.
69
- - ESM modules.
70
- - Prefer functions and simple objects over classes.
71
- - Keep modules small and direct.
72
- - Avoid `any`; use `unknown` and narrow values where possible.
73
- - Add comments only where behavior is not obvious.
74
- - Keep user-facing errors actionable.
75
- - Do not introduce network calls to real provider APIs by default.
76
-
77
- ## Adding A Provider
78
-
79
- GhostAPI intentionally keeps native adapters limited. For the MVP, native adapters are:
80
-
81
- - Stripe
82
- - Twilio
83
- - Resend
84
- - GitHub
85
- - Discord
86
- - OpenAI
87
- - Generic fallback
88
-
89
- Before adding a new native adapter, ask whether generic fallback plus prompt hints is enough. Native adapters should be reserved for providers where contract-specific behavior, validation, or error formatting is clearly worth maintaining.
90
-
91
- If a native adapter is justified:
92
-
93
- 1. Read `docs/providers/authoring-packs.md`.
94
- 2. Add one built-in pack under `src/providers/packs/`.
95
- 3. Register it in `src/providers/registry.ts` without changing generic fallback.
96
- 4. Add deterministic conformance fixtures and provider regression tests.
97
- 5. Do not import network, filesystem, environment, or state-store capabilities into the pack.
98
- 6. Update README provider coverage and the versioned capability manifest.
99
-
100
- ## Adding Prompt Hints
101
-
102
- Most services should use generic fallback. To improve generic behavior:
103
-
104
- 1. Add or refine lightweight inference in `src/ai/genericInference.ts`.
105
- 2. Keep labels best-effort, such as `generic:shopify-like`.
106
- 3. Do not add provider-specific validation or error formats for generic services.
107
- 4. Add tests in `test/genericInference.test.ts`.
108
- 5. Update README coverage if the change affects documented behavior.
109
-
110
- ## Pull Request Checklist
111
-
112
- - The change is scoped and explained clearly.
113
- - `npm run typecheck` passes.
114
- - `npm test` passes.
115
- - `npm run build` passes.
116
- - New behavior has tests when practical.
117
- - No real external API calls were added by default.
118
- - Secrets are not logged, cached, sent to LLM prompts, or exposed in dashboard payloads.
119
- - README or examples are updated when user-facing behavior changes.
1
+ # Contributing to GhostAPI
2
+
3
+ Thanks for helping improve GhostAPI. This project aims to be small, safe, local-first, and useful for developers and AI coding agents.
4
+
5
+ ## Setup
6
+
7
+ Requirements:
8
+
9
+ - Node.js 20 or newer
10
+ - npm
11
+
12
+ Install dependencies from the lockfile:
13
+
14
+ ```bash
15
+ npm ci
16
+ ```
17
+
18
+ Run the local development server:
19
+
20
+ ```bash
21
+ npm run dev
22
+ ```
23
+
24
+ Open:
25
+
26
+ ```text
27
+ http://localhost:8080/dashboard
28
+ ```
29
+
30
+ ## Scripts
31
+
32
+ ```bash
33
+ npm run typecheck
34
+ npm run lint
35
+ npm test
36
+ npm run test:coverage
37
+ npm run build
38
+ npm run dev
39
+ ```
40
+
41
+ Use these before opening a pull request:
42
+
43
+ ```bash
44
+ npm run typecheck
45
+ npm run lint
46
+ npm test
47
+ npm run test:coverage
48
+ npm run build
49
+ ```
50
+
51
+ ## Tests
52
+
53
+ Tests are written with Vitest and must stay local-only. Do not add tests that call real Stripe, Twilio, Resend, GitHub, OpenAI, or any other external API.
54
+
55
+ Current test areas include:
56
+
57
+ - Secret masking
58
+ - Provider detection
59
+ - Cache key stability
60
+ - State save/read/list/delete
61
+ - Provider error formatting
62
+ - Prompt construction and JSON repair
63
+ - Proxy flow integration
64
+ - Dashboard/SSE event formatting
65
+
66
+ Shared fixtures live in `test/fixtures/`.
67
+
68
+ ## Coding Style
69
+
70
+ - TypeScript strict mode.
71
+ - ESM modules.
72
+ - Prefer functions and simple objects over classes.
73
+ - Keep modules small and direct.
74
+ - Avoid `any`; use `unknown` and narrow values where possible.
75
+ - Add comments only where behavior is not obvious.
76
+ - Keep user-facing errors actionable.
77
+ - Do not introduce network calls to real provider APIs by default.
78
+
79
+ ## Adding A Provider
80
+
81
+ GhostAPI intentionally keeps native adapters limited. For the MVP, native adapters are:
82
+
83
+ - Stripe
84
+ - Twilio
85
+ - Resend
86
+ - GitHub
87
+ - Discord
88
+ - OpenAI
89
+ - Generic fallback
90
+
91
+ Before adding a new native adapter, ask whether generic fallback plus prompt hints is enough. Native adapters should be reserved for providers where contract-specific behavior, validation, or error formatting is clearly worth maintaining.
92
+
93
+ If a native adapter is justified:
94
+
95
+ 1. Read `docs/providers/authoring-packs.md`.
96
+ 2. Add one built-in pack under `src/providers/packs/`.
97
+ 3. Register it in `src/providers/registry.ts` without changing generic fallback.
98
+ 4. Add deterministic conformance fixtures and provider regression tests.
99
+ 5. Do not import network, filesystem, environment, or state-store capabilities into the pack.
100
+ 6. Update README provider coverage and the versioned capability manifest.
101
+
102
+ ## Adding Prompt Hints
103
+
104
+ Most services should use generic fallback. To improve generic behavior:
105
+
106
+ 1. Add or refine lightweight inference in `src/ai/genericInference.ts`.
107
+ 2. Keep labels best-effort, such as `generic:shopify-like`.
108
+ 3. Do not add provider-specific validation or error formats for generic services.
109
+ 4. Add tests in `test/genericInference.test.ts`.
110
+ 5. Update README coverage if the change affects documented behavior.
111
+
112
+ ## Pull Request Checklist
113
+
114
+ - The change is scoped and explained clearly.
115
+ - `npm run typecheck` passes.
116
+ - `npm test` passes.
117
+ - `npm run build` passes.
118
+ - New behavior has tests when practical.
119
+ - No real external API calls were added by default.
120
+ - Secrets are not logged, cached, sent to LLM prompts, or exposed in dashboard payloads.
121
+ - README or examples are updated when user-facing behavior changes.
122
+
123
+ ## Authorship And Commits
124
+
125
+ - Use a human Git author for commits. Do not commit as `OpenCode <opencode@localhost>`.
126
+ - Add `Assisted-by: OpenCode` only when AI assistance was substantial and materially affected the change.
127
+ - Use pull requests and squash merge for changes to `main`.
128
+ - Use focused Conventional Commit titles such as `fix(egress): reject unsupported allow hosts` or `docs(readme): clarify provider coverage`.
129
+ - Preferred scopes are `provider`, `policy`, `egress`, `sanitizer`, `dashboard`, `mcp`, `hosted`, `release`, and `docs`.
130
+ - Do not combine unrelated security, feature, and documentation work into one commit.
131
+
132
+ See [`PROVENANCE.md`](PROVENANCE.md) for the project authorship statement.
package/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 GhostAPI contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 GhostAPI contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/PROVENANCE.md ADDED
@@ -0,0 +1,13 @@
1
+ # Project Provenance
2
+
3
+ GhostAPI is maintained by Yiaany.
4
+
5
+ AI-assisted development tools, including OpenCode, were used for code generation, review, test generation, documentation drafting, and refactoring. The maintainer selected the architecture, defined product and security boundaries, reviewed and modified generated changes, ran verification, and accepts responsibility for the published code.
6
+
7
+ AI assistance does not imply independent authorship. No claim is made that every line was typed manually.
8
+
9
+ Security-sensitive changes require maintainer review, tests, and release evidence from the exact published commit.
10
+
11
+ On September 1, 2026, the pre-0.2 history was rewritten to correct 36 commits accidentally recorded under the local `OpenCode <opencode@localhost>` identity to `hizyyo <kapolol2266@gmail.com>`. The reviewed replacement preserved every file tree, commit message, author date, and committer date; PR #20 records the validation and application procedure. This metadata correction does not remove this disclosure of AI-assisted development.
12
+
13
+ New changes should use a human author and may include an `Assisted-by: OpenCode` trailer when the assistance was substantial.
package/README.md CHANGED
@@ -1,33 +1,24 @@
1
- <h1 align="center">GhostAPI</h1>
2
-
3
- <p align="center">
4
- <strong>The local internet for AI coding agents.</strong>
5
- </p>
6
-
7
- <p align="center">
8
- Build and test third-party API integrations locally, without charging cards, sending messages, leaking production keys, or mutating real services.
9
- </p>
10
-
11
- <p align="center">
1
+ <div align="center">
2
+ <img src="docs/assets/ghostapi-avatar.png" alt="GhostAPI logo" width="88" height="88">
3
+ <h1>GhostAPI</h1>
4
+ <p><strong>Local API simulation and test evidence for AI-assisted development.</strong></p>
5
+ <p>GhostAPI gives applications and coding agents a local target for selected Stripe, Resend, OpenAI, Twilio, GitHub, Discord, and generic REST workflows. It records heuristically sanitized traffic, injects deterministic failures, exposes MCP controls, and turns captured behavior into repeatable tests.</p>
6
+ <p>On supported Linux hosts, <code>ghostapi run</code> can execute a test command inside a loopback-only network namespace. It is not a hostile-code or filesystem sandbox.</p>
7
+ <p>
12
8
  <a href="https://www.npmjs.com/package/@yiaany/ghostapi"><img alt="npm" src="https://img.shields.io/npm/v/@yiaany/ghostapi?color=0f172a&label=npm"></a>
13
9
  <a href="https://github.com/yiaany/ghostapi/blob/main/LICENSE"><img alt="license" src="https://img.shields.io/badge/license-MIT-0f172a"></a>
14
10
  <a href="https://github.com/yiaany/ghostapi/actions/workflows/ci.yml"><img alt="ci" src="https://github.com/yiaany/ghostapi/actions/workflows/ci.yml/badge.svg"></a>
15
11
  <img alt="node" src="https://img.shields.io/badge/node-%3E%3D20-0f172a">
16
12
  <img alt="MCP" src="https://img.shields.io/badge/MCP-enabled-0f172a">
17
- </p>
18
-
19
- <p align="center">
20
- <a href="#quickstart">Quickstart</a> ·
21
- <a href="#what-you-get">Features</a> ·
22
- <a href="#provider-support">Providers</a> ·
23
- <a href="#mcp-for-agents">MCP</a> ·
24
- <a href="#safety-boundaries">Safety</a> ·
25
- <a href="#hosted-and-enterprise">Enterprise</a>
26
- </p>
27
-
28
- ```bash
29
- npx @yiaany/ghostapi start --open
30
- ```
13
+ </p>
14
+ <p>
15
+ <a href="#quickstart">Quickstart</a> ·
16
+ <a href="SECURITY.md">Security model</a> ·
17
+ <a href="docs/providers/">Provider coverage</a> ·
18
+ <a href="docs/releases/">Release evidence</a>
19
+ </p>
20
+ <p><code>npx @yiaany/ghostapi start --open</code></p>
21
+ </div>
31
22
 
32
23
  <p align="center">
33
24
  <img src="docs/assets/dashboard.png" alt="GhostAPI dashboard with live local Stripe, OpenAI, and REST traffic">
@@ -37,7 +28,7 @@ npx @yiaany/ghostapi start --open
37
28
 
38
29
  Coding agents can write a Stripe checkout, an OpenAI workflow, a GitHub automation, or an email integration in minutes. The dangerous part is what happens when they run that code.
39
30
 
40
- Without a safe local target, a test can:
31
+ When a client is configured against a live provider, a test can:
41
32
 
42
33
  - charge a real card;
43
34
  - send a real email or SMS;
@@ -45,7 +36,11 @@ Without a safe local target, a test can:
45
36
  - spend API credits;
46
37
  - leak credentials into logs, prompts, screenshots, or test fixtures.
47
38
 
48
- GhostAPI gives your application and coding agent a local API world at `127.0.0.1:8080`. Requests are detected, sanitized, recorded, and answered with deterministic provider-shaped responses. You can inspect the result in the dashboard, control behavior through MCP, and turn failures into repeatable tests.
39
+ GhostAPI provides a local endpoint at `127.0.0.1:8080`. Requests sent to that endpoint are classified, heuristically sanitized, recorded in bounded local stores, and answered by implemented provider packs or generic fallback behavior. You can inspect the result in the dashboard, control local behavior through MCP, and turn captured failures into repeatable tests.
40
+
41
+ ## Verified Locally, Not Customer-Validated Yet
42
+
43
+ The public repository contains reproducible tests for local provider simulation, Linux namespace enforcement, package installation, and hosted-pilot authorization. GhostAPI does not yet claim production customers, paid pilots, or a deployed team service.
49
44
 
50
45
  ## Quickstart
51
46
 
@@ -85,20 +80,20 @@ On Windows and macOS, `ghostapi run` fails closed because an equivalent process-
85
80
 
86
81
  ## What You Get
87
82
 
88
- | Feature | What it does |
89
- | --- | --- |
90
- | Local API sandbox | Gives SDKs and applications a local target instead of a live provider. |
91
- | Provider-shaped behavior | Returns realistic objects, validation errors, rate limits, declines, and failure payloads. |
92
- | Live dashboard | Shows requests and responses, filters traffic by provider, generates tests, and arms scenarios. |
93
- | MCP control plane | Lets compatible coding agents inspect state, read traffic, configure responses, and toggle Chaos Mode. |
94
- | Stateful synthetic worlds | Maintains deterministic local identities and state across Stripe, GitHub, email, and REST projections. |
95
- | Scenarios and record/replay | Saves sanitized sandbox traffic and replays it offline as deterministic fixtures. |
96
- | Contract drift checks | Imports bounded OpenAPI/HAR contracts and classifies breaking, non-breaking, and uncertain changes. |
97
- | Agent evals and evidence | Produces redacted, tamper-evident reports for local review and CI policy gates. |
98
- | Secret protection | Masks secret-shaped headers, query parameters, bodies, paths, events, prompts, and cache inputs. |
99
- | Fault testing | Forces latency, provider errors, card declines, rate limits, and other unhappy paths. |
100
- | Safety controls | Includes local approvals, scoped budgets, kill switches, circuit breakers, ledgers, and reconciliation for synthetic actions. |
101
- | Reliability tooling | Tracks local SLO samples, cost attribution, runtime health, backups, inventory, and attack-path metadata. |
83
+ | Feature | What it does |
84
+ | --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
85
+ | Local API simulation | Gives explicitly configured SDKs and applications a local target instead of a live provider. |
86
+ | Provider-shaped behavior | Returns deterministic objects and errors shaped like the implemented subset of each provider API; it does not claim live-provider parity. |
87
+ | Live dashboard | Shows requests and responses, filters traffic by provider, generates tests, and arms scenarios. |
88
+ | MCP control plane | Lets compatible coding agents inspect state, read traffic, configure responses, and toggle Chaos Mode. |
89
+ | Stateful synthetic worlds | Maintains deterministic local identities and state across Stripe, GitHub, email, and REST projections. |
90
+ | Scenarios and record/replay | Saves sanitized sandbox traffic and replays it offline as deterministic fixtures. |
91
+ | Contract drift checks | Imports bounded OpenAPI/HAR contracts and classifies breaking, non-breaking, and uncertain changes. |
92
+ | Agent evals and evidence | Produces bounded reports with a local self-consistency hash, verifiable while the runtime and local storage remain trusted. |
93
+ | Secret-risk reduction | Heuristically masks recognized secret-shaped headers, query parameters, bodies, paths, events, prompts, and cache inputs. |
94
+ | Fault testing | Forces latency, provider errors, card declines, rate limits, and other unhappy paths. |
95
+ | Safety controls | Includes local approvals, scoped budgets, kill switches, circuit breakers, ledgers, and reconciliation for synthetic actions. |
96
+ | Reliability tooling | Tracks local SLO samples, cost attribution, runtime health, backups, inventory, and attack-path metadata. |
102
97
 
103
98
  ## Dashboard
104
99
 
@@ -120,16 +115,16 @@ GhostAPI has two levels of provider support.
120
115
 
121
116
  ### Stateful provider packs
122
117
 
123
- | Provider | Included behavior |
124
- | --- | --- |
125
- | Stripe | Customers, products, prices, subscriptions, invoices, payment intents, payment methods, checkout sessions, refunds, pagination, lifecycle scenarios, and signed local webhooks. |
126
- | Resend | Deterministic email-shaped requests, responses, validation, and failure behavior. |
118
+ | Provider | Included behavior |
119
+ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
120
+ | Stripe | Customers, products, prices, subscriptions, invoices, payment intents, payment methods, checkout sessions, refunds, pagination, lifecycle scenarios, and signed local webhooks. |
121
+ | Resend | Deterministic email-shaped requests, responses, validation, and failure behavior. |
127
122
 
128
123
  ### Provider-shaped adapters and generic inference
129
124
 
130
- OpenAI, Twilio, GitHub, Discord, and generic REST routes are detected and receive provider-shaped mock responses and errors. These adapters are useful for local development, but they do not claim complete parity with every live-provider endpoint.
125
+ OpenAI, Twilio, GitHub, Discord, and generic REST routes are detected and receive provider-shaped synthetic responses and errors. These adapters are useful for local development, but they do not claim complete parity with live-provider endpoints.
131
126
 
132
- Unsupported endpoints fail diagnostically instead of silently pretending that an operation succeeded.
127
+ Unsupported Stripe and Resend pack operations fail diagnostically. Legacy adapters and generic REST inference may return a synthetic fallback response for unrecognized routes; such responses do not indicate provider support or parity.
133
128
 
134
129
  ## SDK Setup
135
130
 
@@ -143,8 +138,8 @@ export const stripe = new Stripe(
143
138
  {
144
139
  host: process.env.GHOSTAPI_HOST ?? "127.0.0.1",
145
140
  port: Number(process.env.GHOSTAPI_PORT ?? "8080"),
146
- protocol: process.env.GHOSTAPI_PROTOCOL ?? "http"
147
- }
141
+ protocol: process.env.GHOSTAPI_PROTOCOL ?? "http",
142
+ },
148
143
  );
149
144
  ```
150
145
 
@@ -155,7 +150,7 @@ import OpenAI from "openai";
155
150
 
156
151
  export const openai = new OpenAI({
157
152
  apiKey: process.env.OPENAI_API_KEY ?? "sk-ghostapi",
158
- baseURL: process.env.GHOSTAPI_OPENAI_BASE_URL ?? "http://127.0.0.1:8080/v1"
153
+ baseURL: process.env.GHOSTAPI_OPENAI_BASE_URL ?? "http://127.0.0.1:8080/v1",
159
154
  });
160
155
  ```
161
156
 
@@ -182,7 +177,7 @@ Generic MCP configuration:
182
177
  "mcpServers": {
183
178
  "ghostapi": {
184
179
  "command": "npx",
185
- "args": ["-y", "@yiaany/ghostapi", "mcp"]
180
+ "args": ["-y", "@yiaany/ghostapi@0.2.0", "mcp"]
186
181
  }
187
182
  }
188
183
  }
@@ -190,11 +185,11 @@ Generic MCP configuration:
190
185
 
191
186
  Available tools:
192
187
 
193
- | Tool | Purpose |
194
- | --- | --- |
195
- | `inspect_state` | Read current local API objects. |
196
- | `get_traffic_logs` | Inspect sanitized recent traffic. |
197
- | `set_api_behavior` | Force a deterministic response for a method and path. |
188
+ | Tool | Purpose |
189
+ | ------------------- | ------------------------------------------------------ |
190
+ | `inspect_state` | Read current local API objects. |
191
+ | `get_traffic_logs` | Inspect sanitized recent traffic. |
192
+ | `set_api_behavior` | Force a deterministic response for a method and path. |
198
193
  | `toggle_chaos_mode` | Enable or disable local latency and failure injection. |
199
194
 
200
195
  Generate setup snippets for Cursor, Claude, Cline, Aider, Codex, OpenCode, Gemini CLI, Goose, OpenClaw, Hermes, and generic MCP clients:
@@ -203,6 +198,8 @@ Generate setup snippets for Cursor, Claude, Cline, Aider, Codex, OpenCode, Gemin
203
198
  npx @yiaany/ghostapi setup --write
204
199
  ```
205
200
 
201
+ Connect only trusted local MCP clients. MCP tools can read retained traffic and state and can modify local simulation behavior; MCP is not an authentication or egress boundary. Pin the package version in persistent MCP configuration or use a reviewed local installation.
202
+
206
203
  ## Scenarios, Contracts, And Evals
207
204
 
208
205
  Record approved sandbox traffic into a sanitized offline bundle:
@@ -246,30 +243,40 @@ ghostapi eval \
246
243
  --ci
247
244
  ```
248
245
 
249
- ## Safety Boundaries
246
+ ## Security Boundaries
250
247
 
251
- GhostAPI is designed to fail closed, but its boundaries are explicit:
248
+ GhostAPI uses local-first defaults, explicit external-LLM opt-in, and heuristic secret masking. Its boundaries are explicit:
252
249
 
253
250
  - Real provider calls are disabled by default.
254
251
  - Ambient `OPENAI_API_KEY` does not enable external generation.
255
252
  - External LLM generation requires an explicit flag plus a separate `GHOSTAPI_LLM_API_KEY`.
256
- - Non-loopback access requires a strong dashboard token.
253
+ - On non-loopback binds, every route except `/` and `/health` requires a strong `GHOSTAPI_AUTH_TOKEN`. The token provides access control, not encryption.
257
254
  - External response redirects, unsafe response headers, traversal, remote schema references, symlinks, archives, and oversized inputs are rejected where applicable.
258
255
  - Persistent stores have size, entry, retention, or rotation limits.
259
256
  - The Linux `run` backend provides loopback-only process network isolation when namespace preflight succeeds.
260
257
  - `run` is not a hostile-code filesystem sandbox.
261
- - Secret masking is heuristic. Use synthetic credentials and data even in local fixtures.
258
+ - Secret masking is heuristic and incomplete. Use synthetic credentials and data even in local fixtures.
262
259
  - Local approval, action, credential, ledger, trust, and safety components execute synthetic operations only. They are not a production-provider executor.
260
+ - Evidence hashes are local self-consistency checks, not signatures, immutable provenance, or proof against a same-user editor.
261
+ - Current run evidence records namespace lifecycle and GhostAPI-local traffic; it does not enumerate kernel-denied socket attempts.
263
262
 
264
263
  Read the detailed threat models in [`docs/security`](docs/security) and the reporting policy in [`SECURITY.md`](SECURITY.md).
265
264
 
265
+ ## Explicit Non-Goals
266
+
267
+ - No live-provider parity guarantee.
268
+ - No complete secret-redaction guarantee.
269
+ - No hostile-code filesystem sandbox.
270
+ - No equivalent process-egress enforcement on Windows or macOS.
271
+ - No deployed hosted service, SLA, compliance certification, or production credential executor.
272
+
266
273
  ## Platform Support
267
274
 
268
- | Platform | Local API and dashboard | `ghostapi run` enforcement |
269
- | --- | --- | --- |
270
- | Linux | Supported on Node.js 20+ | Supported when `unshare`, `iproute2`, and namespace preflight pass. |
271
- | Windows | Supported on Node.js 20+ | Not implemented; fails closed. |
272
- | macOS | Supported on Node.js 20+ | Not implemented; fails closed. |
275
+ | Platform | Local API and dashboard | `ghostapi run` enforcement |
276
+ | -------- | ------------------------ | ------------------------------------------------------------------- |
277
+ | Linux | Supported on Node.js 20+ | Supported when `unshare`, `iproute2`, and namespace preflight pass. |
278
+ | Windows | Supported on Node.js 20+ | Not implemented; fails closed. |
279
+ | macOS | Supported on Node.js 20+ | Not implemented; fails closed. |
273
280
 
274
281
  Check the current machine:
275
282
 
@@ -285,20 +292,9 @@ GET /health process liveness, HTTP 200 while state can be evaluated
285
292
  GET /health/readiness structural readiness, HTTP 503 when a required store is unsafe
286
293
  ```
287
294
 
288
- ## Hosted And Enterprise
289
-
290
- The `hosted/` directory contains an implemented but not yet deployed team pilot. It includes:
291
-
292
- - organizations, projects, invitations, memberships, and role-based access;
293
- - tenant-safe report and scenario APIs;
294
- - hashed and rotatable CI ingest keys;
295
- - bounded request handling, CSRF checks, security headers, quotas, and abuse limits;
296
- - PostgreSQL migrations, idempotency, outbox dispatch, worker leases, retries, dead letters, and retention cleanup;
297
- - Redis-backed rate limiting, QStash verification, readiness checks, and a non-root Docker image.
298
-
299
- It is not advertised as a production SaaS yet. Live OAuth, Redis, QStash, load, failover, backup/restore, and disaster-recovery behavior must still be proven in staging before a paid pilot.
295
+ ## Hosted Experiment
300
296
 
301
- The detailed product plan for a complete enterprise edition is available in [`docs/enterprise-product-roadmap-ru.md`](docs/enterprise-product-roadmap-ru.md).
297
+ No hosted or enterprise service is currently available. The `hosted/` directory is an undeployed experimental implementation, excluded from the npm package and unsupported for production use. Its live OAuth, dependency, migration, load, failover, backup, and disaster-recovery behavior has not been proven in staging.
302
298
 
303
299
  ## Development
304
300
 
@@ -307,6 +303,7 @@ npm ci
307
303
  npm run lint
308
304
  npm run typecheck
309
305
  npm test
306
+ npm run test:coverage
310
307
  npm run build
311
308
  npm run smoke:package
312
309
  ```
@@ -319,7 +316,7 @@ npm ci
319
316
  npm run check
320
317
  ```
321
318
 
322
- See [`CONTRIBUTING.md`](CONTRIBUTING.md), [`docs/release-readiness.md`](docs/release-readiness.md), and [`docs/development/verification-0.1.8.md`](docs/development/verification-0.1.8.md) for the complete verification boundary.
319
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md), [`PROVENANCE.md`](PROVENANCE.md), and [`docs/releases/`](docs/releases/) for the contribution and release boundaries.
323
320
 
324
321
  ## Documentation
325
322
 
@@ -331,9 +328,10 @@ See [`CONTRIBUTING.md`](CONTRIBUTING.md), [`docs/release-readiness.md`](docs/rel
331
328
  - [Stripe provider pack](docs/providers/stripe-core-pack.md)
332
329
  - [Security policy](SECURITY.md)
333
330
  - [Threat models](docs/security)
331
+ - [Project provenance](PROVENANCE.md)
332
+ - [Release evidence](docs/releases/)
334
333
  - [Release readiness](docs/release-readiness.md)
335
334
  - [Migration and rollback](docs/release-migration-and-rollback.md)
336
- - [Enterprise roadmap in Russian](docs/enterprise-product-roadmap-ru.md)
337
335
 
338
336
  ## License
339
337