Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
c588ad9
Docs: fold leftover Unreleased notes into 0.14.0
dzikowski Sep 4, 2026
fcb547a
Feat: flatten serve paths, publish a runtime image, and add the produ…
dzikowski Sep 10, 2026
00aca70
Queue: drop the redundant ensure_ci_passes argv workaround and pin fo…
dzikowski Sep 11, 2026
a5a504e
Fix: forward JAIPH_QUEUE_STATE to scripts and make the product-owner …
dzikowski Sep 14, 2026
0771a37
Docs: close the 0.14 drift in reference pages and CLI help.
dzikowski Sep 14, 2026
549bbfc
Docs: collapse multi-line EBNF rules onto single lines to pass gramma…
dzikowski Sep 14, 2026
3bb90fa
Docs: accept ADR 0003 and point the parity workflows at it.
dzikowski Sep 15, 2026
904ea07
Fix: fail the step on spawn failure and always emit STEP_END/RUN_END
dzikowski Sep 15, 2026
ed8602f
Feat: bind catch/recover to failed step stdout capture path
dzikowski Sep 15, 2026
21a0297
Feat: add stdin clause on run of a script
dzikowski Sep 15, 2026
c6fd825
Docs: split grammar.md syntax from language.md meaning
dzikowski Sep 15, 2026
0ea1fec
Docs: cut restated inventories from server/auth how-tos
dzikowski Sep 15, 2026
6d19ab0
Docs: give --env one owner on env-vars.md#script-env
dzikowski Sep 15, 2026
e0b6e69
Docs: shrink the agent skill to a checklist with jaiph.org owner links.
dzikowski Sep 15, 2026
4996c67
Test: pin format as a no-op on a shebang plus triple-quoted prompt.
dzikowski Sep 15, 2026
8e3a4e1
Queue: gate the cap drop on copies-are-gone after the how-to cut.
dzikowski Sep 15, 2026
3f25bb4
Docs: cut restated cli.md contracts from mcp/serve how-tos
dzikowski Sep 15, 2026
41bd0b9
Test: cap docs body lines per Diátaxis type now copies are gone
dzikowski Sep 15, 2026
09afdfe
Queue: bare-call invoke and stdin expr -> call()
dzikowski Sep 16, 2026
9670bf9
Docs: describe invoke as a bare call and stdin connect
dzikowski Sep 16, 2026
eeb7b96
Docs: bare-call syntax across satellite pages and skill
dzikowski Sep 16, 2026
bc393ac
Feat: highlight bare calls and stdin connect, drop run keyword
dzikowski Sep 16, 2026
531956c
Feat: highlight bare calls and stdin connect in editor grammars
dzikowski Sep 16, 2026
9266a58
Feat: drop run keyword; invoke is a bare call
dzikowski Sep 16, 2026
b8ca0fb
Fix: let git.commit prompt run without a returns capture
dzikowski Sep 16, 2026
6401d8f
Fix: drop run keyword from Windows native smoke test invocations
dzikowski Sep 16, 2026
3b22629
Queue: samples, stdin pipelines, and output-handle slurp model.
dzikowski Sep 18, 2026
1124585
Queue: drop the superseded slurp task and put the handle model first.
dzikowski Sep 18, 2026
2e8b0c6
Refactor: collapse say_hello valid_name to one fail arm
dzikowski Sep 18, 2026
d068ad8
Feat: highlight callee of every call as a function
dzikowski Sep 18, 2026
9a1d640
Feat: make every call result an output handle, slurp at force sites
dzikowski Sep 18, 2026
cf63209
Feat: chain stdin stages into call pipelines
dzikowski Sep 18, 2026
bf54444
Queue: prompt-handle, recover-merge, and pipeline highlight.
dzikowski Sep 18, 2026
bc36869
Feat: stream stdin pipelines with bounded buffers and overlap
dzikowski Sep 18, 2026
e2e3865
Feat: highlight every arrow and callee in stdin pipelines
dzikowski Sep 18, 2026
010b242
Feat: merge recover stderr and stream prompt identifier handles.
dzikowski Sep 18, 2026
860dbd6
Fix: inherit pipeline stage stdout fd as the next stage's stdin
dzikowski Sep 18, 2026
183c939
Fix: emit pipeline stage STEP_END in stage order across platforms
dzikowski Sep 18, 2026
2169ede
Fix: relay pipeline stdin fd through a pipe under bun
dzikowski Sep 18, 2026
aeb8b79
Queue: drop the completed prompt-handle and recover-merge tasks.
dzikowski Sep 18, 2026
7cc0fcf
Fix: tee pipeline stage stdout into .out and the next stdin.
dzikowski Sep 18, 2026
914ae6a
Fix: guard optional onSpawn callback in pipeline handoff
dzikowski Sep 18, 2026
a347726
Fix: match disambiguated volume.jh run dir in stdin pipeline e2e
dzikowski Sep 18, 2026
1e969b9
Breaking: script bodies use '…' and '''…''' instead of backticks.
dzikowski Sep 20, 2026
c11ef86
Fix: skip .jaiph/runs when copying a local checkout for install.
dzikowski Sep 20, 2026
8b0789e
Add blank line before main() in recover_loop.jh example
dzikowski Sep 20, 2026
87bc6f8
Release: stamp 0.15.0 and default serve/mcp to no auth.
dzikowski Sep 21, 2026
8c43e54
Fix: re-indent prompt bodies and preserve bare stdin on format.
dzikowski Sep 21, 2026
04bae68
Docs: clarify Jaiph orchestration and invocation surfaces.
dzikowski Sep 21, 2026
399a3b0
fix(security): update bigdecimal from 4.1.2 to 4.1.3
aikido-autofix[bot] Sep 22, 2026
7148e70
fix(security): autofix 3rd party Github Actions should be pinned
aikido-autofix[bot] Sep 22, 2026
e6ed89c
Fix: match the current skill heading in the init test.
dzikowski Sep 22, 2026
1161942
Docs: emphasize repeatable polyglot orchestration.
dzikowski Sep 22, 2026
20e0369
Fix: persist a fallback CI report when job logs are missing
dzikowski Sep 23, 2026
e5f4938
Fix: scale stdin stream RSS bound to half the payload step
dzikowski Sep 23, 2026
2aedb4f
Queue: isolate OIDC subjects, pin lockfile restore, and gate imported…
dzikowski Sep 24, 2026
ebc744c
Fix: namespace OIDC serve subjects by claim type
dzikowski Sep 24, 2026
b249180
Fix: require a commit pin on library lockfile restore
dzikowski Sep 24, 2026
7419e63
Fix: gate imported agent trust and flags like agent.command
dzikowski Sep 24, 2026
f32e00c
Release: fold 0.15.0 notes and pin the Zed grammar.
dzikowski Sep 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .cursor/mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"mcpServers": {
"product-owner": {
"url": "http://127.0.0.1:5247/mcp"
}
}
}
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ jobs:
uses: actions/checkout@v4

