Skip to content

ship 0.4.0 - #48

Merged
mesilov merged 46 commits into
mainfrom
dev
Sep 3, 2026
Merged

mesilov merged 46 commits into
mainfrom
dev

Conversation

@mesilov

@mesilov mesilov commented Sep 3, 2026

Copy link
Copy Markdown
Owner

ship 0.4.0

mesilov and others added 30 commits August 27, 2026 18:27
…imestamps

Add diarization submissions with extended timestamps
Remove default Docker pull flag from README
Add Lint and Tests GitHub Actions badges to the README header so the
current CI state for linters and unit tests is visible at a glance.

Closes #31

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q26dAqJp4iUWR3hARcT8VM
docs: add CI status badges to README
…on-skill

Ship cross-agent RARUS Echo transcription skill
Add `make worktree-new|worktree-remove|worktree-list` (backed by
bin/worktree.sh) to run several issues in parallel from isolated git
worktrees under a git-ignored `.worktree/<issue>-<slug>` directory.

New worktrees branch off `origin/<base>`, so local `dev` is never
moved, and are provisioned for immediate `make` use:
- `.env.local` is symlinked from the primary checkout (shared secrets,
  resolved on the host by both make and docker compose).
- `vendor/` is clone-copied (APFS clone -> hardlink -> plain copy),
  falling back to `make composer-install`. A host symlink is avoided
  because its absolute target does not resolve inside the
  `.:/var/www/html` Docker mount.

Removal deletes the worktree and prunes metadata while keeping the
branch. Update the maintainer skill and CONTRIBUTING to use the
tooling, add an OpenSpec `worktree-tooling` change, and a CHANGELOG
entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FXQ1gRhf7KU7diMmJ1gUE
- vendor: never hard-link the clone-copy. Replace the `cp -al` fallback
  with an independent copy chain (APFS clone -> reflink -> plain copy)
  so an in-place write in a worktree (e.g. `composer dumpautoload`)
  cannot corrupt the primary checkout or sibling worktrees.
- remove: reject `--name` values that are not `<issue>-<slug>` and refuse
  to act on any canonical path outside the managed `.worktree` root
  (path-traversal hardening).
- new: roll back a half-provisioned worktree (and a freshly created
  branch) when provisioning fails under `set -e`, so the command stays
  re-runnable.
- Reconcile the stale CHANGELOG "Changed" entry with the new
  origin-based worktree flow; drop "hardlink" wording from docs.
- Mark tasks 2.3 and 2.4 done now that checks and CI are green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FXQ1gRhf7KU7diMmJ1gUE
Resolve CHANGELOG.md conflict: keep the new origin-based worktree flow
entry (which supersedes the stale "update local dev first" line) and
the release-process templates entry from origin/dev.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FXQ1gRhf7KU7diMmJ1gUE
`bin/` holds the published SDK CLI (`bin/rarus-echo`, declared as a
composer `bin`), so maintainer-only process tooling does not belong
there — and with no `.gitattributes` export-ignore it would ship in the
Packagist dist tarball. Move the wrapper to
`.agents/skills/rarus-echo-maintainer/scripts/worktree.sh`, next to the
maintainer skill it serves, and point the Makefile targets at it via a
`WORKTREE_SH` variable. Behavior is unchanged; the make targets are the
same.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FXQ1gRhf7KU7diMmJ1gUE
Add `.gitattributes` with `export-ignore` so the Composer/Packagist dist
archive ships only the runtime SDK (src/, composer.json, LICENSE,
README, CHANGELOG, and the bin/ CLI). Development, CI, tooling,
docs-process, and agent/maintainer paths — including the relocated
worktree tooling under `.agents/` — are no longer distributed.

Verified with `git archive --worktree-attributes HEAD | tar t`.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FXQ1gRhf7KU7diMmJ1gUE
The published CLI image size is dominated by the PHP runtime base
(/usr is 531M while the SDK /app layer is only 18M), so optimizing
/app cannot help. Move the vendor and runtime stages from
php:8.4-cli-bookworm to the official php:8.4-cli-alpine base and
replace apt-get with apk (git/unzip for build, ca-certificates for
TLS) to attack the root cause.

Measured locally on arm64:
- docker images:        769MB  -> ~179MB  (~77% smaller)
- docker save | gzip:  ~180MB  -> ~46MB   (~75% smaller)
- /usr:                 531M   -> 100M

Preserves the rarus-echo entrypoint, curl/fileinfo/mbstring
extensions, the PSR-17/PSR-18 discovery build smoke check, the CLI
php.ini runtime limits, and the multi-arch linux/amd64 + linux/arm64
build. Verified list/--help exit 0 without credentials, queue --json
reaches the production Echo API and exits 0, and fileinfo MIME
detection works on the musl base.

