Repository navigation
Conversation
…imestamps Add diarization submissions with extended timestamps
Add submit --wait polling UX
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
docs: add release workflow issue templates
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
feat: parallel per-issue worktree tooling
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
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
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 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".
| if (!\function_exists('pcntl_signal')) { | ||
| return []; |
There was a problem hiding this comment.
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 👍 / 👎.
| const options = definition.options || {}; | ||
| for (const optionName of optionAllowlist[name]) { |
There was a problem hiding this comment.
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 👍 / 👎.
| - [ ] 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. |
There was a problem hiding this comment.
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 👍 / 👎.
- 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)
ship 0.4.0