- name: Setup Ruby
uses: ruby/setup-ruby@v1
uses: ruby/setup-ruby@e8944e80fb94b20106697132f8c20c665fab29e9 # v1.325.0
with:
ruby-version: "3.2"
bundler-cache: true
Expand Down
89 changes: 89 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,95 @@ jobs:
bash ../scripts/release-version-check.sh \
"${{ steps.meta.outputs.channel }}" "${{ steps.meta.outputs.tag }}" "${got}"

publish-image:
name: Publish GHCR runner image
needs: [build, sanity-windows]
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Resolve tag and channel
id: meta
run: |
set -euo pipefail
case "${GITHUB_REF}" in
refs/tags/v*)
tag="${GITHUB_REF_NAME}"; channel="stable" ;;
refs/heads/nightly)
tag="nightly"; channel="nightly" ;;
*)
echo "Unsupported ref for release: ${GITHUB_REF}" >&2; exit 1 ;;
esac
echo "tag=${tag}" >> "${GITHUB_OUTPUT}"
echo "channel=${channel}" >> "${GITHUB_OUTPUT}"

- name: Resolve image tags
id: image
run: |
set -euo pipefail
owner="$(printf '%s' "${GITHUB_REPOSITORY_OWNER}" | tr '[:upper:]' '[:lower:]')"
image="ghcr.io/${owner}/jaiph-runtime"
echo "image=${image}" >> "${GITHUB_OUTPUT}"
case "${{ steps.meta.outputs.channel }}" in
stable)
tag="${{ steps.meta.outputs.tag }}"
ver="${tag#v}"
echo "tags=${image}:${ver},${image}:${tag},${image}:latest" >> "${GITHUB_OUTPUT}"
;;
nightly)
echo "tags=${image}:nightly" >> "${GITHUB_OUTPUT}"
;;
*)
echo "Unsupported channel: ${{ steps.meta.outputs.channel }}" >&2
exit 1
;;
esac

- name: Download linux binary artifacts
uses: actions/download-artifact@v4
with:
pattern: jaiph-linux-*
path: runtime
merge-multiple: true

- name: Prepare linux binaries
working-directory: runtime
run: |
set -euo pipefail
test -f jaiph-linux-x64
test -f jaiph-linux-arm64
chmod +x jaiph-linux-x64 jaiph-linux-arm64

- name: Set up QEMU
uses: docker/setup-qemu-action@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push
uses: docker/build-push-action@v6
with:
context: runtime
file: runtime/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.image.outputs.tags }}
labels: |
org.opencontainers.image.source=https://github.com/${{ github.repository }}
org.opencontainers.image.revision=${{ github.sha }}
org.opencontainers.image.version=${{ steps.meta.outputs.tag }}

