Skip to content

Fix manifest bot_user, drop Gemini extension, consolidate skill install on npx#45

Merged
howar31 merged 3 commits into
mainfrom
fix/manifest-bot-user
May 24, 2026
Merged

Fix manifest bot_user, drop Gemini extension, consolidate skill install on npx#45
howar31 merged 3 commits into
mainfrom
fix/manifest-bot-user

Conversation

@howar31

@howar31 howar31 commented May 24, 2026

Copy link
Copy Markdown
Owner

Surfaced during hands-on UX validation of the install/onboarding flow.

Changes

  • fix(manifest): declare features.bot_user in 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.
  • chore: remove the Gemini extension distribution channel. gemini-extension.json only set contextFileName to the index skill — npx skills natively targets gemini-cli, so the bespoke extension is redundant. Also dropped from the VERSION fan-out (sync-version.sh, CI version-sync).
  • docs: make npx skills the primary agent-skill install path; fold OpenClaw in, drop the unverified OpenClaw binary-autoinstall claim, and defer install/update behavior to the npx skills wizard.

Verification

  • go test ./... green; skill / manifest / version-sync CI drift guards all pass locally.
  • Agent-side runtime check: read + write (user and bot tokens) exercised against a live workspace.

🤖 Generated with Claude Code

howar31 and others added 3 commits May 24, 2026 19:46
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>
@howar31 howar31 merged commit c73eb79 into main May 24, 2026
4 checks passed
@howar31 howar31 deleted the fix/manifest-bot-user branch May 24, 2026 13:27
@howar31 howar31 mentioned this pull request May 24, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +59 to +63
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},

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

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
  1. 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant