v2: Forge Console + Open WebUI artifacts + Docker

- web/: Local chat UI (Express + WS → Codex bridge)
- openwebui/: Preset, pipelines, knowledge manifest
- Dockerfile + docker-compose.yml
- Updated README with 3 frontend options
- CLI-agnostic: works with Codex, Claude Code, Kiro, Gemini
This commit is contained in:
Max Mayfield
2026-02-27 06:56:34 +00:00
commit df667e0db8
38 changed files with 3206 additions and 0 deletions

31
docs/agents/README.md Normal file
View File

@@ -0,0 +1,31 @@
# Forge Console — Agent Docs
## Jira Agent (`rp-ticket-ops`)
Manages Jira issues via the Atlassian MCP server.
### Capabilities
- Create, update, and transition Jira issues
- Search with JQL
- Add comments and attachments
- Link issues
### Authentication
Uses `mcporter` with OAuth. Run `mcporter auth atlassian` once to authenticate.
### Usage
The agent reads `config/mcporter.json` to connect. No API tokens needed — OAuth handles it.
## MCPorter
MCP client that bridges AI agents to external tool servers.
### Configured Servers
| Server | Purpose |
|--------|---------|
| `atlassian` | Jira via Atlassian's official MCP |
| `aha` | Aha! roadmap management |
| `context7` | Library documentation lookup |
### Config Location
`config/mcporter.json`

327
docs/agents/jira.md Normal file
View File

