Commit Graph
145 Commits
Author SHA1 Message Date
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 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
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 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
Michael Sitarzewski 71753b1b3f Merge branch 'rudy-903' into integ/rudy-series 2026-09-29 10:24:41 -05:00
fruitandClaude Opus 5.5 68f01534ef fix(install): Hermes plugin actually gets enabled on real Hermes configs (#881)
The Hermes installer printed "[OK] enabled plugin" and "Done!" while leaving agency-agents-router disabled or absent. On current Hermes this hit every user: the default plugins: block contains a column-0 "# ====" banner, and `hermes plugins enable/disable` writes enabled:/disabled: below it.

- Bound the enabled: sub-block at the first sibling key; sweep stale entries out of disabled: (Hermes: "an explicit disable wins"); handle inline [], [a,b], disabled: above enabled:, trailing comments, corrupted-scalar recovery; bail on shapes that can't be edited line-wise. (@guozi-lab)
- A column-0 comment no longer ends the plugins: block, and the rewrite's exit status propagates (`|| return 1`) so a bail warns instead of reporting success. (maintainer follow-up)
- check-hermes-config-rewrite.py: 16 cases, including Hermes' real shape.

Verified in real Hermes (official installer, 9a0a162) on configs Hermes wrote itself, with a live turn on local qwen3.8-27b: main -> "agency_agents_delegate does not exist"; this change -> delegated: true, real subagent, real result.

Closes #879

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-28 07:03:44 -05:00
Rudy Celekli 9445c9cbee fix(installer): avoid SIGPIPE when checking selected agents 2026-09-28 01:19:06 -04:00
Rudy Celekli 7ed03ed5e7 fix(validation): reject unclosed agent frontmatter 2026-09-28 01:08:48 -04:00
Rudy Celekli 4e2d91d687 fix(installer): protect unrelated Hermes destinations 2026-09-28 01:05:47 -04:00
Rudy Celekli 09eba4b057 fix(convert): surface parallel failures and clean buffered logs 2026-09-28 01:00:07 -04:00
Rudy Celekli 070640f34c fix(installer): guard shared paths for detected tools 2026-09-28 00:56:56 -04:00
Rudy Celekli 25d6c10b92 fix(installer): stop after failed automatic conversion 2026-09-28 00:49:42 -04:00
Rudy Celekli fda3beeaba fix(convert): refuse duplicate agent slugs before writing 2026-09-28 00:32:16 -04:00
Rudy Celekli 8fba721291 fix(ci): reject undeployable runbook rosters 2026-09-28 00:20:02 -04:00
Rudy Celekli 435cf1d232 fix(ci): reject empty required agent metadata 2026-09-28 00:16:58 -04:00
Rudy Celekli 0249ecd37f fix(ci): select direct agent files for lint and originality 2026-09-28 00:05:15 -04:00
Rudy Celekli 2f1008453b fix(hermes): preserve continued frontmatter metadata 2026-09-27 23:54:05 -04:00
Rudy Celekli 77a898401a fix(eval): preserve manifest when output validation fails 2026-09-27 23:47:25 -04:00
Rudy Celekli 2bc53022ef fix(installer): honor --path for Aider roster 2026-09-27 23:39:04 -04:00
Rudy Celekli 3e7dda0ae7 fix(installer): honor single Copilot destination override 2026-09-27 23:32:32 -04:00
Rudy Celekli a47212e9e5 fix(convert): preserve Markdown separators in agent bodies 2026-09-27 23:24:27 -04:00
Roberto SolanoandClaude Opus 5.5 479193dcce feat(integration): add DeepSeek Harness (dsh) skills support (#846)
Adds DeepSeek Harness as an integration target: 279 agency-* SKILL.md skills installed to ${DSH_HOME:-~/.dsh}/skills (or DSH_SKILLS_DIR for project scope).

Verified in DeepSeek Harness itself (@deepseek-ai/dsh 0.1.7-rc.2, installed via the documented npx path on Ubuntu 26.04 arm64): the repo installer placed 279 skills, and dsh's own skill-filesystem parser accepted all 279 with zero warnings (a planted invalid name and a missing description were both rejected with dsh's own messages).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-27 18:45:36 -05:00
Michael SitarzewskiandClaude Opus 5 652277fba1 fix(install): tell aider users when their CONVENTIONS.md is our stale roster (#875)
#871 shrank the aider integration from 3.8M characters of concatenated agents
to a 97K roster index, because aider keeps a conventions file in context for a
whole session. The fix only reached new installs.

install_aider refuses to overwrite an existing CONVENTIONS.md, which is right —
it is aider's own user-authored file and the one on disk may be the reader's.
But "already exists (remove to reinstall)" says nothing about which file it is,
so anyone holding the pre-index roster re-ran the installer, read that, and
kept the broken file. The people the fix was written for were the ones it could
not reach.

Our generated file has always opened with "# The Agency — AI Agent
Conventions", so the installer can now tell its own stale copy from someone
else's conventions and say which it is. Neither branch writes anything.

Verified in a container, all three cases:
  stale Agency roster   -> names it, reports 3800039 bytes, says to delete and re-run
  user's own file       -> "leaving your file alone", file intact
  no file               -> installs, 97065 bytes

Windsurf has the same guard and the same gap; #870 already handles it there, so
this leaves that path alone rather than colliding with it.

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
2026-09-21 20:44:43 -05:00