pulse-coding-agent 0.1.0__tar.gz → 0.1.2__tar.gz

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 (201) hide show
  1. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/.gitignore +0 -1
  2. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/CHANGELOG.md +82 -52
  3. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/PKG-INFO +27 -14
  4. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/README.md +194 -180
  5. pulse_coding_agent-0.1.2/hatch_build.py +94 -0
  6. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/pyproject.toml +97 -101
  7. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/__init__.py +5 -5
  8. pulse_coding_agent-0.1.2/src/pulse/_product_oauth.json +5 -0
  9. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/agent.py +492 -270
  10. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/agent_manager.py +30 -20
  11. pulse_coding_agent-0.1.2/src/pulse/auth.py +1239 -0
  12. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/cli.py +780 -536
  13. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/cli_ui.py +1129 -977
  14. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/edits.py +95 -65
  15. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/interactive.py +250 -234
  16. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/mutations.py +290 -283
  17. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/anthropic.py +68 -65
  18. pulse_coding_agent-0.1.2/src/pulse/providers/auto.py +96 -0
  19. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/base.py +54 -30
  20. pulse_coding_agent-0.1.2/src/pulse/providers/discovery.py +153 -0
  21. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/gemini.py +69 -66
  22. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/manager.py +228 -95
  23. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/openai.py +46 -40
  24. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/rpc.py +248 -249
  25. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/runtime.py +235 -217
  26. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/project.py +168 -158
  27. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/task_manager.py +425 -417
  28. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/tools.py +377 -372
  29. pulse_coding_agent-0.1.0/.env.example +0 -39
  30. pulse_coding_agent-0.1.0/ARCHITECTURE.md +0 -119
  31. pulse_coding_agent-0.1.0/OPERATIONS.md +0 -161
  32. pulse_coding_agent-0.1.0/agent.config.json +0 -25
  33. pulse_coding_agent-0.1.0/evals/provider-live-v1.json +0 -19
  34. pulse_coding_agent-0.1.0/evals/release-v1.json +0 -54
  35. pulse_coding_agent-0.1.0/scripts/__init__.py +0 -1
  36. pulse_coding_agent-0.1.0/scripts/finalize_sbom.py +0 -67
  37. pulse_coding_agent-0.1.0/scripts/generate_release_metadata.py +0 -88
  38. pulse_coding_agent-0.1.0/scripts/run_docker_release_tests.py +0 -69
  39. pulse_coding_agent-0.1.0/scripts/run_provider_e2e.py +0 -97
  40. pulse_coding_agent-0.1.0/scripts/run_release_evals.py +0 -87
  41. pulse_coding_agent-0.1.0/scripts/verify_release_artifacts.py +0 -191
  42. pulse_coding_agent-0.1.0/src/pulse/auth.py +0 -670
  43. pulse_coding_agent-0.1.0/tests/conftest.py +0 -38
  44. pulse_coding_agent-0.1.0/tests/test_agent_manager.py +0 -173
  45. pulse_coding_agent-0.1.0/tests/test_architecture_contracts.py +0 -109
  46. pulse_coding_agent-0.1.0/tests/test_auth.py +0 -227
  47. pulse_coding_agent-0.1.0/tests/test_ci.py +0 -59
  48. pulse_coding_agent-0.1.0/tests/test_cli_entrypoint.py +0 -90
  49. pulse_coding_agent-0.1.0/tests/test_cli_flow.py +0 -139
  50. pulse_coding_agent-0.1.0/tests/test_cli_ui.py +0 -55
  51. pulse_coding_agent-0.1.0/tests/test_context.py +0 -458
  52. pulse_coding_agent-0.1.0/tests/test_conversation_manager.py +0 -287
  53. pulse_coding_agent-0.1.0/tests/test_core_agent.py +0 -56
  54. pulse_coding_agent-0.1.0/tests/test_correlation.py +0 -69
  55. pulse_coding_agent-0.1.0/tests/test_dag_and_impact.py +0 -88
  56. pulse_coding_agent-0.1.0/tests/test_docker_release_gate.py +0 -30
  57. pulse_coding_agent-0.1.0/tests/test_edits.py +0 -59
  58. pulse_coding_agent-0.1.0/tests/test_episodic_rules.py +0 -82
  59. pulse_coding_agent-0.1.0/tests/test_eval_harness.py +0 -90
  60. pulse_coding_agent-0.1.0/tests/test_execution_loop_failover.py +0 -65
  61. pulse_coding_agent-0.1.0/tests/test_git.py +0 -33
  62. pulse_coding_agent-0.1.0/tests/test_interactive.py +0 -158
  63. pulse_coding_agent-0.1.0/tests/test_mcp.py +0 -102
  64. pulse_coding_agent-0.1.0/tests/test_memory.py +0 -31
  65. pulse_coding_agent-0.1.0/tests/test_mutations.py +0 -40
  66. pulse_coding_agent-0.1.0/tests/test_orchestrator_safety.py +0 -43
  67. pulse_coding_agent-0.1.0/tests/test_patch.py +0 -96
  68. pulse_coding_agent-0.1.0/tests/test_planner.py +0 -86
  69. pulse_coding_agent-0.1.0/tests/test_production.py +0 -167
  70. pulse_coding_agent-0.1.0/tests/test_provider.py +0 -62
  71. pulse_coding_agent-0.1.0/tests/test_provider_e2e.py +0 -60
  72. pulse_coding_agent-0.1.0/tests/test_provider_manager.py +0 -142
  73. pulse_coding_agent-0.1.0/tests/test_provider_system.py +0 -58
  74. pulse_coding_agent-0.1.0/tests/test_public_cli.py +0 -274
  75. pulse_coding_agent-0.1.0/tests/test_reasoning.py +0 -222
  76. pulse_coding_agent-0.1.0/tests/test_release_artifacts.py +0 -75
  77. pulse_coding_agent-0.1.0/tests/test_release_evals.py +0 -57
  78. pulse_coding_agent-0.1.0/tests/test_release_metadata.py +0 -65
  79. pulse_coding_agent-0.1.0/tests/test_release_workflows.py +0 -42
  80. pulse_coding_agent-0.1.0/tests/test_remote_reconciliation.py +0 -143
  81. pulse_coding_agent-0.1.0/tests/test_repository.py +0 -50
  82. pulse_coding_agent-0.1.0/tests/test_rpc.py +0 -73
  83. pulse_coding_agent-0.1.0/tests/test_runtime.py +0 -49
  84. pulse_coding_agent-0.1.0/tests/test_sandbox.py +0 -30
  85. pulse_coding_agent-0.1.0/tests/test_sandbox_cow_adversarial.py +0 -112
  86. pulse_coding_agent-0.1.0/tests/test_sandbox_cow_crash.py +0 -227
  87. pulse_coding_agent-0.1.0/tests/test_sandbox_cow_hard_crash.py +0 -160
  88. pulse_coding_agent-0.1.0/tests/test_sandbox_lifecycle_recovery.py +0 -143
  89. pulse_coding_agent-0.1.0/tests/test_sandbox_phase1.py +0 -171
  90. pulse_coding_agent-0.1.0/tests/test_sandbox_phase2.py +0 -85
  91. pulse_coding_agent-0.1.0/tests/test_sandbox_phase3.py +0 -151
  92. pulse_coding_agent-0.1.0/tests/test_sandbox_phase4.py +0 -72
  93. pulse_coding_agent-0.1.0/tests/test_sandbox_phase5.py +0 -103
  94. pulse_coding_agent-0.1.0/tests/test_sandbox_phase7_network.py +0 -219
  95. pulse_coding_agent-0.1.0/tests/test_sandbox_phase8_secrets.py +0 -241
  96. pulse_coding_agent-0.1.0/tests/test_sandbox_r2_security.py +0 -486
  97. pulse_coding_agent-0.1.0/tests/test_sandbox_remote_auth.py +0 -60
  98. pulse_coding_agent-0.1.0/tests/test_sandbox_remote_security.py +0 -36
  99. pulse_coding_agent-0.1.0/tests/test_sandbox_resource_bombs.py +0 -78
  100. pulse_coding_agent-0.1.0/tests/test_sandbox_security.py +0 -849
  101. pulse_coding_agent-0.1.0/tests/test_sbom.py +0 -54
  102. pulse_coding_agent-0.1.0/tests/test_security_audit_regressions.py +0 -324
  103. pulse_coding_agent-0.1.0/tests/test_session_manager.py +0 -125
  104. pulse_coding_agent-0.1.0/tests/test_software_engineer.py +0 -140
  105. pulse_coding_agent-0.1.0/tests/test_storage.py +0 -111
  106. pulse_coding_agent-0.1.0/tests/test_streaming.py +0 -199
  107. pulse_coding_agent-0.1.0/tests/test_subprocesses.py +0 -80
  108. pulse_coding_agent-0.1.0/tests/test_task_execution_durability.py +0 -194
  109. pulse_coding_agent-0.1.0/tests/test_task_manager.py +0 -238
  110. pulse_coding_agent-0.1.0/tests/test_task_manager_concurrency.py +0 -280
  111. pulse_coding_agent-0.1.0/tests/test_task_manager_crash.py +0 -253
  112. pulse_coding_agent-0.1.0/tests/test_task_manager_lease_execution.py +0 -507
  113. pulse_coding_agent-0.1.0/tests/test_task_manager_migration.py +0 -53
  114. pulse_coding_agent-0.1.0/tests/test_telemetry.py +0 -88
  115. pulse_coding_agent-0.1.0/tests/test_tool_policy.py +0 -134
  116. pulse_coding_agent-0.1.0/tests/test_tool_registry.py +0 -52
  117. pulse_coding_agent-0.1.0/tests/test_verification.py +0 -57
  118. pulse_coding_agent-0.1.0/uv.lock +0 -1353
  119. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/PRIVACY.md +0 -0
  120. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/SECURITY.md +0 -0
  121. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/__main__.py +0 -0
  122. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/audit.py +0 -0
  123. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/ci/github_client.py +0 -0
  124. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/ci/runner.py +0 -0
  125. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/config.py +0 -0
  126. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/context.py +0 -0
  127. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/conversations/__init__.py +0 -0
  128. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/conversations/manager.py +0 -0
  129. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/core/agent.py +0 -0
  130. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/core/planner.py +0 -0
  131. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/core/protocols.py +0 -0
  132. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/episodic.py +0 -0
  133. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/eval/__init__.py +0 -0
  134. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/eval/trajectory_logger.py +0 -0
  135. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/eval/verifier.py +0 -0
  136. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/execution/__init__.py +0 -0
  137. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/execution/remote_task.py +0 -0
  138. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/git.py +0 -0
  139. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/mcp/__init__.py +0 -0
  140. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/mcp/client.py +0 -0
  141. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/mcp/local_tools.py +0 -0
  142. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/memory.py +0 -0
  143. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/orchestration/__init__.py +0 -0
  144. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/orchestration/orchestrator.py +0 -0
  145. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/patch.py +0 -0
  146. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/planner/__init__.py +0 -0
  147. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/planner/dag_planner.py +0 -0
  148. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/planner/execution_loop.py +0 -0
  149. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/production.py +0 -0
  150. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/provider.py +0 -0
  151. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/provider_keys.py +0 -0
  152. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/__init__.py +0 -0
  153. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/deepseek.py +0 -0
  154. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/failover.py +0 -0
  155. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/groq.py +0 -0
  156. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/providers/openrouter.py +0 -0
  157. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/py.typed +0 -0
  158. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/reasoning.py +0 -0
  159. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/refactor/__init__.py +0 -0
  160. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/refactor/impact_analyzer.py +0 -0
  161. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/repository.py +0 -0
  162. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/rule_synthesizer.py +0 -0
  163. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/safety/__init__.py +0 -0
  164. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/safety/safety_manager.py +0 -0
  165. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/SECURITY.md +0 -0
  166. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/__init__.py +0 -0
  167. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/api.py +0 -0
  168. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/audit.py +0 -0
  169. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/__init__.py +0 -0
  170. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/base.py +0 -0
  171. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/docker.py +0 -0
  172. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/host.py +0 -0
  173. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/remote.py +0 -0
  174. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/errors.py +0 -0
  175. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/filesystem.py +0 -0
  176. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/git_safe.py +0 -0
  177. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/lifecycle.py +0 -0
  178. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/network.py +0 -0
  179. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/path_validator.py +0 -0
  180. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/policy.py +0 -0
  181. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/process.py +0 -0
  182. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/python_safe.py +0 -0
  183. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/__init__.py +0 -0
  184. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/client.py +0 -0
  185. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/models.py +0 -0
  186. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/protocol.py +0 -0
  187. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/server.py +0 -0
  188. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/worker.py +0 -0
  189. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/resources.py +0 -0
  190. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/secrets.py +0 -0
  191. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/session_manager.py +0 -0
  192. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/software_engineer.py +0 -0
  193. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/storage.py +0 -0
  194. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/streaming.py +0 -0
  195. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/subprocesses.py +0 -0
  196. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/__init__.py +0 -0
  197. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/cost_tracker.py +0 -0
  198. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/logger.py +0 -0
  199. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/tool_policy.py +0 -0
  200. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/tool_registry.py +0 -0
  201. {pulse_coding_agent-0.1.0 → pulse_coding_agent-0.1.2}/src/pulse/verification.py +0 -0