@@ -0,0 +1,327 @@
---
name: jira
description: Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
---
# Atlassian / JIRA Reference
## Domain
`reltio.jira.com` — use for all browse links, e.g. `https://reltio.jira.com/browse/RP-XXXXX`
## Cloud ID
`444c13e0-0faa-4055-b053-501700bae7b0`
## Current User (Brian Galura)
- account_id: `712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b`
- email: brian.galura@reltio.com
## Project
- key: `RP` (Reltio Platform), id: `10041`
- key: `ICR` (Infrastructure Change Request), id: `12890`
## Issue Types (RP project)
| Name | ID | Hierarchy | Notes |
|----------------|-------|-----------|------------------------------|
| Epic | 5 | 1 | Parent of stories |
| Story | 6 | 0 | Standard work item |
| Rollout Story | 10535 | 0 | Feature enablement per env |
| Task | 3 | 0 | |
| Bug | 1 | 0 | |
| Sub-Task | 9 | -1 | Child of other issue types |
## Required Fields by Issue Type
### Epic (required)
| Field | Key | Type |
|------------------------|--------------------|-------------------|
| Assignee | `assignee` | user |
| Type of Effort | `customfield_15815`| option (select) |
### Story (required)
| Field | Key | Type |
|------------------------|--------------------|-------------------|
| Assignee | `assignee` | user |
| Found/Requested By | `customfield_11922`| option (select) |
| Affected Documentation | `customfield_12429`| array of options |
| Acceptance Criteria | `customfield_15956`| **ADF** (rich text, must use Atlassian Document Format) |
| Type of Effort | `customfield_15815`| option (select) |
### Task (required)
| Field | Key | Type |
|------------------------|--------------------|-------------------|
| Assignee | `assignee` | user |
| Components | `components` | array of component (`[{"id": "..."}]`) |
| Found/Requested By | `customfield_11922`| option (select) |
| Type of Effort | `customfield_15815`| option (select) |
### Rollout Story (required)
| Field | Key | Type |
|------------------------|--------------------|-------------------|
| Assignee | `assignee` | user |
| Found/Requested By | `customfield_11922`| option (select) |
| Affected Documentation | `customfield_12429`| array of options |
| Execution team | `customfield_13020`| option (select) |
| Type of Effort | `customfield_15815`| option (select) |
### Change Request (ICR project, required)
| Field | Key | Type |
|------------------------|--------------------|-------------------|
| Assignee | `assignee` | user (has default; still set explicitly when possible) |
| Change Start Date/Time | `customfield_15856`| datetime (`YYYY-MM-DDTHH:mm:ss.SSS-0800`) |
| Change End Date/Time | `customfield_15857`| datetime (`YYYY-MM-DDTHH:mm:ss.SSS-0800`) |
| Manager/Peer Reviewer | `customfield_15862`| user |
| Procedure | `customfield_15863`| option (select) |
| Change Category | `customfield_15864`| option (select) |
| Can it be rolled back? | `customfield_16072`| array of options (checkbox) |
## Common Custom Fields (optional but useful)
| Field | Key | Type |
|--------------------|--------------------|-----------------|
| Fix Version | `fixVersions` | array of version|
| Reporter | `reporter` | user (`{"accountId": "..."}`) |
| Story Points | `customfield_10013`| number |
| Confidence Level | `customfield_12520`| option (select) |
| Product Lead | `customfield_15755`| user |
| Engineering Lead | `customfield_15756`| user |
| Start date | `customfield_15541`| date (YYYY-MM-DD) |
| End date | `customfield_15535`| date (YYYY-MM-DD) |
| Sprint | `customfield_10320`| sprint |
| Aha! Reference | `customfield_11820`| string (URL) |
| Security Review | `customfield_15826`| option (select) |
## Allowed Values for Required Select Fields
### Type of Effort (`customfield_15815`)
| Value | ID |
|-------------------------------------------|-------|
| Customer Feature | 18153 |
| Customer Support | 18156 |
| Innovation | 19074 |
| Platform Excellence | 18922 |
| Security Issues / Tech Debt / Maintenance | 18155 |
### Found/Requested By (`customfield_11922`)
| Value | ID |
|----------------------|-------|
| Alert | 18931 |
| Customer Engineering | 13609 |
| Engineering | 10114 |
| FDE | 24812 |
| Other | 17542 |
| Product Management | 10115 |
### Affected Documentation (`customfield_12429`)
| Value | ID |
|-------------------|-------|
| No | 16302 |
| Deprecation Notice| 11710 |
| Help Portal | 10438 |
| Internal Only | 12912 |
| Release Notes | 10437 |
### Execution team (`customfield_13020`) — partial list
| Value | ID |
|--------------------|-------|
| Cloud Platform (Portugal) | 19040 |
| DevOps | 16211 |
| Documentation | 18367 |
| Persistence | 16700 |
| Performance | 17629 |
| Data Unification | 12811 |
| Match | 15400 |
| IDP | 17906 |
| Console | 17845 |
| Architecture | 18930 |
| CI | 17656 |
### Procedure (`customfield_15863`) — ICR Change Request
| Value | ID |
|-------------|-------|
| Manual Step | 18226 |
| Automated | 18227 |
### Change Category (`customfield_15864`) — ICR Change Request
Default for ICR templates in this skill: `High Risk` (`18229`).
| Value | ID |
|-----------|-------|
| Low Risk | 18228 |
| High Risk | 18229 |
| Emergency | 18230 |
### Can it be rolled back? (`customfield_16072`) — ICR Change Request
| Value | ID |
|-------|-------|
| Yes | 18678 |
| No | 18679 |
### Risk Level (`customfield_16070`) — required when closing
| Value | ID |
|--------------------|-------|
| High-Risk Changes | 18676 |
| Low-Risk Changes | 18677 |
| Not applicable | 19049 |
### Confidence Level (`customfield_12520`)
| Value | ID |
|--------|-------|
| High | 10510 |
### Components (partial list)
| Value | ID |
|---------------|-------|
| Documentation | 10222 |
| QA | 11511 |
| DevOps | 11111 |
| DNS | 20020 |
## Fix Versions (known)
| Version | ID | Release Date |
|------------|-------|-------------|
| 2026.1.0.0 | 28439 | 2026-03-23 |
## ADF (Atlassian Document Format) Templates
### Acceptance Criteria — ordered list
```json
{
"type": "doc",
"version": 1,
"content": [
{"type": "orderedList", "attrs": {"order": 1}, "content": [
{"type": "listItem", "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Criteria item 1"}]}]},
{"type": "listItem", "content": [{"type": "paragraph", "content": [{"type": "text", "text": "Criteria item 2"}]}]}
]}
]
}
```
### Generic paragraph ADF (use for rich-text custom fields)
```json
{
"type": "doc",
"version": 1,
"content": [
{
"type": "paragraph",
"content": [
{"type": "text", "text": "No expected customer impact."}
]
}
]
}
```
## Common Transitions
| Name | ID | Target Status |
|--------------------------|-----|----------------|
| Selected for Development | 501 | Prioritized |
| Start Progress | 11 | In Progress |
| Resolve | 31 | Resolved |
| In Design | 471 | In Design |
| Close | 351 | Closed |
**Close transition requires:** `fixVersions` and `customfield_16070` (Risk Level).
### Example: Close a ticket
```bash
mcporter call atlassian.transitionJiraIssue --args '{
"cloudId": "444c13e0-0faa-4055-b053-501700bae7b0",
"issueIdOrKey": "RP-XXXXX",
"transition": {"id": "351"},
"fields": {
"fixVersions": [{"id": "28439"}],
"customfield_16070": {"id": "19049"}
}
}'
```
## Example: Create an Epic
```bash
mcporter call atlassian.createJiraIssue --args '{
"cloudId": "444c13e0-0faa-4055-b053-501700bae7b0",
"projectKey": "RP",
"issueTypeName": "Epic",
"summary": "Epic Title",
"description": "Markdown description",
"assignee_account_id": "712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b",
"additional_fields": {
"reporter": {"accountId": "712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b"},
"fixVersions": [{"id": "28439"}],
"customfield_15815": {"id": "18153"}
}
}'
```
## Example: Create a Task
```bash
mcporter call atlassian.createJiraIssue --args '{
"cloudId": "444c13e0-0faa-4055-b053-501700bae7b0",
"projectKey": "RP",
"issueTypeName": "Task",
"summary": "Task Title",
"description": "Task description",
"assignee_account_id": "712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b",
"additional_fields": {
"components": [{"id": "10222"}],
"customfield_15815": {"id": "18922"},
"customfield_11922": {"id": "10115"}
}
}'
```
## Example: Create a Story under an Epic
```bash
mcporter call atlassian.createJiraIssue --args '{
"cloudId": "444c13e0-0faa-4055-b053-501700bae7b0",
"projectKey": "RP",
"issueTypeName": "Story",
"summary": "Story Title",
"description": "Markdown description with ## Why / ## What / ## How",
"assignee_account_id": "712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b",
"parent": "RP-XXXXX",
"additional_fields": {
"reporter": {"accountId": "712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b"},
"fixVersions": [{"id": "28439"}],
"customfield_15815": {"id": "18153"},
"customfield_11922": {"id": "10114"},
"customfield_12429": [{"id": "16302"}],
"customfield_15956": {"type":"doc","version":1,"content":[{"type":"orderedList","attrs":{"order":1},"content":[{"type":"listItem","content":[{"type":"paragraph","content":[{"type":"text","text":"AC item"}]}]}]}]}
}
}'
```
## Example: Create an ICR Change Request
```bash
mcporter call atlassian.createJiraIssue --args '{
"cloudId": "444c13e0-0faa-4055-b053-501700bae7b0",
"projectKey": "ICR",
"issueTypeName": "Change Request",
"summary": "Re-add na11 IP 34.36.175.121 to na07 latency-based Cloud DNS records (na07-compute)",
"description": "Implementation, verification, impact, and rollback details",
"assignee_account_id": "712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b",
"additional_fields": {
"components": [{"id": "20020"}],
"customfield_15856": "2026-02-26T17:00:00.000-0800",
"customfield_15857": "2026-02-26T18:00:00.000-0800",
"customfield_15862": {"accountId": "712020:f70452cf-df7e-4ee3-b65b-66c83566fc3b"},
"customfield_15863": {"id": "18226"},
"customfield_15864": {"id": "18229"},
"customfield_16072": [{"id": "18678"}],
"customfield_15858": {
"type": "doc",
"version": 1,
"content": [
{"type": "paragraph", "content": [{"type": "text", "text": "No expected customer impact."}]}
]
},
"customfield_15859": {
"type": "doc",
"version": 1,
"content": [
{"type": "paragraph", "content": [{"type": "text", "text": "Remove na11 IP 34.36.175.121 from affected latency-based record sets."}]}
]
}
}
}'
```

