diff --git a/hive-ag3nt/prompts/agent.md b/hive-ag3nt/prompts/agent.md index aeefad6..0d135e7 100644 --- a/hive-ag3nt/prompts/agent.md +++ b/hive-ag3nt/prompts/agent.md @@ -24,6 +24,8 @@ Claude session (OAuth credentials) lives at `/root/.claude/` and persists across **Code forge**: a private Forgejo at `http://localhost:3000` is available when `/agents/{label}/state/forge-token` exists. You have your own user account (named `{label}`); credentials for the `tea` CLI are pre-configured at boot. Use `tea repos create`, `tea pulls create --base main --head `, `tea pulls list`, `tea issues create`, etc. for any persistent code work — git repos that should outlive a single turn, code you want a peer or the operator to review, anything you'd otherwise jam into `/shared`. Falls back to plain `git`/`curl` if `tea` doesn't fit; the REST API is at `http://localhost:3000/api/v1/` with the same token (`Authorization: token $(cat /agents/{label}/state/forge-token)`). +The `hive-forge` CLI helper wraps common Forgejo API operations: `view`, `issue`, `pr`, `comment`, `assign`, `close`, `labels`, `pr-reviews`, `branches`, `tree-sha`. To attach a file to an issue or comment use `hive-forge attach-issue [repo]` or `hive-forge attach-comment [repo]` — both print the `browser_download_url` of the uploaded attachment. + Keep messages short — a few sentences each. For anything big (file listings, long diffs, transcripts, analysis): write the payload to `/agents/{label}/state/` and `send` a short pointer ("dropped the cluster audit in /agents/{label}/state/cluster-audit-2026-05.md, headline: 3 nodes over 80% mem"). The manager + operator can read your state from the host as `/agents/{label}/state/`. Sub-agent peers can't read each other's state directly — go through the manager if a payload needs to reach another sub-agent. When your inbox has a message, handle it and stop. Don't narrate intent — act. diff --git a/hive-ag3nt/prompts/manager.md b/hive-ag3nt/prompts/manager.md index 088cb27..c316fa6 100644 --- a/hive-ag3nt/prompts/manager.md +++ b/hive-ag3nt/prompts/manager.md @@ -91,7 +91,7 @@ Keep messages short — a few sentences each. For anything big (digests, agent r - To the operator: write to your own `/state/` (host path `/var/lib/hyperhive/agents/hm1nd/state/`) and tell them where to look. - For shared artifacts (coordination, common reference data): write to `/shared/`. Only put things here you're willing to lose — other agents may delete them. -**Code forge**: a private Forgejo at `http://localhost:3000` is available when `/state/forge-token` exists. You have your own user (`hm1nd`) and so does every sub-agent (one per name). The `tea` CLI is pre-configured at boot. Use it for code work that should survive a turn — a proposed refactor across sub-agents, scratch repos, PRs you want a sub-agent or the operator to review (`tea pulls create --base main --head `, `tea pulls list`, `tea issues create`). REST API at `http://localhost:3000/api/v1/` with `Authorization: token $(cat /state/forge-token)` for anything `tea` can't express. +**Code forge**: a private Forgejo at `http://localhost:3000` is available when `/state/forge-token` exists. You have your own user (`hm1nd`) and so does every sub-agent (one per name). The `tea` CLI is pre-configured at boot. Use it for code work that should survive a turn — a proposed refactor across sub-agents, scratch repos, PRs you want a sub-agent or the operator to review (`tea pulls create --base main --head `, `tea pulls list`, `tea issues create`). REST API at `http://localhost:3000/api/v1/` with `Authorization: token $(cat /state/forge-token)` for anything `tea` can't express. The `hive-forge` CLI helper wraps common operations; use `hive-forge attach-issue ` or `hive-forge attach-comment ` to upload file attachments to issues or comments. A one-line headline + the file path beats a wall-of-text every time — it survives context compaction and the operator can read it in their own time. diff --git a/nix/packages/hive-forge-tools.nix b/nix/packages/hive-forge-tools.nix index b5e40a3..3cb1767 100644 --- a/nix/packages/hive-forge-tools.nix +++ b/nix/packages/hive-forge-tools.nix @@ -221,28 +221,56 @@ pkgs.writeShellApplication { | jq -r '.tree.sha // .sha' } + cmd_attach_issue() { + # attach-issue [repo] + # Upload a file as an attachment to an issue. Prints the download URL. + if [ $# -lt 2 ]; then echo "usage: hive-forge attach-issue [repo]" >&2; exit 1; fi + local _n="$1" _file="$2" _repo="''${3:-$HIVE_FORGE_REPO}" + if [ ! -f "$_file" ]; then echo "hive-forge attach-issue: file not found: $_file" >&2; exit 1; fi + ${pkgs.curl}/bin/curl -sf -X POST \ + -H "Authorization: token $_token" \ + -F "attachment=@$_file" \ + "$FORGE_API/repos/$_repo/issues/$_n/assets" \ + | jq -r '.browser_download_url' + } + + cmd_attach_comment() { + # attach-comment [repo] + # Upload a file as an attachment to an issue comment. Prints the download URL. + if [ $# -lt 2 ]; then echo "usage: hive-forge attach-comment [repo]" >&2; exit 1; fi + local _id="$1" _file="$2" _repo="''${3:-$HIVE_FORGE_REPO}" + if [ ! -f "$_file" ]; then echo "hive-forge attach-comment: file not found: $_file" >&2; exit 1; fi + ${pkgs.curl}/bin/curl -sf -X POST \ + -H "Authorization: token $_token" \ + -F "attachment=@$_file" \ + "$FORGE_API/repos/$_repo/issues/comments/$_id/assets" \ + | jq -r '.browser_download_url' + } + VERB="''${1:-}" if [ -z "$VERB" ]; then echo "usage: hive-forge [args...]" >&2 - echo "verbs: view, issue, pr, comment, assign, close, labels, pr-reviews, branches, tree-sha" >&2 + echo "verbs: view, issue, pr, comment, assign, close, labels, pr-reviews, branches, tree-sha, attach-issue, attach-comment" >&2 exit 1 fi shift case "$VERB" in - view) cmd_view "$@" ;; - issue) cmd_issue "$@" ;; - pr) cmd_pr "$@" ;; - comment) cmd_comment "$@" ;; - assign) cmd_assign "$@" ;; - close) cmd_close "$@" ;; - labels) cmd_labels "$@" ;; - pr-reviews) cmd_pr_reviews "$@" ;; - branches) cmd_branches "$@" ;; - tree-sha) cmd_tree_sha "$@" ;; + view) cmd_view "$@" ;; + issue) cmd_issue "$@" ;; + pr) cmd_pr "$@" ;; + comment) cmd_comment "$@" ;; + assign) cmd_assign "$@" ;; + close) cmd_close "$@" ;; + labels) cmd_labels "$@" ;; + pr-reviews) cmd_pr_reviews "$@" ;; + branches) cmd_branches "$@" ;; + tree-sha) cmd_tree_sha "$@" ;; + attach-issue) cmd_attach_issue "$@" ;; + attach-comment) cmd_attach_comment "$@" ;; *) echo "hive-forge: unknown verb '$VERB'" >&2 - echo "verbs: view, issue, pr, comment, assign, close, labels, pr-reviews, branches, tree-sha" >&2 + echo "verbs: view, issue, pr, comment, assign, close, labels, pr-reviews, branches, tree-sha, attach-issue, attach-comment" >&2 exit 1 ;; esac