cinna-cli 0.5.0__tar.gz → 0.5.1__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 (112) hide show
  1. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/PKG-INFO +1 -1
  2. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/delegation/delegation.md +5 -3
  3. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/delegation/delegation_tech.md +3 -2
  4. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/pyproject.toml +1 -1
  5. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/delegation.py +11 -5
  6. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/kit_contract.py +1 -1
  7. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_delegation.py +10 -0
  8. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_local_import.py +1 -1
  9. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/uv.lock +1 -1
  10. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/.claude/commands/cinna-cli.feature.doc.md +0 -0
  11. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/.github/workflows/publish.yml +0 -0
  12. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/.gitignore +0 -0
  13. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/LICENSE.md +0 -0
  14. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/README.md +0 -0
  15. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/README.md +0 -0
  16. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/account_workspace/account_workspace.md +0 -0
  17. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/account_workspace/account_workspace_acceptance.md +0 -0
  18. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/account_workspace/account_workspace_tech.md +0 -0
  19. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_addons/agent_addons.md +0 -0
  20. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_addons/agent_addons_acceptance.md +0 -0
  21. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_addons/agent_addons_tech.md +0 -0
  22. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_api/agent_api.md +0 -0
  23. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_api/agent_api_acceptance.md +0 -0
  24. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_api/agent_api_tech.md +0 -0
  25. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_management/agent_management.md +0 -0
  26. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_management/agent_management_acceptance.md +0 -0
  27. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_management/agent_management_tech.md +0 -0
  28. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_schedules/agent_schedules.md +0 -0
  29. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_schedules/agent_schedules_acceptance.md +0 -0
  30. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/agent_schedules/agent_schedules_tech.md +0 -0
  31. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/bootstrap_onboarding/bootstrap_onboarding.md +0 -0
  32. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/bootstrap_onboarding/bootstrap_onboarding_acceptance.md +0 -0
  33. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/bootstrap_onboarding/bootstrap_onboarding_tech.md +0 -0
  34. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/delegation/delegation_acceptance.md +0 -0
  35. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/doctor/doctor.md +0 -0
  36. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/doctor/doctor_acceptance.md +0 -0
  37. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/doctor/doctor_tech.md +0 -0
  38. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/git_versioning/git_versioning.md +0 -0
  39. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/git_versioning/git_versioning_acceptance.md +0 -0
  40. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/git_versioning/git_versioning_tech.md +0 -0
  41. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/improvement_requests/improvement_requests.md +0 -0
  42. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/improvement_requests/improvement_requests_acceptance.md +0 -0
  43. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/improvement_requests/improvement_requests_tech.md +0 -0
  44. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/live_sync/live_sync.md +0 -0
  45. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/live_sync/live_sync_acceptance.md +0 -0
  46. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/live_sync/live_sync_tech.md +0 -0
  47. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/local_agent_import/local_agent_import.md +0 -0
  48. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/local_agent_import/local_agent_import_acceptance.md +0 -0
  49. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/local_agent_import/local_agent_import_tech.md +0 -0
  50. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/mcp_integration/mcp_integration.md +0 -0
  51. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/mcp_integration/mcp_integration_acceptance.md +0 -0
  52. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/mcp_integration/mcp_integration_tech.md +0 -0
  53. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/remote_chat/remote_chat.md +0 -0
  54. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/remote_chat/remote_chat_acceptance.md +0 -0
  55. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/remote_chat/remote_chat_tech.md +0 -0
  56. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/remote_exec/remote_exec.md +0 -0
  57. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/remote_exec/remote_exec_acceptance.md +0 -0
  58. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/features/remote_exec/remote_exec_tech.md +0 -0
  59. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/interface.md +0 -0
  60. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/docs/mutagen_capabilities.md +0 -0
  61. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/scripts/check_docs_references.py +0 -0
  62. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/__init__.py +0 -0
  63. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/account.py +0 -0
  64. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/auth.py +0 -0
  65. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/bootstrap.py +0 -0
  66. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/chat.py +0 -0
  67. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/cli_version.py +0 -0
  68. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/client.py +0 -0
  69. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/config.py +0 -0
  70. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/console.py +0 -0
  71. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/context.py +0 -0
  72. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/doctor.py +0 -0
  73. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/errors.py +0 -0
  74. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/git_versioning.py +0 -0
  75. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/improve.py +0 -0
  76. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/local_import.py +0 -0
  77. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/logging.py +0 -0
  78. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/main.py +0 -0
  79. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/mcp_proxy.py +0 -0
  80. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/mutagen_runtime.py +0 -0
  81. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/scenarios.py +0 -0
  82. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/sync.py +0 -0
  83. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/sync_session.py +0 -0
  84. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/sync_ssh_shim.py +0 -0
  85. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/sync_tui.py +0 -0
  86. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/templates/ACCOUNT_CLAUDE.md.template +0 -0
  87. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/templates/CHAT_TESTING.md +0 -0
  88. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/templates/CLAUDE.md.template +0 -0
  89. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/templates/GIT_VERSIONING.md +0 -0
  90. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/src/cinna/templates/__init__.py +0 -0
  91. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/__init__.py +0 -0
  92. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/conftest.py +0 -0
  93. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_account.py +0 -0
  94. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_auth.py +0 -0
  95. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_bootstrap.py +0 -0
  96. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_chat.py +0 -0
  97. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_cli_version.py +0 -0
  98. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_client.py +0 -0
  99. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_config.py +0 -0
  100. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_console.py +0 -0
  101. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_context.py +0 -0
  102. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_doctor.py +0 -0
  103. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_git_versioning.py +0 -0
  104. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_improve.py +0 -0
  105. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_kit_contract.py +0 -0
  106. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_main.py +0 -0
  107. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_mutagen_runtime.py +0 -0
  108. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_onboarding.py +0 -0
  109. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_scenarios.py +0 -0
  110. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_sync.py +0 -0
  111. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_sync_session.py +0 -0
  112. {cinna_cli-0.5.0 → cinna_cli-0.5.1}/tests/test_sync_ssh_shim.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: cinna-cli
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Local development CLI for Cinna Core agents
5
5
  Project-URL: Homepage, https://github.com/opencinna/cinna-cli
