deepvista-cli 0.2.0__tar.gz → 0.3.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 (92) hide show
  1. deepvista_cli-0.3.0/.release-please-manifest.json +3 -0
  2. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/CHANGELOG.md +12 -0
  3. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/PKG-INFO +1 -1
  4. deepvista_cli-0.3.0/deepvista_cli/commands/schedule.py +169 -0
  5. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/main.py +3 -0
  6. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/output/formatter.py +2 -2
  7. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/.claude-plugin/plugin.json +1 -1
  8. deepvista_cli-0.3.0/plugins/claude-code/commands/deepvista.md +115 -0
  9. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/pyproject.toml +1 -1
  10. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/uv.lock +1 -1
  11. deepvista_cli-0.2.0/.release-please-manifest.json +0 -3
  12. deepvista_cli-0.2.0/plugins/claude-code/commands/deepvista.md +0 -129
  13. deepvista_cli-0.2.0/plugins/claude-code/skills/daily-planning/SKILL.md +0 -161
  14. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/.claude-plugin/marketplace.json +0 -0
  15. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/.github/workflows/ci.yml +0 -0
  16. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/.github/workflows/publish.yml +0 -0
  17. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/.github/workflows/release-please.yml +0 -0
  18. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/.gitignore +0 -0
  19. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/.pre-commit-config.yaml +0 -0
  20. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/CLAUDE.md +0 -0
  21. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/CONTRIBUTING.md +0 -0
  22. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/LICENSE +0 -0
  23. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/README.md +0 -0
  24. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/__init__.py +0 -0
  25. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/agent_catalog.py +0 -0
  26. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/auth/__init__.py +0 -0
  27. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/auth/callback_server.py +0 -0
  28. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/auth/login.py +0 -0
  29. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/auth/tokens.py +0 -0
  30. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/client/__init__.py +0 -0
  31. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/client/http.py +0 -0
  32. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/client/origin.py +0 -0
  33. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/__init__.py +0 -0
  34. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/agents.py +0 -0
  35. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/auth.py +0 -0
  36. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/card.py +0 -0
  37. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/chat.py +0 -0
  38. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/config.py +0 -0
  39. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/lint.py +0 -0
  40. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/memory.py +0 -0
  41. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/notes.py +0 -0
  42. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/session.py +0 -0
  43. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/skill.py +0 -0
  44. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/upgrade.py +0 -0
  45. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/commands/vistabase.py +0 -0
  46. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/config.py +0 -0
  47. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/output/__init__.py +0 -0
  48. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/resources/__init__.py +0 -0
  49. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/resources/workflow_host_runtime.md +0 -0
  50. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/session_note.py +0 -0
  51. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/skill_catalog.py +0 -0
  52. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/tui/__init__.py +0 -0
  53. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/tui/app.py +0 -0
  54. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/deepvista_cli/workflow_doc.py +0 -0
  55. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/docs/assets/deepvista-banner.png +0 -0
  56. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/install.sh +0 -0
  57. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/README.md +0 -0
  58. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/README.md +0 -0
  59. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/agents/.gitignore +0 -0
  60. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/commands/refresh-skills.md +0 -0
  61. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/hooks/hooks.json +0 -0
  62. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/scripts/deepvista-session-end.sh +0 -0
  63. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/scripts/deepvista-session-start.sh +0 -0
  64. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/scripts/deepvista-session-turn.sh +0 -0
  65. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/scripts/deepvista-skill-url.py +0 -0
  66. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/scripts/deepvista-sync.sh +0 -0
  67. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/skills/.gitignore +0 -0
  68. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/plugins/claude-code/skills/install-deepvista-cli/SKILL.md +0 -0
  69. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/release-please-config.json +0 -0
  70. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/scripts/check_plugin_version.py +0 -0
  71. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/SKILL.md +0 -0
  72. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/chat.md +0 -0
  73. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/lint.md +0 -0
  74. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/memory.md +0 -0
  75. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/notes.md +0 -0
  76. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/openclaw.md +0 -0
  77. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/session.md +0 -0
  78. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/shared.md +0 -0
  79. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/skill-analyze-notes.md +0 -0
  80. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/skill-create-from-note.md +0 -0
  81. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/skill-import-files.md +0 -0
  82. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/skill-research-to-skill.md +0 -0
  83. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/skill.md +0 -0
  84. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/vistabase-card.md +0 -0
  85. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/deepvista/reference/vistabase.md +0 -0
  86. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/skills/dv-workflow/SKILL.md +0 -0
  87. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/tests/__init__.py +0 -0
  88. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/tests/test_agent_id_tagging.py +0 -0
  89. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/tests/test_session_note_format.py +0 -0
  90. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/tests/test_skill_catalog.py +0 -0
  91. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/tests/test_skill_commands.py +0 -0
  92. {deepvista_cli-0.2.0 → deepvista_cli-0.3.0}/uninstall.sh +0 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.3.0"