release:
name: Publish release assets
needs: [build, sanity-windows]
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ jaiph.key
*.swp
*.vsix

.jaiph/queue-state.md
.jaiph/queue-state.md.lock
.jaiph/runs/
.jaiph/product-owner/
.jaiph/*.jaiph.map
.jaiph/tmp/
.jaiph/scripts/
Expand All @@ -58,6 +61,12 @@ e2e/assign_capture.sh

.obsidian/

# Playwright local output (last-run cache + failure artifacts)
test-results/

# Engineer `git format-patch` leftovers at repo root (also saved under .jaiph/runs)
/*.patch

# debug / temp directories (never commit)
docker-*/
nested-*/
Expand Down
62 changes: 32 additions & 30 deletions .jaiph/architect_review.jh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ config {
agent.claude_flags = "--permission-mode bypassPermissions"
}

script jaiph_review_body_file = `printf '%s\n' "$JAIPH_WORKSPACE/.jaiph/tmp/architect_review_body.txt"`
script jaiph_review_body_file = '''
printf '%s\n' "$JAIPH_WORKSPACE/.jaiph/tmp/architect_review_body.txt"
'''

# Packed as: first line = verdict, rest = updated_description (must stay top-level:
# const … = prompt """…""" is not supported inside run … catch — see parseRecoverStatement).
Expand Down Expand Up @@ -71,62 +73,62 @@ def architect_agent_review(task) {
}

def review_one_header(header) {
run common.arg_nonempty(header) catch (err) {
common.arg_nonempty(header) catch (err) {
return ""
}
const task = run queue.get_task_by_header(header)
run queue.task_is_dev_ready(task) catch (err) {
const packed = run architect_agent_review(task)
const verdict = run common.first_line_str(packed)
const updated_description = run common.rest_lines_str(packed)
const body_file = run jaiph_review_body_file()
run common.mkdir_p_simple(run common.jaiph_tmp_dir())
run common.str_equals(verdict, "dev-ready") catch (err) {
run common.arg_nonempty(updated_description) catch (err) {
const task = queue.get_task_by_header(header)
queue.task_is_dev_ready(task) catch (err) {
const packed = architect_agent_review(task)
const verdict = common.first_line_str(packed)
const updated_description = common.rest_lines_str(packed)
const body_file = jaiph_review_body_file()
common.mkdir_p_simple(common.jaiph_tmp_dir())
common.str_equals(verdict, "dev-ready") catch (err) {
common.arg_nonempty(updated_description) catch (err) {
fail "needs-work requires a non-empty updated_description (questions for the author)."
}
run common.save_string_to_file(body_file, updated_description)
run queue.set_task_description_from_file(header, body_file)
stdin "${updated_description}" -> common.save_string_to_file(body_file)
queue.set_task_description_from_file(header, body_file)
log "Needs work (description updated): ${header}"
return ""
}
run common.arg_nonempty(updated_description) catch (err) {
run queue.mark_task_dev_ready(header)
common.arg_nonempty(updated_description) catch (err) {
queue.mark_task_dev_ready(header)
log "Marked dev-ready: ${header}"
return ""
}
run common.save_string_to_file(body_file, updated_description)
run queue.set_task_description_from_file(header, body_file)
run queue.mark_task_dev_ready(header)
stdin "${updated_description}" -> common.save_string_to_file(body_file)
queue.set_task_description_from_file(header, body_file)
queue.mark_task_dev_ready(header)
log "Marked dev-ready: ${header}"
return ""
}
log "Already dev-ready: ${header}"
}

def process_headers_recursive(header, remaining) {
run review_one_header(header)
run common.arg_nonempty(remaining) catch (err) {
review_one_header(header)
common.arg_nonempty(remaining) catch (err) {
return ""
}
const next = run common.first_line_str(remaining)
const rest = run common.rest_lines_str(remaining)
run process_headers_recursive(next, rest)
const next = common.first_line_str(remaining)
const rest = common.rest_lines_str(remaining)
process_headers_recursive(next, rest)
}

def maybe_process_headers(first, rest) {
run common.arg_nonempty(first) catch (err) {
common.arg_nonempty(first) catch (err) {
return ""
}
run process_headers_recursive(first, rest)
process_headers_recursive(first, rest)
}

export def main() {
const headers = run queue.get_all_task_headers()
const first = run common.first_line_str(headers)
const rest = run common.rest_lines_str(headers)
run maybe_process_headers(first, rest)
run queue.all_dev_ready() catch (err) {
const headers = queue.get_all_task_headers()
const first = common.first_line_str(headers)
const rest = common.rest_lines_str(headers)
maybe_process_headers(first, rest)
queue.all_dev_ready() catch (err) {
fail "One or more tasks need work. Review the agent output above."
}
}
Loading
Loading