deepvista-cli 0.3.0__tar.gz → 0.4.0__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 (91) hide show
  1. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/.github/workflows/ci.yml +26 -0
  2. deepvista_cli-0.4.0/.release-please-manifest.json +3 -0
  3. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/CHANGELOG.md +8 -0
  4. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/PKG-INFO +39 -1
  5. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/README.md +38 -0
  6. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/auth.py +33 -0
  7. deepvista_cli-0.4.0/install.ps1 +401 -0
  8. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/.claude-plugin/plugin.json +1 -1
  9. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/pyproject.toml +1 -1
  10. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/uv.lock +1 -1
  11. deepvista_cli-0.3.0/.release-please-manifest.json +0 -3
  12. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/.claude-plugin/marketplace.json +0 -0
  13. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/.github/workflows/publish.yml +0 -0
  14. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/.github/workflows/release-please.yml +0 -0
  15. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/.gitignore +0 -0
  16. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/.pre-commit-config.yaml +0 -0
  17. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/CLAUDE.md +0 -0
  18. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/CONTRIBUTING.md +0 -0
  19. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/LICENSE +0 -0
  20. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/__init__.py +0 -0
  21. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/agent_catalog.py +0 -0
  22. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/auth/__init__.py +0 -0
  23. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/auth/callback_server.py +0 -0
  24. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/auth/login.py +0 -0
  25. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/auth/tokens.py +0 -0
  26. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/client/__init__.py +0 -0
  27. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/client/http.py +0 -0
  28. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/client/origin.py +0 -0
  29. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/__init__.py +0 -0
  30. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/agents.py +0 -0
  31. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/card.py +0 -0
  32. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/chat.py +0 -0
  33. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/config.py +0 -0
  34. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/lint.py +0 -0
  35. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/memory.py +0 -0
  36. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/notes.py +0 -0
  37. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/schedule.py +0 -0
  38. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/session.py +0 -0
  39. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/skill.py +0 -0
  40. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/upgrade.py +0 -0
  41. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/commands/vistabase.py +0 -0
  42. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/config.py +0 -0
  43. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/main.py +0 -0
  44. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/output/__init__.py +0 -0
  45. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/output/formatter.py +0 -0
  46. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/resources/__init__.py +0 -0
  47. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/resources/workflow_host_runtime.md +0 -0
  48. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/session_note.py +0 -0
  49. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/skill_catalog.py +0 -0
  50. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/tui/__init__.py +0 -0
  51. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/tui/app.py +0 -0
  52. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/deepvista_cli/workflow_doc.py +0 -0
  53. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/docs/assets/deepvista-banner.png +0 -0
  54. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/install.sh +0 -0
  55. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/README.md +0 -0
  56. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/README.md +0 -0
  57. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/agents/.gitignore +0 -0
  58. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/commands/deepvista.md +0 -0
  59. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/commands/refresh-skills.md +0 -0
  60. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/hooks/hooks.json +0 -0
  61. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/scripts/deepvista-session-end.sh +0 -0
  62. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/scripts/deepvista-session-start.sh +0 -0
  63. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/scripts/deepvista-session-turn.sh +0 -0
  64. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/scripts/deepvista-skill-url.py +0 -0
  65. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/scripts/deepvista-sync.sh +0 -0
  66. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/skills/.gitignore +0 -0
  67. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/plugins/claude-code/skills/install-deepvista-cli/SKILL.md +0 -0
  68. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/release-please-config.json +0 -0
  69. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/scripts/check_plugin_version.py +0 -0
  70. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/SKILL.md +0 -0
  71. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/chat.md +0 -0
  72. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/lint.md +0 -0
  73. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/memory.md +0 -0
  74. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/notes.md +0 -0
  75. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/openclaw.md +0 -0
  76. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/session.md +0 -0
  77. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/shared.md +0 -0
  78. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/skill-analyze-notes.md +0 -0
  79. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/skill-create-from-note.md +0 -0
  80. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/skill-import-files.md +0 -0
  81. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/skill-research-to-skill.md +0 -0
  82. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/skill.md +0 -0
  83. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/vistabase-card.md +0 -0
  84. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/deepvista/reference/vistabase.md +0 -0
  85. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/skills/dv-workflow/SKILL.md +0 -0
  86. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/tests/__init__.py +0 -0
  87. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/tests/test_agent_id_tagging.py +0 -0
  88. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/tests/test_session_note_format.py +0 -0
  89. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/tests/test_skill_catalog.py +0 -0
  90. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/tests/test_skill_commands.py +0 -0
  91. {deepvista_cli-0.3.0 → deepvista_cli-0.4.0}/uninstall.sh +0 -0
@@ -47,3 +47,29 @@ jobs:
47
47
  env:
48
48
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
49
49
  run: gh skill publish --dry-run
