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.
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/CHANGELOG.md +82 -63
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/PKG-INFO +14 -11
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/README.md +194 -191
- pulse_coding_agent-0.1.2/hatch_build.py +94 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/pyproject.toml +97 -92
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/__init__.py +5 -5
- pulse_coding_agent-0.1.2/src/pulse/_product_oauth.json +5 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/agent.py +492 -270
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/agent_manager.py +30 -20
- pulse_coding_agent-0.1.2/src/pulse/auth.py +1239 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/cli.py +781 -538
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/cli_ui.py +1129 -977
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/edits.py +95 -65
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/interactive.py +250 -234
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mutations.py +290 -283
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/anthropic.py +68 -65
- pulse_coding_agent-0.1.2/src/pulse/providers/auto.py +96 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/base.py +54 -30
- pulse_coding_agent-0.1.2/src/pulse/providers/discovery.py +153 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/gemini.py +69 -66
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/manager.py +228 -95
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/openai.py +46 -40
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/rpc.py +248 -249
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/runtime.py +235 -217
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/project.py +168 -158
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/task_manager.py +425 -417
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/tools.py +377 -372
- pulse_coding_agent-0.1.1/src/pulse/_product_oauth.json +0 -4
- pulse_coding_agent-0.1.1/src/pulse/auth.py +0 -762
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/.gitignore +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/PRIVACY.md +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/SECURITY.md +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/__main__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/audit.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/ci/github_client.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/ci/runner.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/config.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/context.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/conversations/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/conversations/manager.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/core/agent.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/core/planner.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/core/protocols.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/episodic.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/eval/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/eval/trajectory_logger.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/eval/verifier.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/execution/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/execution/remote_task.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/git.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mcp/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mcp/client.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/mcp/local_tools.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/memory.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/orchestration/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/orchestration/orchestrator.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/patch.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/planner/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/planner/dag_planner.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/planner/execution_loop.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/production.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/provider.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/provider_keys.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/deepseek.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/failover.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/groq.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/providers/openrouter.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/py.typed +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/reasoning.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/refactor/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/refactor/impact_analyzer.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/repository.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/rule_synthesizer.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/safety/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/safety/safety_manager.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/SECURITY.md +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/api.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/audit.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/base.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/docker.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/host.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/backend/remote.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/errors.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/filesystem.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/git_safe.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/lifecycle.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/network.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/path_validator.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/policy.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/process.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/python_safe.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/client.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/models.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/protocol.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/server.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/remote/worker.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/resources.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/sandbox/secrets.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/session_manager.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/software_engineer.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/storage.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/streaming.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/subprocesses.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/__init__.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/cost_tracker.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/telemetry/logger.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/tool_policy.py +0 -0
- {pulse_coding_agent-0.1.1 → pulse_coding_agent-0.1.2}/src/pulse/tool_registry.py +0 -0
- {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.
|
|
9
|
-
|
|
10
|
-
###
|
|
11
|
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
###
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
61
|
-
security
|
|
62
|
-
-
|
|
63
|
-
|
|
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.
|
|
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
|
|
52
|
+
Install the current beta from PyPI with `pip`:
|
|
53
53
|
|
|
54
54
|
```bash
|
|
55
|
-
python -m pip install pulse-coding-agent==0.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.
|
|
65
|
+
uv tool install pulse-coding-agent==0.1.2
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
Alternatively, use `pipx install pulse-coding-agent==0.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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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.
|
|
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.
|
|
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
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
python -m pip install pulse-coding-agent==0.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.
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
Alternatively, use `pipx install pulse-coding-agent==0.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
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
-
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
pulse
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
- `
|
|
110
|
-
- `
|
|
111
|
-
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
pulse
|
|
121
|
-
pulse
|
|
122
|
-
pulse
|
|
123
|
-
pulse
|
|
124
|
-
pulse
|
|
125
|
-
pulse keys
|
|
126
|
-
pulse keys
|
|
127
|
-
pulse keys
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
uv run
|
|
172
|
-
uv
|
|
173
|
-
uv run
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
- [
|
|
186
|
-
- [
|
|
187
|
-
- [
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
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).
|