44
docs/agents/mcporter.md Normal file
View File

@@ -0,0 +1,44 @@
---
name: mcporter
description: Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
homepage: http://mcporter.dev
---
# mcporter
Use `mcporter` to work with MCP servers directly.
⚠️ **CRITICAL EXECUTION RULE:**
Whenever you run `mcporter`, you MUST source the local `.env` file first so `mcporter.json` can interpolate the required API keys. Always run it as a chained command like this:
`set -a && source .env && set +a && mcporter --config config/mcporter.json call <server.tool> key=value`
Quick start
- `mcporter list`
- `mcporter list <server> --schema`
- `mcporter call <server.tool> key=value`
Call tools
- Selector: `mcporter call linear.list_issues team=ENG limit:5`
- Function syntax: `mcporter call "linear.create_issue(title: \"Bug\")"`
- Full URL: `mcporter call https://api.example.com/mcp.fetch url:https://example.com`
- Stdio: `mcporter call --stdio "bun run ./server.ts" scrape url=https://example.com`
- JSON payload: `mcporter call <server.tool> --args '{"limit":5}'`
Auth + config
- OAuth: `mcporter auth <server | url> [--reset]`
- Config: `mcporter config list|get|add|remove|import|login|logout`
Daemon
- `mcporter daemon start|status|stop|restart`
Codegen
- CLI: `mcporter generate-cli --server <name>` or `--command <url>`
- Inspect: `mcporter inspect-cli <path> [--json]`
- TS: `mcporter emit-ts <server> --mode client|types`
Notes
- config file is located at `config/mcporter.json` you may have to resolve a different relative path depending on your context
- Prefer `--output json` for machine-readable results.
- Always use `--args '{...}'` (JSON payload) for Atlassian calls with complex/nested fields.