@@ -1,7 +1,6 @@
1
1
  # Secrets and machine-specific configuration
2
2
  .env
3
3
  .env.*
4
- !.env.example
5
4
  *.pem
6
5
  *.key
7
6
  *.p12
@@ -1,52 +1,82 @@
1
- # Changelog
2
-
3
- All notable changes are recorded here. Pulse follows Semantic Versioning while
4
- pre-1.0 APIs may change with release notes and migration guidance.
5
-
6
- ## [Unreleased]
7
-
8
- ### Added
9
-
10
- - Post-login BYOK onboarding now guides provider and model selection before
11
- collecting the selected provider key through hidden terminal input.
12
- - Provider keys are stored in workspace-scoped native OS credential-vault
13
- entries, with safe status, rotation, and removal through `pulse keys`.
14
-
15
- ### Changed
16
-
17
- - Successful key set or rotation migrates that provider away from a legacy
18
- plaintext workspace `.env` entry without ever displaying the secret.
19
-
20
- ## [0.1.0] - 2026-08-29
21
-
22
- ### Added
23
-
24
- - Permissioned local coding-agent CLI with repository intelligence, durable
25
- tasks, conversations, mutation tracking, provider routing, and loopback RPC.
26
- - Docker and authenticated remote sandbox implementations with policy,
27
- resource, filesystem, network, secret-redaction, and recovery tests.
28
- - Configured remote execution is preferred on client machines, with local
29
- Docker/Podman used as the secure fallback and no implicit host execution.
30
- - Production doctor, correlation IDs, remote health/readiness endpoints,
31
- operations/security documentation, and explicit deployment boundaries.
32
- - Reproducible wheel/source builds, artifact-content verification, clean-install
33
- smoke tests, cross-platform CI, coverage gate, dependency audit, secret scan,
34
- OIDC trusted-publishing workflow, release checksums, source manifest, and
35
- CycloneDX SBOM.
36
- - Direct application dependencies pinned to the versions exercised by the
37
- release suite, preventing unreviewed major-version drift at installation.
38
- - Explicit live-Docker test markers, a single no-skip Docker security gate, and
39
- stable Windows pytest teardown behavior in hosted CI.
40
- - Public `version` and secure provider-key rotation commands, simplified OAuth
41
- login/logout UX, authenticated Google userinfo verification, and literal-safe
42
- terminal rendering for untrusted text.
43
- - Non-root Docker overlay export that avoids archive metadata preservation on
44
- bind mounts, preventing successful sandbox commands from exiting with 125.
45
-
46
- ### Known limitations
47
-
48
- - The supported release boundary is local and single-user.
49
- - Hosted tenancy, centralized observability, and independent multi-tenant
50
- security validation are outside the supported beta boundary.
51
- - The VS Code extension is not included in the Python release; it remains
52
- source-only and evaluation-only, and its legacy stdio transport is unsupported.
1
+ # Changelog
2
+
3
+ All notable changes are recorded here. Pulse follows Semantic Versioning while
4
+ pre-1.0 APIs may change with release notes and migration guidance.
5
+
6
+ ## [Unreleased]
7
+
8
+ ## [0.1.2] - 2026-09-05
9
+
10
+ ### Fixed
11
+
12
+ - Google authorization-code exchange and token refresh now send the Desktop
13
+ client credential required by Google's token endpoint. Google documents that
14
+ installed applications cannot keep this value confidential; PKCE remains the
15
+ authorization-code interception protection.
16
+ - Packaging now fails before creating a wheel or source distribution when the
17
+ product Google Desktop OAuth credentials are missing or malformed, preventing
18
+ the placeholder configuration shipped by the invalid 0.1.1 PyPI artifacts.
19
+ - The release workflow validates the configured credential pair against
20
+ Google's token endpoint before building.
21
+
22
+ ### Security
23
+
24
+ - Release operators must publish only through the protected trusted-publisher
25
+ workflow; direct uploads bypass provenance and release verification.
26
+
27
+ ## [0.1.1] - 2026-09-04
28
+
29
+ ### Added
30
+
31
+ - Product-owned Google Desktop OAuth configuration is embedded in official
32
+ builds, so installed users can sign in without creating a `.env` file.
33
+ - Release verification now rejects missing/placeholder OAuth configuration,
34
+ confidential client secrets, developer-only source content, and local home
35
+ directory paths in published artifacts.
36
+ - Post-login BYOK onboarding now guides provider and model selection before
37
+ collecting the selected provider key through hidden terminal input.
38
+ - Provider keys are stored in workspace-scoped native OS credential-vault
39
+ entries, with safe status, rotation, and removal through `pulse keys`.
40
+
41
+ ### Changed
42
+
43
+ - Google login uses PKCE with a dynamically allocated `127.0.0.1` callback port
44
+ and no confidential client secret in the distributed application.
45
+ - Source distributions contain only the files needed to build and understand
46
+ the product, rather than repository tests, scripts, evals, and local templates.
47
+ - Successful key set or rotation migrates that provider away from a legacy
48
+ plaintext workspace `.env` entry without ever displaying the secret.
49
+
50
+ ## [0.1.0] - 2026-08-29
51
+
52
+ ### Added
53
+
54
+ - Permissioned local coding-agent CLI with repository intelligence, durable
55
+ tasks, conversations, mutation tracking, provider routing, and loopback RPC.
56
+ - Docker and authenticated remote sandbox implementations with policy,
57
+ resource, filesystem, network, secret-redaction, and recovery tests.
58
+ - Configured remote execution is preferred on client machines, with local
59
+ Docker/Podman used as the secure fallback and no implicit host execution.
60
+ - Production doctor, correlation IDs, remote health/readiness endpoints,
61
+ operations/security documentation, and explicit deployment boundaries.
62
+ - Reproducible wheel/source builds, artifact-content verification, clean-install
63
+ smoke tests, cross-platform CI, coverage gate, dependency audit, secret scan,
64
+ OIDC trusted-publishing workflow, release checksums, source manifest, and
65
+ CycloneDX SBOM.
66
+ - Direct application dependencies pinned to the versions exercised by the
67
+ release suite, preventing unreviewed major-version drift at installation.
68
+ - Explicit live-Docker test markers, a single no-skip Docker security gate, and
69
+ stable Windows pytest teardown behavior in hosted CI.
70
+ - Public `version` and secure provider-key rotation commands, simplified OAuth
71
+ login/logout UX, authenticated Google userinfo verification, and literal-safe
72
+ terminal rendering for untrusted text.
73
+ - Non-root Docker overlay export that avoids archive metadata preservation on
74
+ bind mounts, preventing successful sandbox commands from exiting with 125.
75
+
76
+ ### Known limitations
77
+
78
+ - The supported release boundary is local and single-user.
79
+ - Hosted tenancy, centralized observability, and independent multi-tenant
80
+ security validation are outside the supported beta boundary.
81
+ - The VS Code extension is not included in the Python release; it remains
82
+ source-only and evaluation-only, and its legacy stdio transport is unsupported.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pulse-coding-agent
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Permissioned coding-agent CLI with durable planning and isolated execution.
5
5
  Project-URL: Homepage, https://github.com/Roastedpotato21/pulse
