deepcell-cli 0.6.2__tar.gz → 0.6.3__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.
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/PKG-INFO +4 -4
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/README.md +3 -3
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/pyproject.toml +5 -7
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/__init__.py +1 -1
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/client.py +10 -1
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/config.py +1 -1
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/mcp_server.py +1 -1
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/oauth_provider.py +12 -4
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli.egg-info/PKG-INFO +4 -4
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_config.py +1 -1
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_mcp_auth.py +11 -11
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_mcp_server.py +1 -1
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/setup.cfg +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/__main__.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/_findings.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/capabilities.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/capability-contract.json +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/__init__.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/_batch_input.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/_datatypes.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/_negative_args.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/_swapped_args.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/_version_display.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/_write_opts.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/account.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/auth.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/changes.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/deck.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/defs.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/describe.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/doc.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/doctor.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/download.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/edit.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/example.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/export.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/export_docx.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/export_pdf.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/export_pptx.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/files.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/grep.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/guide.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/help_cmd.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/impact.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/import_cmd.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/ingest.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/merge.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/query.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/reasoning.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/ref.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/replace.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/rules.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/share.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/sync.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/upgrade.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/variant.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/version.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/viewer.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/commands/workspace.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/context.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/errors.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/logging_setup.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/main.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/output.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/revision.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/stages.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/surface.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/sync_state.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/upgrade_check.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli/xml_replace.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli.egg-info/SOURCES.txt +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli.egg-info/dependency_links.txt +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli.egg-info/entry_points.txt +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli.egg-info/requires.txt +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/src/deepcell_cli.egg-info/top_level.txt +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_anon.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_claim_strength.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_client.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_client_surface_header.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_conflict_reason.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_deck_help_contract.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_deck_op_shape.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_docs_catalog.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_doctor.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_download.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_findings_provenance.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_guide_eval_a4_a7.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_guide_flag_drift.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_help_flag_drift.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_impact_commands.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_ingest_command.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_logging_setup.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_op_reachability.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_openapi_route_parity.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_output_export_notes.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_output_keeps_the_answer.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_reasoning_commands.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_reasoning_diff_command.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_ref_flag_drift.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_round6_signal_regressions.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_search_reach.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_shed_retry.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_stages.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_surface_examples.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_surface_walker.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_upgrade_check.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_version_parity.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_write_message_rule.py +0 -0
- {deepcell_cli-0.6.2 → deepcell_cli-0.6.3}/tests/test_xml_replace.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepcell-cli
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.3
|
|
4
4
|
Summary: Build and revise .deepcell documents from a terminal — the reasoning, the calculations, the document and the deck, with the links between them
|
|
5
5
|
Author-email: DeepCell <hello@deepcell.net>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -36,12 +36,12 @@ Command-line interface for **DeepCell** — a versionable `.deepcell` document t
|
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
# macOS / Linux
|
|
39
|
-
curl -LsSf https://
|
|
39
|
+
curl -LsSf https://deepcell.net/install.sh | sh
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
```powershell
|
|
43
43
|
# Windows (PowerShell)
|
|
44
|
-
irm https://
|
|
44
|
+
irm https://deepcell.net/install.ps1 | iex
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
```bash
|
|
@@ -251,7 +251,7 @@ Interactive and sync commands (`login`, `clone`, `push`, …) are blocked inside
|
|
|
251
251
|
|
|
252
252
|
| Variable | Purpose | Default |
|
|
253
253
|
|----------|---------|---------|
|
|
254
|
-
| `DEEPCELL_API_URL` | API endpoint | `https://
|
|
254
|
+
| `DEEPCELL_API_URL` | API endpoint | `https://deepcell.net/api/jingwei` |
|
|
255
255
|
| `DEEPCELL_PROJECT` | Override active project | _(none)_ |
|
|
256
256
|
| `DEEPCELL_ACCESS_TOKEN` | Auth token for CI/headless use | _(none)_ |
|
|
257
257
|
| `DEEPCELL_CONFIG` | Alternate `config.json` path (session-scoped) | `~/.deepcell/config.json` |
|
|
@@ -4,12 +4,12 @@ Command-line interface for **DeepCell** — a versionable `.deepcell` document t
|
|
|
4
4
|
|
|
5
5
|
```bash
|
|
6
6
|
# macOS / Linux
|
|
7
|
-
curl -LsSf https://
|
|
7
|
+
curl -LsSf https://deepcell.net/install.sh | sh
|
|
8
8
|
```
|
|
9
9
|
|
|
10
10
|
```powershell
|
|
11
11
|
# Windows (PowerShell)
|
|
12
|
-
irm https://
|
|
12
|
+
irm https://deepcell.net/install.ps1 | iex
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
```bash
|
|
@@ -219,7 +219,7 @@ Interactive and sync commands (`login`, `clone`, `push`, …) are blocked inside
|
|
|
219
219
|
|
|
220
220
|
| Variable | Purpose | Default |
|
|
221
221
|
|----------|---------|---------|
|
|
222
|
-
| `DEEPCELL_API_URL` | API endpoint | `https://
|
|
222
|
+
| `DEEPCELL_API_URL` | API endpoint | `https://deepcell.net/api/jingwei` |
|
|
223
223
|
| `DEEPCELL_PROJECT` | Override active project | _(none)_ |
|
|
224
224
|
| `DEEPCELL_ACCESS_TOKEN` | Auth token for CI/headless use | _(none)_ |
|
|
225
225
|
| `DEEPCELL_CONFIG` | Alternate `config.json` path (session-scoped) | `~/.deepcell/config.json` |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "deepcell-cli"
|
|
3
|
-
version = "0.6.
|
|
3
|
+
version = "0.6.3"
|
|
4
4
|
description = "Build and revise .deepcell documents from a terminal — the reasoning, the calculations, the document and the deck, with the links between them"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -42,12 +42,10 @@ deepcell-mcp = "deepcell_cli.mcp_server:main"
|
|
|
42
42
|
# deliberately no Repository or Issues entry: the CLI is developed in a private
|
|
43
43
|
# repository, and a link to one nobody can open is worse than no link.
|
|
44
44
|
#
|
|
45
|
-
# deepcell.net is the canonical
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
49
|
-
# they stay on beta.deepcell.net, because a curl that 404s is a broken install
|
|
50
|
-
# today rather than a link that is briefly grey.
|
|
45
|
+
# deepcell.net is the canonical origin and serves the site. beta.deepcell.net
|
|
46
|
+
# answers the same deployment and is deliberately left un-redirected, because
|
|
47
|
+
# every CLI already installed has it baked in as its API default — but it is
|
|
48
|
+
# not what anything new should hand out.
|
|
51
49
|
[project.urls]
|
|
52
50
|
Homepage = "https://deepcell.net"
|
|
53
51
|
Documentation = "https://deepcell.net/product/cli"
|
|
@@ -111,7 +111,16 @@ class DeepCellClient:
|
|
|
111
111
|
# which build their own per-request headers and would otherwise be the
|
|
112
112
|
# two calls a new user makes before anything else. httpx merges these
|
|
113
113
|
# with per-request headers rather than replacing them.
|
|
114
|
-
|
|
114
|
+
# `follow_redirects` because httpx defaults it to False, and an installed
|
|
115
|
+
# CLI outlives the hostname it was built against: every copy already in
|
|
116
|
+
# the wild has `https://beta.deepcell.net/api/jingwei` baked in as its
|
|
117
|
+
# default. The day that host answers a 301 instead of serving, a client
|
|
118
|
+
# that does not follow redirects reports the 3xx as a hard failure and
|
|
119
|
+
# every one of those installs breaks at once — which is why beta is kept
|
|
120
|
+
# serving rather than redirected. This makes the next move survivable.
|
|
121
|
+
self._http = httpx.Client(
|
|
122
|
+
timeout=_TIMEOUT, headers=client_headers(), follow_redirects=True
|
|
123
|
+
)
|
|
115
124
|
|
|
116
125
|
# ── Helpers ─────────────────────────────────────────────
|
|
117
126
|
|
|
@@ -19,7 +19,7 @@ _CREDS_FILE = _DIR / "credentials.json"
|
|
|
19
19
|
|
|
20
20
|
# ── Defaults ────────────────────────────────────────────────
|
|
21
21
|
|
|
22
|
-
DEFAULT_API_URL = "https://
|
|
22
|
+
DEFAULT_API_URL = "https://deepcell.net/api/jingwei"
|
|
23
23
|
DEFAULT_FORMAT = "plain"
|
|
24
24
|
|
|
25
25
|
# ── Environment overrides ───────────────────────────────────
|
|
@@ -387,7 +387,7 @@ def _config_path_for_token(token: str) -> str:
|
|
|
387
387
|
base config's ``api_url`` on creation: ``get_api_url()`` falls back to
|
|
388
388
|
DEFAULT_API_URL (the public beta) when the config it reads has no
|
|
389
389
|
``api_url``, so handing a caller an empty config silently repointed a
|
|
390
|
-
self-hosted deployment at
|
|
390
|
+
self-hosted deployment at deepcell.net. ``active_workspace`` is
|
|
391
391
|
deliberately NOT inherited — isolating it is the whole point of this file.
|
|
392
392
|
"""
|
|
393
393
|
import hashlib
|
|
@@ -275,7 +275,9 @@ class DeepCellOAuthProvider(
|
|
|
275
275
|
Returns ``None`` when the code is unknown, expired, or still pending.
|
|
276
276
|
"""
|
|
277
277
|
try:
|
|
278
|
-
async with httpx.AsyncClient(
|
|
278
|
+
async with httpx.AsyncClient(
|
|
279
|
+
timeout=10, headers=client_headers("mcp"), follow_redirects=True
|
|
280
|
+
) as client:
|
|
279
281
|
resp = await client.post(
|
|
280
282
|
f"{self.api_url}/auth/device/token",
|
|
281
283
|
json={"device_code": device_code},
|
|
@@ -436,7 +438,9 @@ class DeepCellOAuthProvider(
|
|
|
436
438
|
headers["Authorization"] = f"Bearer {jingwei_api_key}"
|
|
437
439
|
|
|
438
440
|
try:
|
|
439
|
-
async with httpx.AsyncClient(
|
|
441
|
+
async with httpx.AsyncClient(
|
|
442
|
+
timeout=10, headers=client_headers("mcp"), follow_redirects=True
|
|
443
|
+
) as client:
|
|
440
444
|
resp = await client.post(
|
|
441
445
|
f"{self.api_url}/auth/api-keys/verify",
|
|
442
446
|
json={"key": token},
|
|
@@ -514,7 +518,9 @@ class DeepCellOAuthProvider(
|
|
|
514
518
|
# so they simply expire (15 min).
|
|
515
519
|
if isinstance(token, DeepCellRefreshToken):
|
|
516
520
|
try:
|
|
517
|
-
async with httpx.AsyncClient(
|
|
521
|
+
async with httpx.AsyncClient(
|
|
522
|
+
timeout=10, headers=client_headers("mcp"), follow_redirects=True
|
|
523
|
+
) as client:
|
|
518
524
|
await client.post(
|
|
519
525
|
f"{self.api_url}/auth/revoke-token",
|
|
520
526
|
json={"refresh_token": token.token},
|
|
@@ -547,7 +553,9 @@ class DeepCellOAuthProvider(
|
|
|
547
553
|
grant may still be valid, so the client should retry and keep it.
|
|
548
554
|
"""
|
|
549
555
|
try:
|
|
550
|
-
async with httpx.AsyncClient(
|
|
556
|
+
async with httpx.AsyncClient(
|
|
557
|
+
timeout=10, headers=client_headers("mcp"), follow_redirects=True
|
|
558
|
+
) as client:
|
|
551
559
|
resp = await client.post(
|
|
552
560
|
f"{self.api_url}/auth/refresh",
|
|
553
561
|
json={"refresh_token": raw_refresh_token},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepcell-cli
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.3
|
|
4
4
|
Summary: Build and revise .deepcell documents from a terminal — the reasoning, the calculations, the document and the deck, with the links between them
|
|
5
5
|
Author-email: DeepCell <hello@deepcell.net>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -36,12 +36,12 @@ Command-line interface for **DeepCell** — a versionable `.deepcell` document t
|
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
38
|
# macOS / Linux
|
|
39
|
-
curl -LsSf https://
|
|
39
|
+
curl -LsSf https://deepcell.net/install.sh | sh
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
```powershell
|
|
43
43
|
# Windows (PowerShell)
|
|
44
|
-
irm https://
|
|
44
|
+
irm https://deepcell.net/install.ps1 | iex
|
|
45
45
|
```
|
|
46
46
|
|
|
47
47
|
```bash
|
|
@@ -251,7 +251,7 @@ Interactive and sync commands (`login`, `clone`, `push`, …) are blocked inside
|
|
|
251
251
|
|
|
252
252
|
| Variable | Purpose | Default |
|
|
253
253
|
|----------|---------|---------|
|
|
254
|
-
| `DEEPCELL_API_URL` | API endpoint | `https://
|
|
254
|
+
| `DEEPCELL_API_URL` | API endpoint | `https://deepcell.net/api/jingwei` |
|
|
255
255
|
| `DEEPCELL_PROJECT` | Override active project | _(none)_ |
|
|
256
256
|
| `DEEPCELL_ACCESS_TOKEN` | Auth token for CI/headless use | _(none)_ |
|
|
257
257
|
| `DEEPCELL_CONFIG` | Alternate `config.json` path (session-scoped) | `~/.deepcell/config.json` |
|
|
@@ -87,7 +87,7 @@ def test_clear_credentials(tmp_config):
|
|
|
87
87
|
|
|
88
88
|
|
|
89
89
|
def test_api_url_default(tmp_config):
|
|
90
|
-
assert get_api_url() == "https://
|
|
90
|
+
assert get_api_url() == "https://deepcell.net/api/jingwei"
|
|
91
91
|
|
|
92
92
|
|
|
93
93
|
def test_api_url_env(tmp_config, monkeypatch):
|
|
@@ -156,41 +156,41 @@ class TestBuildServerOAuthUrls:
|
|
|
156
156
|
def test_base_url_strips_path(self):
|
|
157
157
|
from deepcell_cli.mcp_server import _build_server
|
|
158
158
|
|
|
159
|
-
srv = _build_server(oauth_url="https://
|
|
159
|
+
srv = _build_server(oauth_url="https://deepcell.net/mcp")
|
|
160
160
|
# AnyHttpUrl may add trailing slash to bare hosts
|
|
161
161
|
issuer = str(srv.settings.auth.issuer_url).rstrip("/")
|
|
162
|
-
assert issuer == "https://
|
|
162
|
+
assert issuer == "https://deepcell.net"
|
|
163
163
|
|
|
164
164
|
def test_resource_url_keeps_path(self):
|
|
165
165
|
from deepcell_cli.mcp_server import _build_server
|
|
166
166
|
|
|
167
|
-
srv = _build_server(oauth_url="https://
|
|
167
|
+
srv = _build_server(oauth_url="https://deepcell.net/mcp")
|
|
168
168
|
resource = str(srv.settings.auth.resource_server_url).rstrip("/")
|
|
169
|
-
assert resource == "https://
|
|
169
|
+
assert resource == "https://deepcell.net/mcp"
|
|
170
170
|
|
|
171
171
|
def test_no_path_leaves_both_equal(self):
|
|
172
172
|
from deepcell_cli.mcp_server import _build_server
|
|
173
173
|
|
|
174
|
-
srv = _build_server(oauth_url="https://
|
|
174
|
+
srv = _build_server(oauth_url="https://deepcell.net")
|
|
175
175
|
issuer = str(srv.settings.auth.issuer_url).rstrip("/")
|
|
176
176
|
resource = str(srv.settings.auth.resource_server_url).rstrip("/")
|
|
177
|
-
assert issuer == "https://
|
|
178
|
-
assert resource == "https://
|
|
177
|
+
assert issuer == "https://deepcell.net"
|
|
178
|
+
assert resource == "https://deepcell.net"
|
|
179
179
|
|
|
180
180
|
def test_provider_server_url_is_base(self):
|
|
181
181
|
"""The OAuth provider's server_url (the issuer identity) must be the base URL."""
|
|
182
182
|
from deepcell_cli.mcp_server import _build_server
|
|
183
183
|
|
|
184
|
-
srv = _build_server(oauth_url="https://
|
|
184
|
+
srv = _build_server(oauth_url="https://deepcell.net/mcp")
|
|
185
185
|
provider = srv._auth_server_provider
|
|
186
|
-
assert provider.server_url == "https://
|
|
186
|
+
assert provider.server_url == "https://deepcell.net"
|
|
187
187
|
|
|
188
188
|
def test_frontend_url_defaults_to_the_oauth_origin(self):
|
|
189
189
|
"""nginx serves the consent page from the same origin it proxies /mcp on."""
|
|
190
190
|
from deepcell_cli.mcp_server import _build_server
|
|
191
191
|
|
|
192
|
-
srv = _build_server(oauth_url="https://
|
|
193
|
-
assert srv._auth_server_provider.frontend_url == "https://
|
|
192
|
+
srv = _build_server(oauth_url="https://deepcell.net/mcp")
|
|
193
|
+
assert srv._auth_server_provider.frontend_url == "https://deepcell.net"
|
|
194
194
|
|
|
195
195
|
def test_frontend_url_env_override(self, monkeypatch):
|
|
196
196
|
from deepcell_cli.mcp_server import _build_server
|
|
@@ -755,7 +755,7 @@ class TestPerCallerConfigPreservesDeploymentSettings:
|
|
|
755
755
|
> DEFAULT_API_URL (the public beta). Handing an authenticated caller a
|
|
756
756
|
fresh, empty config file therefore made a self-hosted deployment — whose
|
|
757
757
|
api_url lives in ~/.deepcell/config.json, written by dev.sh — fall through
|
|
758
|
-
to
|
|
758
|
+
to deepcell.net for every OAuth request.
|
|
759
759
|
"""
|
|
760
760
|
|
|
761
761
|
def test_session_config_inherits_api_url_from_the_base_config(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|