{
  "manifest_version": "1.0.0",
  "template": {
    "id": "6e57ae3c-a40b-4c25-9f26-d5f7f414a097",
    "slug": "keen-fair",
    "name": "keen-fair",
    "description": "Deploy and Host keen-fair with Railway",
    "url": "https://railway.com/deploy/keen-fair",
    "upstream": {
      "repo_url": "https://github.com/yogen-p/github-pr-slack-bot"
    }
  },
  "services": [
    {
      "name": "Slack pr bot",
      "source": {
        "repo": "https://github.com/yogen-p/github-pr-slack-bot"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "Slack pr bot",
      "description": "Optional. HTTP port the Express server listens on. Default: 3000.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "TEAMMATES",
      "service": "Slack pr bot",
      "description": "Optional. Maps display names to GitHub usernames and (optionally) Slack user IDs for real @-mentions in thread replies.",
      "secret": false,
      "strategy": "default",
      "default": "Aidan:adlee:U012AB3CD,Sarah:schen:U098ZY7WX"
    },
    {
      "key": "GITHUB_REPOS",
      "service": "Slack pr bot",
      "description": "Required (or use GITHUB_REPO_OWNER + GITHUB_REPO_NAME). Comma-separated repos monitored by @mention commands.",
      "secret": false,
      "strategy": "default",
      "default": "your-org/repo1,your-org/repo2"
    },
    {
      "key": "GITHUB_TOKEN",
      "service": "Slack pr bot",
      "description": "Required. Octokit auth for listing PRs and reviews; needs repo + read:org scopes.",
      "secret": true,
      "strategy": "default",
      "default": "ghp_..."
    },
    {
      "key": "EMOJI_APPROVED",
      "service": "Slack pr bot",
      "description": "Optional. Slack emoji reacted when a reviewer approves. Default: white_check_mark.",
      "secret": false,
      "strategy": "default",
      "default": "white_check_mark"
    },
    {
      "key": "MENTION_PREFIX",
      "service": "Slack pr bot",
      "description": "Optional. Text prepended to PR notifications. Default: <!here>. Set to empty string to disable.",
      "secret": false,
      "strategy": "default",
      "default": "<!here>"
    },
    {
      "key": "SLACK_BOT_TOKEN",
      "service": "Slack pr bot",
      "description": "Required. Authenticates all Slack API calls (post, delete, react).",
      "secret": true,
      "strategy": "default",
      "default": "xoxb-..."
    },
    {
      "key": "GITHUB_REPO_NAME",
      "service": "Slack pr bot",
      "description": "Legacy single-repo config. Ignored if GITHUB_REPOS is set.",
      "secret": false,
      "strategy": "default",
      "default": "your-repo"
    },
    {
      "key": "SLACK_CHANNEL_ID",
      "service": "Slack pr bot",
      "description": "Required. Channel where PR messages are posted.",
      "secret": false,
      "strategy": "default",
      "default": "C0123456789"
    },
    {
      "key": "ANTHROPIC_API_KEY",
      "service": "Slack pr bot",
      "description": "Optional. Enables Claude-powered @mention replies; falls back to keyword matching when unset.",
      "secret": true,
      "strategy": "default",
      "default": "sk-ant-..."
    },
    {
      "key": "GITHUB_REPO_OWNER",
      "service": "Slack pr bot",
      "description": "Legacy single-repo config. Ignored if GITHUB_REPOS is set.",
      "secret": false,
      "strategy": "default",
      "default": "your-org"
    },
    {
      "key": "SLACK_SIGNING_SECRET",
      "service": "Slack pr bot",
      "description": "Required. Verifies incoming Slack requests; ExpressReceiver rejects all events without it.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GITHUB_WEBHOOK_SECRET",
      "service": "Slack pr bot",
      "description": "Strongly recommended. Verifies GitHub webhook signatures; without it, anyone can forge webhooks. Do not run in production without this.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "EMOJI_CHANGES_REQUESTED",
      "service": "Slack pr bot",
      "description": "Optional. Slack emoji reacted when a reviewer requests changes. Default: rabbit.",
      "secret": false,
      "strategy": "default",
      "default": "rabbit"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "keen-fair"
      }
    },
    "cli": "railway deploy --template keen-fair",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "6e57ae3c-a40b-4c25-9f26-d5f7f414a097",
            "serializedConfig": {
              "services": {
                "55d6f0ec-7a07-4d03-9232-d1fd2c565cf1": {
                  "name": "Slack pr bot",
                  "source": {
                    "repo": "yogen-p/github-pr-slack-bot",
                    "branch": null,
                    "rootDirectory": null
                  },
                  "variables": {
                    "PORT": {
                      "description": "Optional. HTTP port the Express server listens on. Default: 3000.",
                      "defaultValue": "3000"
                    },
                    "TEAMMATES": {
                      "description": "Optional. Maps display names to GitHub usernames and (optionally) Slack user IDs for real @-mentions in thread replies.",
                      "defaultValue": "Aidan:adlee:U012AB3CD,Sarah:schen:U098ZY7WX"
                    },
                    "GITHUB_REPOS": {
                      "description": "Required (or use GITHUB_REPO_OWNER + GITHUB_REPO_NAME). Comma-separated repos monitored by @mention commands.",
                      "defaultValue": "your-org/repo1,your-org/repo2"
                    },
                    "GITHUB_TOKEN": {
                      "description": "Required. Octokit auth for listing PRs and reviews; needs repo + read:org scopes.",
                      "defaultValue": "ghp_..."
                    },
                    "EMOJI_APPROVED": {
                      "description": "Optional. Slack emoji reacted when a reviewer approves. Default: white_check_mark.",
                      "defaultValue": "white_check_mark"
                    },
                    "MENTION_PREFIX": {
                      "description": "Optional. Text prepended to PR notifications. Default: <!here>. Set to empty string to disable.",
                      "defaultValue": "<!here>"
                    },
                    "SLACK_BOT_TOKEN": {
                      "description": "Required. Authenticates all Slack API calls (post, delete, react).",
                      "defaultValue": "xoxb-..."
                    },
                    "GITHUB_REPO_NAME": {
                      "description": "Legacy single-repo config. Ignored if GITHUB_REPOS is set.",
                      "defaultValue": "your-repo"
                    },
                    "SLACK_CHANNEL_ID": {
                      "description": "Required. Channel where PR messages are posted.",
                      "defaultValue": "C0123456789"
                    },
                    "ANTHROPIC_API_KEY": {
                      "description": "Optional. Enables Claude-powered @mention replies; falls back to keyword matching when unset.",
                      "defaultValue": "sk-ant-..."
                    },
                    "GITHUB_REPO_OWNER": {
                      "description": "Legacy single-repo config. Ignored if GITHUB_REPOS is set.",
                      "defaultValue": "your-org"
                    },
                    "SLACK_SIGNING_SECRET": {
                      "description": "Required. Verifies incoming Slack requests; ExpressReceiver rejects all events without it.",
                      "defaultValue": "{{SLACK_SIGNING_SECRET}}"
                    },
                    "GITHUB_WEBHOOK_SECRET": {
                      "description": "Strongly recommended. Verifies GitHub webhook signatures; without it, anyone can forge webhooks. Do not run in production without this.",
                      "defaultValue": "{{GITHUB_WEBHOOK_SECRET}}"
                    },
                    "EMOJI_CHANGES_REQUESTED": {
                      "description": "Optional. Slack emoji reacted when a reviewer requests changes. Default: rabbit.",
                      "defaultValue": "rabbit"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {},
  "resources": {
    "expected_services": 1,
    "needs_volume": false
  },
  "generated_at": "2026-09-20T10:14:37.339Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-09-20T14:22:03.815Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_f339d37c60fb4391820c",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "CRASHED"
      }
    ]
  }
}