6
6
  Project-URL: Repository, https://github.com/Roastedpotato21/pulse
@@ -23,7 +23,6 @@ Requires-Dist: httpx==0.28.1
23
23
  Requires-Dist: keyring==25.7.0
24
24
  Requires-Dist: openai==2.44.0
25
25
  Requires-Dist: prompt-toolkit==3.0.52
26
- Requires-Dist: python-dotenv==1.2.2
27
26
  Requires-Dist: rich==15.0.0
28
27
  Requires-Dist: typer==0.26.8
29
28
  Requires-Dist: websockets==16.1
@@ -36,7 +35,7 @@ It combines repository-aware planning, durable task state, explicit mutation
36
35
  controls, sandboxed command execution, provider routing, audit trails, and cost
37
36
  tracking in one Python package.
38
37
 
39
- > **Public beta — 0.1.0:** Pulse is supported for controlled, local,
38
+ > **Public beta — 0.1.1:** Pulse is supported for controlled, local,
40
39
  > single-user use. The remote worker and VS Code extension are included for
41
40
  > evaluation and development, but they are not supported as multi-tenant or
42
41
  > unattended production services.
@@ -50,14 +49,23 @@ tracking in one Python package.
50
49
 
51
50
  ## Install
52
51
 
53
- Install the first beta from PyPI:
52
+ Install the current beta from PyPI with `pip`:
54
53
 