Adds OpenSpec change reduce-cli-docker-image-size.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FXQ1gRhf7KU7diMmJ1gUE
The docker/php-cli image is the local development / CI container
(compose-mounted workspace that runs the make test/lint targets),
which is a different artifact from the published rarus-echo-cli image.
Rename it to dev-php so the name reflects its purpose and no longer
reads as another CLI image.

- docker/php-cli/ -> docker/dev-php/ (build stage was already `AS dev-php`)
- docker-compose service php-cli -> dev-php
- Makefile: service invocations plus the `php-cli-bash`/`php-cli-root`
  targets -> `dev-php-bash`/`dev-php-root`
- CI cache-key hashFiles path, the agent-plugin CLI runner, and docs
  (README, CONTRIBUTING, CLAUDE) updated

Verified: docker compose build dev-php, make test-unit
(209 tests, 553 assertions), make lint-all all green.

Bundled into PR #25 per maintainer request.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017FXQ1gRhf7KU7diMmJ1gUE
…e-size

perf(docker): reduce CLI image size with php:8.4-cli-alpine base
The Claude Code CLI rejects a bare `.` as a marketplace source with
`Invalid marketplace source format. Try: owner/repo, https://..., or ./path`,
which broke the documented repo-local plugin install flow: the marketplace
was never added, so `claude plugin install` then failed with
`Plugin ... not found in marketplace "rarus-echo-plugins"`.

Use the accepted `./` path form in README.md and the transcription skill's
distribution.md. The Codex `codex plugin marketplace add .` line is left
untouched — that is a separate CLI with its own source parser.

Refs #39

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XCpmpJT1UmN1Am1K24Lqfv
docs: fix Claude Code plugin marketplace source `.` -> `./`
…probing

Rewrite the Command Selection section of the rarus-echo-transcription
transcribe skill so the published Docker CLI is the unconditional default
execution path. Agents run the Docker CLI directly instead of probing for
host PHP, an installed vendor/, or a local binary first. Local
vendor/bin/rarus-echo / php bin/rarus-echo execution stays documented as an
explicit opt-in (user request or Docker unavailable).

Adds an OpenSpec change for the agent-transcription-skill capability and a
CHANGELOG Unreleased entry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ho2YwAMQLQnr2ZdRMXSqCr
docs(transcribe-skill): make Docker CLI the default, drop PHP/binary probing
mesilov and others added 7 commits September 3, 2026 02:37
Large file submissions aborted with "Idle timeout reached" from the
auto-discovered Symfony HttpClient, which fell back to PHP's ~60s
default_socket_timeout while the API had not yet started responding to a
large multipart upload. This was a client-side timeout, not an API 5xx.

Build the default HTTP client with an explicit 600s idle timeout, and
make it configurable via ApiClientFactory::withHttpTimeout() and the
RARUS_ECHO_HTTP_TIMEOUT environment variable (precedence: explicit > env
> default). A caller-supplied withHttpClient() client is left untouched.

