pulse-coding-agent 0.1.1__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 (113) hide show
  1. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/CHANGELOG.md +82 -63
  2. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/PKG-INFO +14 -11
  3. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/README.md +194 -191
  4. pulse_coding_agent-0.1.2/hatch_build.py +94 -0
  5. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/pyproject.toml +97 -92
  6. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/__init__.py +5 -5
  7. pulse_coding_agent-0.1.2/src/pulse/_product_oauth.json +5 -0
  8. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/agent.py +492 -270
  9. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/agent_manager.py +30 -20
  10. pulse_coding_agent-0.1.2/src/pulse/auth.py +1239 -0
  11. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/cli.py +781 -538
  12. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/cli_ui.py +1129 -977
  13. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/edits.py +95 -65
  14. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/interactive.py +250 -234
  15. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mutations.py +290 -283
  16. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/anthropic.py +68 -65
  17. pulse_coding_agent-0.1.2/src/pulse/providers/auto.py +96 -0
  18. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/base.py +54 -30
  19. pulse_coding_agent-0.1.2/src/pulse/providers/discovery.py +153 -0
  20. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/gemini.py +69 -66
  21. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/manager.py +228 -95
  22. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/openai.py +46 -40
  23. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/rpc.py +248 -249
  24. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/runtime.py +235 -217
  25. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/project.py +168 -158
  26. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/task_manager.py +425 -417
  27. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/tools.py +377 -372
  28. pulse_coding_agent-0.1.1/src/pulse/_product_oauth.json +0 -4
  29. pulse_coding_agent-0.1.1/src/pulse/auth.py +0 -762
  30. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/.gitignore +0 -0
  31. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/PRIVACY.md +0 -0
  32. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/SECURITY.md +0 -0
  33. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/__main__.py +0 -0
  34. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/audit.py +0 -0
  35. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/ci/github_client.py +0 -0
  36. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/ci/runner.py +0 -0
  37. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/config.py +0 -0
  38. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/context.py +0 -0
  39. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/conversations/__init__.py +0 -0
  40. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/conversations/manager.py +0 -0
  41. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/core/agent.py +0 -0
  42. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/core/planner.py +0 -0
  43. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/core/protocols.py +0 -0
  44. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/episodic.py +0 -0
  45. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/eval/__init__.py +0 -0
  46. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/eval/trajectory_logger.py +0 -0
  47. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/eval/verifier.py +0 -0
  48. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/execution/__init__.py +0 -0
  49. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/execution/remote_task.py +0 -0
  50. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/git.py +0 -0
  51. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mcp/__init__.py +0 -0
  52. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mcp/client.py +0 -0
  53. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mcp/local_tools.py +0 -0
  54. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/memory.py +0 -0
  55. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/orchestration/__init__.py +0 -0
  56. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/orchestration/orchestrator.py +0 -0
  57. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/patch.py +0 -0
  58. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/planner/__init__.py +0 -0
  59. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/planner/dag_planner.py +0 -0
  60. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/planner/execution_loop.py +0 -0
  61. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/production.py +0 -0
  62. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/provider.py +0 -0
  63. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/provider_keys.py +0 -0
  64. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/__init__.py +0 -0
  65. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/deepseek.py +0 -0
  66. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/failover.py +0 -0
  67. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/groq.py +0 -0
  68. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/openrouter.py +0 -0
  69. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/py.typed +0 -0
  70. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/reasoning.py +0 -0
  71. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/refactor/__init__.py +0 -0
  72. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/refactor/impact_analyzer.py +0 -0
  73. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/repository.py +0 -0
  74. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/rule_synthesizer.py +0 -0
  75. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/safety/__init__.py +0 -0
  76. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/safety/safety_manager.py +0 -0
  77. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/SECURITY.md +0 -0
  78. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/__init__.py +0 -0
  79. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/api.py +0 -0
  80. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/audit.py +0 -0
  81. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/__init__.py +0 -0
  82. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/base.py +0 -0
  83. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/docker.py +0 -0
  84. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/host.py +0 -0
  85. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/remote.py +0 -0
  86. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/errors.py +0 -0
  87. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/filesystem.py +0 -0
  88. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/git_safe.py +0 -0
  89. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/lifecycle.py +0 -0
  90. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/network.py +0 -0
  91. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/path_validator.py +0 -0
  92. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/policy.py +0 -0
  93. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/process.py +0 -0
  94. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/python_safe.py +0 -0
  95. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/__init__.py +0 -0
  96. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/client.py +0 -0
  97. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/models.py +0 -0
  98. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/protocol.py +0 -0
  99. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/server.py +0 -0
  100. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/worker.py +0 -0
  101. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/resources.py +0 -0
  102. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/secrets.py +0 -0
  103. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/session_manager.py +0 -0
  104. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/software_engineer.py +0 -0
  105. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/storage.py +0 -0
  106. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/streaming.py +0 -0
  107. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/subprocesses.py +0 -0
  108. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/__init__.py +0 -0
  109. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/cost_tracker.py +0 -0
  110. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/logger.py +0 -0
  111. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/tool_policy.py +0 -0
  112. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/tool_registry.py +0 -0
  113. {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/verification.py +0 -0
@@ -1,63 +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
- ## [0.1.1] - 2026-09-04
9
-
10
- ### Added
11
-
12
- - Product-owned Google Desktop OAuth configuration is embedded in official
13
- builds, so installed users can sign in without creating a `.env` file.
14
- - Release verification now rejects missing/placeholder OAuth configuration,
15
- confidential client secrets, developer-only source content, and local home
16
- directory paths in published artifacts.
17
- - Post-login BYOK onboarding now guides provider and model selection before
18
- collecting the selected provider key through hidden terminal input.
19
- - Provider keys are stored in workspace-scoped native OS credential-vault
20
- entries, with safe status, rotation, and removal through `pulse keys`.
21
-
22
- ### Changed
23
-
24
- - Google login uses PKCE with a dynamically allocated `127.0.0.1` callback port
25
- and no confidential client secret in the distributed application.
26
- - Source distributions contain only the files needed to build and understand
27
- the product, rather than repository tests, scripts, evals, and local templates.
28
- - Successful key set or rotation migrates that provider away from a legacy
29
- plaintext workspace `.env` entry without ever displaying the secret.
30
-
31
- ## [0.1.0] - 2026-08-29
32
-
33
- ### Added
34
-
35
- - Permissioned local coding-agent CLI with repository intelligence, durable
36
- tasks, conversations, mutation tracking, provider routing, and loopback RPC.
37
- - Docker and authenticated remote sandbox implementations with policy,
38
- resource, filesystem, network, secret-redaction, and recovery tests.
39
- - Configured remote execution is preferred on client machines, with local
40
- Docker/Podman used as the secure fallback and no implicit host execution.
41
- - Production doctor, correlation IDs, remote health/readiness endpoints,
42
- operations/security documentation, and explicit deployment boundaries.
43
- - Reproducible wheel/source builds, artifact-content verification, clean-install
44
- smoke tests, cross-platform CI, coverage gate, dependency audit, secret scan,
45
- OIDC trusted-publishing workflow, release checksums, source manifest, and
46
- CycloneDX SBOM.
47
- - Direct application dependencies pinned to the versions exercised by the
48
- release suite, preventing unreviewed major-version drift at installation.
49
- - Explicit live-Docker test markers, a single no-skip Docker security gate, and
50
- stable Windows pytest teardown behavior in hosted CI.
51
- - Public `version` and secure provider-key rotation commands, simplified OAuth
52
- login/logout UX, authenticated Google userinfo verification, and literal-safe
53
- terminal rendering for untrusted text.
54
- - Non-root Docker overlay export that avoids archive metadata preservation on
55
- bind mounts, preventing successful sandbox commands from exiting with 125.
56
-
57
- ### Known limitations
58
-
59
- - The supported release boundary is local and single-user.
60
- - Hosted tenancy, centralized observability, and independent multi-tenant
61
- security validation are outside the supported beta boundary.
62
- - The VS Code extension is not included in the Python release; it remains
63
- 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.1
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
@@ -49,10 +49,10 @@ tracking in one Python package.
49
49
 
50
50
  ## Install
51
51
 
52
- Install the first beta from PyPI with `pip`:
52
+ Install the current beta from PyPI with `pip`:
53
53
 
54
54
  ```bash
55
- python -m pip install pulse-coding-agent==0.1.1
55
+ python -m pip install pulse-coding-agent==0.1.2
56
56
  ```
57
57
 
58
58
  The PyPI distribution name is `pulse-coding-agent`; the Python import and
@@ -62,10 +62,10 @@ belongs to an unrelated WSGI package published in 2009.
62
62
  For an isolated command-line installation, use `uv` or `pipx`:
63
63
 
64
64
  ```bash
65
- uv tool install pulse-coding-agent==0.1.1
65
+ uv tool install pulse-coding-agent==0.1.2
66
66
  ```
67
67
 
68
- Alternatively, use `pipx install pulse-coding-agent==0.1.1`.
68
+ Alternatively, use `pipx install pulse-coding-agent==0.1.2`.
69
69
 
70
70
  ## Quick start
71
71
 
@@ -79,10 +79,12 @@ pulse ask "Explain this repository and identify the highest-risk missing test"
79
79
 
80
80
  After Google login, Pulse guides provider selection, model selection, and hidden
81
81
  BYOK entry. New provider keys are stored in the native OS credential vault.
82
- The official distribution already contains Pulse's public Google Desktop OAuth
83
- identity; installed users do not create a `.env` file or provide OAuth client
84
- credentials. Provider API keys are collected through hidden terminal input and
85
- are not written to the project.
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.
86
88
 
87
89
  To run commands without installing Docker on the client workstation, configure
88
90
  a remote worker:
@@ -168,7 +170,7 @@ operator-managed fallback sources.
168
170
 
169
171
  ## Supported boundary
170
172
 
171
- The 0.1.1 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
172
174
  user on one workstation. Pulse does not claim a security boundary between
173
175
  mutually untrusted tenants. Do not expose `pulse-rpc` or `pulse-remote` directly
174
176
  to the public internet.
@@ -199,8 +201,9 @@ Run the local quality gates:
199
201
  uv run ruff check src tests scripts
200
202
  uv run mypy
201
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
202
205
  uv build
203
- uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.1
206
+ uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.2
204
207
  ```
205
208
 
206
209
  Docker security tests require a working Docker daemon and are enforced by the
@@ -1,191 +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.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 first beta from PyPI with `pip`:
23
-
24
- ```bash
25
- python -m pip install pulse-coding-agent==0.1.1
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.1
36
- ```
37
-
38
- Alternatively, use `pipx install pulse-coding-agent==0.1.1`.
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 public Google Desktop OAuth
53
- identity; installed users do not create a `.env` file or provide OAuth client
54
- credentials. Provider API keys are collected through hidden terminal input and
55
- are not written to the project.
56
-
57
- To run commands without installing Docker on the client workstation, configure
58
- a remote worker:
59
-
60
- ```text
61
- PULSE_REMOTE_URL=wss://sandbox.example.com
62
- PULSE_REMOTE_TOKEN=<random token of at least 32 characters>
63
- PULSE_TLS_CERT=/absolute/path/to/client.crt
64
- PULSE_TLS_KEY=/absolute/path/to/client.key
65
- PULSE_TLS_CA=/absolute/path/to/ca.crt
66
- ```
67
-
68
- When those variables are set, Pulse tries the remote sandbox first and uses a
69
- local Docker/Podman engine only as a secure fallback. The remote worker host
70
- still requires Docker or Podman; execution never silently falls back to the
71
- client host.
72
-
73
- Before allowing mutations or shell execution, review the proposed operation and
74
- its permission prompt. Treat model output, tool arguments, and repository
75
- content as untrusted input.
76
-
77
- ## What the beta includes
78
-
79
- - Repository indexing and context-aware conversations
80
- - Durable plans, tasks, sessions, episodic memory, and recovery state
81
- - Permission-gated file mutations with transactional rollback
82
- - Host, Docker, Podman, and authenticated remote sandbox backends
83
- - Filesystem, network, resource, timeout, and secret-redaction policies
84
- - Multi-provider model routing and usage/cost accounting
85
- - Loopback JSON-RPC integration through `pulse-rpc` or `pulse serve`
86
- - Production preflight checks, structured audit events, and correlation IDs
87
-
88
- The package installs three entry points:
89
-
90
- ```text
91
- pulse Interactive CLI
92
- pulse-rpc Loopback JSON-RPC server
93
- pulse-remote Evaluation-only remote sandbox worker
94
- ```
95
-
96
- Use `pulse --help` for the current command surface and command-specific help.
97
- `pulse-rpc` and `pulse serve` require a strong `PULSE_RPC_TOKEN` bearer secret
98
- and must stay bound to loopback.
99
-
100
- ### Interactive shell
101
-
102
- Run `pulse` without arguments for the responsive project shell. Natural-language
103
- input goes to the agent; prefix any regular CLI command with `/` to run it in the
104
- same session, such as `/status`, `/keys list`, or `/chat switch ID`. Completions
105
- appear as you type and are always generated from the public CLI parser.
106
-
107
- - `Tab` or `Ctrl-Space`: open/accept command completion
108
- - `Up`/`Down`: navigate history; `Ctrl-R`: search history
109
- - `Alt-Enter`: insert a newline; `Enter`: submit
110
- - `Ctrl-C`: clear the current input; on an empty prompt, exit
111
- - `/help`, `/clear`, and `/exit`: shell controls
112
-
113
- History is stored locally in the Git-ignored `.pulse/history` file.
114
-
115
- ### Account and provider keys
116
-
117
- ```bash
118
- pulse version
119
- pulse login
120
- pulse auth-status
121
- pulse whoami
122
- pulse logout
123
- pulse keys
124
- pulse keys list
125
- pulse keys set openai
126
- pulse keys rotate openai
127
- pulse keys remove openai
128
- ```
129
-
130
- `pulse keys` opens the status and rotation manager. Set and rotate operations
131
- prompt with hidden input; provider keys are never accepted as command-line
132
- arguments or printed back to the terminal. New keys are stored in a
133
- workspace-scoped entry in the native OS credential vault. Existing `.env` keys
134
- remain readable for compatibility and are removed for that provider after a
135
- successful vault-backed set or rotation. Pulse never creates a `.env` file.
136
- Process environment variables and external secret managers remain supported as
137
- operator-managed fallback sources.
138
-
139
- ## Supported boundary
140
-
141
- The 0.1.1 beta supports the local CLI and loopback RPC server for one trusted
142
- user on one workstation. Pulse does not claim a security boundary between
143
- mutually untrusted tenants. Do not expose `pulse-rpc` or `pulse-remote` directly
144
- to the public internet.
145
-
146
- The remote worker requires authenticated transport, durable configuration, and
147
- container isolation. It remains evaluation-only until tenant isolation,
148
- centralized observability, load testing, disaster-recovery exercises, and an
149
- independent security review are complete. The VS Code extension is source-only
150
- and is not part of the Python distribution.
151
-
152
- Pulse sends prompts and selected repository context to the configured model
153
- provider. Data handling therefore also depends on that provider's terms and
154
- settings. Pulse itself does not include product analytics or telemetry export
155
- in this beta.
156
-
157
- ## Development
158
-
159
- Clone the repository and create the locked development environment:
160
-
161
- ```bash
162
- uv sync --locked
163
- uv run pulse --help
164
- ```
165
-
166
- Run the local quality gates:
167
-
168
- ```bash
169
- uv run ruff check src tests scripts
170
- uv run mypy
171
- uv run pytest tests/ -k "not sandbox" --cov=pulse --cov-report=term-missing --cov-fail-under=54
172
- uv build
173
- uv run python scripts/verify_release_artifacts.py dist --expected-version 0.1.1
174
- ```
175
-
176
- Docker security tests require a working Docker daemon and are enforced by the
177
- hosted release workflow. See [OPERATIONS.md](OPERATIONS.md) for release and
178
- rollback procedures.
179
-
180
- ## Documentation
181
-
182
- - [Architecture](ARCHITECTURE.md)
183
- - [Operations and releases](OPERATIONS.md)
184
- - [Security policy](SECURITY.md)
185
- - [Sandbox security boundary](src/pulse/sandbox/SECURITY.md)
186
- - [Privacy policy](PRIVACY.md)
187
- - [Changelog](CHANGELOG.md)
188
-
189
- To report a vulnerability, use GitHub private vulnerability reporting instead
190
- of a public issue. General defects and beta feedback belong in the
191
- [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).