55
54
  ```bash
56
- uv tool install pulse-coding-agent==0.1.0
55
+ python -m pip install pulse-coding-agent==0.1.2
57
56
  ```
58
57
 
59
- Alternatively, use `pipx install pulse-coding-agent==0.1.0` or install it in a
60
- dedicated virtual environment with `pip`.
58
+ The PyPI distribution name is `pulse-coding-agent`; the Python import and
59
+ installed command are both `pulse`. Do not run `pip install pulse`: that name
60
+ belongs to an unrelated WSGI package published in 2009.
61
+
62
+ For an isolated command-line installation, use `uv` or `pipx`:
63
+
64
+ ```bash
65
+ uv tool install pulse-coding-agent==0.1.2
66
+ ```
67
+
68
+ Alternatively, use `pipx install pulse-coding-agent==0.1.2`.
61
69
 
62
70
  ## Quick start
63
71
 
@@ -71,9 +79,12 @@ pulse ask "Explain this repository and identify the highest-risk missing test"
71
79
 
72
80
  After Google login, Pulse guides provider selection, model selection, and hidden
73
81
  BYOK entry. New provider keys are stored in the native OS credential vault.
74
- Credentials can also be supplied through environment variables such as `OPENAI_API_KEY`,
75
- `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, or `OPENROUTER_API_KEY`. Do not commit a
76
- populated `.env` file.
82
+ The official distribution already contains Pulse's Google Desktop OAuth client
83
+ credentials; installed users do not create a `.env` file or provide them. As
84
+ with every installed application, these identify the application but cannot be
85
+ kept confidential on end-user machines; PKCE protects authorization-code
86
+ exchange. Provider API keys are collected through hidden terminal input and are
87
+ not written to the project.
77
88
 
78
89
  To run commands without installing Docker on the client workstation, configure
79
90
  a remote worker:
@@ -153,12 +164,13 @@ prompt with hidden input; provider keys are never accepted as command-line
153
164
  arguments or printed back to the terminal. New keys are stored in a
154
165
  workspace-scoped entry in the native OS credential vault. Existing `.env` keys
155
166
  remain readable for compatibility and are removed for that provider after a
156
- successful vault-backed set or rotation. Environment variables and external
157
- secret managers remain supported as fallback sources.
167
+ successful vault-backed set or rotation. Pulse never creates a `.env` file.
168
+ Process environment variables and external secret managers remain supported as
169
+ operator-managed fallback sources.
158
170
 
159
171
  ## Supported boundary
160
172
 
161
- The 0.1.0 beta supports the local CLI and loopback RPC server for one trusted
173
+ The 0.1.2 beta supports the local CLI and loopback RPC server for one trusted
162
174
  user on one workstation. Pulse does not claim a security boundary between
163
175
  mutually untrusted tenants. Do not expose `pulse-rpc` or `pulse-remote` directly
164
176
  to the public internet.
@@ -189,8 +201,9 @@ Run the local quality gates:
189
201
  uv run ruff check src tests scripts
190
202
  uv run mypy
191
203
  uv run pytest tests/ -k "not sandbox" --cov=pulse --cov-report=term-missing --cov-fail-under=54
204
+ PULSE_GOOGLE_CLIENT_ID=<desktop-client-id> PULSE_GOOGLE_CLIENT_SECRET=<desktop-credential> uv run python scripts/configure_product_oauth.py
192
205
  uv build
193
- uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.0
206
+ uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.2
194
207
  ```
