agentlane 0.5.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.
- agentlane-0.5.0/.agents/skills/code-change-verification/SKILL.md +29 -0
- agentlane-0.5.0/.agents/skills/code-change-verification/scripts/run.sh +25 -0
- agentlane-0.5.0/.agents/skills/docs-sync/SKILL.md +140 -0
- agentlane-0.5.0/.agents/skills/docs-sync/agents/openai.yaml +4 -0
- agentlane-0.5.0/.agents/skills/docs-sync/references/doc-coverage-checklist.md +48 -0
- agentlane-0.5.0/.agents/skills/release/SKILL.md +182 -0
- agentlane-0.5.0/.agents/skills/release/references/release_notes_template.md +27 -0
- agentlane-0.5.0/.agents/skills/release/scripts/release_context.py +171 -0
- agentlane-0.5.0/.agents/skills/release/scripts/run.sh +9 -0
- agentlane-0.5.0/.agents/skills/vhs/SKILL.md +102 -0
- agentlane-0.5.0/.github/workflows/pypi-publish.yml +66 -0
- agentlane-0.5.0/.gitignore +36 -0
- agentlane-0.5.0/.hadolint.yaml +4 -0
- agentlane-0.5.0/.isort.cfg +2 -0
- agentlane-0.5.0/.markdownlint.yaml +12 -0
- agentlane-0.5.0/.python-version +1 -0
- agentlane-0.5.0/.yamllint.yaml +11 -0
- agentlane-0.5.0/AGENTS.md +115 -0
- agentlane-0.5.0/CLAUDE.md +1 -0
- agentlane-0.5.0/LICENSE +21 -0
- agentlane-0.5.0/Makefile +104 -0
- agentlane-0.5.0/PKG-INFO +234 -0
- agentlane-0.5.0/README.md +192 -0
- agentlane-0.5.0/docs/README.md +119 -0
- agentlane-0.5.0/docs/code-style/README.md +20 -0
- agentlane-0.5.0/docs/code-style/comments.md +311 -0
- agentlane-0.5.0/docs/code-style/imports.md +25 -0
- agentlane-0.5.0/docs/code-style/modules.md +102 -0
- agentlane-0.5.0/docs/code-style/python.md +63 -0
- agentlane-0.5.0/docs/code-style/testing-and-prs.md +42 -0
- agentlane-0.5.0/docs/code-style/workspace-packages.md +68 -0
- agentlane-0.5.0/docs/harness/agents.md +81 -0
- agentlane-0.5.0/docs/harness/architecture.md +124 -0
- agentlane-0.5.0/docs/harness/default-agents.md +178 -0
- agentlane-0.5.0/docs/harness/runner.md +146 -0
- agentlane-0.5.0/docs/harness/tasks.md +53 -0
- agentlane-0.5.0/docs/messaging/routing-and-delivery.md +117 -0
- agentlane-0.5.0/docs/models/overview.md +128 -0
- agentlane-0.5.0/docs/models/prompt-templating.md +126 -0
- agentlane-0.5.0/docs/releases/v0.3.0.md +20 -0
- agentlane-0.5.0/docs/releases/v0.4.1.md +20 -0
- agentlane-0.5.0/docs/releases/v0.5.0.md +16 -0
- agentlane-0.5.0/docs/runtime/distributed-runtime-architecture.md +128 -0
- agentlane-0.5.0/docs/runtime/distributed-runtime-usage.md +187 -0
- agentlane-0.5.0/docs/runtime/engine-and-execution.md +120 -0
- agentlane-0.5.0/docs/tracing/overview.md +110 -0
- agentlane-0.5.0/docs/transport/serialization.md +95 -0
- agentlane-0.5.0/examples/README.md +84 -0
- agentlane-0.5.0/examples/__init__.py +3 -0
- agentlane-0.5.0/examples/harness/README.md +29 -0
- agentlane-0.5.0/examples/harness/__init__.py +1 -0
- agentlane-0.5.0/examples/harness/agent_as_tool_policy_specialist/README.md +52 -0
- agentlane-0.5.0/examples/harness/agent_as_tool_policy_specialist/__init__.py +1 -0
- agentlane-0.5.0/examples/harness/agent_as_tool_policy_specialist/main.py +112 -0
- agentlane-0.5.0/examples/harness/customer_support_conversation/README.md +68 -0
- agentlane-0.5.0/examples/harness/customer_support_conversation/__init__.py +1 -0
- agentlane-0.5.0/examples/harness/customer_support_conversation/main.py +224 -0
- agentlane-0.5.0/examples/harness/default_agent_quickstart/README.md +24 -0
- agentlane-0.5.0/examples/harness/default_agent_quickstart/main.py +99 -0
- agentlane-0.5.0/examples/harness/default_agent_tool_note_writer/README.md +35 -0
- agentlane-0.5.0/examples/harness/default_agent_tool_note_writer/__init__.py +1 -0
- agentlane-0.5.0/examples/harness/default_agent_tool_note_writer/main.py +87 -0
- agentlane-0.5.0/examples/harness/default_handoff_takeover/README.md +38 -0
- agentlane-0.5.0/examples/harness/default_handoff_takeover/__init__.py +1 -0
- agentlane-0.5.0/examples/harness/default_handoff_takeover/main.py +85 -0
- agentlane-0.5.0/examples/harness/handoff_to_returns_specialist/README.md +36 -0
- agentlane-0.5.0/examples/harness/handoff_to_returns_specialist/__init__.py +1 -0
- agentlane-0.5.0/examples/harness/handoff_to_returns_specialist/main.py +96 -0
- agentlane-0.5.0/examples/harness/tool_calling_search_answer/README.md +81 -0
- agentlane-0.5.0/examples/harness/tool_calling_search_answer/__init__.py +1 -0
- agentlane-0.5.0/examples/harness/tool_calling_search_answer/main.py +155 -0
- agentlane-0.5.0/examples/runtime/README.md +20 -0
- agentlane-0.5.0/examples/runtime/__init__.py +1 -0
- agentlane-0.5.0/examples/runtime/distributed_publish_fan_in/README.md +78 -0
- agentlane-0.5.0/examples/runtime/distributed_publish_fan_in/__init__.py +1 -0
- agentlane-0.5.0/examples/runtime/distributed_publish_fan_in/main.py +528 -0
- agentlane-0.5.0/examples/runtime/distributed_scatter_gather/README.md +69 -0
- agentlane-0.5.0/examples/runtime/distributed_scatter_gather/__init__.py +1 -0
- agentlane-0.5.0/examples/runtime/distributed_scatter_gather/main.py +454 -0
- agentlane-0.5.0/examples/runtime/multi_agent_workflow/README.md +25 -0
- agentlane-0.5.0/examples/runtime/multi_agent_workflow/__init__.py +1 -0
- agentlane-0.5.0/examples/runtime/multi_agent_workflow/demo.gif +0 -0
- agentlane-0.5.0/examples/runtime/multi_agent_workflow/demo.tape +19 -0
- agentlane-0.5.0/examples/runtime/multi_agent_workflow/main.py +503 -0
- agentlane-0.5.0/examples/runtime/simple/README.md +15 -0
- agentlane-0.5.0/examples/runtime/simple/__init__.py +1 -0
- agentlane-0.5.0/examples/runtime/simple/distributed_publish_fan_in.py +239 -0
- agentlane-0.5.0/examples/runtime/simple/distributed_scatter_gather.py +180 -0
- agentlane-0.5.0/examples/throughput/__init__.py +1 -0
- agentlane-0.5.0/examples/throughput/high_throughput_messaging/README.md +36 -0
- agentlane-0.5.0/examples/throughput/high_throughput_messaging/__init__.py +1 -0
- agentlane-0.5.0/examples/throughput/high_throughput_messaging/demo.gif +0 -0
- agentlane-0.5.0/examples/throughput/high_throughput_messaging/demo.tape +19 -0
- agentlane-0.5.0/examples/throughput/high_throughput_messaging/main.py +553 -0
- agentlane-0.5.0/packages/braintrust/README.md +9 -0
- agentlane-0.5.0/packages/braintrust/src/agentlane_braintrust/__init__.py +7 -0
- agentlane-0.5.0/packages/braintrust/src/agentlane_braintrust/_braintrust_processor.py +445 -0
- agentlane-0.5.0/packages/braintrust/src/agentlane_braintrust/py.typed +1 -0
- agentlane-0.5.0/packages/braintrust/tests/test_braintrust_processor.py +234 -0
- agentlane-0.5.0/packages/litellm/README.md +12 -0
- agentlane-0.5.0/packages/litellm/src/agentlane_litellm/__init__.py +13 -0
- agentlane-0.5.0/packages/litellm/src/agentlane_litellm/_client.py +552 -0
- agentlane-0.5.0/packages/litellm/src/agentlane_litellm/py.typed +0 -0
- agentlane-0.5.0/packages/litellm/src/agentlane_litellm/types/__init__.py +22 -0
- agentlane-0.5.0/packages/litellm/tests/test_client.py +171 -0
- agentlane-0.5.0/packages/openai/README.md +14 -0
- agentlane-0.5.0/packages/openai/src/agentlane_openai/__init__.py +26 -0
- agentlane-0.5.0/packages/openai/src/agentlane_openai/_embeddings.py +81 -0
- agentlane-0.5.0/packages/openai/src/agentlane_openai/_responses_client.py +882 -0
- agentlane-0.5.0/packages/openai/src/agentlane_openai/_tool_output_adapter.py +37 -0
- agentlane-0.5.0/packages/openai/src/agentlane_openai/py.typed +0 -0
- agentlane-0.5.0/packages/openai/src/agentlane_openai/types/__init__.py +53 -0
- agentlane-0.5.0/packages/openai/tests/test_embeddings.py +77 -0
- agentlane-0.5.0/packages/openai/tests/test_responses_client.py +208 -0
- agentlane-0.5.0/pyproject.toml +90 -0
- agentlane-0.5.0/pyrightconfig.json +20 -0
- agentlane-0.5.0/ruff.toml +11 -0
- agentlane-0.5.0/src/agentlane/__init__.py +5 -0
- agentlane-0.5.0/src/agentlane/harness/__init__.py +21 -0
- agentlane-0.5.0/src/agentlane/harness/_agent.py +233 -0
- agentlane-0.5.0/src/agentlane/harness/_handoff.py +206 -0
- agentlane-0.5.0/src/agentlane/harness/_hooks.py +97 -0
- agentlane-0.5.0/src/agentlane/harness/_lifecycle.py +530 -0
- agentlane-0.5.0/src/agentlane/harness/_run.py +108 -0
- agentlane-0.5.0/src/agentlane/harness/_runner.py +1114 -0
- agentlane-0.5.0/src/agentlane/harness/_skills.py +4 -0
- agentlane-0.5.0/src/agentlane/harness/_task.py +95 -0
- agentlane-0.5.0/src/agentlane/harness/_tooling.py +62 -0
- agentlane-0.5.0/src/agentlane/harness/agents/__init__.py +15 -0
- agentlane-0.5.0/src/agentlane/harness/agents/_base.py +79 -0
- agentlane-0.5.0/src/agentlane/harness/agents/_default_agent.py +301 -0
- agentlane-0.5.0/src/agentlane/harness/context/__init__.py +3 -0
- agentlane-0.5.0/src/agentlane/harness/context/_conversation.py +4 -0
- agentlane-0.5.0/src/agentlane/harness/context/_mailbox.py +4 -0
- agentlane-0.5.0/src/agentlane/harness/context/_session.py +4 -0
- agentlane-0.5.0/src/agentlane/harness/memory/__init__.py +3 -0
- agentlane-0.5.0/src/agentlane/harness/memory/_history.py +4 -0
- agentlane-0.5.0/src/agentlane/harness/memory/_scratchpad.py +4 -0
- agentlane-0.5.0/src/agentlane/harness/memory/_store.py +4 -0
- agentlane-0.5.0/src/agentlane/messaging/__init__.py +63 -0
- agentlane-0.5.0/src/agentlane/messaging/_context.py +31 -0
- agentlane-0.5.0/src/agentlane/messaging/_envelope.py +166 -0
- agentlane-0.5.0/src/agentlane/messaging/_identity.py +224 -0
- agentlane-0.5.0/src/agentlane/messaging/_outcome.py +235 -0
- agentlane-0.5.0/src/agentlane/messaging/_routing.py +94 -0
- agentlane-0.5.0/src/agentlane/messaging/_routing_policy.py +129 -0
- agentlane-0.5.0/src/agentlane/messaging/_subscription.py +218 -0
- agentlane-0.5.0/src/agentlane/models/README.md +46 -0
- agentlane-0.5.0/src/agentlane/models/__init__.py +112 -0
- agentlane-0.5.0/src/agentlane/models/_exceptions.py +31 -0
- agentlane-0.5.0/src/agentlane/models/_interface.py +291 -0
- agentlane-0.5.0/src/agentlane/models/_json_repair.py +341 -0
- agentlane-0.5.0/src/agentlane/models/_output_schema.py +457 -0
- agentlane-0.5.0/src/agentlane/models/_prompts.py +212 -0
- agentlane-0.5.0/src/agentlane/models/_rate_limiter.py +305 -0
- agentlane-0.5.0/src/agentlane/models/_response_utils.py +343 -0
- agentlane-0.5.0/src/agentlane/models/_retry.py +260 -0
- agentlane-0.5.0/src/agentlane/models/_strict_schema.py +179 -0
- agentlane-0.5.0/src/agentlane/models/_tool.py +345 -0
- agentlane-0.5.0/src/agentlane/models/_tool_executor.py +202 -0
- agentlane-0.5.0/src/agentlane/models/_tool_output_adapter.py +75 -0
- agentlane-0.5.0/src/agentlane/models/_types/__init__.py +29 -0
- agentlane-0.5.0/src/agentlane/models/py.typed +0 -0
- agentlane-0.5.0/src/agentlane/models/run/__init__.py +8 -0
- agentlane-0.5.0/src/agentlane/models/run/_context.py +145 -0
- agentlane-0.5.0/src/agentlane/models/run/_ctx_managers.py +47 -0
- agentlane-0.5.0/src/agentlane/py.typed +0 -0
- agentlane-0.5.0/src/agentlane/runtime/__init__.py +39 -0
- agentlane-0.5.0/src/agentlane/runtime/_base_agent.py +116 -0
- agentlane-0.5.0/src/agentlane/runtime/_cancellation.py +36 -0
- agentlane-0.5.0/src/agentlane/runtime/_context.py +180 -0
- agentlane-0.5.0/src/agentlane/runtime/_dispatcher.py +265 -0
- agentlane-0.5.0/src/agentlane/runtime/_distributed_grpc.py +304 -0
- agentlane-0.5.0/src/agentlane/runtime/_distributed_wire.py +454 -0
- agentlane-0.5.0/src/agentlane/runtime/_engine.py +75 -0
- agentlane-0.5.0/src/agentlane/runtime/_message_helpers.py +60 -0
- agentlane-0.5.0/src/agentlane/runtime/_network.py +20 -0
- agentlane-0.5.0/src/agentlane/runtime/_protocol.py +68 -0
- agentlane-0.5.0/src/agentlane/runtime/_registry.py +192 -0
- agentlane-0.5.0/src/agentlane/runtime/_runtime.py +736 -0
- agentlane-0.5.0/src/agentlane/runtime/_scheduler.py +159 -0
- agentlane-0.5.0/src/agentlane/runtime/_types.py +28 -0
- agentlane-0.5.0/src/agentlane/runtime/_worker_runtime.py +520 -0
- agentlane-0.5.0/src/agentlane/runtime/_worker_runtime_host.py +616 -0
- agentlane-0.5.0/src/agentlane/tracing/README.md +145 -0
- agentlane-0.5.0/src/agentlane/tracing/__init__.py +110 -0
- agentlane-0.5.0/src/agentlane/tracing/_create.py +217 -0
- agentlane-0.5.0/src/agentlane/tracing/_metrics/__init__.py +81 -0
- agentlane-0.5.0/src/agentlane/tracing/_metrics/_aggregators.py +222 -0
- agentlane-0.5.0/src/agentlane/tracing/_metrics/_collector.py +173 -0
- agentlane-0.5.0/src/agentlane/tracing/_metrics/_emit.py +95 -0
- agentlane-0.5.0/src/agentlane/tracing/_metrics/_registry.py +149 -0
- agentlane-0.5.0/src/agentlane/tracing/_metrics/_types.py +62 -0
- agentlane-0.5.0/src/agentlane/tracing/_metrics_processor.py +114 -0
- agentlane-0.5.0/src/agentlane/tracing/_processor_interface.py +48 -0
- agentlane-0.5.0/src/agentlane/tracing/_processors.py +122 -0
- agentlane-0.5.0/src/agentlane/tracing/_propagation.py +69 -0
- agentlane-0.5.0/src/agentlane/tracing/_provider.py +275 -0
- agentlane-0.5.0/src/agentlane/tracing/_scope.py +75 -0
- agentlane-0.5.0/src/agentlane/tracing/_setup/__init__.py +5 -0
- agentlane-0.5.0/src/agentlane/tracing/_setup/_global.py +45 -0
- agentlane-0.5.0/src/agentlane/tracing/_span.py +292 -0
- agentlane-0.5.0/src/agentlane/tracing/_span_data.py +115 -0
- agentlane-0.5.0/src/agentlane/tracing/_trace.py +292 -0
- agentlane-0.5.0/src/agentlane/tracing/py.typed +0 -0
- agentlane-0.5.0/src/agentlane/transport/__init__.py +69 -0
- agentlane-0.5.0/src/agentlane/transport/_codecs_json.py +296 -0
- agentlane-0.5.0/src/agentlane/transport/_codecs_protobuf.py +103 -0
- agentlane-0.5.0/src/agentlane/transport/_errors.py +61 -0
- agentlane-0.5.0/src/agentlane/transport/_registry.py +515 -0
- agentlane-0.5.0/src/agentlane/transport/_serializer.py +74 -0
- agentlane-0.5.0/src/agentlane/transport/_types.py +77 -0
- agentlane-0.5.0/src/agentlane/transport/_utils.py +31 -0
- agentlane-0.5.0/src/agentlane/transport/_wire_payload.py +169 -0
- agentlane-0.5.0/src/agentlane/util/__init__.py +5 -0
- agentlane-0.5.0/src/agentlane/util/_time.py +8 -0
- agentlane-0.5.0/src/agentlane/version.py +9 -0
- agentlane-0.5.0/tests/agents/test_agent_protocol.py +163 -0
- agentlane-0.5.0/tests/harness/conftest.py +1 -0
- agentlane-0.5.0/tests/harness/test_agent_lifecycle.py +356 -0
- agentlane-0.5.0/tests/harness/test_default_agent.py +302 -0
- agentlane-0.5.0/tests/harness/test_runner.py +1524 -0
- agentlane-0.5.0/tests/harness/test_task.py +228 -0
- agentlane-0.5.0/tests/messaging/test_router.py +147 -0
- agentlane-0.5.0/tests/models/conftest.py +17 -0
- agentlane-0.5.0/tests/models/test_json_repair.py +335 -0
- agentlane-0.5.0/tests/models/test_output_schema.py +98 -0
- agentlane-0.5.0/tests/models/test_prompts.py +110 -0
- agentlane-0.5.0/tests/models/test_rate_limiter.py +343 -0
- agentlane-0.5.0/tests/models/test_response_utils.py +231 -0
- agentlane-0.5.0/tests/models/test_run_context.py +462 -0
- agentlane-0.5.0/tests/models/test_strict_schema.py +66 -0
- agentlane-0.5.0/tests/models/test_tooling.py +271 -0
- agentlane-0.5.0/tests/runtime/test_cancellation.py +21 -0
- agentlane-0.5.0/tests/runtime/test_distributed_runtime.py +478 -0
- agentlane-0.5.0/tests/runtime/test_distributed_wire.py +362 -0
- agentlane-0.5.0/tests/runtime/test_engine.py +843 -0
- agentlane-0.5.0/tests/test_scaffold.py +5 -0
- agentlane-0.5.0/tests/tracing/conftest.py +24 -0
- agentlane-0.5.0/tests/tracing/test_metrics.py +366 -0
- agentlane-0.5.0/tests/tracing/test_trace_context.py +50 -0
- agentlane-0.5.0/tests/transport/test_serialization.py +406 -0
- agentlane-0.5.0/uv.lock +1363 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-change-verification
|
|
3
|
+
description: Run the mandatory verification stack when changes affect runtime code, tests, or build/test behavior in the OpenAI Agents Python repository.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Change Verification
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Ensure work is only marked complete after formatting, linting, type checking, and tests pass. Use this skill when changes affect runtime code, tests, or build/test configuration. You can skip it for docs-only or repository metadata unless a user asks for the full stack.
|
|
11
|
+
|
|
12
|
+
## Quick start
|
|
13
|
+
|
|
14
|
+
1. macOS/Linux: `bash .agents/skills/code-change-verification/scripts/run.sh`.
|
|
15
|
+
2. If any command fails, fix the issue, rerun the script, and report the failing output.
|
|
16
|
+
3. Confirm completion only when all commands succeed with no remaining issues.
|
|
17
|
+
|
|
18
|
+
## Manual workflow
|
|
19
|
+
|
|
20
|
+
- If dependencies are not installed or have changed, run `make sync` first to install dev requirements via `uv`.
|
|
21
|
+
- Run from the repository root in this order: `make format`, `make lint`, `make typecheck`, `make tests`.
|
|
22
|
+
- Do not skip steps; stop and fix issues immediately when a command fails.
|
|
23
|
+
- Re-run the full stack after applying fixes so the commands execute in the required order.
|
|
24
|
+
|
|
25
|
+
## Resources
|
|
26
|
+
|
|
27
|
+
### scripts/run.sh
|
|
28
|
+
|
|
29
|
+
- Executes the full verification sequence with fail-fast semantics from the repository root. Prefer this entry point to ensure the required commands run in the correct order.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Fail fast on any error or undefined variable.
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
6
|
+
if command -v git >/dev/null 2>&1; then
|
|
7
|
+
REPO_ROOT="$(git -C "${SCRIPT_DIR}" rev-parse --show-toplevel 2>/dev/null || true)"
|
|
8
|
+
fi
|
|
9
|
+
REPO_ROOT="${REPO_ROOT:-$(cd "${SCRIPT_DIR}/../../../.." && pwd)}"
|
|
10
|
+
|
|
11
|
+
cd "${REPO_ROOT}"
|
|
12
|
+
|
|
13
|
+
echo "Running make format..."
|
|
14
|
+
make format
|
|
15
|
+
|
|
16
|
+
echo "Running make lint..."
|
|
17
|
+
make lint
|
|
18
|
+
|
|
19
|
+
echo "Running make typecheck..."
|
|
20
|
+
make typecheck
|
|
21
|
+
|
|
22
|
+
echo "Running make tests..."
|
|
23
|
+
make tests
|
|
24
|
+
|
|
25
|
+
echo "code-change-verification: all commands passed."
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: docs-sync
|
|
3
|
+
description: Review the current AgentLane code and public docs under docs/ to find missing, outdated, or misplaced documentation, then propose or apply concise documentation updates that match the repository’s structure and writing style. Ignore internal planning docs under docs/plans/.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Docs Sync
|
|
7
|
+
|
|
8
|
+
Use this skill when the user wants to audit documentation coverage, keep
|
|
9
|
+
`docs/` aligned with implementation changes, or update public technical docs.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
This skill is for public documentation under `docs/**`.
|
|
14
|
+
|
|
15
|
+
Rules:
|
|
16
|
+
|
|
17
|
+
1. Treat `docs/plans/**` as internal tracking, not public documentation.
|
|
18
|
+
2. English only.
|
|
19
|
+
3. Keep edits concise and easy to maintain.
|
|
20
|
+
|
|
21
|
+
## Workflow
|
|
22
|
+
|
|
23
|
+
### 1. Define the scope to review
|
|
24
|
+
|
|
25
|
+
Pick one of these modes:
|
|
26
|
+
|
|
27
|
+
1. full public-doc audit against the current branch
|
|
28
|
+
2. doc sync for a specific feature or directory
|
|
29
|
+
3. diff-based audit against `main` for in-flight changes
|
|
30
|
+
|
|
31
|
+
Prefer diff-based review when there is active branch work. Prefer a full audit
|
|
32
|
+
when the user asks for broad documentation cleanup.
|
|
33
|
+
|
|
34
|
+
### 2. Build a feature inventory from code
|
|
35
|
+
|
|
36
|
+
Review the selected scope in code first.
|
|
37
|
+
|
|
38
|
+
Focus on user-facing behavior:
|
|
39
|
+
|
|
40
|
+
1. public exports
|
|
41
|
+
2. runtime behaviors and guarantees
|
|
42
|
+
3. configuration options and defaults
|
|
43
|
+
4. examples that define supported usage
|
|
44
|
+
5. important developer workflows
|
|
45
|
+
6. renamed, removed, or newly added features
|
|
46
|
+
|
|
47
|
+
Capture lightweight evidence:
|
|
48
|
+
|
|
49
|
+
1. file path
|
|
50
|
+
2. symbol or setting name
|
|
51
|
+
3. short note about the behavior that should be documented
|
|
52
|
+
|
|
53
|
+
### 3. Review the existing docs hierarchy
|
|
54
|
+
|
|
55
|
+
Use the current docs tree as the source of structure.
|
|
56
|
+
|
|
57
|
+
Start with:
|
|
58
|
+
|
|
59
|
+
1. `docs/README.md`
|
|
60
|
+
2. the relevant page under `docs/runtime/`, `docs/messaging/`, `docs/harness/`,
|
|
61
|
+
or `docs/transport/`
|
|
62
|
+
|
|
63
|
+
When reviewing, prefer updating an existing page over creating a new one unless
|
|
64
|
+
the topic clearly has no home.
|
|
65
|
+
|
|
66
|
+
If you add, remove, or rename a public docs page, update `docs/README.md`.
|
|
67
|
+
|
|
68
|
+
### 4. Compare docs against code
|
|
69
|
+
|
|
70
|
+
Look for:
|
|
71
|
+
|
|
72
|
+
1. missing public behavior
|
|
73
|
+
2. outdated names, defaults, or semantics
|
|
74
|
+
3. examples in docs that no longer match implementation
|
|
75
|
+
4. information that belongs on a different page for discoverability
|
|
76
|
+
5. public docs that accidentally expose internal rollout or planning details
|
|
77
|
+
|
|
78
|
+
### 5. Produce a Docs Sync Report
|
|
79
|
+
|
|
80
|
+
Before editing, produce a short report with:
|
|
81
|
+
|
|
82
|
+
1. doc gaps
|
|
83
|
+
2. inaccurate or outdated content
|
|
84
|
+
3. structural suggestions, if any
|
|
85
|
+
4. proposed file-level edits
|
|
86
|
+
|
|
87
|
+
Keep the report concise.
|
|
88
|
+
|
|
89
|
+
### 6. Apply updates if asked
|
|
90
|
+
|
|
91
|
+
When applying edits:
|
|
92
|
+
|
|
93
|
+
1. edit only the relevant public docs under `docs/**`
|
|
94
|
+
2. keep the current writing style and section structure
|
|
95
|
+
3. keep examples short and directly tied to the repo
|
|
96
|
+
4. prefer current-state documentation over rollout history
|
|
97
|
+
5. do not add jokes, slang, rhetoric, puns, or contrastive-negation phrasing
|
|
98
|
+
|
|
99
|
+
## Writing Style
|
|
100
|
+
|
|
101
|
+
Match the existing documentation style in this repository.
|
|
102
|
+
|
|
103
|
+
Rules:
|
|
104
|
+
|
|
105
|
+
1. write in plain technical English
|
|
106
|
+
2. prefer short sections and short paragraphs
|
|
107
|
+
3. use direct statements over persuasive or dramatic framing
|
|
108
|
+
4. explain the current behavior, boundaries, and intended usage
|
|
109
|
+
5. keep examples minimal and realistic
|
|
110
|
+
6. avoid figures of speech, jokes, slang, and rhetorical phrasing
|
|
111
|
+
7. avoid contrastive negation patterns such as “not X, but Y”
|
|
112
|
+
8. keep tone neutral and open-source appropriate
|
|
113
|
+
|
|
114
|
+
## Public Docs Boundary
|
|
115
|
+
|
|
116
|
+
For this repository, public docs currently live under `docs/**`.
|
|
117
|
+
|
|
118
|
+
Internal tracking docs live under `docs/plans/**` and should not be treated as
|
|
119
|
+
the public documentation surface.
|
|
120
|
+
|
|
121
|
+
## Output format
|
|
122
|
+
|
|
123
|
+
Use this report shape when auditing before edits:
|
|
124
|
+
|
|
125
|
+
Docs Sync Report
|
|
126
|
+
|
|
127
|
+
- Scope
|
|
128
|
+
- What was reviewed
|
|
129
|
+
- Missing or weak coverage
|
|
130
|
+
- Doc file or missing page -> evidence -> proposed change
|
|
131
|
+
- Incorrect or outdated content
|
|
132
|
+
- Doc file -> issue -> correct behavior -> evidence
|
|
133
|
+
- Structural suggestions
|
|
134
|
+
- Proposed move/add/remove -> rationale
|
|
135
|
+
- Proposed edits
|
|
136
|
+
- File -> short summary
|
|
137
|
+
|
|
138
|
+
## References
|
|
139
|
+
|
|
140
|
+
- `references/doc-coverage-checklist.md`
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "Docs Sync"
|
|
3
|
+
short_description: "Audit public docs coverage and propose concise updates"
|
|
4
|
+
default_prompt: "Use $docs-sync to review AgentLane public docs under docs/ against the current implementation, then propose concise documentation updates."
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Doc Coverage Checklist
|
|
2
|
+
|
|
3
|
+
Use this checklist when reviewing AgentLane public documentation.
|
|
4
|
+
|
|
5
|
+
## Review targets
|
|
6
|
+
|
|
7
|
+
- Public docs under `docs/**`
|
|
8
|
+
- Public docs index in `docs/README.md`
|
|
9
|
+
- Current implementation under `src/`
|
|
10
|
+
- Public examples when they define supported usage
|
|
11
|
+
|
|
12
|
+
Do not treat `docs/plans/**` as public documentation.
|
|
13
|
+
|
|
14
|
+
## Code-first pass
|
|
15
|
+
|
|
16
|
+
- Identify public exports, runtime behaviors, configuration, and examples.
|
|
17
|
+
- Note renamed, removed, or newly added features.
|
|
18
|
+
- Record short evidence only: file path plus symbol or setting.
|
|
19
|
+
|
|
20
|
+
## Doc-first pass
|
|
21
|
+
|
|
22
|
+
- Review the relevant page in `docs/`.
|
|
23
|
+
- Check whether the page reflects the current behavior and naming.
|
|
24
|
+
- Prefer updating existing pages over creating new ones.
|
|
25
|
+
- Update `docs/README.md` if public docs pages are added, removed, or renamed.
|
|
26
|
+
|
|
27
|
+
## Common gaps
|
|
28
|
+
|
|
29
|
+
- Missing public behavior after a new feature lands
|
|
30
|
+
- Old names or defaults that no longer match code
|
|
31
|
+
- Examples that no longer match the actual API
|
|
32
|
+
- Public docs that still contain rollout notes, phases, dates, or status markers
|
|
33
|
+
- Information placed on the wrong page for discoverability
|
|
34
|
+
|
|
35
|
+
## Writing guardrails
|
|
36
|
+
|
|
37
|
+
- Keep docs concise.
|
|
38
|
+
- Use plain technical English.
|
|
39
|
+
- Avoid slang, jokes, rhetoric, figures of speech, and puns.
|
|
40
|
+
- Avoid contrastive negation phrasing.
|
|
41
|
+
- Describe current behavior rather than implementation history.
|
|
42
|
+
|
|
43
|
+
## Patch guidance
|
|
44
|
+
|
|
45
|
+
- Keep edits narrow and local to the affected pages.
|
|
46
|
+
- Preserve the current section style and hierarchy.
|
|
47
|
+
- Prefer short examples over long explanatory blocks.
|
|
48
|
+
- Keep internal planning notes in `docs/plans/**`, not in public docs.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release
|
|
3
|
+
description: Prepare an AgentLane release with lockstep versioning across the root package and workspace packages, release notes based on changes since the last remote tag, full verification, and local-only git tag creation.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Release
|
|
7
|
+
|
|
8
|
+
Use this skill when the user wants to cut a release, bump versions, draft
|
|
9
|
+
release notes, or create a git tag for PyPI or GitHub release preparation.
|
|
10
|
+
|
|
11
|
+
## Quick start
|
|
12
|
+
|
|
13
|
+
1. Run `bash .agents/skills/release/scripts/run.sh`.
|
|
14
|
+
2. The release must halt unless the current branch is `main`.
|
|
15
|
+
3. The release must halt if `git status --short` is not empty.
|
|
16
|
+
4. If the current versions are not in lockstep yet, update:
|
|
17
|
+
- `pyproject.toml`
|
|
18
|
+
- every discovered `packages/*/pyproject.toml`
|
|
19
|
+
5. Keep all package versions identical for a release.
|
|
20
|
+
6. Do not add compatibility bounds between workspace packages as part of this
|
|
21
|
+
release workflow.
|
|
22
|
+
7. Write release notes to `docs/releases/v<version>.md` using the short
|
|
23
|
+
template in `references/release_notes_template.md`.
|
|
24
|
+
8. Run `/usr/bin/make format`, `/usr/bin/make lint`, and `/usr/bin/make tests`.
|
|
25
|
+
9. Create a local annotated tag with `git tag -a v<version> -F docs/releases/v<version>.md`.
|
|
26
|
+
10. Do not push the tag. Leave tag pushing to the user after review.
|
|
27
|
+
|
|
28
|
+
## Versioning policy
|
|
29
|
+
|
|
30
|
+
This repository uses lockstep versioning.
|
|
31
|
+
|
|
32
|
+
Rules:
|
|
33
|
+
|
|
34
|
+
1. The root package and all workspace packages share the same release version.
|
|
35
|
+
2. While the project is still pre-`1.0`, treat `0.MINOR.0` as the release line
|
|
36
|
+
for meaningful public changes.
|
|
37
|
+
3. Use `PATCH` only for safe fixes, docs, and internal improvements that do not
|
|
38
|
+
intentionally break documented public APIs.
|
|
39
|
+
4. Use a `MINOR` bump for new public capabilities or any public behavior change
|
|
40
|
+
users should adapt to.
|
|
41
|
+
|
|
42
|
+
## Release workflow
|
|
43
|
+
|
|
44
|
+
### 1. Confirm repository state
|
|
45
|
+
|
|
46
|
+
Before editing anything:
|
|
47
|
+
|
|
48
|
+
1. ensure the current branch is exactly `main`
|
|
49
|
+
2. ensure `git status --short` is empty
|
|
50
|
+
3. halt immediately if either check fails
|
|
51
|
+
4. do not discard unrelated changes just to force a release through
|
|
52
|
+
|
|
53
|
+
### 2. Review release context from the remote
|
|
54
|
+
|
|
55
|
+
Always base the release review on the latest remote tag, not just local tags.
|
|
56
|
+
|
|
57
|
+
Run:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
bash .agents/skills/release/scripts/run.sh
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
This helper:
|
|
64
|
+
|
|
65
|
+
1. verifies the current branch is `main`
|
|
66
|
+
2. verifies the worktree is clean
|
|
67
|
+
3. fetches tags from `origin`
|
|
68
|
+
4. reads the current versions from the root and workspace packages
|
|
69
|
+
5. checks whether the repo is already in lockstep
|
|
70
|
+
6. finds the latest remote semver tag
|
|
71
|
+
7. prints the review range and the git commands to inspect commits and files
|
|
72
|
+
|
|
73
|
+
If there are no remote tags yet, treat the release as the initial release and
|
|
74
|
+
review the full history.
|
|
75
|
+
|
|
76
|
+
### 3. Bump versions in lockstep
|
|
77
|
+
|
|
78
|
+
Update:
|
|
79
|
+
|
|
80
|
+
1. `pyproject.toml`
|
|
81
|
+
2. every discovered `packages/*/pyproject.toml`
|
|
82
|
+
|
|
83
|
+
All version values should match exactly.
|
|
84
|
+
|
|
85
|
+
Do not add or change inter-package compatibility bounds as part of this
|
|
86
|
+
workflow.
|
|
87
|
+
|
|
88
|
+
### 4. Write release notes
|
|
89
|
+
|
|
90
|
+
Create `docs/releases/v<version>.md`.
|
|
91
|
+
|
|
92
|
+
Base the notes on:
|
|
93
|
+
|
|
94
|
+
1. `git log --reverse --no-merges --oneline <range>`
|
|
95
|
+
2. `git diff --name-only <range>` or `git log --name-only --pretty=format: --diff-filter=AM HEAD` for an initial release
|
|
96
|
+
3. user-facing API and behavior changes
|
|
97
|
+
4. examples and documentation added or updated
|
|
98
|
+
|
|
99
|
+
Keep the notes short. Prefer one or two sentences of summary plus a few bullets
|
|
100
|
+
for the most notable user-facing changes. Do not turn release notes into a full
|
|
101
|
+
project history dump.
|
|
102
|
+
|
|
103
|
+
Use `references/release_notes_template.md` as the starting point.
|
|
104
|
+
|
|
105
|
+
Format rules:
|
|
106
|
+
|
|
107
|
+
1. summarize the release in one or two sentences
|
|
108
|
+
2. keep only the most notable changes and fixes
|
|
109
|
+
3. group them into short sections such as `Added`, `Changed`, and `Fixed`
|
|
110
|
+
4. attach commit links or short commit references for each bullet
|
|
111
|
+
5. omit low-signal internal churn unless it materially affects users
|
|
112
|
+
6. do not hard-wrap or reflow the release notes to fit an 80-column line limit
|
|
113
|
+
7. keep each summary paragraph on one physical line
|
|
114
|
+
8. keep each bullet on one physical line
|
|
115
|
+
|
|
116
|
+
The template shape is intentionally short, closer to:
|
|
117
|
+
|
|
118
|
+
```markdown
|
|
119
|
+
# v<version>
|
|
120
|
+
|
|
121
|
+
## Summary
|
|
122
|
+
|
|
123
|
+
One or two concise sentences.
|
|
124
|
+
|
|
125
|
+
## Added
|
|
126
|
+
|
|
127
|
+
- Short user-facing addition (`abc1234`)
|
|
128
|
+
|
|
129
|
+
## Changed
|
|
130
|
+
|
|
131
|
+
- Short user-facing change (`def5678`)
|
|
132
|
+
|
|
133
|
+
## Fixed
|
|
134
|
+
|
|
135
|
+
- Short user-facing fix (`fedcba9`)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
For an initial release, make that explicit in the summary.
|
|
139
|
+
|
|
140
|
+
The helper intentionally stops at guardrails plus release context. Do the
|
|
141
|
+
commit review and release-note writing directly in the release task instead of
|
|
142
|
+
trying to encode the whole release process in a script.
|
|
143
|
+
|
|
144
|
+
### 5. Verify
|
|
145
|
+
|
|
146
|
+
Run from the repository root:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
/usr/bin/make format
|
|
150
|
+
/usr/bin/make lint
|
|
151
|
+
/usr/bin/make tests
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Do not create a release tag until all three pass.
|
|
155
|
+
|
|
156
|
+
### 6. Create the tag locally only
|
|
157
|
+
|
|
158
|
+
Create the tag:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
git tag -a v<version> -F docs/releases/v<version>.md
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
Rules:
|
|
165
|
+
|
|
166
|
+
1. create the tag locally only
|
|
167
|
+
2. do not push the tag
|
|
168
|
+
3. use the release notes file as the annotated tag body
|
|
169
|
+
4. report the tag name and release notes path back to the user
|
|
170
|
+
|
|
171
|
+
## Expected output
|
|
172
|
+
|
|
173
|
+
A release-ready result should include:
|
|
174
|
+
|
|
175
|
+
1. the chosen version
|
|
176
|
+
2. confirmation that the release was cut from `main`
|
|
177
|
+
3. confirmation that the worktree was clean before the release started
|
|
178
|
+
4. confirmation that all package versions match
|
|
179
|
+
5. the release notes file path
|
|
180
|
+
6. the verification results
|
|
181
|
+
7. the local tag name
|
|
182
|
+
8. an explicit note that the tag was not pushed
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# v<version>
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
One or two short sentences describing what changed in this release and why it matters to users.
|
|
6
|
+
|
|
7
|
+
## Added
|
|
8
|
+
|
|
9
|
+
- Short user-facing addition ([`abc1234`](https://github.com/<owner>/<repo>/commit/abc1234))
|
|
10
|
+
|
|
11
|
+
## Changed
|
|
12
|
+
|
|
13
|
+
- Short user-facing change ([`def5678`](https://github.com/<owner>/<repo>/commit/def5678))
|
|
14
|
+
|
|
15
|
+
## Fixed
|
|
16
|
+
|
|
17
|
+
- Short user-facing fix ([`fedcba9`](https://github.com/<owner>/<repo>/commit/fedcba9))
|
|
18
|
+
|
|
19
|
+
## Notes
|
|
20
|
+
|
|
21
|
+
- Keep this file concise.
|
|
22
|
+
- Include only notable user-facing changes.
|
|
23
|
+
- Prefer commit links over issue taxonomy unless an issue number adds real value.
|
|
24
|
+
- For an initial release, say so in the summary.
|
|
25
|
+
- Do not hard-wrap or reflow lines to fit an 80-column limit.
|
|
26
|
+
- Keep each summary paragraph on one physical line.
|
|
27
|
+
- Keep each bullet on one physical line.
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Print minimal release context and enforce release guardrails."""
|
|
3
|
+
|
|
4
|
+
import argparse
|
|
5
|
+
import subprocess
|
|
6
|
+
import tomllib
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def run_git(
|
|
11
|
+
repo_root: Path,
|
|
12
|
+
*args: str,
|
|
13
|
+
check: bool = True,
|
|
14
|
+
) -> subprocess.CompletedProcess[str]:
|
|
15
|
+
"""Run one git command from the repository root."""
|
|
16
|
+
return subprocess.run(
|
|
17
|
+
["git", *args],
|
|
18
|
+
cwd=repo_root,
|
|
19
|
+
check=check,
|
|
20
|
+
capture_output=True,
|
|
21
|
+
text=True,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def repo_root() -> Path:
|
|
26
|
+
"""Resolve the current repository root."""
|
|
27
|
+
result = run_git(Path.cwd(), "rev-parse", "--show-toplevel")
|
|
28
|
+
return Path(result.stdout.strip())
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def ensure_main_branch(repo_root_path: Path) -> str:
|
|
32
|
+
"""Ensure the release is being prepared from the main branch."""
|
|
33
|
+
result = run_git(repo_root_path, "branch", "--show-current")
|
|
34
|
+
branch = result.stdout.strip()
|
|
35
|
+
if branch != "main":
|
|
36
|
+
raise RuntimeError(
|
|
37
|
+
"Release preparation must run from the main branch. "
|
|
38
|
+
f"Current branch: {branch or '<detached>'}."
|
|
39
|
+
)
|
|
40
|
+
return branch
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def ensure_clean_worktree(repo_root_path: Path) -> None:
|
|
44
|
+
"""Ensure the working tree is clean before release preparation starts."""
|
|
45
|
+
result = run_git(repo_root_path, "status", "--short")
|
|
46
|
+
lines = [line for line in result.stdout.splitlines() if line.strip()]
|
|
47
|
+
if not lines:
|
|
48
|
+
return
|
|
49
|
+
|
|
50
|
+
joined = "\n".join(lines)
|
|
51
|
+
raise RuntimeError(
|
|
52
|
+
"Release preparation requires a clean working tree. "
|
|
53
|
+
"Commit or stash changes first.\n"
|
|
54
|
+
f"{joined}"
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def discover_version_file_paths(repo_root_path: Path) -> list[Path]:
|
|
59
|
+
"""Return the root package file plus all workspace package files."""
|
|
60
|
+
paths: list[Path] = [Path("pyproject.toml")]
|
|
61
|
+
packages_root = repo_root_path / "packages"
|
|
62
|
+
if not packages_root.is_dir():
|
|
63
|
+
return paths
|
|
64
|
+
|
|
65
|
+
for package_file in sorted(packages_root.glob("*/pyproject.toml")):
|
|
66
|
+
paths.append(package_file.relative_to(repo_root_path))
|
|
67
|
+
return paths
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def read_versions(repo_root_path: Path) -> dict[str, str]:
|
|
71
|
+
"""Read package versions from the root and workspace package files."""
|
|
72
|
+
versions: dict[str, str] = {}
|
|
73
|
+
for relative_path in discover_version_file_paths(repo_root_path):
|
|
74
|
+
absolute_path = repo_root_path / relative_path
|
|
75
|
+
with absolute_path.open("rb") as handle:
|
|
76
|
+
data = tomllib.load(handle)
|
|
77
|
+
project = data.get("project", {})
|
|
78
|
+
version = project.get("version")
|
|
79
|
+
if not isinstance(version, str):
|
|
80
|
+
raise RuntimeError(f"Missing string version in {relative_path}.")
|
|
81
|
+
versions[str(relative_path)] = version
|
|
82
|
+
return versions
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def latest_semver_tag(repo_root_path: Path) -> str | None:
|
|
86
|
+
"""Return the latest fetched semver tag, if one exists."""
|
|
87
|
+
result = run_git(repo_root_path, "tag", "--sort=-v:refname")
|
|
88
|
+
for line in result.stdout.splitlines():
|
|
89
|
+
candidate = line.strip()
|
|
90
|
+
if candidate.startswith("v"):
|
|
91
|
+
return candidate
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def parse_args() -> argparse.Namespace:
|
|
96
|
+
"""Parse command-line arguments."""
|
|
97
|
+
parser = argparse.ArgumentParser(
|
|
98
|
+
description="Check release guardrails and print release context."
|
|
99
|
+
)
|
|
100
|
+
parser.add_argument(
|
|
101
|
+
"--remote",
|
|
102
|
+
default="origin",
|
|
103
|
+
help="Git remote used for tags. Defaults to origin.",
|
|
104
|
+
)
|
|
105
|
+
return parser.parse_args()
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def print_release_context(
|
|
109
|
+
*,
|
|
110
|
+
repo_root_path: Path,
|
|
111
|
+
remote: str,
|
|
112
|
+
branch: str,
|
|
113
|
+
versions: dict[str, str],
|
|
114
|
+
last_tag: str | None,
|
|
115
|
+
) -> None:
|
|
116
|
+
"""Print the small release context that is useful to the skill."""
|
|
117
|
+
print("Release context")
|
|
118
|
+
print(f"Repository: {repo_root_path}")
|
|
119
|
+
print(f"Remote: {remote}")
|
|
120
|
+
print(f"Branch: {branch}")
|
|
121
|
+
print("Worktree: clean")
|
|
122
|
+
print()
|
|
123
|
+
|
|
124
|
+
print("Version files:")
|
|
125
|
+
for path, version in versions.items():
|
|
126
|
+
print(f"- {path}: {version}")
|
|
127
|
+
lockstep = len(set(versions.values())) == 1
|
|
128
|
+
print(f"Lockstep: {'yes' if lockstep else 'no'}")
|
|
129
|
+
print()
|
|
130
|
+
|
|
131
|
+
if last_tag is None:
|
|
132
|
+
review_range = "HEAD"
|
|
133
|
+
print("Last remote tag: none")
|
|
134
|
+
print("Review range: initial release (full history)")
|
|
135
|
+
else:
|
|
136
|
+
review_range = f"{last_tag}..HEAD"
|
|
137
|
+
print(f"Last remote tag: {last_tag}")
|
|
138
|
+
print(f"Review range: {review_range}")
|
|
139
|
+
print()
|
|
140
|
+
|
|
141
|
+
print("Suggested review commands:")
|
|
142
|
+
if last_tag is None:
|
|
143
|
+
print("- git log --reverse --no-merges --oneline HEAD")
|
|
144
|
+
print("- git log --name-only --pretty=format: --diff-filter=AM HEAD")
|
|
145
|
+
else:
|
|
146
|
+
print(f"- git log --reverse --no-merges --oneline {review_range}")
|
|
147
|
+
print(f"- git diff --name-only {review_range}")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def main() -> int:
|
|
151
|
+
"""Run the release helper."""
|
|
152
|
+
args = parse_args()
|
|
153
|
+
repo_root_path = repo_root()
|
|
154
|
+
branch = ensure_main_branch(repo_root_path)
|
|
155
|
+
ensure_clean_worktree(repo_root_path)
|
|
156
|
+
run_git(repo_root_path, "fetch", "--tags", args.remote)
|
|
157
|
+
|
|
158
|
+
versions = read_versions(repo_root_path)
|
|
159
|
+
last_tag = latest_semver_tag(repo_root_path)
|
|
160
|
+
print_release_context(
|
|
161
|
+
repo_root_path=repo_root_path,
|
|
162
|
+
remote=args.remote,
|
|
163
|
+
branch=branch,
|
|
164
|
+
versions=versions,
|
|
165
|
+
last_tag=last_tag,
|
|
166
|
+
)
|
|
167
|
+
return 0
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
if __name__ == "__main__":
|
|
171
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
REPO_ROOT="$(git -C "${SCRIPT_DIR}" rev-parse --show-toplevel 2>/dev/null || true)"
|
|
6
|
+
REPO_ROOT="${REPO_ROOT:-$(cd "${SCRIPT_DIR}/../../../.." && pwd)}"
|
|
7
|
+
|
|
8
|
+
cd "${REPO_ROOT}"
|
|
9
|
+
uv run python .agents/skills/release/scripts/release_context.py "$@"
|