6
6
  Project-URL: Repository, https://github.com/opencinna/cinna-cli
@@ -152,9 +152,11 @@ result attached to the current task ──► delivered to the requester (Deskto
152
152
  - **Remote chat** — a delegated task runs as a platform session like the ones
153
153
  `cinna chat` drives. See [Remote Chat](../remote_chat/remote_chat.md).
154
154
  - **cinna-core task MCP server (not in this repo)** — inside cloud tasks the
155
- backend's MCP task server exposes a `handover_report` tool that records the
156
- same kind of result. It is implemented and documented in cinna-core; this CLI
157
- only offers the equivalent command-line path.
155
+ backend's `cinna` MCP server exposes a `tasks_report` tool (the Cinna Task
156
+ Protocol, kit contract 1.6.0) that records the same kind of result; an
157
+ environment built before protocol version 1 still has it as `handover_report`
158
+ on the older `agent_task` server. It is implemented and documented in
159
+ cinna-core; this CLI only offers the equivalent command-line path.
158
160
 
159
161
  Implementation: see [delegation_tech.md](delegation_tech.md).
160
162
  Real-usage e2e scenarios: see [delegation_acceptance.md](delegation_acceptance.md).
@@ -122,8 +122,9 @@ Executor side — direct call, agent-token auth:
122
122
  belongs to this environment's agent and owner, and resolves the task from the
123
123
  session. Any 2xx is success.
124
124
 
125
- Related, not in this repo: cinna-core's cloud MCP task server exposes a
126
- `handover_report` tool for the same executor-side report.
125
+ Related, not in this repo: cinna-core's `cinna` MCP server exposes a
126
+ `tasks_report` tool for the same executor-side report (`handover_report` on
127
+ environments built before protocol version 1).
127
128
 
128
129
  ## Edge cases & guardrails (preserve these)
129
130
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "cinna-cli"
3
- version = "0.5.0"
3
+ version = "0.5.1"
4
4
  description = "Local development CLI for Cinna Core agents"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -78,8 +78,13 @@ def _emit_json(result) -> bool:
78
78
 
79
79
 
80
80
  def _parse_artifacts(values: tuple[str, ...]) -> list[dict]:
81
- """Each ``--artifact`` must be a JSON object with kind, name and an
82
- HTTP(S) ``ref`` — the only kind of reference another agent can open."""
81
+ """Each ``--artifact`` must be a JSON object with ``kind`` and ``name``.
82
+
83
+ A ``link`` needs an HTTP(S) ``ref`` — the only kind of reference another
84
+ agent can open. A ``file`` may leave ``ref`` out (the Cinna Task Protocol's
85
+ name-only file artifact, kit contract 1.6.0); when it carries one it must be
86
+ HTTP(S) too, never a local path.
87
+ """
83
88
  artifacts = []
