Skip to content

feat(slack): support long app descriptions - #65256

Closed
2001Y wants to merge 2 commits into
NousResearch:mainfrom
2001Y:feat/slack-long-description
Closed

feat(slack): support long app descriptions#65256
2001Y wants to merge 2 commits into
NousResearch:mainfrom
2001Y:feat/slack-long-description

Conversation

@2001Y

@2001Y 2001Y commented Jul 15, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

Adds opt-in support for setting Slack's display_information.long_description when generating an app manifest with hermes slack manifest.

The command now accepts either inline text (--long-description) or a UTF-8 file (--long-description-file). It validates Slack's documented 175–4,000-character range, preserves file contents exactly (including CRLF and lone-CR newlines), and reports path-expansion, read, and decode failures as CLI errors. Integer command-handler statuses are propagated through the main dispatcher so these failures exit with status 2 for shells and CI. Existing manifest output is unchanged when neither option is supplied.

Long descriptions are intentionally rejected with --slashes-only, because that mode emits an intentionally minimal manifest without display_information.

Related Issue

N/A — this is a user-requested CLI enhancement and no matching issue exists.

Overlap check

  • Pinned implementation base: dbf86b9234717983f65fe56e7bfd9d0f9632ceb4.
  • Searched open and closed issues/PRs for long_description, Slack manifest long description, --long-description, and display_information Slack.
  • No exact or complementary Slack-manifest implementation was found. Search results using the generic phrase “long description” concerned unrelated model-picker, personality-preview, and approval-display behavior.

Type of Change

  • 🐛 Bug fix (non-breaking change that fixes an issue)
  • ✨ New feature (non-breaking change that adds functionality)
  • 🔒 Security fix
  • 📝 Documentation update
  • ✅ Tests (adding or improving test coverage)
  • ♻️ Refactor (no behavior change)
  • 🎯 New skill (bundled or hub)

Changes Made

  • Added mutually exclusive --long-description and --long-description-file options in hermes_cli/subcommands/slack.py.
  • Added Slack-schema length validation, exact UTF-8 file reading, actionable errors, and --slashes-only conflict handling in hermes_cli/slack_cli.py.
  • Propagated integer handler statuses from hermes_cli/main.py, with subprocess coverage proving all new validation paths exit with status 2.
  • Threaded the optional value into display_information.long_description without changing the default manifest.
  • Added focused coverage for inline/file input, 175/4,000 boundaries, invalid UTF-8, CRLF/lone-CR preservation, tilde expansion, read errors, and option conflicts in tests/hermes_cli/test_slack_cli.py.
  • Documented both options in the CLI reference and Slack setup guide.

How to Test

  1. Run the focused regression suite:
    scripts/run_tests.sh -j 1 \
      tests/hermes_cli/test_slack_cli.py \
      tests/gateway/test_slack_plugin_setup.py \
      tests/hermes_cli/test_console_engine.py -q
  2. Generate a manifest from a UTF-8 file:
    python3 -c "from pathlib import Path; Path('/tmp/slack-long-description.txt').write_text('A' * 175, encoding='utf-8')"
    ./hermes slack manifest \
      --agent-view \
      --long-description-file /tmp/slack-long-description.txt
  3. Verify that the JSON contains display_information.long_description, retains features.agent_view, and rejects inputs shorter than 175 or longer than 4,000 characters.

Checklist

Code

  • I've read the Contributing Guide
  • My commit messages follow Conventional Commits (fix(scope):, feat(scope):, etc.)
  • I searched for existing PRs to make sure this isn't a duplicate
  • My PR contains only changes related to this fix/feature (no unrelated commits)
  • I've run pytest tests/ -q and all tests pass
    • Canonical runner result on the PR head: 41,195 passed, 25 failed, and tests/gateway/test_matrix.py timed out at 120 seconds.
    • The exact parent reproduced the same 13 failing files and 25 failed tests, plus the same matrix timeout under the same 16-worker command.
    • The timed-out matrix file completed on both the PR head and exact parent when rerun alone with a 300-second timeout; each run passed all 251 tests.
  • I've added tests for my changes (required for bug fixes, strongly encouraged for features)
  • I've tested on my platform: macOS 27.0 (arm64)

Documentation & Housekeeping

  • I've updated relevant documentation (README, docs/, docstrings) — or N/A
  • I've updated cli-config.yaml.example if I added/changed config keys — or N/A (no config keys changed)
  • I've updated CONTRIBUTING.md or AGENTS.md if I changed architecture or workflows — or N/A (no architecture/workflow change)
  • I've considered cross-platform impact (Windows, macOS) per the compatibility guide — or N/A
  • I've updated tool descriptions/schemas if I changed tool behavior — or N/A (no agent tool changed)

Screenshots / Logs