195
208
 
196
209
  Docker security tests require a working Docker daemon and are enforced by the
@@ -1,180 +1,194 @@
1
- # Pulse
2
-
3
- Pulse is a permissioned coding-agent CLI for working on software repositories.
4
- It combines repository-aware planning, durable task state, explicit mutation
5
- controls, sandboxed command execution, provider routing, audit trails, and cost
6
- tracking in one Python package.
7
-
8
- > **Public beta — 0.1.0:** Pulse is supported for controlled, local,
9
- > single-user use. The remote worker and VS Code extension are included for
10
- > evaluation and development, but they are not supported as multi-tenant or
11
- > unattended production services.
12
-
13
- ## Requirements
14
-
15
- - Python 3.11, 3.12, or 3.13
16
- - An API key for the model provider you choose
17
- - Docker or Podman for local isolated execution, or access to a configured
18
- Pulse remote worker
19
-
20
- ## Install
21
-
22
- Install the first beta from PyPI:
23
-
24
- ```bash
25
- uv tool install pulse-coding-agent==0.1.0
26
- ```
27
-
28
- Alternatively, use `pipx install pulse-coding-agent==0.1.0` or install it in a
29
- dedicated virtual environment with `pip`.
30
-
31
- ## Quick start
32
-
33
- Run these commands from the repository you want Pulse to work on:
34
-
35
- ```bash
36
- pulse login
37
- pulse doctor --production --target local
38
- pulse ask "Explain this repository and identify the highest-risk missing test"
39
- ```
40
-
41
- After Google login, Pulse guides provider selection, model selection, and hidden
42
- BYOK entry. New provider keys are stored in the native OS credential vault.
43
- Credentials can also be supplied through environment variables such as `OPENAI_API_KEY`,
44
- `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, or `OPENROUTER_API_KEY`. Do not commit a
45
- populated `.env` file.
46
-
47
- To run commands without installing Docker on the client workstation, configure
48
- a remote worker:
49
-
50
- ```text
51
- PULSE_REMOTE_URL=wss://sandbox.example.com
52
- PULSE_REMOTE_TOKEN=<random token of at least 32 characters>
53
- PULSE_TLS_CERT=/absolute/path/to/client.crt
54
- PULSE_TLS_KEY=/absolute/path/to/client.key
55
- PULSE_TLS_CA=/absolute/path/to/ca.crt
56
- ```
57
-
58
- When those variables are set, Pulse tries the remote sandbox first and uses a
59
- local Docker/Podman engine only as a secure fallback. The remote worker host
60
- still requires Docker or Podman; execution never silently falls back to the
61
- client host.
62
-
63
- Before allowing mutations or shell execution, review the proposed operation and
64
- its permission prompt. Treat model output, tool arguments, and repository
65
- content as untrusted input.
66
-
67
- ## What the beta includes
68
-
69
- - Repository indexing and context-aware conversations
70
- - Durable plans, tasks, sessions, episodic memory, and recovery state
71
- - Permission-gated file mutations with transactional rollback
72
- - Host, Docker, Podman, and authenticated remote sandbox backends
73
- - Filesystem, network, resource, timeout, and secret-redaction policies
74
- - Multi-provider model routing and usage/cost accounting
75
- - Loopback JSON-RPC integration through `pulse-rpc` or `pulse serve`
76
- - Production preflight checks, structured audit events, and correlation IDs
77
-
78
- The package installs three entry points:
79
-
80
- ```text
81
- pulse Interactive CLI
82
- pulse-rpc Loopback JSON-RPC server
83
- pulse-remote Evaluation-only remote sandbox worker
84
- ```
85
-
86
- Use `pulse --help` for the current command surface and command-specific help.
87
- `pulse-rpc` and `pulse serve` require a strong `PULSE_RPC_TOKEN` bearer secret
88
- and must stay bound to loopback.
89
-
90
- ### Interactive shell
91
-
92
- Run `pulse` without arguments for the responsive project shell. Natural-language
93
- input goes to the agent; prefix any regular CLI command with `/` to run it in the
94
- same session, such as `/status`, `/keys list`, or `/chat switch ID`. Completions
95
- appear as you type and are always generated from the public CLI parser.
96
-
97
- - `Tab` or `Ctrl-Space`: open/accept command completion
98
- - `Up`/`Down`: navigate history; `Ctrl-R`: search history
99
- - `Alt-Enter`: insert a newline; `Enter`: submit
100
- - `Ctrl-C`: clear the current input; on an empty prompt, exit
101
- - `/help`, `/clear`, and `/exit`: shell controls
102
-
103
- History is stored locally in the Git-ignored `.pulse/history` file.
104
-
105
- ### Account and provider keys
106
-
107
- ```bash
108
- pulse version
109
- pulse login
110
- pulse auth-status
111
- pulse whoami
112
- pulse logout
113
- pulse keys
114
- pulse keys list
115
- pulse keys set openai
116
- pulse keys rotate openai
117
- pulse keys remove openai
118
- ```
119
-
120
- `pulse keys` opens the status and rotation manager. Set and rotate operations
121
- prompt with hidden input; provider keys are never accepted as command-line
122
- arguments or printed back to the terminal. New keys are stored in a
123
- workspace-scoped entry in the native OS credential vault. Existing `.env` keys
124
- remain readable for compatibility and are removed for that provider after a
125
- successful vault-backed set or rotation. Environment variables and external
126
- secret managers remain supported as fallback sources.
127
-
128
- ## Supported boundary
129
-
130
- The 0.1.0 beta supports the local CLI and loopback RPC server for one trusted
131
- user on one workstation. Pulse does not claim a security boundary between
132
- mutually untrusted tenants. Do not expose `pulse-rpc` or `pulse-remote` directly
133
- to the public internet.
134
-
135
- The remote worker requires authenticated transport, durable configuration, and
136
- container isolation. It remains evaluation-only until tenant isolation,
137
- centralized observability, load testing, disaster-recovery exercises, and an
138
- independent security review are complete. The VS Code extension is source-only
139
- and is not part of the Python distribution.
140
-
141
- Pulse sends prompts and selected repository context to the configured model
142
- provider. Data handling therefore also depends on that provider's terms and
143
- settings. Pulse itself does not include product analytics or telemetry export
144
- in this beta.
145
-
146
- ## Development
147
-
148
- Clone the repository and create the locked development environment:
149
-
150
- ```bash
151
- uv sync --locked
152
- uv run pulse --help
153
- ```
154
-
155
- Run the local quality gates:
156
-
157
- ```bash
158
- uv run ruff check src tests scripts
159
- uv run mypy
160
- uv run pytest tests/ -k "not sandbox" --cov=pulse --cov-report=term-missing --cov-fail-under=54
161
- uv build
162
- uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.0
163
- ```
164
-
165
- Docker security tests require a working Docker daemon and are enforced by the
166
- hosted release workflow. See [OPERATIONS.md](OPERATIONS.md) for release and
167
- rollback procedures.
168
-
169
- ## Documentation
170
-
171
- - [Architecture](ARCHITECTURE.md)
172
- - [Operations and releases](OPERATIONS.md)
173
- - [Security policy](SECURITY.md)
174
- - [Sandbox security boundary](src/pulse/sandbox/SECURITY.md)
175
- - [Privacy policy](PRIVACY.md)
176
- - [Changelog](CHANGELOG.md)
177
-
178
- To report a vulnerability, use GitHub private vulnerability reporting instead
179
- of a public issue. General defects and beta feedback belong in the
180
- [issue tracker](https://github.com/Roastedpotato21/pulse/issues).
1
+ # Pulse
2
+
3
+ Pulse is a permissioned coding-agent CLI for working on software repositories.
4
+ It combines repository-aware planning, durable task state, explicit mutation
5
+ controls, sandboxed command execution, provider routing, audit trails, and cost
6
+ tracking in one Python package.
7
+
8
+ > **Public beta — 0.1.1:** Pulse is supported for controlled, local,
9
+ > single-user use. The remote worker and VS Code extension are included for
10
+ > evaluation and development, but they are not supported as multi-tenant or
11
+ > unattended production services.
12
+
13
+ ## Requirements
14
+
15
+ - Python 3.11, 3.12, or 3.13
16
+ - An API key for the model provider you choose
17
+ - Docker or Podman for local isolated execution, or access to a configured
18
+ Pulse remote worker
19
+
20
+ ## Install
21
+
22
+ Install the current beta from PyPI with `pip`:
23
+
24
+ ```bash
25
+ python -m pip install pulse-coding-agent==0.1.2
26
+ ```
27
+
28
+ The PyPI distribution name is `pulse-coding-agent`; the Python import and
29
+ installed command are both `pulse`. Do not run `pip install pulse`: that name
30
+ belongs to an unrelated WSGI package published in 2009.
31
+
32
+ For an isolated command-line installation, use `uv` or `pipx`:
33
+
34
+ ```bash
35
+ uv tool install pulse-coding-agent==0.1.2
36
+ ```
37
+
38
+ Alternatively, use `pipx install pulse-coding-agent==0.1.2`.
39
+
40
+ ## Quick start
41
+
42
+ Run these commands from the repository you want Pulse to work on:
43
+
44
+ ```bash
45
+ pulse login
46
+ pulse doctor --production --target local
47
+ pulse ask "Explain this repository and identify the highest-risk missing test"
48
+ ```
49
+
50
+ After Google login, Pulse guides provider selection, model selection, and hidden
51
+ BYOK entry. New provider keys are stored in the native OS credential vault.
52
+ The official distribution already contains Pulse's Google Desktop OAuth client
53
+ credentials; installed users do not create a `.env` file or provide them. As
54
+ with every installed application, these identify the application but cannot be
55
+ kept confidential on end-user machines; PKCE protects authorization-code
56
+ exchange. Provider API keys are collected through hidden terminal input and are
57
+ not written to the project.
58
+
59
+ To run commands without installing Docker on the client workstation, configure
60
+ a remote worker:
61
+
62
+ ```text
63
+ PULSE_REMOTE_URL=wss://sandbox.example.com
64
+ PULSE_REMOTE_TOKEN=<random token of at least 32 characters>
65
+ PULSE_TLS_CERT=/absolute/path/to/client.crt
66
+ PULSE_TLS_KEY=/absolute/path/to/client.key
67
+ PULSE_TLS_CA=/absolute/path/to/ca.crt
68
+ ```
69
+
70
+ When those variables are set, Pulse tries the remote sandbox first and uses a
71
+ local Docker/Podman engine only as a secure fallback. The remote worker host
72
+ still requires Docker or Podman; execution never silently falls back to the
73
+ client host.
74
+
75
+ Before allowing mutations or shell execution, review the proposed operation and
76
+ its permission prompt. Treat model output, tool arguments, and repository
77
+ content as untrusted input.
78
+
79
+ ## What the beta includes
80
+
81
+ - Repository indexing and context-aware conversations
82
+ - Durable plans, tasks, sessions, episodic memory, and recovery state
83
+ - Permission-gated file mutations with transactional rollback
84
+ - Host, Docker, Podman, and authenticated remote sandbox backends
85
+ - Filesystem, network, resource, timeout, and secret-redaction policies
86
+ - Multi-provider model routing and usage/cost accounting
87
+ - Loopback JSON-RPC integration through `pulse-rpc` or `pulse serve`
88
+ - Production preflight checks, structured audit events, and correlation IDs
89
+
90
+ The package installs three entry points:
91
+
92
+ ```text
93
+ pulse Interactive CLI
94
+ pulse-rpc Loopback JSON-RPC server
95
+ pulse-remote Evaluation-only remote sandbox worker
96
+ ```
97
+
98
+ Use `pulse --help` for the current command surface and command-specific help.
99
+ `pulse-rpc` and `pulse serve` require a strong `PULSE_RPC_TOKEN` bearer secret
100
+ and must stay bound to loopback.
101
+
102
+ ### Interactive shell
103
+
104
+ Run `pulse` without arguments for the responsive project shell. Natural-language
105
+ input goes to the agent; prefix any regular CLI command with `/` to run it in the
106
+ same session, such as `/status`, `/keys list`, or `/chat switch ID`. Completions
107
+ appear as you type and are always generated from the public CLI parser.
108
+
109
+ - `Tab` or `Ctrl-Space`: open/accept command completion
110
+ - `Up`/`Down`: navigate history; `Ctrl-R`: search history
111
+ - `Alt-Enter`: insert a newline; `Enter`: submit
112
+ - `Ctrl-C`: clear the current input; on an empty prompt, exit
113
+ - `/help`, `/clear`, and `/exit`: shell controls
114
+
115
+ History is stored locally in the Git-ignored `.pulse/history` file.
116
+
117
+ ### Account and provider keys
118
+
119
+ ```bash
120
+ pulse version
121
+ pulse login
122
+ pulse auth-status
123
+ pulse whoami
124
+ pulse logout
125
+ pulse keys
126
+ pulse keys list
127
+ pulse keys set openai
128
+ pulse keys rotate openai
129
+ pulse keys remove openai
130
+ ```
131
+
132
+ `pulse keys` opens the status and rotation manager. Set and rotate operations
133
+ prompt with hidden input; provider keys are never accepted as command-line
134
+ arguments or printed back to the terminal. New keys are stored in a
135
+ workspace-scoped entry in the native OS credential vault. Existing `.env` keys
136
+ remain readable for compatibility and are removed for that provider after a
137
+ successful vault-backed set or rotation. Pulse never creates a `.env` file.
138
+ Process environment variables and external secret managers remain supported as
139
+ operator-managed fallback sources.
140
+
141
+ ## Supported boundary
142
+
143
+ The 0.1.2 beta supports the local CLI and loopback RPC server for one trusted
144
+ user on one workstation. Pulse does not claim a security boundary between
145
+ mutually untrusted tenants. Do not expose `pulse-rpc` or `pulse-remote` directly
146
+ to the public internet.
147
+
148
+ The remote worker requires authenticated transport, durable configuration, and
149
+ container isolation. It remains evaluation-only until tenant isolation,
150
+ centralized observability, load testing, disaster-recovery exercises, and an
151
+ independent security review are complete. The VS Code extension is source-only
152
+ and is not part of the Python distribution.
153
+
154
+ Pulse sends prompts and selected repository context to the configured model
155
+ provider. Data handling therefore also depends on that provider's terms and
156
+ settings. Pulse itself does not include product analytics or telemetry export
157
+ in this beta.
158
+
159
+ ## Development
160
+
161
+ Clone the repository and create the locked development environment:
162
+
163
+ ```bash
164
+ uv sync --locked
165
+ uv run pulse --help
166
+ ```
167
+
168
+ Run the local quality gates:
169
+
170
+ ```bash
171
+ uv run ruff check src tests scripts
172
+ uv run mypy
173
+ uv run pytest tests/ -k "not sandbox" --cov=pulse --cov-report=term-missing --cov-fail-under=54
174
+ PULSE_GOOGLE_CLIENT_ID=<desktop-client-id> PULSE_GOOGLE_CLIENT_SECRET=<desktop-credential> uv run python scripts/configure_product_oauth.py
175
+ uv build
176
+ uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.2
177
+ ```
178
+
179
+ Docker security tests require a working Docker daemon and are enforced by the
180
+ hosted release workflow. See [OPERATIONS.md](OPERATIONS.md) for release and
181
+ rollback procedures.
182
+
183
+ ## Documentation
184
+
185
+ - [Architecture](ARCHITECTURE.md)
186
+ - [Operations and releases](OPERATIONS.md)
187
+ - [Security policy](SECURITY.md)
188
+ - [Sandbox security boundary](src/pulse/sandbox/SECURITY.md)
189
+ - [Privacy policy](PRIVACY.md)
190
+ - [Changelog](CHANGELOG.md)
191
+
192
+ To report a vulnerability, use GitHub private vulnerability reporting instead
193
+ of a public issue. General defects and beta feedback belong in the
194
+ [issue tracker](https://github.com/Roastedpotato21/pulse/issues).