84
89
  for value in values:
85
90
  try:
@@ -90,9 +95,10 @@ def _parse_artifacts(values: tuple[str, ...]) -> list[dict]:
90
95
  raise click.BadParameter(
91
96
  f"Not a JSON object: {value}", param_hint="--artifact"
92
97
  )
98
+ required = ("kind", "name") if artifact.get("kind") == "file" and "ref" not in artifact else ("kind", "name", "ref")
93
99
  missing = [
94
100
  key
95
- for key in ("kind", "name", "ref")
101
+ for key in required
96
102
  if not isinstance(artifact.get(key), str) or not artifact[key].strip()
97
103
  ]
98
104
  if missing:
@@ -100,7 +106,7 @@ def _parse_artifacts(values: tuple[str, ...]) -> list[dict]:
100
106
  f"Artifact needs non-empty string {', '.join(missing)}: {value}",
101
107
  param_hint="--artifact",
102
108
  )
103
- if urlparse(artifact["ref"]).scheme.lower() not in ("http", "https"):
109
+ if "ref" in artifact and urlparse(artifact["ref"]).scheme.lower() not in ("http", "https"):
104
110
  raise click.BadParameter(
105
111
  "Artifact ref must be an http(s) URL (upload local files first): "
106
112
  f"{artifact['ref']}",
@@ -311,7 +317,7 @@ def status(task_id):
311
317
  @click.option(
312
318
  "--artifact",
313
319
  multiple=True,
314
- help='JSON object {"kind", "name", "ref"} with an http(s) ref; repeatable.',
320
+ help='JSON object {"kind", "name", "ref"} with an http(s) ref; a "file" may omit ref; repeatable.',
315
321
  )
316
322
  @click.option("--body", default="", help="The full result text.")
317
323
  def report(task_id, result_status, summary, question, audience, artifact, body):
@@ -59,7 +59,7 @@ CONTRACT_VERSION_FILENAME = "CONTRACT_VERSION"
59
59
 
60
60
  #: The contract version this CLI implements. Only the MAJOR component is a
61
61
  #: compatibility question — see ``check_contract_compatibility``.
62
- SUPPORTED_CONTRACT_VERSION = "1.5.0"
62
+ SUPPORTED_CONTRACT_VERSION = "1.6.0"
63
63
 
64
64
 
65
65
  # ── Offline fallbacks ───────────────────────────────────────────────────────
@@ -258,6 +258,16 @@ def test_valid_artifact_passes_through(runner, platform):
258
258
  assert platform.calls_to("PUT", "tasks/task/delegation-result")[0]["json_body"]["artifacts"] == [artifact]
259
259
 
260
260
 
261
+ def test_file_artifact_without_ref_passes_through(runner, platform):
262
+ """The protocol's name-only file artifact: a file the executor could not
263
+ upload is named, not refused — a link still needs its http(s) ref."""
264
+ platform.routes[("PUT", "tasks/task/delegation-result")] = (200, {"id": "result"})
265
+ artifact = {"kind": "file", "name": "out/report.pdf"}
266
+ result = runner.invoke(cli, ["delegation", "report", "task", "--status", "done", "--summary", "S", "--artifact", json.dumps(artifact)])
267
+ assert result.exit_code == 0, result.output
268
+ assert platform.calls_to("PUT", "tasks/task/delegation-result")[0]["json_body"]["artifacts"] == [artifact]
269
+
270
+
261
271
  # ─── cloud report (no TASK_ID) ──────────────────────────────────────────────
262
272
 
263
273
 
@@ -1190,7 +1190,7 @@ def test_a_same_major_contract_passes_silently(
1190
1190
 
1191
1191
  result = runner.invoke(cli, ["agent", "import", str(src), "--yes"])
1192
1192
  assert result.exit_code == 0, result.output
1193
- assert "contract 1.5.2 runs on contract 1.5.0" in result.output
1193
+ assert "contract 1.5.2 runs on contract 1.6.0" in result.output
1194
1194
  (entry,) = json.loads((src / "publications.json").read_text())["publications"]
1195
1195
  assert entry["contract_version"] == "1.5.2"
1196
1196
 
@@ -136,7 +136,7 @@ wheels = [
136
136
 
137
137
  [[package]]
138
138
  name = "cinna-cli"
139
- version = "0.5.0"
139
+ version = "0.5.1"
140
140
  source = { editable = "." }
141
141
  dependencies = [
142
142
  { name = "click" },
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