3
+ }
@@ -37,6 +37,18 @@ 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.3.0](https://github.com/DeepVista-AI/deepvista-cli/compare/v0.2.0...v0.3.0) (2026-05-31)
41
+
42
+
43
+ ### Features
44
+
45
+ * **DV-871:** move daily-planning to server; add schedule command ([#151](https://github.com/DeepVista-AI/deepvista-cli/issues/151)) ([7c317e7](https://github.com/DeepVista-AI/deepvista-cli/commit/7c317e7d6f71763f6622354b8581ead8b10ef8ea))
46
+
47
+
48
+ ### Bug Fixes
49
+
50
+ * **types:** mark output_error as NoReturn to fix Pyright errors in schedule.py ([#153](https://github.com/DeepVista-AI/deepvista-cli/issues/153)) ([7ac8b12](https://github.com/DeepVista-AI/deepvista-cli/commit/7ac8b12f1b10a94cd6dbe8533b122a2cf8489228))
51
+
40
52
  ## [0.2.0](https://github.com/DeepVista-AI/deepvista-cli/compare/v0.1.18...v0.2.0) (2026-05-28)
41
53
 
42
54
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepvista-cli
3
- Version: 0.2.0
3
+ Version: 0.3.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
@@ -0,0 +1,169 @@
1
+ """deepvista schedule — opt-in recurring runs of the daily-planning skill.
2
+
3
+ Daily planning generation lives on the DeepVista server (the
4
+ ``deepvista-daily-planning`` skill). This command lets the user *explicitly*
5
+ activate a recurring server job that generates today's planning note on a cron
6
+ schedule — nothing runs automatically until the user opts in here, which keeps
7
+ token spend under their control.
8
+
9
+ Under the hood each "activation" is a row in the server's ``scheduled_jobs``
10
+ table whose ``prompt`` asks the agent to run the daily-planning skill. The
11
+ heartbeat dispatcher drains due rows and runs the agent.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import click
17
+
18
+ from deepvista_cli.client.http import DeepVistaClient
19
+ from deepvista_cli.output.formatter import format_output, output_error
20
+
21
+ # The server-side workflow skill that generates the planning note.
22
+ DAILY_PLANNING_SKILL = "deepvista-daily-planning"
23
+ # Stable title used to find this job again (activate is idempotent on it).
24
+ JOB_TITLE = "Daily Planning"
25
+ # Cron is evaluated in UTC server-side (no per-user timezone yet — see DV-879).
26
+ DEFAULT_DAILY_CRON = "0 8 * * *"
27
+ DEFAULT_WEEKLY_CRON = "0 8 * * 1"
28
+
29
+ # Columns shown in `--format table`.
30
+ _JOB_COLUMNS = ["id", "title", "cron_schedule", "enabled", "next_run_at", "last_run_at"]
31
+
32
+
33
+ def _client(ctx: click.Context) -> DeepVistaClient:
34
+ return ctx.obj._client
35
+
36
+
37
+ def _find_daily_planning_job(ctx: click.Context) -> dict | None:
38
+ """Return the existing daily-planning job for this user, or None.
39
+
40
+ Matches on the stable ``JOB_TITLE`` so repeated activations re-use the same
41
+ row instead of stacking duplicates.
42
+ """
43
+ data = _client(ctx).get("/scheduled-jobs")
44
+ for job in data.get("jobs", []):
45
+ if job.get("title") == JOB_TITLE:
46
+ return job
47
+ return None
48
+
49
+
50
+ @click.group("schedule")
51
+ def schedule_group() -> None:
52
+ """Manage the recurring daily-planning job (opt-in)."""
53
+
54
+
55
+ @schedule_group.command("activate")
56
+ @click.option("--cron", "cron_schedule", default=None, help="5-field cron in UTC (default: daily 08:00 UTC).")
57
+ @click.option("--weekly", is_flag=True, default=False, help="Run weekly (Mon 08:00 UTC) instead of daily.")
58
+ @click.pass_context
59
+ def schedule_activate(ctx: click.Context, cron_schedule: str | None, weekly: bool) -> None:
60
+ """Activate the recurring daily-planning job.
61
+
62
+ Idempotent: if a daily-planning job already exists it is re-enabled rather
63
+ than duplicated. To change the cron of an existing job, deactivate + delete
64
+ it first, then activate again with a new --cron.
65
+ """
66
+ cadence = "weekly" if weekly else "daily"
67
+ if cron_schedule is None:
68
+ cron_schedule = DEFAULT_WEEKLY_CRON if weekly else DEFAULT_DAILY_CRON
69
+
70
+ existing = _find_daily_planning_job(ctx)
71
+ if existing is not None:
72
+ if existing.get("enabled"):
73
+ format_output(
74
+ {"status": "already_active", "job": existing},
75
+ ctx.obj.output_format,
76
+ title="Daily planning already active",
77
+ )
78
+ return
79
+ resp = _client(ctx).patch(f"/scheduled-jobs/{existing['id']}", {"enabled": True})
80
+ format_output(
81
+ {"status": "reactivated", "job": resp.get("job", resp)},
82
+ ctx.obj.output_format,
83
+ title="Daily planning reactivated",
84
+ )
85
+ return
86
+
87
+ prompt = (
88
+ f"Run the {DAILY_PLANNING_SKILL} skill to generate today's daily "
89
+ f"planning note (cadence: {cadence}). List the workflow Skills that "
90
+ f"should run today as context-card chips in the note's Planning section."
91
+ )
92
+ resp = _client(ctx).post(
93
+ "/scheduled-jobs",
94
+ {
95
+ "prompt": prompt,
96
+ "cron_schedule": cron_schedule,
97
+ "title": JOB_TITLE,
98
+ "enabled": True,
99
+ },
100
+ )
101
+ if not resp.get("success"):
102
+ output_error(1, "Failed to activate daily planning", resp.get("error", ""))
103
+ format_output(
104
+ {"status": "activated", "cadence": cadence, "job": resp.get("job", resp)},
105
+ ctx.obj.output_format,
106
+ title="Daily planning activated",
107
+ )
108
+
109
+
110
+ @schedule_group.command("deactivate")
111
+ @click.pass_context
112
+ def schedule_deactivate(ctx: click.Context) -> None:
113
+ """Disable the daily-planning job (keeps the row so it can be re-activated)."""
114
+ existing = _find_daily_planning_job(ctx)
115
+ if existing is None:
116
+ output_error(1, "No daily-planning job found", "Run: deepvista schedule activate")
117
+ if not existing.get("enabled"):
118
+ format_output(
119
+ {"status": "already_inactive", "job": existing},
120
+ ctx.obj.output_format,
121
+ title="Daily planning already inactive",
122
+ )
123
+ return
124
+ resp = _client(ctx).patch(f"/scheduled-jobs/{existing['id']}", {"enabled": False})
125
+ format_output(
126
+ {"status": "deactivated", "job": resp.get("job", resp)},
127
+ ctx.obj.output_format,
128
+ title="Daily planning deactivated",
129
+ )
130
+
131
+
132
+ @schedule_group.command("list")
133
+ @click.pass_context
134
+ def schedule_list(ctx: click.Context) -> None:
135
+ """List the caller's scheduled jobs (read-only)."""
136
+ data = _client(ctx).get("/scheduled-jobs")
137
+ jobs = data.get("jobs", [])
138
+ format_output(
139
+ {"jobs": jobs, "count": len(jobs)},
140
+ ctx.obj.output_format,
141
+ columns=_JOB_COLUMNS,
142
+ title="Scheduled Jobs",
143
+ )
144
+
145
+
146
+ @schedule_group.command("delete")
147
+ @click.argument("job_id", required=False)
148
+ @click.pass_context
149
+ def schedule_delete(ctx: click.Context, job_id: str | None) -> None:
150
+ """Delete a scheduled job permanently.
151
+
152
+ With no JOB_ID, deletes the daily-planning job. Use this (then ``activate``)
153
+ to change a job's cron, which PATCH can't edit. Pass ``--dry-run`` on the
154
+ root command to preview without deleting.
155
+ """
156
+ if job_id is None:
157
+ existing = _find_daily_planning_job(ctx)
158
+ if existing is None:
159
+ output_error(1, "No daily-planning job found", "Pass a JOB_ID, or run: deepvista schedule list")
160
+ job_id = existing["id"]
161
+
162
+ resp = _client(ctx).delete(f"/scheduled-jobs/{job_id}")
163
+ if not resp.get("success"):
164
+ output_error(1, "Failed to delete scheduled job", resp.get("error", ""))
165
+ format_output(
166
+ {"status": "deleted", "job_id": job_id},
167
+ ctx.obj.output_format,
168
+ title="Scheduled job deleted",
169
+ )
@@ -31,6 +31,7 @@ from deepvista_cli.commands.config import config_group
31
31
  from deepvista_cli.commands.lint import lint_command
32
32
  from deepvista_cli.commands.memory import vistabase_group
33
33
  from deepvista_cli.commands.notes import notes_group
34
+ from deepvista_cli.commands.schedule import schedule_group
34
35
  from deepvista_cli.commands.session import session_group
35
36
  from deepvista_cli.commands.skill import skill_group
36
37
  from deepvista_cli.commands.upgrade import upgrade_command
@@ -87,6 +88,8 @@ for _name, _cmd in card_group.commands.items():
87
88
  cli.add_command(vistabase_group, name="memory")
88
89
  # Agent orchestration
89
90
  cli.add_command(agents_group)
91
+ # Opt-in recurring daily-planning job
92
+ cli.add_command(schedule_group)
90
93
  # Agent session transcripts (DV-742) — `init` / `tick` / `finalize`
91
94
  cli.add_command(session_group)
92
95
  # Supporting commands
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import json
10
10
  import sys
11
- from typing import Any
11
+ from typing import Any, NoReturn
12
12
 
13
13
  import click
14
14
 
@@ -170,7 +170,7 @@ def output_table(data: Any, columns: list[str] | None = None, title: str | None
170
170
  output_json(data)
171
171
 
172
172
 
173
- def output_error(code: int, message: str, detail: str = "") -> None:
173
+ def output_error(code: int, message: str, detail: str = "") -> NoReturn:
174
174
  """Write structured error to stderr and exit."""
175
175
  err = {"error": {"code": code, "message": message}}
176
176
  if detail:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deepvista",
3
- "version": "0.2.0",
3
+ "version": "0.3.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",
@@ -0,0 +1,115 @@
1
+ ---
2
+ description: DeepVista controls — `run` executes today's Daily Planning note (each workflow via a subagent); no args shows help
3
+ argument-hint: "[run]"
4
+ ---
5
+
6
+ DeepVista control surface. Behaviour depends on `$ARGUMENTS`:
7
+
8
+ - **No argument** (or any value other than `run`) → print the help block below.
9
+ - **`run`** → execute today's *Daily Planning* note: launch a subagent per
10
+ workflow Skill listed in its `## Planning` section, then append a
11
+ consolidated `## Summary` back onto the note.
12
+
13
+ **Generation moved server-side.** Today's planning note is created by the
14
+ DeepVista server agent via the `deepvista-daily-planning` skill — either on a
15
+ schedule you opt into (`deepvista schedule activate`) or on demand. This command
16
+ only *processes* (runs) a note that already exists. Planning notes are regular
17
+ DeepVista notes (`type=note`) tagged ``daily-planning`` + ``date:YYYYMMDD``.
18
+
19
+ ---
20
+
21
+ ## If `$ARGUMENTS` is empty or not `run`
22
+
23
+ Print this verbatim, then stop:
24
+
25
+ > **DeepVista — Claude Code commands**
26
+ >
27
+ > - `/deepvista run` — execute today's *Daily Planning* note. Reads the note's
28
+ > `## Planning` workflow chips and runs each workflow Skill with a subagent,
29
+ > then appends the results under a `## Summary — <timestamp>` block.
30
+ > - `/refresh-skills` — resync the DeepVista skill catalog and agent
31
+ > definitions immediately (bypasses the 60-minute throttle).
32
+ >
33
+ > **Generating today's plan**
34
+ >
35
+ > - Planning is generated by the DeepVista server, not here. Activate a daily
36
+ > run with `deepvista schedule activate` (or `--weekly`), or ask DeepVista to
37
+ > run the `deepvista-daily-planning` skill on demand.
38
+ > - `deepvista schedule list` / `deepvista schedule deactivate` manage it.
39
+ >
40
+ > **Tips**
41
+ >
42
+ > - Need help with the CLI itself? `deepvista --help` or `deepvista <group> --help`.
43
+
44
+ ## If `$ARGUMENTS` is `run`
45
+
46
+ Execute today's planning note.
47
+
48
+ ### Step 1 — Find today's planning note
49
+
50
+ ```bash
51
+ TODAY=$(date +%Y%m%d)
52
+ deepvista --format json card +search "Daily Planning $TODAY" --limit 5
53
+ ```
54
+
55
+ Pick the card whose `tags` include both ``daily-planning`` and ``date:$TODAY``,
56
+ then fetch its full body:
57
+
58
+ ```bash
59
+ deepvista --format json notes get <note-id>
60
+ ```
61
+
62
+ If **no note exists for today**, stop and tell the user to generate one first —
63
+ generation is server-side now: `deepvista schedule activate` for a recurring
64
+ run, or ask DeepVista to run the `deepvista-daily-planning` skill on demand. Do
65
+ **not** try to generate the plan from this command.
66
+
67
+ ### Step 2 — Run each workflow with a subagent
68
+
69
+ Read the note's `## Planning` section. It lists the workflow Skills to run today
70
+ as context-card chips (`<contextCardBlock cardType="skill" id="...">`). You don't
71
+ need to hand-parse anything mechanically — read the note and, for each workflow
72
+ chip in order, launch a subagent to load and run that workflow Skill end-to-end
73
+ (`deepvista skill run <skill-id>` drives it host-side). Give each subagent the
74
+ planning note's intent so it has context.
75
+
76
+ For each workflow, capture:
77
+
78
+ - **Time** — how long the run took (or start/finish).
79
+ - **Output** — the deliverable / where it landed (note id, card, artifact).
80
+
81
+ If a chip's skill id can't be resolved or a run fails, record the error for that
82
+ workflow and continue with the rest — don't abort the whole run.
83
+
84
+ ### Step 3 — Append a consolidated summary to the note
85
+
86
+ Build one markdown block:
87
+
88
+ ```
89
+ ## Summary — <YYYY-MM-DD HH:MM>
90
+
91
+ ### <Workflow 1 title>
92
+ - Time: <duration>
93
+ - Output: <result / link>
94
+
95
+ ### <Workflow 2 title>
96
+ - Time: <duration>
97
+ - Output: <result / link>
98
+ ```
99
+
100
+ Read the current body, append the block, write it back:
101
+
102
+ ```bash
103
+ deepvista --format json notes get <note-id>
104
+ # Capture description, append the block, then:
105
+ deepvista notes update <note-id> --content-file -
106
+ ```
107
+
108
+ ### Step 4 — Report
109
+
110
+ Tell the user, in two lines:
111
+
112
+ - Which workflows ran (and any that were skipped or failed).
113
+ - The planning note URL (`https://app.deepvista.ai/notes/<id>`).
114
+
115
+ If any step fails, stop and surface the error — do not silently fall through.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deepvista-cli"
3
- version = "0.2.0"
3
+ version = "0.3.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.2.0"
59
+ version = "0.3.0"
60
60
  source = { editable = "." }
61
61
  dependencies = [
62
62
  { name = "click" },
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.2.0"
3
- }
@@ -1,129 +0,0 @@
1
- ---
2
- description: DeepVista controls — `run` generates + dispatches today's planning note via the daily-planning skill; no args shows help
3
- argument-hint: "[run]"
4
- ---
5
-
6
- DeepVista control surface. Behaviour depends on `$ARGUMENTS`:
7
-
8
- - **No argument** (or any value other than `run`) → print the help block below.
9
- - **`run`** → generate today's *Daily Planning* note via the `daily-planning`
10
- skill (if one doesn't already exist), dispatch each `## <role>` section to
11
- its matching `@<role>` subagent, and append a consolidated summary back
12
- onto the note.
13
-
14
- Planning notes are stored as regular DeepVista notes (`type=note`) tagged
15
- ``daily-planning`` + ``date:YYYYMMDD``. No dedicated `deepvista planning`
16
- CLI command exists — read/write everything via `deepvista notes` and
17
- `deepvista card +search`.
18
-
19
- ---
20
-
21
- ## If `$ARGUMENTS` is empty or not `run`
22
-
23
- Print this verbatim, then stop:
24
-
25
- > **DeepVista — Claude Code commands**
26
- >
27
- > - `/deepvista run` — generate today's *Daily Planning* note (LLM-reasoned,
28
- > driven by the `daily-planning` skill: yesterday's progress + last 7 days
29
- > of cards → per-role tasks), then dispatch each `## <role>` section to
30
- > the matching `@<role>` subagent. Subagent results are appended back to
31
- > the planning note under a `## Summary — <timestamp>` block.
32
- > - `/refresh-skills` — resync the DeepVista skill catalog and agent
33
- > definitions immediately (bypasses the 60-minute throttle).
34
- >
35
- > **Tips**
36
- >
37
- > - Want to draft a plan without dispatching? Just say *"draft today's
38
- > planning note"* and the `daily-planning` skill kicks in.
39
- > - Personalise a subagent's voice by setting `config.system_prompt` on its
40
- > managed agent (free text, e.g. *"You are the marketing specialist;
41
- > follow persona context card persona-mkt-001."*) and re-running
42
- > `/refresh-skills`. The agent loads the persona card at runtime.
43
- > - Need help with the CLI itself? `deepvista --help` or `deepvista <group> --help`.
44
-
45
- ## If `$ARGUMENTS` is `run`
46
-
47
- Execute the daily-planning dispatch workflow.
48
-
49
- ### Step 1 — Find today's planning note (or generate one)
50
-
51
- ```bash
52
- TODAY=$(date +%Y%m%d)
53
- deepvista --format json card +search "Daily Planning $TODAY" --limit 5
54
- ```
55
-
56
- Walk the result and pick the card with both ``daily-planning`` and
57
- ``date:$TODAY`` in `tags`. Two cases:
58
-
59
- - **No match** → today's note doesn't exist. **Load the `daily-planning`
60
- skill and follow it end-to-end** to produce today's plan. The skill ends
61
- by saving the note via `deepvista notes create`. Re-run the search above
62
- to pick up the new note id.
63
-
64
- - **Match found** → fetch its full body:
65
- ```bash
66
- deepvista --format json notes get <note-id>
67
- ```
68
-
69
- Parse `description` and split on `## ` headings. Treat headings that match
70
- ``Workflow today`` or ``Summary`` (case-insensitive) as reserved; everything
71
- else is a role section keyed by its heading text (lowercased).
72
-
73
- ### Step 2 — Dispatch each role section to its subagent
74
-
75
- For each `(role, section_markdown)` in the role sections, invoke the
76
- matching subagent inline. Skip any role with no on-disk `dv-<role>.md`
77
- definition — the user hasn't registered a managed agent for it yet.
78
- Example body:
79
-
80
- ```
81
- @<role>
82
-
83
- You are dispatched from today's Daily Planning note (id: <note_id>).
84
-
85
- Your section reads:
86
-
87
- <section_markdown>
88
-
89
- Complete it end-to-end. Return your deliverable in the standard subagent
90
- output format (Frame → Deliverable → Sources → Captured).
91
- ```
92
-
93
- Collect each subagent's full reply.
94
-
95
- ### Step 3 — Append a consolidated summary to the note
96
-
97
- Build a single markdown block:
98
-
99
- ```
100
- ## Summary — <YYYY-MM-DD HH:MM>
101
-
102
- ### @marketing
103
- <that subagent's reply>
104
-
105
- ### @engineering
106
- <that subagent's reply>
107
-
108
-
109
- ```
110
-
111
- Read the current body, append the block, write it back:
112
-
113
- ```bash
114
- deepvista --format json notes get <note-id>
115
- # Capture description from JSON, append the block, then:
116
- deepvista notes update <note-id> --content-file -
117
- # (pass `description + appended_block` on stdin)
118
- ```
119
-
120
- ### Step 4 — Report
121
-
122
- Tell the user, in two lines:
123
-
124
- - Whether the plan was generated this run (and via which skill), or pulled
125
- from an existing note.
126
- - Roles dispatched (and any skipped because no matching subagent existed),
127
- plus the planning note URL (`https://app.deepvista.ai/notes/<id>`).
128
-
129
- If any step fails, stop and surface the error — do not silently fall through.
@@ -1,161 +0,0 @@
1
- ---
2
- name: daily-planning
3
- description: |
4
- Generate today's *Daily Planning* note by reading yesterday's plan (and its
5
- appended progress summary) along with recent context cards from the last 7
6
- days — then reason about what carries over, what's new, and what each
7
- registered `@<role>` managed-agent subagent should own today. Save the
8
- result as a regular DeepVista note tagged ``daily-planning`` +
9
- ``date:YYYYMMDD``. Use when the user runs `/deepvista run` and today's
10
- planning note doesn't yet exist, or when the user asks to "draft today's
11
- plan", "make today's standup", or "regenerate my daily planning note".
12
- ---
13
-
14
- # Daily planning — generate today's plan from yesterday's context
15
-
16
- This skill produces today's *Daily Planning* note as an LLM-reasoned plan,
17
- not a static template. Planning notes are plain `deepvista notes` cards
18
- (type=note) tagged ``daily-planning`` + ``date:YYYYMMDD`` — there is no
19
- dedicated `deepvista planning` subcommand. The flow:
20
-
21
- 1. Read **yesterday's** planning note + appended summary (if it exists).
22
- 2. Read the **last 7 days** of context cards (notes, todos, sessions).
23
- 3. List the **`@<role>` subagents** registered for this user.
24
- 4. Reason about carry-over, new tasks, and blockers.
25
- 5. Save the result as a note via `deepvista notes create`.
26
-
27
- The CLI does the data lookups; this skill is the reasoning runbook.
28
-
29
- ## Step 1 — Read yesterday's plan
30
-
31
- Search for yesterday's planning note by tag (titles can be edited; tags
32
- shouldn't). Hybrid search filtered to `type=note` is the most robust:
33
-
34
- ```bash
35
- YESTERDAY=$(date -v-1d +%Y%m%d 2>/dev/null || date -d 'yesterday' +%Y%m%d)
36
- TODAY=$(date +%Y%m%d)
37
-
38
- deepvista --format json card +search "Daily Planning $YESTERDAY" --limit 5
39
- # If a match is found, fetch its full body:
40
- # deepvista --format json notes get <id>
41
- ```
42
-
43
- Parse `description` (yesterday's full markdown — plan + any
44
- `## Summary — <timestamp>` blocks that `/deepvista run` appended after
45
- subagents finished). If nothing matches, treat yesterday as a clean slate.
46
-
47
- ## Step 2 — Read the last 7 days of context cards
48
-
49
- Each call is bounded (`--limit 20`). Skip silently on failure.
50
-
51
- ```bash
52
- deepvista --format json notes list --limit 20
53
- deepvista --format json card list --type todo --limit 20
54
- deepvista --format json card list --type session --limit 10
55
- deepvista --format json card +search "progress OR blocker OR shipped OR next" --limit 10
56
- ```
57
-
58
- For each result, keep only items updated in the last 7 days. Extract:
59
-
60
- - title
61
- - last-updated date
62
- - a one-sentence read of what it implies for today
63
-
64
- ## Step 3 — List the registered `@<role>` subagents
65
-
66
- ```bash
67
- ls "${CLAUDE_PLUGIN_ROOT:-$HOME/.claude/plugins/deepvista}/agents/" 2>/dev/null \
68
- | grep -E '^dv-.*\.md$' \
69
- | sed 's/^dv-//; s/\.md$//'
70
- ```
71
-
72
- If the list is empty, default to `marketing,engineering,gtm`. The user can
73
- register more via `deepvista agents register`.
74
-
75
- ## Step 4 — Reason about today's plan
76
-
77
- You now have:
78
-
79
- - Yesterday's plan + appended summaries (assigned vs. shipped).
80
- - A 7-day rolling window of notes/todos/sessions (the *why* behind today).
81
- - The list of available `@<role>` subagents (the *who* of today).
82
-
83
- Produce markdown that:
84
-
85
- 1. **Opens with a 2-3 sentence preamble** restating the week's arc — what's
86
- in progress, what shipped yesterday, what's next.
87
- 2. **`## Workflow today`** — a short bulleted list of cross-cutting work the
88
- *main agent* will run directly (not delegated). Include `/refresh-skills`
89
- if subagents are stale; surface explicit user todos; surface blockers.
90
- 3. **One `## <role>` section per registered subagent**, each with:
91
- - **1 must-do** — finishable today, traceable to a card or yesterday's
92
- summary. Reference the source card id inline (e.g. `(see card-xyz)`).
93
- - **0–2 stretch goals** — only if there's spare bandwidth.
94
- - **Blockers** — call out anything the role can't proceed without.
95
- 4. **`## Summary`** — leave empty (`_Subagent results land here after
96
- `/deepvista run` finishes._`). The `/deepvista run` flow fills it later.
97
-
98
- Hard constraints:
99
-
100
- - Total length ≤ 600 words. Brevity beats completeness for a daily plan.
101
- - Every task must trace to a real card, note, or yesterday's summary —
102
- never invent work. If a role has nothing genuinely ready, write
103
- `- _No queued work today — the {role} specialist is free for ad-hoc
104
- requests._` and move on.
105
- - Use the section headers (`## Workflow today`, `## <role>`, `## Summary`)
106
- exactly — the `/deepvista run` slash command parses them by string match.
107
-
108
- ## Step 5 — Save the plan as a DeepVista note
109
-
110
- Pipe the markdown straight into `deepvista notes create` and tag it so
111
- tomorrow's run finds it:
112
-
113
- ```bash
114
- cat <<'PLAN' | deepvista notes create \
115
- --title "Daily Planning $TODAY" \
116
- --content-file - \
117
- --tags "[\"daily-planning\",\"date:$TODAY\",\"source:agent\"]"
118
- # Daily Planning $TODAY
119
-
120
- <preamble>
121
-
122
- ## Workflow today
123
- - …
124
-
125
- ## marketing
126
- - …
127
-
128
- ## engineering
129
- - …
130
-
131
- ## Summary
132
-
133
- _Subagent results land here after `/deepvista run` finishes._
134
- PLAN
135
- ```
136
-
137
- Confirm with the user before running the save (this is a write command).
138
- Surface the note URL — `https://app.deepvista.ai/notes/<id>` — in the
139
- response so they can edit any section before `/deepvista run` dispatches it.
140
-
141
- ## Append a summary after `/deepvista run` finishes
142
-
143
- The slash command appends each subagent's reply onto today's note. There is
144
- no dedicated `append-summary` CLI — use `deepvista notes update`:
145
-
146
- ```bash
147
- deepvista notes get <note-id> # read current description
148
- # build new_description = current + "\n\n## Summary — <timestamp>\n<consolidated block>\n"
149
- deepvista notes update <note-id> --content-file - # pipe new_description on stdin
150
- ```
151
-
152
- ## Quick reference
153
-
154
- | Command | Reads | Writes |
155
- |---|---|---|
156
- | `card +search "Daily Planning <date>"` | semantic search across cards | — |
157
- | `notes get <id>` | one note's full body | — |
158
- | `notes list --limit 20` | recent notes | — |
159
- | `card list --type todo` | recent todos | — |
160
- | `notes create --title ... --content-file - --tags ...` | stdin markdown | new note |
161
- | `notes update <id> --content-file -` | stdin markdown | replaces the note body |
File without changes
File without changes
File without changes
File without changes
File without changes