View File

@@ -0,0 +1,38 @@
---
name: rp-ticket-ops
description: Create and update RP Jira tickets in reltio.jira.com with the standard IaC setup. Use when you need to batch-create or normalize RP tasks to match the reference ticket (labels, sprint, status, assignee, and verification).
---
# RP Ticket Ops
## Jira Context
- Domain: `https://reltio.jira.com`
- Cloud ID: `444c13e0-0faa-4055-b053-501700bae7b0`
- Project: `RP`
- Reference ticket: `RP-175518`
## Standard RP IaC Values
- Sprint field key: `customfield_10320`
- Sprint value shape: numeric sprint id in `fields` (example: `4936`)
- Sprint in this workflow: `4936` (`IAC Sprint 8`)
- Labels:
- `Project_Cloud_Platform_IaC`
## Update Pattern
1. Find all target issues by key or summary.
2. Ensure labels are set exactly to the 3 standard labels.
3. Set sprint with:
- `fields: { "customfield_10320": 4936 }`
4. Verify with JQL.
## Verification JQL
- Sprint check:
- `key in (...) AND sprint = 4936`
- Assignee check:
- `key in (...) AND assignee = "Yevhen Fesyk"`
- Status + labels check:
- `key in (...) AND status = "Prioritized" AND labels in ("Project_Cloud_Platform_IaC","Project_Cloud_Platform_IaC_v0.4","qa-foxtrot")`
## Notes
- For sprint assignment, prefer the numeric `fields.customfield_10320` payload.
- If sprint is not visible on board after update, re-check via JQL first; board views can lag.