Closes #43

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
Address Codex review on #44. The code and tests already treat an
explicitly empty RARUS_ECHO_HTTP_TIMEOUT (e.g. `KEY=` in .env) as
"not configured" and fall back to the default, but the spec listed an
empty value among the invalid ones. Resolve the mismatch in favor of the
resilient behavior — an empty variable must not throw on every API call —
and align the OpenSpec delta, add an explicit test, and make the intent
clear in code comments.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
fix(http-client): default idle timeout for large uploads (#43)
Roll the [Unreleased] changelog entries into a dated [0.4.0] - 2026-09-03
section, keep an empty [Unreleased] heading above it, and pin the README
installation example to the ^0.4 release line.

Add the prepare-0-4-0-release-docs OpenSpec change documenting the release
documentation rollover.

Closes #34

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
…nment rule

Add a structured "Справочник команд и опций" section to the README `## CLI`
part documenting every CLI key: global options plus per-command arguments and
options for queue, submit, status, and transcript, with value requirements and
defaults.

Record a maintainer-workflow rule that any CLI change must be aligned in both
documentation surfaces: the generated transcription-skill CLI reference
(update-cli-reference.sh, drift-checked by make lint-agent-plugins) and the
hand-written README `## CLI` section.

Add the document-cli-option-reference OpenSpec change.

Closes #46

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
docs: full CLI option reference in README + maintainer CLI-alignment rule
docs: prepare 0.4.0 release documentation
@mesilov mesilov self-assigned this Sep 3, 2026
@mesilov mesilov added this to the 0.4.0 milestone Sep 3, 2026
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-03T05:34:17.276091Z e09f5a5 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e09f5a5185

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +76 to +77
if (!\function_exists('pcntl_signal')) {
return [];

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Install PCNTL in the published CLI image

The published php:8.4-cli-alpine image never installs the pcntl extension—the runtime Dockerfile installs only curl, fileinfo, and mbstring, while only the development image installs pcntl. Consequently, the documented default Docker execution path always returns an empty signal subscription here, so submit --wait cannot emit the promised SIGINT/SIGTERM shutdown diagnostic or use its handler. Install pcntl in the runtime image and include it in the image smoke check.

AGENTS.md reference: AGENTS.md:L31-L34

Useful? React with 👍 / 👎.

Comment on lines +228 to +229
const options = definition.options || {};
for (const optionName of optionAllowlist[name]) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Detect newly added CLI options before filtering

The generator iterates only the hard-coded allowlist and never checks for additional project-owned options in definition.options. If a future CLI option is added but the allowlist/reference is not updated, regeneration produces the same old file and make lint-agent-plugins passes, contradicting the OpenSpec guarantee that validation fails when a CLI option drifts. Compare the discovered option set against the expected framework/project sets before rendering the filtered table.

AGENTS.md reference: AGENTS.md:L31-L34

Useful? React with 👍 / 👎.

Comment on lines +24 to +25
- [ ] 4.1 Push the `feature/25-reduce-cli-docker-image-size` branch and open a pull request into `dev` with `Closes #25`.
- [ ] 4.2 Verify PR CI (Docker build, lint, tests) and process agent review threads.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Mark the completed Docker-image PR tasks current

This release commit already includes and documents the Alpine CLI-image change, but its OpenSpec task list still says that opening the PR and verifying its CI/review threads are unfinished. That leaves the canonical change state inaccurate for subsequent maintainers; update these task markers to reflect the completed work.

AGENTS.md reference: openspec/AGENTS.md:L7-L10

Useful? React with 👍 / 👎.

mesilov and others added 9 commits September 3, 2026 11:36
- Scope --json to RARUS Echo commands in the README global-options table; it is
  added by AbstractEchoCommand and is not available on Symfony's built-in
  list/help commands.
- Add the Symfony --silent global option (present in the shipped Console runtime)
  and refine the quiet/verbose descriptions to match the actual CLI help.
- Maintainer skill: note that adding a new CLI command/option requires updating
  the PROJECT_COMMANDS/optionAllowlist arrays in update-cli-reference.sh, since
  the drift check only covers keys already listed there and would otherwise pass
  while leaving a new key undocumented.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
(cherry picked from commit 8bb2b63)
docs: address Codex review on CLI reference (follow-up to #47)
…lists

- README: --silent is a Symfony Console 7.2+ option, but composer.json still
  allows symfony/console ^6.4 || ^7.0, so consumers on 6.4/7.0/7.1 do not have
  it. Qualify the option with its minimum Console version and note the shipped
  Docker image includes it while older library installs may not.
- Maintainer skill: adding a CLI command/option requires updating all three
  lists in update-cli-reference.sh (bash PROJECT_COMMANDS, node projectCommands,
  optionAllowlist), not just two; a command needs both command arrays or the
  generator silently skips it while the drift check still passes.

Follow-up to Codex review on #49.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
docs: qualify --silent by Symfony version + document all three CLI lists (follow-up to #49)
…issing allowlist

Root-cause fix for the recurring CLI-reference maintenance pitfalls surfaced by
Codex review:

- update-cli-reference.sh now single-sources the command list: the node
  generator receives the shell PROJECT_COMMANDS array as arguments instead of
  keeping a duplicate hardcoded projectCommands list, so the two can no longer
  drift apart.
- A command present in PROJECT_COMMANDS but missing an optionAllowlist entry now
  fails with a clear, actionable message instead of crashing on
  "undefined is not iterable".
- Maintainer skill: simplify the "Изменения CLI" note to the two remaining
  lists (PROJECT_COMMANDS + optionAllowlist) and state that every command needs
  an allowlist entry (at least ["json"]).

Regenerated cli.md is byte-identical; the drift check stays green.

Follow-up to Codex review on #50.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
…rator

docs: harden CLI reference generator (root-cause fix for #50 review)
… CLI work

Address the maintainer-policy gaps raised by Codex on #51:

- Update the active `document-cli-option-reference` OpenSpec change so its
  proposal, design, tasks, and spec cover the review refinements (`--json`
  scope, `--silent` version) and the generator hardening (single-sourced
  command list, clear error on a missing optionAllowlist entry).
- Add the missing `[Unreleased]` CHANGELOG entries for the generator hardening
  and the README CLI-reference corrections.

Follow-up to Codex review on #51.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
…n in spec

- CHANGELOG: move the CLI-reference generator hardening and README-reference
  corrections from [Unreleased] into the not-yet-released [0.4.0] section
  (generator hardening under Changed; --json/--silent accuracy folded into the
  existing CLI-reference Added entry). [Unreleased] is empty again.
- OpenSpec spec: align the "README Documents the Complete CLI Option Reference"
  requirement and scenario with the scoped --json (Echo commands only, not
  Symfony's built-in list/help), matching the proposal and implementation.

Follow-up to Codex review on #52.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EanqRNh4A3XoojYr7MNFvd
docs: align OpenSpec + changelog with CLI-reference work (fixes #51 P1 review)
@mesilov
mesilov merged commit 978f7ff into main Sep 3, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant