Commit Graph
164 Commits
Author SHA1 Message Date
Michael Sitarzewski a71ed85054 Merge remote-tracking branch 'origin/main' into integ/content-batch2 2026-10-04 14:51:50 -05:00
ordinary being 59635e0008 fix(lib): an indented closing fence closes the block (CommonMark/GitHub parity) (#1028)
fence_closes_p() required a closing fence's indent to be <= the opener's.
That is not a CommonMark rule and not how GitHub renders: a closing fence
may be indented up to three spaces regardless of the opener. A GitHub-valid
document was therefore read as still open, so lint reported a false
"does not nest" (and a false "never closed") and the OpenClaw split kept the
next "##" heading inside the previous section, leaving AGENTS.md empty.

The closing rule is now exactly the four conditions already enforced: same
character, run at least as long as the opener, indent 0-3, and nothing but
whitespace after the run. Callers still pass the opener's indent as the
optional fourth argument; it is documented as deliberately not consulted.

Regression fixtures in test-lint-fences.sh pin the helper boundaries (2- and
3-space closers close; a shorter or 4-space-indented run does not; tilde
closers follow the same rule), a lint run on the GitHub-valid document, and
the OpenClaw split. They fail on the previous code at the first new
assertion: "fence_closes_p rejected a bare closer indented 2 spaces under
an unindented opener".
2026-10-04 14:32:42 -05:00
Michael SitarzewskiandClaude Opus 5.5 7d9ad2cf7a chore(eval): regenerate the convert-outputs manifest for content batch 2
Exactly the 43 agents the 49 merged fixes touch; no other agent or tool line moves.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 14:23:23 -05:00
Hotragn PettuganiandClaude Opus 5.5 d3f71c4bb8 fix(qwen): translate Claude Code tool names so Qwen grants Read, Write and Bash (#965)
From @Hotragn. 17 agents list Claude Code tool names (Read, Write, Bash...). Qwen Code resolves subagent tools by exact name or display name, so those three matched nothing and were never granted. Traced in Qwen Code 0.24.7: resolveToolNames preserves unknown names, and getTool() is a plain lookup with no alias translation. Now mapped to read_file, write_file and run_shell_command; other names pass through unchanged. The manifest moves exactly those 17 agents.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-01 14:35:39 -05:00
Michael SitarzewskiandClaude Opus 5.5 c078bd0db4 chore(eval): manifest lines for the 35 content fixes
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 22:12:25 -05:00
Michael SitarzewskiandClaude Opus 5.5 b94b72e780 chore(eval): regenerate the convert-outputs manifest for the installer batch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 21:31:57 -05:00
Michael Sitarzewski f96c36ff3e Merge commit 'refs/b3/961' into integ/installer-batch3
# Conflicts:
#	.github/workflows/test-install.yml
2026-09-30 21:20:58 -05:00
Michael Sitarzewski 83452ee559 Merge commit 'refs/b3/956' into integ/installer-batch3
# Conflicts:
#	.github/workflows/check-tools.yml
2026-09-30 21:20:46 -05:00
Michael Sitarzewski 057243b089 Merge commit 'refs/b3/958' into integ/installer-batch3
# Conflicts:
#	.github/workflows/check-tools.yml
2026-09-30 21:20:45 -05:00
Michael Sitarzewski d85c598ce7 Merge commit 'refs/b3/960' into integ/installer-batch3 2026-09-30 21:20:37 -05:00
Michael Sitarzewski a518866195 Merge commit 'refs/b3/955' into integ/installer-batch3 2026-09-30 21:20:37 -05:00
Michael Sitarzewski 5eacda1c7c Merge commit 'refs/b3/957' into integ/installer-batch3 2026-09-30 21:20:37 -05:00
Michael Sitarzewski ee241d4b70 Merge commit 'refs/b3/962' into integ/installer-batch3 2026-09-30 21:20:37 -05:00
Michael Sitarzewski ffdf7730bb Merge commit 'refs/b3/954' into integ/installer-batch3 2026-09-30 21:20:37 -05:00
Rudy Celekli 947ba568e9 fix(install): replay failed parallel workers before returning
Signed-off-by: Rudy Celekli <47457359+rudycelekli@users.noreply.github.com>
2026-09-30 21:42:28 -04:00
Rudy Celekli 266c0864fe fix(lint): reject unsupported folded YAML frontmatter
Signed-off-by: Rudy Celekli <47457359+rudycelekli@users.noreply.github.com>
2026-09-30 21:38:48 -04:00
Rudy Celekli 3711d8729a fix(install): preserve user files and foreign links in link mode
Signed-off-by: Rudy Celekli <47457359+rudycelekli@users.noreply.github.com>
2026-09-30 21:38:47 -04:00
nolanchicandClaude Opus 5.5 e31d699e06 feat(engineering): add ServiceNow Developer & Mentor agent (#703)
From @nolanchic. ServiceNow platform developer and step-by-step troubleshooter: Business Rules, Script Includes, GlideRecord/GlideAggregate, GlideAjax, ACLs, Flow Designer. Maintainer follow-up: the GlideAjax example now reads its parameter with this.getParameter() (the function argument never receives it), and an unverified system-property check is replaced with Transform Map guidance.

Closes #250

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 20:11:35 -05:00
Subhodip ChatterjeeandClaude Opus 5.5 7b3738099c feat: add DX Engineer (product) and Developer Community Builder (marketing) (#238)
From @Subhodip-Chatterjee's Developer Relations submission. DX Engineer joins product/ (onboarding friction, SDK ergonomics, error messages, first-run experience). Community Builder joins marketing/ as Developer Community Builder (community architecture, contributor programs, health metrics). Developer Advocate and Docs Engineer were not added, because specialized/Developer Advocate and engineering/Technical Writer already cover those roles.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 19:03:06 -05:00
hotragn d9e8a51ea2 test(install): the spaced-path --parallel exit was passing for the wrong reason
With a spaced --path, the parallel workers get the path split into words
and reject the stray words as unknown options (the bug #755 fixes). Unknown
options used to exit 0, so every worker "succeeded" having installed
nothing, and this case's exit-code assert passed while the count assert
next to it was already an xfail for #755.

Now that unknown options exit 1, the parent exits non-zero there, which is
the truth. The exit-code assert becomes an xfail for #755 like its
neighbour; both will report "appears to have landed" once #755 merges.
2026-09-30 05:21:11 -04:00
hotragn bdb3143fcd fix(cli): an unknown option exits 1; convert.sh --help shows every option
Both scripts handled an unknown option with `error ...; usage`, and usage()
always ended in `exit 0`:

  $ ./scripts/convert.sh --tol codex; echo $?
  [ERR] Unknown option: --tol
  ...usage...
  0

so a mistyped flag in CI or a wrapper script read as success. usage() now
takes a status. --help still prints to stdout and exits 0; an unknown
option prints the usage text to stderr and exits 1, the same as a bad
--tool or --division value already does.

convert.sh --help also printed a hard-coded `sed -n '3,28p'`. The option
notes live on lines 33-34, so --parallel and --jobs never appeared, and
--out was only in the synopsis. It now uses USAGE-START/END sentinels, as
install.sh has for a while, and the option list covers --tool and --out.

test-cli-usage.sh checks both scripts: an unknown option exits non-zero
with its name and the usage on stderr and nothing on stdout, --help exits 0
without printing the sentinels, and convert.sh --help describes --tool,
--out, --parallel and --jobs. It fails on main at the first check and runs
in check-tools.yml.
2026-09-30 05:02:50 -04:00
hotragn 33f68d61b7 fix(install): accept the file-stem ids runbooks.json uses for --agent
strategy/runbooks.json names agents by file stem, the corpus id the desktop
app maps to catalog entries ("engineering-frontend-developer"). The installer
only accepted the slug built from `name:` ("frontend-developer"), and for
206 of the 279 agents those differ. Of the 36 agents the four runbooks list,
35 could not be selected by the ids the runbooks give them:

  $ install.sh --tool claude-code --agent engineering-frontend-developer --dry-run
  [ERR] Unknown agent 'engineering-frontend-developer'. Use --list agents ...

So there was no way to install a runbook's team from the CLI without
translating every id by hand.

resolve_agent now takes a slug, a display name (as before, via slugify), or a
file stem, and returns the install slug. Slugs are tried first. No stem
equals a different agent's slug today, and stems are unique, so nothing that
resolved before resolves differently now.

Resolution also stops rescanning the roster per request. agent_slug_exists
ran get_field over all 279 files for each requested agent; roster_index
builds the slug/stem table once in the parent shell. A 36-line agents file
went from ~10,000 get_field calls to 279.

test-agent-selection.sh gains a stem case and feeds each runbook's roster to
--agents-file, checking that it resolves to exactly its own agent count. It
fails on main at the first runbook. The usage text and the README selection
section say which ids are accepted, with an example of installing a
runbook's team.
2026-09-30 04:55:57 -04:00
hotragn ec4ff9fed4 fix(install): one failing tool no longer stops the tools after it
A sequential install called install_tool bare under set -e, so the first
tool that returned 1 exited the whole script. With copilot, cursor, qwen,
codex and hermes detected and no integrations/cursor:

  [1/5] copilot   [OK]
  [2/5] cursor    [ERR] integrations/cursor missing. Run convert.sh first.
  (exit 1)

qwen, codex and hermes were never attempted, and nothing said so. The same
happens for any ensure_converted failure or an OpenClaw registration error.

Each tool now runs in a subshell with errexit on. It is not
`install_tool "$t" || failed+=(...)`: bash ignores errexit for everything on
the left of ||, subshells included, so a failing cp inside a tool would carry
on as if it had worked. Instead the parent turns errexit off for that one
command, and the subshell turns it back on for itself.

A failed tool is recorded and the loop moves on. The done box reads
"Installed 2 of 3 tool(s)" instead of "Done!", and the run ends with
"Failed: cursor — see the [ERR] line under each above" and exit 1. A clean
install is unchanged. Nothing in install_* sets globals the parent reads
afterwards, and the SKIPPED_LOG cleanup trap does not fire in a ( )
subshell, so running tools in a subshell loses nothing.

Parallel mode is untouched; its log replay on failure is item 1 of #917.

test-install-continue-after-failure.sh builds a fixture repo with
gemini-cli and qwen output and no cursor output, installs all three, and
checks that qwen still installs, cursor's error is shown, the summary names
cursor, and the exit is non-zero. It also checks that a clean run still
exits 0. It fails on main at "qwen ... was never installed" and runs in
check-tools.yml.
2026-09-30 04:49:05 -04:00
hotragn 453bc88d47 fix(install): claude-code/copilot and the .md converters collide under --path
path_collision_group put claude-code and copilot in their own group on the
assumption that they write <division>-<slug>.md. They copy the source file
under its own name, and 73 of the 279 agents are named <slug>.md already:
all 20 in game-development/, 38 in specialized/, 6 in spatial-computing/ and
9 elsewhere. For those, the file is the same one gemini-cli, opencode, qwen
and zcode write.

  $ install.sh --tool claude-code,qwen --agent game-designer --path out --no-convert
  [OK]  Claude Code: 1 agents -> out
  [OK]  Qwen Code: installed 1 agents to out
  $ head -2 out/game-designer.md
  ---
  name: 'game-designer'          <- qwen's frontmatter; the Claude Code file is gone

Both tools report success and the install exits 0. A full install of any of
those pairs into one --path loses 73 files the same way.

The six tools are now one group. That also refuses a pair like claude-code
and gemini-cli for a selection with no slug-named agent in it, which could
technically share a directory; the guard works per tool pair, and a full
install collides on 73 files, so treating the pair as colliding is the
honest answer. claude-code with codex, cursor, kimi and the other
distinct-output tools still share a --path as before.

test-install.sh picks a slug-named agent from game-development/ and checks
that claude-code,qwen into one --path is refused and writes nothing. The
refusal comes before conversion, so the case stays cheap.
2026-09-30 04:44:55 -04:00
hotragn 3d80c07945 fix(markdown): seven agents' templates break out of their code blocks
Markdown has no nesting at equal fence length. Inside a ```markdown
template, a ```bash line is text, and the example's bare ``` closes the
template. Seven agents nest example blocks inside a template that way, so on
GitHub the rest of each template renders as headings and prose, and in three
of them the last block then runs open to the end of the file:

  design-ux-architect          code from line 414 to EOF
  ats-validator-architect      code from line 307 to EOF
  master-plan-architect        code from line 102 to EOF
  technical-writer, incident-response-commander, developer-advocate,
  workflow-architect           templates end early, rest renders as markdown

The fix for each is the one CommonMark intends: fence the outer template
with four backticks so the three-backtick examples stay inside it. Nine outer
blocks change; no content does.

Nothing caught this because lib.sh's fence_closes_p accepted "```python" as
a closing fence. CommonMark allows only whitespace after a closing run, and
GitHub renders by that rule. With the old rule the linter and the OpenClaw
split read those seven files one way and GitHub another, so each agreed with
itself and all three disagreed with what users see. fence_closes_p now
requires a bare run, and the OpenClaw split invariant in
test-convert-outputs.sh uses the same rule.

lint-agents.sh gets two errors, each with the file line number:

  - a fence line inside an open block that is long enough to close it but
    carries an info string -- the only way that happens is an attempted
    nest, and the message says how to fix it
  - a block that is still open at the end of the file

The body loop now reads the file from the line after the frontmatter
instead of from $body, which drops every "---" line and so cannot give a
line number. It also keeps a last line with no trailing newline; two agents
end on a closing fence with none, and without that they read as unclosed.

The whole roster lints with 0 errors after the fix; on main the same check
reports 18 errors across the seven files.
scripts/test-lint-fences.sh covers both errors, the suggested fix, tilde
fences, and fence_closes_p directly, and runs in check-tools.yml.
2026-09-30 04:37:58 -04:00
Michael SitarzewskiandClaude Opus 5.5 23d0a68d7b fix(openclaw): one failed registration no longer costs the others
#915 made registration failures visible (main swallowed them with `|| true` and
reported success). But it returned at the first failure, so every agent after it
went unregistered. In real OpenClaw 2026.9.6 with one registration forced to fail,
batch 2 registered only 1 of the 2 agents that could have succeeded.

Keep registering the rest, name every failure in one message at the end, and
still exit non-zero. Verified against real OpenClaw (node:24, official npm
package): the failure case now registers both good agents and exits 1; the
normal install and the re-run are unchanged. #915's own test still passes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 17:53:28 -05:00
Michael SitarzewskiandClaude Opus 5.5 a9feb4285f fix(install): skip a foreign destination symlink and keep going; replace our own
#916 stops cp from writing through a symlink at an agent's destination, which on
main overwrites whatever the link points at (verified: a user's file was replaced
by an agent). But it made one stray link fatal: under `set -e` the refusal aborted
the install at the first link, leaving a partial roster (57 of 279 in testing).
It also refused our own links, so re-installing without --link after a --link
install failed for every file (main fails there too, with "are the same file").

- A link into this clone ($REPO_ROOT) is ours: remove it and copy. That's the
  intended --link -> copy switch, and the clone's sources stay untouched.
- Any other link is skipped with a warning, recorded, and the install continues.
  The final summary lists what was not installed. A temp file carries the list so
  it survives the parallel installer's subshells.
- test-install.sh: #916's case now asserts skip-and-continue (sentinel intact,
  link left in place, the rest of the selection installs, summary reports it);
  new case for --link then copy (link replaced by a real file, source unchanged).
  65 passed, 0 failed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 17:33:47 -05:00
Michael Sitarzewski 4d7acad64a Merge branch 'rudy-915' into integ/rudy-batch2 2026-09-29 14:41:13 -05:00
Michael Sitarzewski 4aaea9874e Merge branch 'rudy-913' into integ/rudy-batch2 2026-09-29 14:41:13 -05:00
Michael Sitarzewski 6c08f8db20 Merge branch 'rudy-914' into integ/rudy-batch2 2026-09-29 14:41:13 -05:00
Rudy Celekli 37678803bf fix(installer): refuse destination file symlinks when copying 2026-09-29 13:58:44 -04:00
Rudy Celekli 2ce9ca601a fix(openclaw): detect existing agents and report registration failures 2026-09-29 13:07:47 -04:00
Rudy Celekli 3acce92df2 fix(convert): refuse symlinked tool output directories 2026-09-29 12:59:47 -04:00
Rudy Celekli e4626b9040 fix(install): honor --path for Windsurf rules 2026-09-29 12:52:22 -04:00
Michael SitarzewskiandClaude Opus 5.5 d801ff90ad fix(install): never follow a symlink when replacing the Hermes plugin
`rm -rf "$dest/"` follows a symlink and empties its target. basename ignores a
trailing slash, so HERMES_PLUGIN_DIR=".../agency-agents-router/" passed every
check, and a symlinked destination (our own --link install, or a user's folder)
had its target's contents deleted. #903's ownership check didn't cover it: the
check reads through the link and the rm still follows it.

- Strip all trailing slashes from the destination before any check.
- A symlinked destination is removed with `rm -f` (the link itself), never
  `rm -rf`.
- test-install-hermes-destination.sh: two new cases (trailing slash on a
  symlink to a folder with a matching plugin.yaml; re-install over a --link
  install). Both fail before this commit and pass after.

Found by a destructive-path matrix (25 scenarios, throwaway container, fake HOME
with sentinel files): main fails 10 (deletes unrelated dirs, files and symlink
targets at the plugin path); the series without this commit fails 2 (H8/H9);
with it, 25/25.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 10:56:23 -05:00
Michael SitarzewskiandClaude Opus 5.5 d2d2101c45 chore(eval): regenerate the convert-outputs manifest for the integrated series
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-29 10:34:01 -05:00
Michael Sitarzewski fe52dd6a2e Merge branch 'rudy-895' into integ/rudy-series
# Conflicts:
#	scripts/convert-outputs.sha256
2026-09-29 10:25:03 -05:00
Michael Sitarzewski d2089289b8 Merge branch 'rudy-906' into integ/rudy-series
# Conflicts:
#	.github/workflows/check-tools.yml
2026-09-29 10:25:02 -05:00
Michael Sitarzewski cb156e0b15 Merge branch 'rudy-902' into integ/rudy-series
# Conflicts:
#	.github/workflows/check-tools.yml
2026-09-29 10:25:02 -05:00
Michael Sitarzewski 6671f71765 Merge branch 'rudy-900' into integ/rudy-series
# Conflicts:
#	.github/workflows/check-tools.yml
2026-09-29 10:25:01 -05:00
Michael Sitarzewski 9abb989416 Merge branch 'rudy-904' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski c59cff9ce5 Merge branch 'rudy-901' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski 7a0f97ca58 Merge branch 'rudy-898' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski ea3e7e5322 Merge branch 'rudy-897' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski 731efe6c9b Merge branch 'rudy-896' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski 611d0448e7 Merge branch 'rudy-894' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski 3cc60d0e3f Merge branch 'rudy-893' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski 545b569e30 Merge branch 'rudy-892' into integ/rudy-series 2026-09-29 10:24:42 -05:00
Michael Sitarzewski 3c195668b0 Merge branch 'rudy-891' into integ/rudy-series 2026-09-29 10:24:41 -05:00
Michael Sitarzewski 747ad1576d Merge branch 'rudy-899' into integ/rudy-series 2026-09-29 10:24:41 -05:00