No UI change.

  • Focused suite: 371 tests passed across Slack, console-engine, and main-dispatcher regression files.
  • End-to-end smoke: a 3,719-character, 61-line UTF-8 AGENTS.md round-tripped byte-for-byte through display_information.long_description; agent_view remained enabled.
  • Console-script smoke: 174-character input, a missing UTF-8 file, and a --slashes-only conflict each exited with status 2.
  • ruff check, py_compile, scripts/check-windows-footguns.py, and git diff --check passed.
  • Slack manifest v1 schema bounds verified as 175–4,000 characters.

@alt-glitch alt-glitch added type/feature New feature or request comp/cli CLI entry point, hermes_cli/, setup wizard platform/slack Slack app adapter P3 Low — cosmetic, nice to have labels Jul 15, 2026
@teknium1

Copy link
Copy Markdown
Contributor

Thanks for adding an opt-in manifest field with focused parsing, file-decoding, boundary, and documentation coverage. Current main has no long_description option or manifest emission (hermes_cli/subcommands/slack.py:35-76, hermes_cli/slack_cli.py:129-133), so the requested feature remains live.

Problems

  • The hermes_cli/main.py dispatcher change alters exit-code behavior for every parsed command, not only Slack: current main discards handler results at hermes_cli/main.py:14874-14878. tests/hermes_cli/test_kanban_core_functionality.py:2031-2034 explicitly documents that existing nonzero subcommand results are discarded. The PR covers Slack statuses but leaves that shared contract change untested and the existing test comment incorrect.

Suggested changes

  • Either localize status handling to the Slack path, or add a generic dispatcher regression using an existing non-Slack nonzero handler and update the Kanban test to assert its propagated status.

Automated hermes-sweeper review.

@teknium1 teknium1 added sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:blast-broad Sweeper blast radius: broad — a core path most sessions hit labels Jul 16, 2026
@2001Y
2001Y force-pushed the feat/slack-long-description branch from 83fb86c to b786a62 Compare July 19, 2026 16:09
teknium1 pushed a commit that referenced this pull request Jul 23, 2026
Add --long-description / --long-description-file to `hermes slack
manifest` so the generated app manifest can carry Slack's
display_information.long_description (175–4,000 characters), with
validation of the length bounds, mutual-exclusion with --slashes-only,
and UTF-8 file input. Also propagate the manifest command's exit status
through cmd_slack so validation failures reach the shell.

Squash of the two commits from PR #65256 — one commit per contributor
on this salvage branch.

Salvaged from #65256
teknium1 pushed a commit that referenced this pull request Jul 23, 2026
Add --long-description / --long-description-file to `hermes slack
manifest` so the generated app manifest can carry Slack's
display_information.long_description (175–4,000 characters), with
validation of the length bounds, mutual-exclusion with --slashes-only,
and UTF-8 file input. Also propagate the manifest command's exit status
through cmd_slack so validation failures reach the shell.

Squash of the two commits from PR #65256 — one commit per contributor
on this salvage branch.

Salvaged from #65256
teknium1 pushed a commit that referenced this pull request Jul 23, 2026
Add --long-description / --long-description-file to `hermes slack
manifest` so the generated app manifest can carry Slack's
display_information.long_description (175–4,000 characters), with
validation of the length bounds, mutual-exclusion with --slashes-only,
and UTF-8 file input. Also propagate the manifest command's exit status
through cmd_slack so validation failures reach the shell.

Squash of the two commits from PR #65256 — one commit per contributor
on this salvage branch.

Salvaged from #65256
teknium1 pushed a commit that referenced this pull request Jul 23, 2026
Add --long-description / --long-description-file to `hermes slack
manifest` so the generated app manifest can carry Slack's
display_information.long_description (175–4,000 characters), with
validation of the length bounds, mutual-exclusion with --slashes-only,
and UTF-8 file input. Also propagate the manifest command's exit status
through cmd_slack so validation failures reach the shell.

Squash of the two commits from PR #65256 — one commit per contributor
on this salvage branch.

Salvaged from #65256
@teknium1

Copy link
Copy Markdown
Contributor

Merged via #70196 — your commit was cherry-picked/reapplied onto current main with your authorship preserved in git history: your long app description support was cherry-picked.

Thanks for the contribution!

@teknium1 teknium1 closed this Jul 23, 2026
randlee pushed a commit to randlee/hermes-agent that referenced this pull request Aug 11, 2026
Add --long-description / --long-description-file to `hermes slack
manifest` so the generated app manifest can carry Slack's
display_information.long_description (175–4,000 characters), with
validation of the length bounds, mutual-exclusion with --slashes-only,
and UTF-8 file input. Also propagate the manifest command's exit status
through cmd_slack so validation failures reach the shell.

Squash of the two commits from PR NousResearch#65256 — one commit per contributor
on this salvage branch.

Salvaged from NousResearch#65256
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cli CLI entry point, hermes_cli/, setup wizard P3 Low — cosmetic, nice to have platform/slack Slack app adapter sweeper:blast-broad Sweeper blast radius: broad — a core path most sessions hit sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades type/feature New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants