Fix manifest bot_user, drop Gemini extension, consolidate skill install on npx#45
Conversation
The generated app manifest declared bot OAuth scopes (oauth_config.scopes.bot) without a bot user, so Slack's "create app from manifest" form rejected it with "Oauth requires bot_user". Emit features.bot_user whenever the command tree contributes any bot scopes, and regenerate the README manifest block. Assert the bot_user is present in the generator test. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Gemini extension's gemini-extension.json only set contextFileName to the slk index skill — no MCP, commands, or binary install. npx skills natively targets gemini-cli, installing the full skill tree as on-demand agent skills with `npx skills update`, so the bespoke extension is redundant. Drop gemini-extension.json and its VERSION fan-out (sync-version.sh, the version-sync CI guard) plus the SPEC/CLAUDE references, and remove the README install section that pointed at it. Gemini users install via npx skills like every other skill-aware agent. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lead the Agent setup section with `npx skills`: it auto-detects installed agents (Claude Code, Gemini CLI, Codex, Cursor, OpenClaw, and more), installs the whole slk skill tree symlinked to one canonical copy, and `npx skills update` keeps every agent current. Fold the former OpenClaw section into this single path and demote the hand-copy to a fallback. Keep the inline option (reference `slk --help` or paste SKILL.md) for agents without a skills directory. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request removes the gemini-extension.json file and updates the versioning and documentation workflows accordingly. It also modifies the manifest generation logic to automatically include a bot_user feature when bot scopes are present, ensuring compatibility with Slack's app creation requirements. Feedback was provided to improve the readability of the manifest generation code by pre-calculating scope sets and ensuring consistent JSON schema output.
| botScopes := scopeUnion(root, "bot") | ||
| manifest := map[string]any{ | ||
| "display_information": map[string]any{"name": "slk"}, | ||
| "oauth_config": map[string]any{ | ||
| "scopes": scopes{User: scopeUnion(root, "user"), Bot: scopeUnion(root, "bot")}, | ||
| "scopes": scopes{User: scopeUnion(root, "user"), Bot: botScopes}, |
There was a problem hiding this comment.
For better consistency and readability, consider calculating both userScopes and botScopes before initializing the manifest map. This makes the map literal cleaner and ensures both scope sets are handled identically. Additionally, ensure that the generated manifest maintains a consistent schema even if these scope lists are empty, as per repository standards for command outputs.
userScopes := scopeUnion(root, "user")
botScopes := scopeUnion(root, "bot")
manifest := map[string]any{
"display_information": map[string]any{"name": "slk"},
"oauth_config": map[string]any{
"scopes": scopes{User: userScopes, Bot: botScopes},
},References
- Ensure JSON output for commands maintains a consistent schema even when data lists are empty. Standard envelope or metadata fields should be included alongside empty arrays to ensure a predictable structure for programmatic callers.
Surfaced during hands-on UX validation of the install/onboarding flow.
Changes
features.bot_userin the generated app manifest. Slack's "create app from manifest" form rejects bot scopes without a bot user (Oauth requires bot_user); this unblocks app creation.gemini-extension.jsononly setcontextFileNameto the index skill —npx skillsnatively targetsgemini-cli, so the bespoke extension is redundant. Also dropped from the VERSION fan-out (sync-version.sh, CIversion-sync).npx skillsthe primary agent-skill install path; fold OpenClaw in, drop the unverified OpenClaw binary-autoinstall claim, and defer install/update behavior to thenpx skillswizard.Verification
go test ./...green; skill / manifest / version-sync CI drift guards all pass locally.🤖 Generated with Claude Code