50
+
51
+ windows-smoke:
52
+ runs-on: windows-latest
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+
56
+ - name: Parse install.ps1 (syntax check)
57
+ shell: pwsh
58
+ run: |
59
+ $errors = $null
60
+ [System.Management.Automation.Language.Parser]::ParseFile("$PWD/install.ps1", [ref]$null, [ref]$errors) | Out-Null
61
+ if ($errors.Count -gt 0) {
62
+ $errors | ForEach-Object { Write-Error $_.Message }
63
+ exit 1
64
+ }
65
+ Write-Host "install.ps1 parses cleanly"
66
+
67
+ - uses: astral-sh/setup-uv@v6
68
+ with:
69
+ enable-cache: true
70
+
71
+ - name: Install deepvista CLI from checkout
72
+ run: uv tool install ".[ui]"
73
+
74
+ - name: Smoke test - deepvista --help
75
+ run: deepvista --help
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.4.0"
3
+ }
@@ -37,6 +37,14 @@ users what's new between the version they have installed and the latest release.
37
37
  adopts a pre-existing server-side row instead of failing when the local
38
38
  file is missing.
39
39
 
40
+ ## [0.4.0](https://github.com/DeepVista-AI/deepvista-cli/compare/v0.3.0...v0.4.0) (2026-06-03)
41
+
42
+
43
+ ### Features
44
+
45
+ * **DV-941:** add windows install script and trampoline troubleshooting docs ([#156](https://github.com/DeepVista-AI/deepvista-cli/issues/156)) ([eed7335](https://github.com/DeepVista-AI/deepvista-cli/commit/eed7335ffdc1dfcfd84523ed0e77be066b7fe9c3))
46
+ * **DV-942:** print next-step hints after auth login ([#157](https://github.com/DeepVista-AI/deepvista-cli/issues/157)) ([0fca6c9](https://github.com/DeepVista-AI/deepvista-cli/commit/0fca6c9309623ee690c2c9e16870d528b558fd80))
47
+
40
48
  ## [0.3.0](https://github.com/DeepVista-AI/deepvista-cli/compare/v0.2.0...v0.3.0) (2026-05-31)
41
49
 
42
50
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepvista-cli
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: CLI for DeepVista — chat, notes, skills, and memory from your terminal.
5
5
  Project-URL: Homepage, https://deepvista.ai
6
6
  Project-URL: Repository, https://github.com/DeepVista-AI/deepvista-cli
@@ -164,14 +164,52 @@ then `deepvista auth login`).
164
164
 
165
165
  ### For non-Claude-Code agents (Cursor, OpenCode, OpenClaw, …)
166
166
 
167
+ **macOS / Linux (bash):**
168
+
167
169
  ```bash
168
170
  curl -sSL https://raw.githubusercontent.com/DeepVista-AI/deepvista-cli/main/install.sh | bash
169
171
  ```
170
172
 
173
+ **Windows (PowerShell):**
174
+
175
+ ```powershell
176
+ powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/DeepVista-AI/deepvista-cli/main/install.ps1 | iex"
177
+ ```
178
+
171
179
  The script auto-detects your package manager (`uv`, `pipx`, or `pip`) and copies the consolidated `deepvista` skill into your agent's skill directory (Cursor, OpenCode, OpenClaw, and Claude Code as a fallback). If you upgraded from an earlier release, it also sweeps out the 12 legacy `deepvista-*` skills so you don't end up with both.
172
180
 
173
181
  Prefer GitHub's CLI? `gh skill install DeepVista-AI/deepvista-cli` works too (GitHub CLI ≥ 2.90, preview).
174
182
 
183
+ #### Windows troubleshooting: `uv trampoline failed to canonicalize script path`
184
+
185
+ On Windows, running `deepvista` may fail with:
186
+
187
+ ```
188
+ error: uv trampoline failed to canonicalize script path
189
+ ```
190
+
191
+ This is a [known uv-on-Windows issue](https://github.com/astral-sh/uv/issues): the launcher (trampoline) that `uv tool install` creates can fail to resolve its own path. It is aggravated by working directories that contain **spaces** (e.g. `C:\Users\you\Claude Folder`) or are inside **OneDrive**-synced folders.
192
+
193
+ Fixes, in order of preference:
194
+
195
+ 1. **Update uv and reinstall the launcher:**
196
+
197
+ ```powershell
198
+ uv self update
199
+ uv tool install --reinstall "deepvista-cli[ui]"
200
+ ```
201
+
202
+ 2. **Run via `uv tool run` as a fallback** (bypasses the broken trampoline entirely):
203
+
204
+ ```powershell
205
+ uv tool run deepvista auth login
206
+ uv tool run deepvista notes +quick "My first note"
207
+ ```
208
+
209
+ 3. **Avoid spaces / OneDrive in your working directory.** Run from a path without spaces, e.g. `C:\dev`, rather than `C:\Users\you\Claude Folder`.
210
+
211
+ The `install.ps1` script performs this check automatically: after installing it runs `deepvista --version`, and if it hits the trampoline error it falls back to `uv tool run deepvista` and prints the guidance above. It also adds `%USERPROFILE%\.local\bin` (uv's tool bin directory) to your user PATH if it isn't already there — restart your shell afterward so new terminals pick it up.
212
+
175
213
  ### Get Started
176
214
 
177
215
  Open your agent and paste:
@@ -135,14 +135,52 @@ then `deepvista auth login`).
135
135
 
136
136
  ### For non-Claude-Code agents (Cursor, OpenCode, OpenClaw, …)
137
137
 
138
+ **macOS / Linux (bash):**
139
+
138
140
  ```bash
139
141
  curl -sSL https://raw.githubusercontent.com/DeepVista-AI/deepvista-cli/main/install.sh | bash
140
142
  ```
141
143
 
144
+ **Windows (PowerShell):**
145
+
146
+ ```powershell
147
+ powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/DeepVista-AI/deepvista-cli/main/install.ps1 | iex"
148
+ ```
149
+
142
150
  The script auto-detects your package manager (`uv`, `pipx`, or `pip`) and copies the consolidated `deepvista` skill into your agent's skill directory (Cursor, OpenCode, OpenClaw, and Claude Code as a fallback). If you upgraded from an earlier release, it also sweeps out the 12 legacy `deepvista-*` skills so you don't end up with both.
143
151
 
144
152
  Prefer GitHub's CLI? `gh skill install DeepVista-AI/deepvista-cli` works too (GitHub CLI ≥ 2.90, preview).
145
153
 
154
+ #### Windows troubleshooting: `uv trampoline failed to canonicalize script path`
155
+
156
+ On Windows, running `deepvista` may fail with:
157
+
158
+ ```
159
+ error: uv trampoline failed to canonicalize script path
160
+ ```
161
+
162
+ This is a [known uv-on-Windows issue](https://github.com/astral-sh/uv/issues): the launcher (trampoline) that `uv tool install` creates can fail to resolve its own path. It is aggravated by working directories that contain **spaces** (e.g. `C:\Users\you\Claude Folder`) or are inside **OneDrive**-synced folders.
163
+
164
+ Fixes, in order of preference:
165
+
166
+ 1. **Update uv and reinstall the launcher:**
167
+
168
+ ```powershell
169
+ uv self update
170
+ uv tool install --reinstall "deepvista-cli[ui]"
171
+ ```
172
+
173
+ 2. **Run via `uv tool run` as a fallback** (bypasses the broken trampoline entirely):
174
+
175
+ ```powershell
176
+ uv tool run deepvista auth login
177
+ uv tool run deepvista notes +quick "My first note"
178
+ ```
179
+
180
+ 3. **Avoid spaces / OneDrive in your working directory.** Run from a path without spaces, e.g. `C:\dev`, rather than `C:\Users\you\Claude Folder`.
181
+
182
+ The `install.ps1` script performs this check automatically: after installing it runs `deepvista --version`, and if it hits the trampoline error it falls back to `uv tool run deepvista` and prints the guidance above. It also adds `%USERPROFILE%\.local\bin` (uv's tool bin directory) to your user PATH if it isn't already there — restart your shell afterward so new terminals pick it up.
183
+
146
184
  ### Get Started
147
185
 
148
186
  Open your agent and paste:
@@ -14,6 +14,7 @@ from deepvista_cli.auth.tokens import (
14
14
  remove_account,
15
15
  switch_active_account,
16
16
  )
17
+ from deepvista_cli.client.origin import detect_agent_tool
17
18
  from deepvista_cli.config import credentials_path
18
19
  from deepvista_cli.output.formatter import format_output, output_error
19
20
 
@@ -23,6 +24,37 @@ def auth_group() -> None:
23
24
  """Authenticate with DeepVista."""
24
25
 
25
26
 
27
+ def _print_next_steps() -> None:
28
+ """Print actionable next-step options after a successful login (DV-942).
29
+
30
+ Written to stderr so the JSON result on stdout stays machine-parseable.
31
+ Suggestions adapt to whoever is driving the CLI (agent vs. terminal).
32
+ """
33
+ tool, _version = detect_agent_tool()
34
+ if tool == "claude-code":
35
+ steps = [
36
+ "/refresh-skills — sync the DeepVista skill catalog",
37
+ 'say "Help me get started with DeepVista."',
38
+ 'deepvista notes +quick "<fact>" — capture your first note',
39
+ ]
40
+ elif tool == "deepvista-cli": # direct terminal usage
41
+ steps = [
42
+ 'deepvista notes +quick "My first note" — capture a note',
43
+ "deepvista skill list — browse your workflow skills",
44
+ "deepvista ui — launch the terminal UI",
45
+ "deepvista chat — talk to your DeepVista agent",
46
+ ]
47
+ else: # some other AI agent is driving us
48
+ steps = [
49
+ 'deepvista notes +quick "<fact>" — capture a note for the user',
50
+ "deepvista skill list — discover available workflow skills",
51
+ 'deepvista vistabase +search "<topic>" — recall the user\'s stored context',
52
+ ]
53
+ click.echo("\n What's next? Pick one:", err=True)
54
+ for step in steps:
55
+ click.echo(f" - {step}", err=True)
56
+
57
+
26
58
  @auth_group.command("login")
27
59
  @click.option("--code", default=None, help="One-time auth code from the browser.")
28
60
  @click.option("--dry-run", is_flag=True, default=False, help="Preview what would happen without making any changes.")
@@ -64,6 +96,7 @@ def auth_login(ctx: click.Context, code: str | None, dry_run: bool) -> None:
64
96
  }
65
97
  format_output(result, ctx.obj.output_format)
66
98
  click.echo(f" Logged in as {tokens.email or tokens.user_id}", err=True)
99
+ _print_next_steps()
67
100
 
68
101
 
69
102
  @auth_group.command("status")
@@ -0,0 +1,401 @@
1
+ #Requires -Version 5.1
2
+ <#
3
+ .SYNOPSIS
4
+ Installs the DeepVista CLI and agent skills on Windows.
5
+
6
+ .DESCRIPTION
7
+ PowerShell port of install.sh. Works in Windows PowerShell 5.1 and
8
+ PowerShell 7+ (pwsh). Mirrors the bash installer:
9
+ 1. Ensure uv is installed (irm https://astral.sh/uv/install.ps1 | iex)
10
+ 2. Install or upgrade the deepvista CLI
11
+ 3. Deploy the consolidated `deepvista` skill to agent skill directories
12
+ 4. Inject skill interpretation rules into agent config files
13
+ 5. Register the skill-trigger hook in Claude Code settings.json
14
+ 6. Verify the binary runs (with uv-trampoline troubleshooting)
15
+ 7. Check / perform authentication
16
+ 8. Print next-steps guidance
17
+
18
+ .NOTES
19
+ Run with:
20
+ powershell -ExecutionPolicy ByPass -c "irm https://raw.githubusercontent.com/DeepVista-AI/deepvista-cli/main/install.ps1 | iex"
21
+ #>
22
+
23
+ Set-StrictMode -Version Latest
24
+ $ErrorActionPreference = 'Stop'
25
+
26
+ $REPO = 'DeepVista-AI/deepvista-cli'
27
+ $SKILL = 'deepvista'
28
+
29
+ function Write-Step { param([string]$Message) Write-Host "==> $Message" }
30
+ function Write-Sub { param([string]$Message) Write-Host " $Message" }
31
+ function Write-Warn { param([string]$Message) Write-Host " WARNING: $Message" -ForegroundColor Yellow }
32
+
33
+ function Test-Command {
34
+ param([string]$Name)
35
+ return [bool](Get-Command $Name -ErrorAction SilentlyContinue)
36
+ }
37
+
38
+ # uv installs the tool launchers (shims) into %USERPROFILE%\.local\bin on Windows.
39
+ $UvBinDir = Join-Path $env:USERPROFILE '.local\bin'
40
+
41
+ function Add-UvBinToPath {
42
+ # Ensure the uv tool bin dir is on PATH for this session and persisted for the user.
43
+ if (Test-Path $UvBinDir) {
44
+ if (($env:PATH -split ';') -notcontains $UvBinDir) {
45
+ $env:PATH = "$UvBinDir;$env:PATH"
46
+ }
47
+ $userPath = [Environment]::GetEnvironmentVariable('PATH', 'User')
48
+ $userEntries = @()
49
+ if ($userPath) { $userEntries = $userPath -split ';' }
50
+ if ($userEntries -notcontains $UvBinDir) {
51
+ $newUserPath = if ($userPath) { "$userPath;$UvBinDir" } else { $UvBinDir }
52
+ [Environment]::SetEnvironmentVariable('PATH', $newUserPath, 'User')
53
+ Write-Sub "Added $UvBinDir to your user PATH (restart your shell for new terminals to pick it up)."
54
+ }
55
+ }
56
+ }
57
+
58
+ # ---------------------------------------------------------------------------
59
+ # 1. Ensure uv
60
+ # ---------------------------------------------------------------------------
61
+ Write-Step 'Installing deepvista CLI...'
62
+
63
+ if (-not (Test-Command 'uv')) {
64
+ Write-Sub 'uv not found - installing uv...'
65
+ try {
66
+ Invoke-RestMethod 'https://astral.sh/uv/install.ps1' | Invoke-Expression
67
+ } catch {
68
+ Write-Error "Failed to install uv: $($_.Exception.Message)"
69
+ exit 1
70
+ }
71
+ # The uv installer puts uv in %USERPROFILE%\.local\bin; surface it now.
72
+ if (($env:PATH -split ';') -notcontains $UvBinDir) {
73
+ $env:PATH = "$UvBinDir;$env:PATH"
74
+ }
75
+ }
76
+
77
+ # ---------------------------------------------------------------------------
78
+ # 2. Install or upgrade the CLI
79
+ # ---------------------------------------------------------------------------
80
+ if (Test-Command 'deepvista') {
81
+ Write-Sub 'deepvista already installed - running upgrade...'
82
+ deepvista upgrade
83
+ } else {
84
+ if (Test-Command 'uv') {
85
+ uv tool install "deepvista-cli[ui]"
86
+ } elseif (Test-Command 'pipx') {
87
+ pipx install "deepvista-cli[ui]"
88
+ } elseif (Test-Command 'pip3') {
89
+ pip3 install --user "deepvista-cli[ui]"
90
+ } elseif (Test-Command 'pip') {
91
+ pip install --user "deepvista-cli[ui]"
92
+ } else {
93
+ Write-Error 'No Python package manager found (pip, pipx, or uv required)'
94
+ exit 1
95
+ }
96
+ }
97
+
98
+ # Make sure the freshly-installed launcher is reachable.
99
+ Add-UvBinToPath
100
+
101
+ # ---------------------------------------------------------------------------
102
+ # 3. Install DeepVista skills
103
+ # ---------------------------------------------------------------------------
104
+ Write-Step 'Installing DeepVista skills...'
105
+
106
+ # Detect which agent skill directories to install into.
107
+ $SkillDirs = New-Object System.Collections.Generic.List[string]
108
+ $home_ = $env:USERPROFILE
109
+ if (Test-Path (Join-Path $home_ '.claude')) { $SkillDirs.Add((Join-Path $home_ '.claude\skills')) }
110
+ if (Test-Path (Join-Path $home_ '.agents')) { $SkillDirs.Add((Join-Path $home_ '.agents\skills')) }
111
+ if (Test-Path (Join-Path $home_ '.cursor')) { $SkillDirs.Add((Join-Path $home_ '.cursor\skills')) }
112
+ if (Test-Path (Join-Path $home_ '.opencode')) { $SkillDirs.Add((Join-Path $home_ '.opencode\skills')) }
113
+ # OpenClaw: skills live in the workspace directory.
114
+ if (Test-Path (Join-Path $home_ '.openclaw\workspace')) { $SkillDirs.Add((Join-Path $home_ '.openclaw\workspace\skills')) }
115
+
116
+ # Default to Claude if no agent directory found.
117
+ if ($SkillDirs.Count -eq 0) {
118
+ $SkillDirs.Add((Join-Path $home_ '.claude\skills'))
119
+ }
120
+
121
+ if (-not (Test-Command 'git')) {
122
+ Write-Error 'git required to install DeepVista skills'
123
+ exit 1
124
+ }
125
+
126
+ $Tmp = Join-Path ([System.IO.Path]::GetTempPath()) ("deepvista-" + [System.Guid]::NewGuid().ToString('N'))
127
+ New-Item -ItemType Directory -Path $Tmp -Force | Out-Null
128
+ try {
129
+ $RepoDir = Join-Path $Tmp 'repo'
130
+ git clone --depth 1 --quiet "https://github.com/$REPO.git" $RepoDir
131
+ $Src = Join-Path $RepoDir 'skills'
132
+
133
+ foreach ($dir in $SkillDirs) {
134
+ New-Item -ItemType Directory -Path $dir -Force | Out-Null
135
+ $dest = Join-Path $dir $SKILL
136
+ if (Test-Path $dest) { Remove-Item -Recurse -Force $dest }
137
+ Copy-Item -Recurse -Force (Join-Path $Src $SKILL) $dest
138
+ Write-Sub "Skill installed to $dest"
139
+ }
140
+ } finally {
141
+ if (Test-Path $Tmp) { Remove-Item -Recurse -Force $Tmp -ErrorAction SilentlyContinue }
142
+ }
143
+
144
+ $OpenClawWorkspace = Join-Path $home_ '.openclaw\workspace'
145
+
146
+ # ---------------------------------------------------------------------------
147
+ # 4. Inject skill interpretation rules
148
+ # ---------------------------------------------------------------------------
149
+ $SkillRulesBlock = @'
150
+
151
+ <!-- deepvista-skill-rules -->
152
+ ## Skill Interpretation Rules
153
+
154
+ When you load or invoke any skill, check its frontmatter for two fields: `type` and `execution`.
155
+
156
+ ### Handling `type`
157
+
158
+ **`type: persona`**
159
+ Do not invoke this as a command. Load it as background context that shapes how you
160
+ behave for the rest of the session. Apply its tone, expertise, and decision patterns silently.
161
+
162
+ **`type: tool`**
163
+ Treat this as a discrete capability. Invoke it when the task calls for it and return
164
+ its result. No special handling needed.
165
+
166
+ **`type: workflow`**
167
+ Treat this as a self-contained sequence of steps. Work through them in order. Do not
168
+ mix steps from other skills into this sequence unless explicitly instructed.
169
+
170
+ ### Handling `execution`
171
+
172
+ **`execution: stateless`**
173
+ Run freely. Retry on failure. No confirmation needed.
174
+
175
+ **`execution: stateful`**
176
+ Before executing, stop and do two things:
177
+ 1. If the skill or its underlying command supports `--dry-run`, run that first and show the output.
178
+ 2. Summarize what you are about to do and what will change, then ask for confirmation before proceeding.
179
+
180
+ Never skip this checkpoint for stateful skills, even if the task seems straightforward.
181
+
182
+ ### Fallback rules
183
+ - If `type` is missing, use the information in the skill to guess its type.
184
+ - If `execution` is missing, treat as `stateful` and apply the checkpoint.
185
+ - If a workflow is stateful, treat all its steps as stateful unless they declare otherwise.
186
+ <!-- /deepvista-skill-rules -->
187
+ '@
188
+
189
+ function Install-SkillRules {
190
+ param([string]$ConfigFile)
191
+ $parent = Split-Path -Parent $ConfigFile
192
+ if ($parent -and -not (Test-Path $parent)) {
193
+ New-Item -ItemType Directory -Path $parent -Force | Out-Null
194
+ }
195
+ # Idempotent: skip if already installed.
196
+ if ((Test-Path $ConfigFile) -and (Select-String -Path $ConfigFile -Pattern 'deepvista-skill-rules' -Quiet)) {
197
+ return
198
+ }
199
+ Add-Content -Path $ConfigFile -Value $SkillRulesBlock
200
+ Write-Sub "Skill interpretation rules injected in $ConfigFile"
201
+ }
202
+
203
+ Write-Step 'Injecting skill interpretation rules...'
204
+
205
+ if (Test-Path (Join-Path $home_ '.claude')) { Install-SkillRules (Join-Path $home_ '.claude\CLAUDE.md') }
206
+ if (Test-Path (Join-Path $home_ '.cursor')) { Install-SkillRules (Join-Path $home_ '.cursor\rules') }
207
+ if (Test-Path (Join-Path $home_ '.opencode')) { Install-SkillRules (Join-Path $home_ '.opencode\AGENTS.md') }
208
+ if (Test-Path $OpenClawWorkspace) { Install-SkillRules (Join-Path $OpenClawWorkspace 'AGENTS.md') }
209
+
210
+ # ---------------------------------------------------------------------------
211
+ # 5. Register the skill-trigger hook in Claude Code settings.json
212
+ # ---------------------------------------------------------------------------
213
+ Write-Step 'Installing DeepVista skill-trigger hook...'
214
+
215
+ # Same shell command as the bash installer. The hook body is a bash snippet
216
+ # executed by Claude Code's hook runner; it is stored verbatim as a string.
217
+ $TriggerCmd = @'
218
+ prompt=$(jq -r '.prompt // ""'); if echo "$prompt" | grep -qiE '\b(workflow|skill)'; then echo '{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"IMPORTANT: The user mentioned workflow or skills. You MUST call the Skill tool with skill=\"deepvista\" before doing anything else. Do not search files, browse the web, or use any other tool first."}}'; fi # deepvista-skill-trigger
219
+ '@.Trim()
220
+
221
+ function Install-SkillTriggerHook {
222
+ param([string]$SettingsFile)
223
+
224
+ $parent = Split-Path -Parent $SettingsFile
225
+ if ($parent -and -not (Test-Path $parent)) {
226
+ New-Item -ItemType Directory -Path $parent -Force | Out-Null
227
+ }
228
+
229
+ if (-not (Test-Path $SettingsFile)) {
230
+ Set-Content -Path $SettingsFile -Value '{}'
231
+ }
232
+
233
+ # Idempotent: skip if already installed.
234
+ if (Select-String -Path $SettingsFile -Pattern 'deepvista-skill-trigger' -Quiet) {
235
+ Write-Sub "Skill-trigger hook already registered in $SettingsFile"
236
+ return
237
+ }
238
+
239
+ $raw = Get-Content -Raw -Path $SettingsFile
240
+ if ([string]::IsNullOrWhiteSpace($raw)) { $raw = '{}' }
241
+ try {
242
+ $cfg = $raw | ConvertFrom-Json
243
+ } catch {
244
+ $cfg = [pscustomobject]@{}
245
+ }
246
+ if ($null -eq $cfg) { $cfg = [pscustomobject]@{} }
247
+
248
+ # Ensure cfg.hooks exists.
249
+ if (-not ($cfg.PSObject.Properties.Name -contains 'hooks') -or $null -eq $cfg.hooks) {
250
+ $cfg | Add-Member -NotePropertyName 'hooks' -NotePropertyValue ([pscustomobject]@{}) -Force
251
+ }
252
+ $hooks = $cfg.hooks
253
+
254
+ # Ensure hooks.UserPromptSubmit exists as an array.
255
+ if (-not ($hooks.PSObject.Properties.Name -contains 'UserPromptSubmit') -or $null -eq $hooks.UserPromptSubmit) {
256
+ $hooks | Add-Member -NotePropertyName 'UserPromptSubmit' -NotePropertyValue @() -Force
257
+ }
258
+ $uspList = @($hooks.UserPromptSubmit)
259
+
260
+ # Bail if already present (defensive; the Select-String check above usually catches it).
261
+ foreach ($entry in $uspList) {
262
+ if ($entry.PSObject.Properties.Name -contains 'hooks') {
263
+ foreach ($h in @($entry.hooks)) {
264
+ if ($h.PSObject.Properties.Name -contains 'command' -and "$($h.command)".Contains('deepvista-skill-trigger')) {
265
+ Write-Sub "Skill-trigger hook already registered in $SettingsFile"
266
+ return
267
+ }
268
+ }
269
+ }
270
+ }
271
+
272
+ $newEntry = [pscustomobject]@{
273
+ matcher = ''
274
+ hooks = @(
275
+ [pscustomobject]@{
276
+ type = 'command'
277
+ command = $TriggerCmd
278
+ }
279
+ )
280
+ }
281
+
282
+ $hooks.UserPromptSubmit = @($uspList + $newEntry)
283
+
284
+ $cfg | ConvertTo-Json -Depth 20 | Set-Content -Path $SettingsFile -Encoding UTF8
285
+ Write-Sub "Skill-trigger hook registered in $SettingsFile"
286
+ }
287
+
288
+ Install-SkillTriggerHook (Join-Path $home_ '.claude\settings.json')
289
+ Write-Sub 'Skill-trigger hook active - deepvista skill will be suggested when you mention workflow or skills'
290
+
291
+ # ---------------------------------------------------------------------------
292
+ # 6. Verify the binary actually runs (uv trampoline check)
293
+ # ---------------------------------------------------------------------------
294
+ Write-Step 'Verifying deepvista runs...'
295
+
296
+ # How to invoke deepvista for the auth step below. Defaults to the direct
297
+ # launcher; falls back to `uv tool run` if the trampoline is broken.
298
+ $DeepvistaRunner = @('deepvista')
299
+
300
+ function Invoke-DeepvistaVersion {
301
+ # Returns a hashtable: @{ Ok = $bool; Output = $string }
302
+ param([string[]]$Prefix)
303
+ $out = ''
304
+ $ok = $false
305
+ try {
306
+ $exe = $Prefix[0]
307
+ $argList = @()
308
+ if ($Prefix.Count -gt 1) { $argList += $Prefix[1..($Prefix.Count - 1)] }
309
+ $argList += '--version'
310
+ $out = & $exe @argList 2>&1 | Out-String
311
+ $ok = ($LASTEXITCODE -eq 0)
312
+ } catch {
313
+ $out = $_.Exception.Message
314
+ $ok = $false
315
+ }
316
+ return @{ Ok = $ok; Output = $out }
317
+ }
318
+
319
+ $verify = Invoke-DeepvistaVersion -Prefix @('deepvista')
320
+ if ($verify.Ok) {
321
+ Write-Sub ("deepvista OK: " + ($verify.Output.Trim()))
322
+ } else {
323
+ $isTrampoline = $verify.Output -match 'trampoline failed to canonicalize'
324
+ if ($isTrampoline) {
325
+ Write-Warn 'Hit the known uv trampoline bug: "uv trampoline failed to canonicalize script path".'
326
+ } else {
327
+ Write-Warn ('deepvista --version did not run cleanly: ' + ($verify.Output.Trim()))
328
+ }
329
+
330
+ # Fall back to `uv tool run deepvista`.
331
+ $fallback = Invoke-DeepvistaVersion -Prefix @('uv', 'tool', 'run', 'deepvista')
332
+ if ($fallback.Ok) {
333
+ Write-Sub ('Fallback works: uv tool run deepvista -> ' + ($fallback.Output.Trim()))
334
+ $DeepvistaRunner = @('uv', 'tool', 'run', 'deepvista')
335
+ Write-Host ''
336
+ Write-Sub 'The `deepvista` launcher is broken but `uv tool run deepvista` works. To fix the launcher:'
337
+ Write-Sub ' uv self update'
338
+ Write-Sub ' uv tool install --reinstall "deepvista-cli[ui]"'
339
+ Write-Sub 'Until then, prefix commands with `uv tool run`, e.g. `uv tool run deepvista auth login`.'
340
+ Write-Sub 'Tip: paths with spaces or OneDrive-synced folders aggravate this bug - run from a path without spaces.'
341
+ Write-Host ''
342
+ } else {
343
+ Write-Warn 'Could not run deepvista via the launcher or `uv tool run`.'
344
+ Write-Sub 'Try the following, then re-run this installer:'
345
+ Write-Sub ' uv self update'
346
+ Write-Sub ' uv tool install --reinstall "deepvista-cli[ui]"'
347
+ Write-Sub 'Or invoke it directly with: uv tool run deepvista <args>'
348
+ Write-Sub 'Tip: avoid working directories with spaces or OneDrive sync, which trigger the uv trampoline bug.'
349
+ }
350
+ }
351
+
352
+ # ---------------------------------------------------------------------------
353
+ # 7. Authentication
354
+ # ---------------------------------------------------------------------------
355
+ Write-Step 'Checking DeepVista authentication...'
356
+
357
+ function Invoke-Deepvista {
358
+ param([string[]]$Arguments)
359
+ $exe = $DeepvistaRunner[0]
360
+ $prefixArgs = @()
361
+ if ($DeepvistaRunner.Count -gt 1) { $prefixArgs = $DeepvistaRunner[1..($DeepvistaRunner.Count - 1)] }
362
+ & $exe @($prefixArgs + $Arguments)
363
+ return $LASTEXITCODE
364
+ }
365
+
366
+ $authStatus = 1
367
+ try {
368
+ $statusPrefixArgs = @()
369
+ if ($DeepvistaRunner.Count -gt 1) { $statusPrefixArgs = $DeepvistaRunner[1..($DeepvistaRunner.Count - 1)] }
370
+ $null = (& $DeepvistaRunner[0] @($statusPrefixArgs + @('auth', 'status')) 2>&1)
371
+ $authStatus = $LASTEXITCODE
372
+ } catch {
373
+ $authStatus = 1
374
+ }
375
+
376
+ if ($authStatus -eq 0) {
377
+ Write-Sub 'Already authenticated.'
378
+ } else {
379
+ Write-Sub 'Not authenticated - launching login...'
380
+ Invoke-Deepvista -Arguments @('auth', 'login') | Out-Null
381
+ }
382
+
383
+ # ---------------------------------------------------------------------------
384
+ # 8. Next steps
385
+ # ---------------------------------------------------------------------------
386
+ Write-Host ''
387
+ Write-Step 'DeepVista Claude Code plugin'
388
+ Write-Host ''
389
+ Write-Host ' Inside Claude Code, run:'
390
+ Write-Host ''
391
+ Write-Host ' /plugin marketplace add DeepVista-AI/deepvista-cli'
392
+ Write-Host ' /plugin install deepvista@deepvista-ai'
393
+ Write-Host ''
394
+ Write-Host ' Using a different AI agent? Paste this prompt:'
395
+ Write-Host ''
396
+ Write-Host ' Help me install the deepvista plugin for Claude Code: https://github.com/DeepVista-AI/deepvista-cli#as-a-claude-code-plugin'
397
+ Write-Host ''
398
+ Write-Host 'DeepVista is ready. Open your AI agent and say:'
399
+ Write-Host ''
400
+ Write-Host ' Help me get started with DeepVista.'
401
+ Write-Host ''
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepvista",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Remote-managed skill catalog from DeepVista. Auto-syncs thin stubs into the plugin's skills dir on SessionStart; full bodies are lazy-loaded at invocation time.",
5
5
  "author": {
6
6
  "name": "DeepVista AI",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deepvista-cli"
3
- version = "0.3.0"
3
+ version = "0.4.0"
4
4
  description = "CLI for DeepVista — chat, notes, skills, and memory from your terminal."
5
5
  readme = "README.md"
6
6
  license = { text = "Apache-2.0" }
@@ -56,7 +56,7 @@ wheels = [
56
56
 
57
57
  [[package]]
58
58
  name = "deepvista-cli"
59
- version = "0.3.0"
59
+ version = "0.4.0"
60
60
  source = { editable = "." }
61
61
  dependencies = [
62
62
  { name = "click" },
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.3.0"
3
- }
File without changes
File without changes
File without changes
File without changes