diff --git a/.claude/skills/orchestrate/SKILL.md b/.claude/skills/orchestrate/SKILL.md index 32bf884a..2c78f135 100644 --- a/.claude/skills/orchestrate/SKILL.md +++ b/.claude/skills/orchestrate/SKILL.md @@ -60,15 +60,15 @@ What was provided? ### Route logic -1. **`/orchestrate `** -- If the path points to a git repository, derive the target name from the directory basename. Check `/tmp/kagenti/orchestrate//` for existing state. If no scan report exists, invoke `orchestrate:scan`. If scan exists but no plan, invoke `orchestrate:plan`. If both exist, determine the next incomplete phase and invoke it. +1. **`/orchestrate `** -- If the path points to a git repository, derive the target name from the directory basename. Check `/tmp/rossoctl/orchestrate//` for existing state. If no scan report exists, invoke `orchestrate:scan`. If scan exists but no plan, invoke `orchestrate:plan`. If both exist, determine the next incomplete phase and invoke it. 2. **`/orchestrate `** -- Validate that `scan-report.md` and `plan.md` exist for the current target. If missing, instruct the user to run `/orchestrate ` first. Otherwise invoke the requested phase skill directly (e.g., `orchestrate:precommit`). -3. **`/orchestrate status`** -- List all directories under `/tmp/kagenti/orchestrate/`, read each target's `phase-status.md`, and display a summary table showing target name, current phase, and completion percentage. +3. **`/orchestrate status`** -- List all directories under `/tmp/rossoctl/orchestrate/`, read each target's `phase-status.md`, and display a summary table showing target name, current phase, and completion percentage. ## Phase Status Tracking -All orchestration state is persisted under `/tmp/kagenti/orchestrate//`: +All orchestration state is persisted under `/tmp/rossoctl/orchestrate//`: | File | Purpose | |------|---------| diff --git a/.claude/skills/orchestrate:ci/SKILL.md b/.claude/skills/orchestrate:ci/SKILL.md index 7f29d69b..56515d0c 100644 --- a/.claude/skills/orchestrate:ci/SKILL.md +++ b/.claude/skills/orchestrate:ci/SKILL.md @@ -39,8 +39,8 @@ management, and supply chain hardening. ## Prerequisites -- Plan exists at `/tmp/kagenti/orchestrate//plan.md` -- Scan report at `/tmp/kagenti/orchestrate//scan-report.md` +- Plan exists at `/tmp/rossoctl/orchestrate//plan.md` +- Scan report at `/tmp/rossoctl/orchestrate//scan-report.md` - Target repo in `.repos//` ## Read Scan Report First @@ -391,7 +391,7 @@ gh pr create --repo org/repo --title "Add comprehensive CI workflows" --body "Ph ## Update Phase Status -Set ci to `complete` in `/tmp/kagenti/orchestrate//phase-status.md`. +Set ci to `complete` in `/tmp/rossoctl/orchestrate//phase-status.md`. ## Related Skills diff --git a/.claude/skills/orchestrate:plan/SKILL.md b/.claude/skills/orchestrate:plan/SKILL.md index 595f478a..89de4b3a 100644 --- a/.claude/skills/orchestrate:plan/SKILL.md +++ b/.claude/skills/orchestrate:plan/SKILL.md @@ -33,7 +33,7 @@ is Phase 1 — interactive brainstorming with the developer, no PRs. Scan report must exist: ```bash -cat /tmp/kagenti/orchestrate//scan-report.md +cat /tmp/rossoctl/orchestrate//scan-report.md ``` ## Planning Process @@ -78,7 +78,7 @@ Target 600-700 lines per PR. For each phase: ## Plan Output -Save to `/tmp/kagenti/orchestrate//plan.md`: +Save to `/tmp/rossoctl/orchestrate//plan.md`: ```markdown # Enhancement Plan: @@ -124,7 +124,7 @@ Save to `/tmp/kagenti/orchestrate//plan.md`: Initialize phase tracking: ```bash -cat > /tmp/kagenti/orchestrate//phase-status.md << 'EOF' +cat > /tmp/rossoctl/orchestrate//phase-status.md << 'EOF' # Phase Status: | Phase | Status | PR | Date | diff --git a/.claude/skills/orchestrate:precommit/SKILL.md b/.claude/skills/orchestrate:precommit/SKILL.md index 0e794bab..b294ba70 100644 --- a/.claude/skills/orchestrate:precommit/SKILL.md +++ b/.claude/skills/orchestrate:precommit/SKILL.md @@ -35,7 +35,7 @@ produces PR #1 — the foundation that validates all subsequent PRs. ## Prerequisites -- Plan exists at `/tmp/kagenti/orchestrate//plan.md` +- Plan exists at `/tmp/rossoctl/orchestrate//plan.md` - Target repo cloned in `.repos//` ## Step 1: Detect Language @@ -207,7 +207,7 @@ gh pr create --repo org/repo --title "Add pre-commit hooks and code quality base ## Update Phase Status -Update `/tmp/kagenti/orchestrate//phase-status.md`: +Update `/tmp/rossoctl/orchestrate//phase-status.md`: - Set precommit to `complete` - Record PR number and date diff --git a/.claude/skills/orchestrate:replicate/SKILL.md b/.claude/skills/orchestrate:replicate/SKILL.md index 26dc2879..d89b2290 100644 --- a/.claude/skills/orchestrate:replicate/SKILL.md +++ b/.claude/skills/orchestrate:replicate/SKILL.md @@ -54,7 +54,7 @@ making it fully self-sufficient. This is Phase 6. After copying, adapt the skills: -1. **Remove source-specific references** — strip kagenti-specific paths or +1. **Remove source-specific references** — strip rossoctl-specific paths or assumptions that don't apply 2. **Verify frontmatter** — every `name:` field must match its directory name 3. **Update Related Skills** — only reference skills that exist in the copied set diff --git a/.claude/skills/orchestrate:review/SKILL.md b/.claude/skills/orchestrate:review/SKILL.md index cf1528ee..717939e1 100644 --- a/.claude/skills/orchestrate:review/SKILL.md +++ b/.claude/skills/orchestrate:review/SKILL.md @@ -37,7 +37,7 @@ submits reviews after user approval. ## Prerequisites -- `scan-report.md` and `plan.md` exist in `/tmp/kagenti/orchestrate//` +- `scan-report.md` and `plan.md` exist in `/tmp/rossoctl/orchestrate//` - Phases 2-6 are complete (or at least the phases that were planned) - PRs are open on the target repo @@ -210,7 +210,7 @@ Update `phase-status.md` when complete: ```bash # Update phase-status.md -sed -i '' 's/| review .*/| review | complete | -- | YYYY-MM-DD |/' /tmp/kagenti/orchestrate//phase-status.md +sed -i '' 's/| review .*/| review | complete | -- | YYYY-MM-DD |/' /tmp/rossoctl/orchestrate//phase-status.md ``` ## Related Skills diff --git a/.claude/skills/orchestrate:scan/SKILL.md b/.claude/skills/orchestrate:scan/SKILL.md index 99ffd44f..e87046d5 100644 --- a/.claude/skills/orchestrate:scan/SKILL.md +++ b/.claude/skills/orchestrate:scan/SKILL.md @@ -309,10 +309,10 @@ git -C .repos/ remote -v ## Output Format -Save scan report to `/tmp/kagenti/orchestrate//scan-report.md`: +Save scan report to `/tmp/rossoctl/orchestrate//scan-report.md`: ```bash -mkdir -p /tmp/kagenti/orchestrate/ +mkdir -p /tmp/rossoctl/orchestrate/ ``` Report template: diff --git a/.claude/skills/skills:scan/SKILL.md b/.claude/skills/skills:scan/SKILL.md index 9b8a2bce..5afa9006 100644 --- a/.claude/skills/skills:scan/SKILL.md +++ b/.claude/skills/skills:scan/SKILL.md @@ -165,10 +165,10 @@ Rate each skill 1-5: ### Phase 6: Generate Report -Save to `/tmp/kagenti/skills-scan/`: +Save to `/tmp/rossoctl/skills-scan/`: ```bash -mkdir -p /tmp/kagenti/skills-scan +mkdir -p /tmp/rossoctl/skills-scan ``` Output a structured report: diff --git a/.claude/skills/skills:validate/SKILL.md b/.claude/skills/skills:validate/SKILL.md index 2519bc63..6037efd0 100644 --- a/.claude/skills/skills:validate/SKILL.md +++ b/.claude/skills/skills:validate/SKILL.md @@ -140,7 +140,7 @@ If a command is NOT covered, add the pattern to `.claude/settings.json` in the ` When validating multiple skills: ``` -TaskCreate: "kagenti | skills | | Verify | Validate " +TaskCreate: "rossoctl | skills | | Verify | Validate " ``` ## Related Skills diff --git a/.github/workflows/pr-verifier.yml b/.github/workflows/pr-verifier.yml index 49b09d74..bebe6c7e 100644 --- a/.github/workflows/pr-verifier.yml +++ b/.github/workflows/pr-verifier.yml @@ -1,7 +1,7 @@ # PR Verifier — caller workflow # # Invokes the org-level reusable PR title verifier defined in -# kagenti/.github to enforce PR title prefix conventions (Feat, +# rossoctl/.github to enforce PR title prefix conventions (Feat, # Fix, Docs, etc.) on every pull request. Pinned to a SHA for # supply-chain hygiene; bump intentionally when upstream changes. @@ -15,4 +15,4 @@ permissions: {} jobs: verify-pr-title: - uses: kagenti/.github/.github/workflows/pr-verifier-required.yml@4e535f2436d167295d39d488ce5c44b5a2d49792 + uses: rossoctl/.github/.github/workflows/pr-verifier-required.yml@4e535f2436d167295d39d488ce5c44b5a2d49792 diff --git a/.github/workflows/project.yml b/.github/workflows/project.yml index f6f4f4e5..ed72d249 100644 --- a/.github/workflows/project.yml +++ b/.github/workflows/project.yml @@ -1,4 +1,4 @@ -name: Kagenti Project Automation +name: Rossoctl Project Automation on: issues: @@ -11,7 +11,7 @@ permissions: jobs: add: - name: Add item to Kagenti Project + name: Add item to Rossoctl Project permissions: issues: write @@ -19,6 +19,6 @@ jobs: contents: read # Pinned to @main intentionally: org-internal workflows propagate updates automatically. - uses: kagenti/.github/.github/workflows/add-to-project.yml@main + uses: rossoctl/.github/.github/workflows/add-to-project.yml@main secrets: inherit diff --git a/.github/workflows/self-assign.yml b/.github/workflows/self-assign.yml index a4130cf5..1b55966a 100644 --- a/.github/workflows/self-assign.yml +++ b/.github/workflows/self-assign.yml @@ -1,9 +1,9 @@ # Issue Self-Assign # # Thin caller for the org-wide reusable self-assign workflow. -# Configuration and defaults are managed centrally in kagenti/.github. +# Configuration and defaults are managed centrally in rossoctl/.github. # -# Reference: https://github.com/kagenti/.github/blob/main/.github/workflows/self-assign-reusable.yml +# Reference: https://github.com/rossoctl/.github/blob/main/.github/workflows/self-assign-reusable.yml # name: Issue self-assign @@ -17,6 +17,6 @@ permissions: jobs: self-assign: - uses: kagenti/.github/.github/workflows/self-assign-reusable.yml@main + uses: rossoctl/.github/.github/workflows/self-assign-reusable.yml@main secrets: ISSUE_ASSIGN_TOKEN: ${{ secrets.ISSUE_ASSIGN_TOKEN }} diff --git a/.github/workflows/stale.yaml b/.github/workflows/stale.yaml index b317f8cd..9d413890 100644 --- a/.github/workflows/stale.yaml +++ b/.github/workflows/stale.yaml @@ -1,9 +1,9 @@ # Stale Issue and PR Management # # Thin caller for the org-wide reusable stale workflow. -# Configuration and defaults are managed centrally in kagenti/.github. +# Configuration and defaults are managed centrally in rossoctl/.github. # -# Reference: https://github.com/kagenti/.github/blob/main/.github/workflows/stale.yaml +# Reference: https://github.com/rossoctl/.github/blob/main/.github/workflows/stale.yaml # name: Close Stale Issues and PRs @@ -18,4 +18,4 @@ permissions: jobs: stale: - uses: kagenti/.github/.github/workflows/stale.yaml@main + uses: rossoctl/.github/.github/workflows/stale.yaml@main diff --git a/CLAUDE.md b/CLAUDE.md index f03fac97..83fb930b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance for AI assistants working with this repository. ## Overview -Community examples of AI agents (A2A protocol) and MCP tools for the Kagenti platform. +Community examples of AI agents (A2A protocol) and MCP tools for the Rossoctl platform. Each agent/tool is a self-contained Python project with its own `pyproject.toml` and `Dockerfile`. ## Repository Structure diff --git a/CODEOWNERS b/CODEOWNERS index 52d438d3..0ea5197c 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,16 +1,16 @@ # Default owners for everything -* @kagenti/maintainers +* @rossoctl/maintainers # CI and platform tooling -.github/ @kagenti/platform -Makefile @kagenti/platform +.github/ @rossoctl/platform +Makefile @rossoctl/platform # A2A agents -a2a/ @kagenti/agents +a2a/ @rossoctl/agents # MCP tools -mcp/ @kagenti/agents +mcp/ @rossoctl/agents # Documentation -docs/ @kagenti/maintainers -*.md @kagenti/maintainers +docs/ @rossoctl/maintainers +*.md @rossoctl/maintainers diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 140182dc..847dead9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing to this project -Greetings! We are grateful for your interest in joining the Kagenti community and making a positive impact. Whether you're raising issues, enhancing documentation, fixing bugs, or developing new features, your contributions are essential to our success. +Greetings! We are grateful for your interest in joining the Rossoctl community and making a positive impact. Whether you're raising issues, enhancing documentation, fixing bugs, or developing new features, your contributions are essential to our success. To get started, kindly read through this document and familiarize yourself with our code of conduct. @@ -8,11 +8,11 @@ We can't wait to collaborate with you! ## Contributing Code -Please follow the [Contribution guide](https://github.com/kagenti/kagenti/blob/main/CONTRIBUTING.md#contributing-to-this-project) as found in the Kagenti Repository for instructions on how to contribute to our repositories. +Please follow the [Contribution guide](https://github.com/rossoctl/rossoctl/blob/main/CONTRIBUTING.md#contributing-to-this-project) as found in the Rossoctl Repository for instructions on how to contribute to our repositories. ### Developer's Guide -Please follow our [Developer's Guide](https://github.com/kagenti/kagenti/blob/main/docs/dev-guide.md#developers-guide), as found in the Kagenti Repository, where you can find comprehensive instructions for common development operations. +Please follow our [Developer's Guide](https://github.com/rossoctl/rossoctl/blob/main/docs/dev-guide.md#developers-guide), as found in the Rossoctl Repository, where you can find comprehensive instructions for common development operations. Please note that the section concerning pre-commit does not apply to this repository. diff --git a/Makefile b/Makefile index 15596cd4..6ae317be 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ test-docker: test-a2a test-mcp test-exgentic-agent test-exgentic-tool TEST_A2A_SKIP := a2a/exgentic_agent # Verify all of the A2A example Docker images can be built -# (Optional KAGENTI_DOCKER_FLAGS for docker build, e.g. --no-cache or --load) +# (Optional ROSSOCTL_DOCKER_FLAGS for docker build, e.g. --no-cache or --load) test-a2a: @for f in $(shell find a2a -mindepth 1 -maxdepth 1 -type d); do \ case " $(TEST_A2A_SKIP) " in \ @@ -24,7 +24,7 @@ test-a2a: esac; \ pushd $${f} || exit; \ echo "Building Docker image for $${f}..."; \ - docker build ${KAGENTI_DOCKER_FLAGS} --tag $${f##*/} . || exit; \ + docker build ${ROSSOCTL_DOCKER_FLAGS} --tag $${f##*/} . || exit; \ popd; \ done @@ -32,7 +32,7 @@ test-a2a: TEST_MCP_SKIP := mcp/exgentic_benchmarks mcp/wiki_memory_tool # Verify all of the MCP example Docker images can be built -# (Optional KAGENTI_DOCKER_FLAGS for docker build, e.g. --no-cache or --load) +# (Optional ROSSOCTL_DOCKER_FLAGS for docker build, e.g. --no-cache or --load) test-mcp: @for f in $(shell find mcp -mindepth 1 -maxdepth 1 -type d); do \ case " $(TEST_MCP_SKIP) " in \ @@ -40,7 +40,7 @@ test-mcp: esac; \ pushd $${f} || exit; \ echo "Building Docker image for $${f}..."; \ - docker build ${KAGENTI_DOCKER_FLAGS} --tag $${f##*/} . || exit; \ + docker build ${ROSSOCTL_DOCKER_FLAGS} --tag $${f##*/} . || exit; \ popd; \ done diff --git a/a2a/a2a_contact_extractor/server.py b/a2a/a2a_contact_extractor/server.py index 79c3a551..b483466e 100644 --- a/a2a/a2a_contact_extractor/server.py +++ b/a2a/a2a_contact_extractor/server.py @@ -74,7 +74,7 @@ def main(host, port, result_type, instructions): routes = [] # create_agent_card_routes serves /.well-known/agent-card.json natively routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/a2a_currency_converter/README.md b/a2a/a2a_currency_converter/README.md index bb4fc5df..fbb68128 100644 --- a/a2a/a2a_currency_converter/README.md +++ b/a2a/a2a_currency_converter/README.md @@ -84,7 +84,7 @@ sequenceDiagram uv run app/test_client.py ``` -## Running the agent on Kubernetes with [Kagenti](https://kagenti.github.io/.github/) +## Running the agent on Kubernetes with [Rossoctl](https://rossoctl.github.io/.github/) Deploy the sample manifest: diff --git a/a2a/a2a_currency_converter/app/__main__.py b/a2a/a2a_currency_converter/app/__main__.py index 8f15c72f..d349ef20 100644 --- a/a2a/a2a_currency_converter/app/__main__.py +++ b/a2a/a2a_currency_converter/app/__main__.py @@ -74,7 +74,7 @@ def main(host, port): routes = [] routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/a2a_currency_converter/app/agent_executor.py b/a2a/a2a_currency_converter/app/agent_executor.py index a13ad72e..7d1e13a0 100644 --- a/a2a/a2a_currency_converter/app/agent_executor.py +++ b/a2a/a2a_currency_converter/app/agent_executor.py @@ -108,8 +108,8 @@ async def execute( except AuthenticationError as e: msg = f"""CurrencyAgentExecutor reports an authentication error. -When importing this agent into Kagenti, expand Environment Variables and Add Variable, -or import https://github.com/kagenti/agent-examples/blob/main/a2a/a2a_currency_converter/.env.openai +When importing this agent into Rossoctl, expand Environment Variables and Add Variable, +or import https://github.com/rossoctl/examples/blob/main/a2a/a2a_currency_converter/.env.openai Use `kubectl -n logs deployment/` for details. diff --git a/a2a/a2a_currency_converter/deployment/k8s.yaml b/a2a/a2a_currency_converter/deployment/k8s.yaml index 5eb0557b..2d061e10 100644 --- a/a2a/a2a_currency_converter/deployment/k8s.yaml +++ b/a2a/a2a_currency_converter/deployment/k8s.yaml @@ -11,9 +11,9 @@ kind: Service metadata: labels: app.kubernetes.io/name: a2a-currency-converter - # kagenti.io/type=agent is required for the Agent to be discovered by Kagenti and show up in the UI - kagenti.io/type: agent - protocol.kagenti.io/a2a: "" + # rossoctl.io/type=agent is required for the Agent to be discovered by Rossoctl and show up in the UI + rossoctl.io/type: agent + protocol.rossoctl.io/a2a: "" name: a2a-currency-converter namespace: team1 spec: @@ -24,7 +24,7 @@ spec: targetPort: 8000 selector: app.kubernetes.io/name: a2a-currency-converter - kagenti.io/type: agent + rossoctl.io/type: agent type: ClusterIP --- # Deploy a test build of the Agent @@ -34,10 +34,10 @@ metadata: labels: app.kubernetes.io/component: agent app.kubernetes.io/name: a2a-currency-converter - kagenti.io/framework: LangGraph - kagenti.io/type: agent - kagenti.io/workload-type: deployment - protocol.kagenti.io/a2a: "" + rossoctl.io/framework: LangGraph + rossoctl.io/type: agent + rossoctl.io/workload-type: deployment + protocol.rossoctl.io/a2a: "" name: a2a-currency-converter namespace: team1 spec: @@ -47,14 +47,14 @@ spec: selector: matchLabels: app.kubernetes.io/name: a2a-currency-converter - kagenti.io/type: agent + rossoctl.io/type: agent template: metadata: labels: app.kubernetes.io/name: a2a-currency-converter - kagenti.io/framework: LangGraph - kagenti.io/type: agent - protocol.kagenti.io/a2a: "" + rossoctl.io/framework: LangGraph + rossoctl.io/type: agent + protocol.rossoctl.io/a2a: "" spec: containers: - env: @@ -68,7 +68,7 @@ spec: - name: AGENT_ENDPOINT value: http://a2a-currency-converter.team1.svc.cluster.local:8080/ - name: OTEL_EXPORTER_OTLP_ENDPOINT - value: http://otel-collector.kagenti-system.svc.cluster.local:8335 + value: http://otel-collector.rossoctl-system.svc.cluster.local:8335 - name: KEYCLOAK_URL value: http://keycloak.keycloak.svc.cluster.local:8080 - name: UV_CACHE_DIR @@ -102,9 +102,9 @@ spec: - name: GITHUB_SECRET_NAME value: github-token-secret # Pin to a specific version - image: ghcr.io/kagenti/agent-examples/a2a_currency_converter:v0.1.0-alpha.1 + image: ghcr.io/rossoctl/examples/a2a_currency_converter:v0.1.0-alpha.1 # Or use the latest version - # image: ghcr.io/kagenti/agent-examples/a2a_currency_converter:latest + # image: ghcr.io/rossoctl/examples/a2a_currency_converter:latest imagePullPolicy: Always name: agent ports: diff --git a/a2a/cheerup_agent/src/cheerup_agent/agent.py b/a2a/cheerup_agent/src/cheerup_agent/agent.py index 2f742f93..ff147c04 100644 --- a/a2a/cheerup_agent/src/cheerup_agent/agent.py +++ b/a2a/cheerup_agent/src/cheerup_agent/agent.py @@ -142,7 +142,7 @@ def run(): routes = [Route("/health", health, methods=["GET"])] # create_agent_card_routes serves /.well-known/agent-card.json natively routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/claude_agent/README.md b/a2a/claude_agent/README.md index 2dc75b8d..50f49d68 100644 --- a/a2a/claude_agent/README.md +++ b/a2a/claude_agent/README.md @@ -45,20 +45,20 @@ uv run server uv run pytest -v ``` -## Deploy on Kagenti +## Deploy on Rossoctl The image is published to GHCR by the repo's `Build-Publish` workflow (on `v*` -tags), so you just point Kagenti at it — no local build needed: +tags), so you just point Rossoctl at it — no local build needed: ``` -ghcr.io/kagenti/agent-examples/claude_agent:latest +ghcr.io/rossoctl/examples/claude_agent:latest ``` UI → **Agents → Import New Agent** → **Deploy from Existing Image**: | Field | Value | |---|---| -| Container Image | `ghcr.io/kagenti/agent-examples/claude_agent` | +| Container Image | `ghcr.io/rossoctl/examples/claude_agent` | | Image Tag | `latest` (or a released `vX.Y.Z`) | | Namespace | `team1` | | Agent Name | `claude-agent` | @@ -90,4 +90,4 @@ Durable continuity across restarts would require a persistent volume or an external session store — out of scope for this example. Pre-built manifests are also available at -`kagenti/examples/agents/claude_agent_*.yaml` in the `kagenti/kagenti` repo. +`rossoctl/examples/agents/claude_agent_*.yaml` in the `rossoctl/rossoctl` repo. diff --git a/a2a/claude_agent/src/claude_agent/agent.py b/a2a/claude_agent/src/claude_agent/agent.py index 372d5870..5896a5ba 100644 --- a/a2a/claude_agent/src/claude_agent/agent.py +++ b/a2a/claude_agent/src/claude_agent/agent.py @@ -130,7 +130,7 @@ def run() -> None: # assemble into a Starlette app ourselves. Serve the current well-known path # (/.well-known/agent-card.json) plus the legacy /.well-known/agent.json for # back-compat. - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes = create_jsonrpc_routes(request_handler, rpc_url="/", enable_v0_3_compat=True) routes += create_agent_card_routes(agent_card) routes += create_agent_card_routes(agent_card, card_url="/.well-known/agent.json") diff --git a/a2a/exgentic_agent/README.md b/a2a/exgentic_agent/README.md index dc7cabae..b08ae876 100644 --- a/a2a/exgentic_agent/README.md +++ b/a2a/exgentic_agent/README.md @@ -1,6 +1,6 @@ # Exgentic A2A Agent Wrapper -A Docker-based wrapper that runs [Exgentic](https://github.com/Exgentic/exgentic) agents using the A2A (Agent-to-Agent) protocol. This wrapper clones the Exgentic repository, installs a specific agent at build time, and exposes it via the A2A interface. These agents are used for evaluation against the [Exgentic benchmarks mcp servers](mcp/README.md). The test harness used to evaluate the agents against the benchmarks is found in the [workload-harness repo](https://github.com/kagenti/workload-harness/blob/main/README.md). +A Docker-based wrapper that runs [Exgentic](https://github.com/Exgentic/exgentic) agents using the A2A (Agent-to-Agent) protocol. This wrapper clones the Exgentic repository, installs a specific agent at build time, and exposes it via the A2A interface. These agents are used for evaluation against the [Exgentic benchmarks mcp servers](mcp/README.md). The test harness used to evaluate the agents against the benchmarks is found in the [workload-harness repo](https://github.com/rossoctl/workload-harness/blob/main/README.md). ## Overview diff --git a/a2a/file_organizer/src/file_organizer/agent.py b/a2a/file_organizer/src/file_organizer/agent.py index cd54f11f..1cea876e 100644 --- a/a2a/file_organizer/src/file_organizer/agent.py +++ b/a2a/file_organizer/src/file_organizer/agent.py @@ -200,7 +200,7 @@ def run(): routes = [] routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/generic_agent/README.md b/a2a/generic_agent/README.md index 1a40d9c5..693e4928 100644 --- a/a2a/generic_agent/README.md +++ b/a2a/generic_agent/README.md @@ -54,9 +54,9 @@ Once deployed, the agent can handle requests like: The agent automatically selects the appropriate tool from connected MCP servers and returns formatted results. -## Running in Kagenti +## Running in Rossoctl -When deploying in the Kagenti UI: +When deploying in the Rossoctl UI: 1. Import your intended tools using the `Import New Tools` section. 2. In the `Import New Agent` section, follow the given prompts and configure these environmental variables: diff --git a/a2a/generic_agent/src/generic_agent/agent.py b/a2a/generic_agent/src/generic_agent/agent.py index 56ba6348..ec82bd03 100644 --- a/a2a/generic_agent/src/generic_agent/agent.py +++ b/a2a/generic_agent/src/generic_agent/agent.py @@ -217,7 +217,7 @@ def run(): # a2a-sdk 1.x replaced A2AStarletteApplication with route factories that we # assemble into a Starlette app ourselves. - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes = create_jsonrpc_routes(request_handler, rpc_url="/", enable_v0_3_compat=True) # Serve the current well-known path (/.well-known/agent-card.json) plus the # legacy /.well-known/agent.json path for backward compatibility. diff --git a/a2a/git_issue_agent/.env.ollama b/a2a/git_issue_agent/.env.ollama index 53d9692f..aba841ba 100644 --- a/a2a/git_issue_agent/.env.ollama +++ b/a2a/git_issue_agent/.env.ollama @@ -20,5 +20,5 @@ PORT=8000 LOG_LEVEL=DEBUG # MCP Tool endpoint -# Port 9090 is the default Kagenti service port for tools +# Port 9090 is the default Rossoctl service port for tools MCP_URL=http://github-tool-mcp:9090/mcp diff --git a/a2a/git_issue_agent/README.md b/a2a/git_issue_agent/README.md index 6bf94243..81e55f1c 100644 --- a/a2a/git_issue_agent/README.md +++ b/a2a/git_issue_agent/README.md @@ -2,7 +2,7 @@ ## Introduction -The Github Issue Agent is designed to perform tasks dealing with Github issues, leveraging large language models (LLMs) to generate plans, execute steps, and summarize findings. This agent integrates with [the upstream Github MCP Server](https://github.com/github/github-mcp-server) as a tool via MCP and utilizes AI models for data extraction, summarization, and more. This agent also integrates with [this MCP Man-in-the-Middle](https://github.com/kagenti/agent-examples/tree/main/mcp/github_tool) that will verify OAuth tokens and can be configured with Github PATs to communicate with the upstream Github MPC Server. +The Github Issue Agent is designed to perform tasks dealing with Github issues, leveraging large language models (LLMs) to generate plans, execute steps, and summarize findings. This agent integrates with [the upstream Github MCP Server](https://github.com/github/github-mcp-server) as a tool via MCP and utilizes AI models for data extraction, summarization, and more. This agent also integrates with [this MCP Man-in-the-Middle](https://github.com/rossoctl/examples/tree/main/mcp/github_tool) that will verify OAuth tokens and can be configured with Github PATs to communicate with the upstream Github MPC Server. ## Architecture diff --git a/a2a/git_issue_agent/a2a_agent.py b/a2a/git_issue_agent/a2a_agent.py index 6c394d31..c0d0d760 100644 --- a/a2a/git_issue_agent/a2a_agent.py +++ b/a2a/git_issue_agent/a2a_agent.py @@ -272,7 +272,7 @@ def run(): # a2a-sdk 1.x replaced A2AStarletteApplication with route factories that we # assemble into a Starlette app ourselves. - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes = create_jsonrpc_routes(request_handler, rpc_url="/", enable_v0_3_compat=True) # Serve the current well-known path (/.well-known/agent-card.json) plus the # legacy /.well-known/agent.json path for backward compatibility. diff --git a/a2a/git_issue_agent/git_issue_agent/agents.py b/a2a/git_issue_agent/git_issue_agent/agents.py index c9506c30..40e14141 100644 --- a/a2a/git_issue_agent/git_issue_agent/agents.py +++ b/a2a/git_issue_agent/git_issue_agent/agents.py @@ -27,7 +27,7 @@ def __init__(self, config: Settings, issue_tools, step_callback=None): agent=self.prereq_identifier, expected_output=( 'A JSON object with keys "owner", "repo", and "issue_numbers". ' - 'Example: {"owner": "kagenti", "repo": "kagenti", "issue_numbers": null}' + 'Example: {"owner": "rossoctl", "repo": "rossoctl", "issue_numbers": null}' ), ) diff --git a/a2a/git_issue_agent/git_issue_agent/prompts.py b/a2a/git_issue_agent/git_issue_agent/prompts.py index 5994b914..d236e7a0 100644 --- a/a2a/git_issue_agent/git_issue_agent/prompts.py +++ b/a2a/git_issue_agent/git_issue_agent/prompts.py @@ -38,7 +38,7 @@ CORRECT EXAMPLE Thought: The user provided owner and repo; list_issues fits. Action: list_issues -Action Input: {"owner":"kagenti","repo":"kagenti"} +Action Input: {"owner":"rossoctl","repo":"rossoctl"} Observation: ──────────────────────────────────────────────────────── @@ -79,7 +79,7 @@ - When owner/repo/issue identifiers are provided (either directly or via context variables), reuse them verbatim; never replace them with partial segments or assumed values. Examples: -- “Open issues in `kagenti/agent-examples`” → list issues +- “Open issues in `rossoctl/examples`” → list issues - “Find issues mentioning ‘timeout’ across all repos” → search issues - “Issue types for the `ibm` organization” → list issue types - “Sub-issues under #134 in `openai/triton`” → list sub-issues @@ -101,7 +101,7 @@ Examples: - "summarize open issues across the foo organization" → Owner: foo, Repo: None, Issues: None -- "kagenti/agent-examples" → Owner: kagenti, Repo: agent-examples, Issues: None +- "rossoctl/examples" → Owner: rossoctl, Repo: agent-examples, Issues: None - "foo in the bar organization" → Owner: bar, Repo: foo, Issues: None - "Search across all of github/github-mcp-server for open issues with bug" → Owner: github, Repo: github-mcp-server, Issues: None - "How long has issue 2 in modelcontextprotocol/servers been open?" → Owner: modelcontextprotocol, Repo: servers, Issues: [2] diff --git a/a2a/image_service/src/image_service/agent.py b/a2a/image_service/src/image_service/agent.py index 63a3a2d7..1cfd9662 100644 --- a/a2a/image_service/src/image_service/agent.py +++ b/a2a/image_service/src/image_service/agent.py @@ -230,7 +230,7 @@ def run(): routes = [] routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/recipe_agent/src/recipe_agent/agent.py b/a2a/recipe_agent/src/recipe_agent/agent.py index 71bccb0a..0a26af46 100644 --- a/a2a/recipe_agent/src/recipe_agent/agent.py +++ b/a2a/recipe_agent/src/recipe_agent/agent.py @@ -140,7 +140,7 @@ def run(): routes = [Route("/health", health, methods=["GET"])] # create_agent_card_routes serves /.well-known/agent-card.json natively routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/reservation_service/README.md b/a2a/reservation_service/README.md index ca2fb602..a62b3414 100644 --- a/a2a/reservation_service/README.md +++ b/a2a/reservation_service/README.md @@ -79,15 +79,15 @@ List all my reservations using email jane@example.com Cancel reservation res_12345 because plans changed ``` -## Deployment in Kagenti +## Deployment in Rossoctl -### Via Kagenti UI +### Via Rossoctl UI -1. Navigate to **Import New Agent** in the Kagenti UI +1. Navigate to **Import New Agent** in the Rossoctl UI 2. Fill in the deployment details: - **Namespace**: `team1` (or your namespace) - **Environment Variable Sets**: Select `ollama` and `mcp-reservations` - - **Agent Source Repository URL**: `https://github.com/kagenti/agent-examples` + - **Agent Source Repository URL**: `https://github.com/rossoctl/examples` - **Git Branch or Tag**: `main` - **Protocol**: `a2a` - **Source Subfolder**: `a2a/reservation_service` diff --git a/a2a/reservation_service/pyproject.toml b/a2a/reservation_service/pyproject.toml index 4103971f..b61e03c9 100644 --- a/a2a/reservation_service/pyproject.toml +++ b/a2a/reservation_service/pyproject.toml @@ -3,7 +3,7 @@ name = "reservation-service" version = "0.1.0" description = "Restaurant reservation agent using LangGraph and MCP tools" authors = [ - { name = "Kagenti Contributors" } + { name = "Rossoctl Contributors" } ] readme = "README.md" license = { text = "Apache-2.0" } diff --git a/a2a/reservation_service/src/reservation_service/agent.py b/a2a/reservation_service/src/reservation_service/agent.py index befb70ba..69642a45 100644 --- a/a2a/reservation_service/src/reservation_service/agent.py +++ b/a2a/reservation_service/src/reservation_service/agent.py @@ -208,7 +208,7 @@ def run(): routes = [] routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/simple_generalist/.env.ollama b/a2a/simple_generalist/.env.ollama index 6c6bb6e1..05e84c16 100644 --- a/a2a/simple_generalist/.env.ollama +++ b/a2a/simple_generalist/.env.ollama @@ -20,7 +20,7 @@ MAX_ITERATIONS=20 # Public URL advertised in Agent Card (optional) # A2A_PUBLIC_URL=http://localhost:8000/ -# # For Kagenti kind install, external to cluster +# # For Rossoctl kind install, external to cluster A2A_PUBLIC_URL=http://simple-generalist.team1.localtest.me:8080 # For Kubernetes or OpenShift, internal to cluster # A2A_PUBLIC_URL=http://simple-generalist.team1.localtest.me:8080/ diff --git a/a2a/simple_generalist/.env.openai b/a2a/simple_generalist/.env.openai index cf423e57..80964e08 100644 --- a/a2a/simple_generalist/.env.openai +++ b/a2a/simple_generalist/.env.openai @@ -21,7 +21,7 @@ MAX_ITERATIONS=20 # Public URL advertised in Agent Card (optional) # A2A_PUBLIC_URL=http://localhost:8000/ -# # For Kagenti kind install, external to cluster +# # For Rossoctl kind install, external to cluster A2A_PUBLIC_URL=http://simple-generalist.team1.localtest.me:8080 # For Kubernetes or OpenShift, internal to cluster # A2A_PUBLIC_URL=http://simple-generalist.team1.localtest.me:8080/ diff --git a/a2a/simple_generalist/README.md b/a2a/simple_generalist/README.md index 68b0bdc3..5d437684 100644 --- a/a2a/simple_generalist/README.md +++ b/a2a/simple_generalist/README.md @@ -58,7 +58,7 @@ Local: uv run server ``` -Kagenti: +Rossoctl: 1. Import `.env.template` in the UI as environment variables. 2. Customize the values as needed for your deployment. diff --git a/a2a/simple_generalist/src/simple_generalist/a2a_server/server.py b/a2a/simple_generalist/src/simple_generalist/a2a_server/server.py index 46751a76..242ec260 100644 --- a/a2a/simple_generalist/src/simple_generalist/a2a_server/server.py +++ b/a2a/simple_generalist/src/simple_generalist/a2a_server/server.py @@ -236,7 +236,7 @@ def create_app(settings: Settings) -> Any: # a2a-sdk 1.x replaced A2AStarletteApplication with route factories that we # assemble into a Starlette app ourselves. - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes = create_jsonrpc_routes(request_handler, rpc_url="/", enable_v0_3_compat=True) # Serve the current well-known path (/.well-known/agent-card.json) plus the # legacy /.well-known/agent.json path for backward compatibility. diff --git a/a2a/simple_generalist/src/simple_generalist/agent/generalist_agent.py b/a2a/simple_generalist/src/simple_generalist/agent/generalist_agent.py index 801cd4ad..cc29c03b 100644 --- a/a2a/simple_generalist/src/simple_generalist/agent/generalist_agent.py +++ b/a2a/simple_generalist/src/simple_generalist/agent/generalist_agent.py @@ -31,7 +31,7 @@ class AgentIdSpanProcessor(SpanProcessor): AG2's instrumentation sets gen_ai.agent.name but not gen_ai.agent.id. This processor maps agent names to stable IDs so downstream consumers - (e.g. kagenti-compatible backends) see the field they expect. + (e.g. rossoctl-compatible backends) see the field they expect. """ def __init__(self, agent_ids: dict[str, str]) -> None: diff --git a/a2a/slack_researcher/README.md b/a2a/slack_researcher/README.md index 4e6a3356..28a80409 100644 --- a/a2a/slack_researcher/README.md +++ b/a2a/slack_researcher/README.md @@ -34,8 +34,8 @@ The Slack Researcher Agent is designed to perform research tasks across Slack ch > If all of `TOKEN_URL`, `CLIENT_ID`, and `CLIENT_SECRET` are set in addition, token exchange will be performed using Bearer tokens from incoming requests, to send to the MCP endpoint. > In addition to `TOKEN_URL`, `CLIENT_ID`, `CLIENT_SECRET`, which trigger token exchange, `TARGET_SCOPES` can be optionally configured to be the `scope` in the token exchange request. -## Running in Kagenti -When deploying in the Kagenti UI - You will need to attach 3 environments to the agent deployment: +## Running in Rossoctl +When deploying in the Rossoctl UI - You will need to attach 3 environments to the agent deployment: ![alt text](docs/environments.png) diff --git a/a2a/slack_researcher/a2a_agent.py b/a2a/slack_researcher/a2a_agent.py index 51731cc1..242ce2f0 100644 --- a/a2a/slack_researcher/a2a_agent.py +++ b/a2a/slack_researcher/a2a_agent.py @@ -242,7 +242,7 @@ def run(): routes = [] routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/trivia_agent/src/trivia_agent/agent.py b/a2a/trivia_agent/src/trivia_agent/agent.py index 7651de8b..918ec434 100644 --- a/a2a/trivia_agent/src/trivia_agent/agent.py +++ b/a2a/trivia_agent/src/trivia_agent/agent.py @@ -141,7 +141,7 @@ def run(): routes = [Route("/health", health, methods=["GET"])] # create_agent_card_routes serves /.well-known/agent-card.json natively routes.extend(create_agent_card_routes(agent_card)) - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes.extend(create_jsonrpc_routes(request_handler, "/", enable_v0_3_compat=True)) app = Starlette(routes=routes) diff --git a/a2a/weather_service/README.md b/a2a/weather_service/README.md index 35b67090..9edd3dcc 100644 --- a/a2a/weather_service/README.md +++ b/a2a/weather_service/README.md @@ -2,22 +2,22 @@ The Weather Service Agent is an example of an [A2A](https://a2a-protocol.org/latest/) agent. -This agent depends on the Kagenti [Weather Tool](https://github.com/kagenti/agent-examples/tree/main/mcp/weather_tool). The weather tool should be running before chatting with the weather service agent. +This agent depends on the Rossoctl [Weather Tool](https://github.com/rossoctl/examples/tree/main/mcp/weather_tool). The weather tool should be running before chatting with the weather service agent. -## Run the agent on Kubernetes with Kagenti +## Run the agent on Kubernetes with Rossoctl -You may deploy using Kagenti's UI or through a Kubernetes manifest. +You may deploy using Rossoctl's UI or through a Kubernetes manifest. -### Deploy using Kagenti's UI +### Deploy using Rossoctl's UI -Kagenti's UI is aware of this example agent. To deploy through the UI +Rossoctl's UI is aware of this example agent. To deploy through the UI -- Browse to http://kagenti-ui.localtest.me:8080/agents/ +- Browse to http://rossoctl-ui.localtest.me:8080/agents/ - Build from source - Weather service agent - Expand Environment Variables - - Import from File/URL, URL, https://raw.githubusercontent.com/kagenti/agent-examples/refs/heads/main/a2a/weather_service/.env.openai - - If using [Ollama](https://ollama.com/), instead of the default use https://raw.githubusercontent.com/kagenti/agent-examples/refs/heads/main/a2a/weather_service/.env.ollama + - Import from File/URL, URL, https://raw.githubusercontent.com/rossoctl/examples/refs/heads/main/a2a/weather_service/.env.openai + - If using [Ollama](https://ollama.com/), instead of the default use https://raw.githubusercontent.com/rossoctl/examples/refs/heads/main/a2a/weather_service/.env.ollama - Fetch and parse - Import - Build and deploy agent diff --git a/a2a/weather_service/deployment/k8s.yaml b/a2a/weather_service/deployment/k8s.yaml index 89905506..5f398d73 100644 --- a/a2a/weather_service/deployment/k8s.yaml +++ b/a2a/weather_service/deployment/k8s.yaml @@ -11,9 +11,9 @@ kind: Service metadata: labels: app.kubernetes.io/name: weather-service - # kagenti.io/type=agent is required for the Agent to be discovered by Kagenti and show up in the UI - kagenti.io/type: agent - protocol.kagenti.io/a2a: "" + # rossoctl.io/type=agent is required for the Agent to be discovered by Rossoctl and show up in the UI + rossoctl.io/type: agent + protocol.rossoctl.io/a2a: "" name: weather-service namespace: team1 spec: @@ -24,7 +24,7 @@ spec: targetPort: 8000 selector: app.kubernetes.io/name: weather-service - kagenti.io/type: agent + rossoctl.io/type: agent type: ClusterIP --- # Deploy a test build of the Agent @@ -34,10 +34,10 @@ metadata: labels: app.kubernetes.io/component: agent app.kubernetes.io/name: weather-service - kagenti.io/framework: LangGraph - kagenti.io/type: agent - kagenti.io/workload-type: deployment - protocol.kagenti.io/a2a: "" + rossoctl.io/framework: LangGraph + rossoctl.io/type: agent + rossoctl.io/workload-type: deployment + protocol.rossoctl.io/a2a: "" name: weather-service namespace: team1 spec: @@ -47,14 +47,14 @@ spec: selector: matchLabels: app.kubernetes.io/name: weather-service - kagenti.io/type: agent + rossoctl.io/type: agent template: metadata: labels: app.kubernetes.io/name: weather-service - kagenti.io/framework: LangGraph - kagenti.io/type: agent - protocol.kagenti.io/a2a: "" + rossoctl.io/framework: LangGraph + rossoctl.io/type: agent + protocol.rossoctl.io/a2a: "" spec: containers: - env: @@ -68,7 +68,7 @@ spec: - name: AGENT_ENDPOINT value: http://weather-service.team1.svc.cluster.local:8080/ - name: OTEL_EXPORTER_OTLP_ENDPOINT - value: http://otel-collector.kagenti-system.svc.cluster.local:8335 + value: http://otel-collector.rossoctl-system.svc.cluster.local:8335 - name: KEYCLOAK_URL value: http://keycloak.keycloak.svc.cluster.local:8080 - name: UV_CACHE_DIR @@ -101,13 +101,13 @@ spec: # key: openai-api-key - name: LLM_MODEL value: llama3.2:3b-instruct-fp16 - # Kagenti will supply a GITHUB_SECRET_NAME, but the weather service does not need it. + # Rossoctl will supply a GITHUB_SECRET_NAME, but the weather service does not need it. # - name: GITHUB_SECRET_NAME # value: github-token-secret # Pin to a specific version - image: ghcr.io/kagenti/agent-examples/weather_service:v0.1.0-alpha.1 + image: ghcr.io/rossoctl/examples/weather_service:v0.1.0-alpha.1 # Or use the latest version - # image: ghcr.io/kagenti/agent-examples/weather_service:latest + # image: ghcr.io/rossoctl/examples/weather_service:latest imagePullPolicy: Always name: agent ports: @@ -129,7 +129,7 @@ spec: requests: cpu: 100m memory: 256Mi - # Note that Kagenti's UI doesn't create security contexts for agents, but it's a good practice to set them for defense in depth. This is a fairly restrictive security context that should work for most agents, but you may need to adjust it based on your Agent's needs. + # Note that Rossoctl's UI doesn't create security contexts for agents, but it's a good practice to set them for defense in depth. This is a fairly restrictive security context that should work for most agents, but you may need to adjust it based on your Agent's needs. securityContext: allowPrivilegeEscalation: false capabilities: diff --git a/a2a/weather_service/src/weather_service/agent.py b/a2a/weather_service/src/weather_service/agent.py index 0ae51099..267b9be4 100644 --- a/a2a/weather_service/src/weather_service/agent.py +++ b/a2a/weather_service/src/weather_service/agent.py @@ -249,7 +249,7 @@ def run(): # a2a-sdk 1.x replaced A2AStarletteApplication with route factories that we # assemble into a Starlette app ourselves. - # enable_v0_3_compat is needed because Kagenti uses A2A 0.3 client libraries + # enable_v0_3_compat is needed because Rossoctl uses A2A 0.3 client libraries routes = create_jsonrpc_routes(request_handler, rpc_url="/", enable_v0_3_compat=True) # Serve the current well-known path (/.well-known/agent-card.json) plus the # legacy /.well-known/agent.json path for backward compatibility. diff --git a/a2a/weather_service/src/weather_service/observability.py b/a2a/weather_service/src/weather_service/observability.py index 86ef884a..ee910879 100644 --- a/a2a/weather_service/src/weather_service/observability.py +++ b/a2a/weather_service/src/weather_service/observability.py @@ -132,7 +132,7 @@ def setup_observability() -> None: namespace = os.getenv("K8S_NAMESPACE_NAME", "team1") otlp_endpoint = os.getenv( "OTEL_EXPORTER_OTLP_ENDPOINT", - "http://otel-collector.kagenti-system.svc.cluster.local:8335", + "http://otel-collector.rossoctl-system.svc.cluster.local:8335", ) logger.info("=" * 60) diff --git a/mcp/exgentic_benchmarks/README.md b/mcp/exgentic_benchmarks/README.md index a75906ec..aa495d6d 100644 --- a/mcp/exgentic_benchmarks/README.md +++ b/mcp/exgentic_benchmarks/README.md @@ -2,7 +2,7 @@ A Docker-based MCP (Model Context Protocol) server that runs the [Exgentic](https://github.com/Exgentic/exgentic) benchmark system. This server clones the Exgentic repository, installs a specific benchmark at build time, and exposes it via the MCP protocol. -The test harness used to evaluate the benchmark against agents is found in the [workload-harness repo](https://github.com/kagenti/workload-harness/blob/main/README.md). +The test harness used to evaluate the benchmark against agents is found in the [workload-harness repo](https://github.com/rossoctl/workload-harness/blob/main/README.md). ## Overview diff --git a/mcp/github_tool/.env.authbridge b/mcp/github_tool/.env.authbridge index c4591b02..ad50b53b 100644 --- a/mcp/github_tool/.env.authbridge +++ b/mcp/github_tool/.env.authbridge @@ -13,6 +13,6 @@ UPSTREAM_HEADER_TO_USE_IF_IN_AUDIENCE='{"valueFrom": {"secretKeyRef": {"name": " UPSTREAM_HEADER_TO_USE_IF_NOT_IN_AUDIENCE='{"valueFrom": {"secretKeyRef": {"name": "github-tool-secrets", "key": "UPSTREAM_HEADER_TO_USE_IF_NOT_IN_AUDIENCE"}}}' # Keycloak validation settings for incoming tokens -ISSUER=http://keycloak.localtest.me:8080/realms/kagenti -JWKS_URL=http://keycloak-service.keycloak.svc.cluster.local:8080/realms/kagenti/protocol/openid-connect/certs +ISSUER=http://keycloak.localtest.me:8080/realms/rossoctl +JWKS_URL=http://keycloak-service.keycloak.svc.cluster.local:8080/realms/rossoctl/protocol/openid-connect/certs AUDIENCE=github-tool diff --git a/mcp/github_tool/README.md b/mcp/github_tool/README.md index bde8f800..aa006683 100644 --- a/mcp/github_tool/README.md +++ b/mcp/github_tool/README.md @@ -71,14 +71,14 @@ curl -v ${MCP} -X POST -H "mcp-session-id: ${SESSION_ID}" -H "Content-Type: appl ' | jq ``` -Now we want to invoke a tool, to prove it works. This facade expects an OIDC token. We'll need one. To get one from Keycloak in a Kagenti environment: +Now we want to invoke a tool, to prove it works. This facade expects an OIDC token. We'll need one. To get one from Keycloak in a Rossoctl environment: ```bash KEYCLOAK_USER=admin KEYCLOAK_PASSWORD=... # use yours -KAGENTI_SECRET=$(oc -n kagenti-system get secret kagenti-ui-oauth-secret -o jsonpath="{.data.CLIENT_SECRET}" | base64 -d) +ROSSOCTL_SECRET=$(oc -n rossoctl-system get secret rossoctl-ui-oauth-secret -o jsonpath="{.data.CLIENT_SECRET}" | base64 -d) MITM_TOKEN=$(curl -sX POST -H "Content-Type: application/x-www-form-urlencoded" \ - -d "client_secret=$KAGENTI_SECRET" -d "client_id=kagenti" \ + -d "client_secret=$ROSSOCTL_SECRET" -d "client_id=rossoctl" \ -d "grant_type=password" \ -d "username=${KEYCLOAK_USER}" -d "password=${KEYCLOAK_PASSWORD}" \ "http://keycloak.localtest.me:8080/realms/master/protocol/openid-connect/token" | jq --raw-output ".access_token") @@ -106,8 +106,8 @@ curl -v ${MCP} -H "Authorization: ${MITM_AUTH}" -H "mcp-session-id: ${SESSION_ID "params": { "name": "list_branches", "arguments": { - "owner": "kagenti", - "repo": "kagenti" + "owner": "rossoctl", + "repo": "rossoctl" } } } @@ -116,9 +116,9 @@ curl -v ${MCP} -H "Authorization: ${MITM_AUTH}" -H "mcp-session-id: ${SESSION_ID If this works, you should see the list of tools, as JSON. -# Deploying in Kagenti +# Deploying in Rossoctl -First, you'll need to give Kagenti credentials. For the GitHub OAuth API key demo, you'll need to supply API keys +First, you'll need to give Rossoctl credentials. For the GitHub OAuth API key demo, you'll need to supply API keys oc -n team1 get configmap environments -o yaml > /tmp/environments.yaml (edit /tmp/environments.yaml) creating the following, and replacing `${GITHUB_TOKEN}` with your GitHub personal access token (PAT): @@ -132,17 +132,17 @@ data: UPSTREAM_HEADER_TO_USE_IF_NOT_IN_AUDIENCE: Bearer rutabaga ``` -After adding the new env vars, apply to Kagenti using `kubectl apply -n team1 -f /tmp/environments.yaml`. +After adding the new env vars, apply to Rossoctl using `kubectl apply -n team1 -f /tmp/environments.yaml`. Now that the environment variables are available, start an instance of the tool -- Browse to http://kagenti-ui.localtest.me:8080/Import_New_Tool +- Browse to http://rossoctl-ui.localtest.me:8080/Import_New_Tool - Select namespace - Set the Target Port to 9090 - Specify Subfolder `mcp/github_tool` - Click "Build & Deploy New Tool" to deploy. -Once the tool is deployed, if you wish to test it from outside Kagenti you'll need to create an HTTPRoute for it. +Once the tool is deployed, if you wish to test it from outside Rossoctl you'll need to create an HTTPRoute for it. ```bash cat < /tmp/expose-github-tool.yaml diff --git a/mcp/github_tool/cli/main/main.go b/mcp/github_tool/cli/main/main.go index d7f53e35..c62bb18d 100644 --- a/mcp/github_tool/cli/main/main.go +++ b/mcp/github_tool/cli/main/main.go @@ -9,7 +9,7 @@ import ( "strconv" "time" - lib "github.com/kagenti/mcp-mitm/gtlib" + lib "github.com/rossoctl/mcp-mitm/gtlib" ) func main() { diff --git a/mcp/github_tool/go.mod b/mcp/github_tool/go.mod index 51a7cfc4..9d52ffbb 100644 --- a/mcp/github_tool/go.mod +++ b/mcp/github_tool/go.mod @@ -1,4 +1,4 @@ -module github.com/kagenti/mcp-mitm +module github.com/rossoctl/mcp-mitm go 1.24.9 diff --git a/mcp/github_tool/gtlib/upstream.go b/mcp/github_tool/gtlib/upstream.go index ab56fad8..964c42f2 100644 --- a/mcp/github_tool/gtlib/upstream.go +++ b/mcp/github_tool/gtlib/upstream.go @@ -314,7 +314,7 @@ func (m *mcpAuthImpl) createMCPClient(ctx context.Context, authorization string, ListChanged: true, }, } - clientName := "kagenti-mitm-mcp" + clientName := "rossoctl-mitm-mcp" initResp, err := httpClient.Initialize(ctx, mcp.InitializeRequest{ Params: mcp.InitializeParams{ @@ -380,9 +380,9 @@ func (m *mcpAuthImpl) getAuthorizationHeaderFromBearer(auth string) string { /* x := map[string]interface {}{ "acr":"1", - "allowed-origins":[]interface {}{"http://kagenti-ui.localtest.me:8080"}, + "allowed-origins":[]interface {}{"http://rossoctl-ui.localtest.me:8080"}, "aud":[]interface {}{"demo-realm", "master-realm", "account"}, - "azp":"kagenti", + "azp":"rossoctl", "email_verified":false, "exp":1.760644947e+09, "iat":1.760644887e+09, diff --git a/mcp/reservation_tool/PLAN.md b/mcp/reservation_tool/PLAN.md index 77dcddd7..f25b558f 100644 --- a/mcp/reservation_tool/PLAN.md +++ b/mcp/reservation_tool/PLAN.md @@ -4,7 +4,7 @@ This document outlines the implementation plan for the Restaurant Reservation MCP server, a new example for the agent-examples repository that demonstrates how to build a multi-tool MCP server with provider abstraction for future extensibility. -## Alignment with Kagenti/agent-examples Conventions +## Alignment with Rossoctl/agent-examples Conventions This implementation follows the established patterns in the agent-examples repository: @@ -22,7 +22,7 @@ This implementation follows the established patterns in the agent-examples repos - `tests/` - Unit and integration tests ### MCP Tool Annotations -All tools include Kagenti-specific MCP annotations: +All tools include Rossoctl-specific MCP annotations: - `readOnlyHint`: True for search/query operations, False for mutations - `destructiveHint`: True only for cancel_reservation, False otherwise - `idempotentHint`: True for safe retry operations @@ -188,7 +188,7 @@ The mock provider supports realistic workflows: - Environment variables table - Local run instructions (`uv run reservation_tool.py`) - Example curl commands for MCP initialization and tool calls -- Sample Generic Agent prompts for testing with Kagenti +- Sample Generic Agent prompts for testing with Rossoctl ### PLAN.md (this file) - Architecture decisions @@ -232,7 +232,7 @@ These would be follow-up issues/PRs: 4. **Observability** - Structured logging with trace IDs - Metrics for tool invocations - - Integration with Kagenti observability stack + - Integration with Rossoctl observability stack 5. **Testing** - Contract tests for future providers diff --git a/mcp/reservation_tool/README.md b/mcp/reservation_tool/README.md index 0aad908e..8bbf8987 100644 --- a/mcp/reservation_tool/README.md +++ b/mcp/reservation_tool/README.md @@ -175,7 +175,7 @@ curl -X POST "$MCP_URL" \ ## Testing with a Generic Agent -If you're using this MCP server with a Kagenti-deployed agent, you can test with prompts like: +If you're using this MCP server with a Rossoctl-deployed agent, you can test with prompts like: ``` Find me Italian restaurants in Boston with a price tier of 3 @@ -292,11 +292,11 @@ Availability is generated deterministically based on: This ensures consistent results for testing while simulating realistic availability patterns. -## Deployment in Kagenti +## Deployment in Rossoctl -### 1. Deploy via Kagenti UI +### 1. Deploy via Rossoctl UI -1. Navigate to **Import New Tool** in the Kagenti UI +1. Navigate to **Import New Tool** in the Rossoctl UI 2. Select your namespace (e.g., `team1`) 3. Set **Target Port** to `8000` 4. Set **Source Subfolder** to `mcp/reservation_tool` diff --git a/mcp/weather_tool/README.md b/mcp/weather_tool/README.md index 157b78f0..5d8ac489 100644 --- a/mcp/weather_tool/README.md +++ b/mcp/weather_tool/README.md @@ -11,11 +11,11 @@ cd mcp/weather_tool uv run --no-sync weather_tool.py ``` -## Deploy the MCP server to Kagenti +## Deploy the MCP server to Rossoctl -### Deploy using the Kagenti UI +### Deploy using the Rossoctl UI -- Browse to http://kagenti-ui.localtest.me:8080/tools +- Browse to http://rossoctl-ui.localtest.me:8080/tools - Import Tool - Deploy from Source - Select weather tool @@ -26,9 +26,9 @@ Alternately, you can deploy a pre-built image using Kubernetes - `kubectl apply -f mcp/weather_tool/deployment/k8s.yaml` -## Test the MCP server using Kagenti +## Test the MCP server using Rossoctl -- Visit http://kagenti-ui.localtest.me:8080/tools/team1/weather-tool +- Visit http://rossoctl-ui.localtest.me:8080/tools/team1/weather-tool - Click "Connect & list tools" - Expand "get_weather" - Click "invoke tool" diff --git a/mcp/weather_tool/deployment/k8s.yaml b/mcp/weather_tool/deployment/k8s.yaml index 82bdfea8..7849a6b9 100644 --- a/mcp/weather_tool/deployment/k8s.yaml +++ b/mcp/weather_tool/deployment/k8s.yaml @@ -11,9 +11,9 @@ kind: Service metadata: labels: app.kubernetes.io/name: weather-tool - # kagenti.io/type=tool is required for the MCP Server that provides tool to be discovered by Kagenti and show up in the UI - kagenti.io/type: tool - protocol.kagenti.io/mcp: "" + # rossoctl.io/type=tool is required for the MCP Server that provides tool to be discovered by Rossoctl and show up in the UI + rossoctl.io/type: tool + protocol.rossoctl.io/mcp: "" name: weather-tool-mcp namespace: team1 spec: @@ -24,7 +24,7 @@ spec: targetPort: 8000 selector: app.kubernetes.io/name: weather-tool - kagenti.io/type: tool + rossoctl.io/type: tool type: ClusterIP --- # Deploy a test build of the Tool @@ -33,12 +33,12 @@ kind: Deployment metadata: labels: app.kubernetes.io/name: weather-tool - kagenti.io/framework: Python - # Set inject to true for [AuthBridge](https://github.com/kagenti/kagenti-extensions/tree/main/AuthBridge) - kagenti.io/inject: disabled - kagenti.io/type: tool - kagenti.io/workload-type: deployment - protocol.kagenti.io/mcp: "" + rossoctl.io/framework: Python + # Set inject to true for [AuthBridge](https://github.com/rossoctl/rossocortex/tree/main/AuthBridge) + rossoctl.io/inject: disabled + rossoctl.io/type: tool + rossoctl.io/workload-type: deployment + protocol.rossoctl.io/mcp: "" name: weather-tool namespace: team1 spec: @@ -48,17 +48,17 @@ spec: selector: matchLabels: app.kubernetes.io/name: weather-tool - kagenti.io/type: tool + rossoctl.io/type: tool template: metadata: labels: app.kubernetes.io/name: weather-tool - kagenti.io/framework: Python - # Set inject to true for [AuthBridge](https://github.com/kagenti/kagenti-extensions/tree/main/AuthBridge) - kagenti.io/inject: disabled - kagenti.io/transport: streamable_http - kagenti.io/type: tool - protocol.kagenti.io/mcp: "" + rossoctl.io/framework: Python + # Set inject to true for [AuthBridge](https://github.com/rossoctl/rossocortex/tree/main/AuthBridge) + rossoctl.io/inject: disabled + rossoctl.io/transport: streamable_http + rossoctl.io/type: tool + protocol.rossoctl.io/mcp: "" spec: containers: - env: @@ -69,22 +69,22 @@ spec: - name: HOST value: 0.0.0.0 - name: OTEL_EXPORTER_OTLP_ENDPOINT - value: http://otel-collector.kagenti-system.svc.cluster.local:8335 + value: http://otel-collector.rossoctl-system.svc.cluster.local:8335 - name: KEYCLOAK_URL value: http://keycloak.keycloak.svc.cluster.local:8080 - name: UV_CACHE_DIR value: /app/.cache/uv # Pin to a specific version - image: ghcr.io/kagenti/agent-examples/weather_tool:v0.1.0-alpha.1 + image: ghcr.io/rossoctl/examples/weather_tool:v0.1.0-alpha.1 # Or use the latest version - # image: ghcr.io/kagenti/agent-examples/weather_tool:latest + # image: ghcr.io/rossoctl/examples/weather_tool:latest imagePullPolicy: Always name: mcp ports: - containerPort: 8000 name: http protocol: TCP - # Note that a readinessProbe is recommended. Kagenti doesn't generate one for UI + # Note that a readinessProbe is recommended. Rossoctl doesn't generate one for UI # deployments, and we follow that pattern in this example, but you may want to add one for your own tools. resources: limits: diff --git a/mcp/weather_tool/weather_tool.py b/mcp/weather_tool/weather_tool.py index 57d944f8..b3bbb0c9 100644 --- a/mcp/weather_tool/weather_tool.py +++ b/mcp/weather_tool/weather_tool.py @@ -63,7 +63,7 @@ def _build_resilient_session() -> requests.Session: def setup_tracing() -> None: """Initialize OpenTelemetry tracing with W3C trace context propagation.""" otlp_endpoint = os.getenv( - "OTEL_EXPORTER_OTLP_ENDPOINT", "http://otel-collector.kagenti-system.svc.cluster.local:8335" + "OTEL_EXPORTER_OTLP_ENDPOINT", "http://otel-collector.rossoctl-system.svc.cluster.local:8335" ) service_name = os.getenv("OTEL_SERVICE_NAME", "weather-mcp-tool") diff --git a/mcp/wiki_memory_tool/DEMO.md b/mcp/wiki_memory_tool/DEMO.md index 90d4ecd2..27daa6dc 100644 --- a/mcp/wiki_memory_tool/DEMO.md +++ b/mcp/wiki_memory_tool/DEMO.md @@ -151,4 +151,4 @@ GitHub Pages initialized (6 files): assets/css/style.css ``` -After ~60 seconds, browse: https://kaslom.github.io/kagenti-wiki-research/ +After ~60 seconds, browse: https://kaslom.github.io/rossoctl-wiki-research/ diff --git a/mcp/wiki_memory_tool/Dockerfile b/mcp/wiki_memory_tool/Dockerfile index 49bd7d17..95af1e01 100644 --- a/mcp/wiki_memory_tool/Dockerfile +++ b/mcp/wiki_memory_tool/Dockerfile @@ -18,7 +18,7 @@ ENV UV_CACHE_DIR=/tmp/uv-cache ENV UV_LINK_MODE=copy ENV WIKI_ROOT=/data/wiki ENV ACL_FILE=/config/acl.yaml -ENV SPIFFE_TRUST_DOMAIN=kagenti.example.com +ENV SPIFFE_TRUST_DOMAIN=rossoctl.example.com EXPOSE 8000 diff --git a/mcp/wiki_memory_tool/README.md b/mcp/wiki_memory_tool/README.md index 2171fc18..cf64f132 100644 --- a/mcp/wiki_memory_tool/README.md +++ b/mcp/wiki_memory_tool/README.md @@ -1,6 +1,6 @@ # Wiki Memory Tool -Multi-agent wiki memory service for the Kagenti Research Wiki use case. +Multi-agent wiki memory service for the Rossoctl Research Wiki use case. Provides persistent, git-backed knowledge storage with per-topic access control, GitHub OAuth login, and SPIFFE workload identity. ## Status @@ -15,10 +15,10 @@ git-backed storage, and identity-aware access control. - Deployable to any Kubernetes cluster (Kind, OpenShift, etc.) **What this is not (yet):** -- Not wired into the Kagenti operator (no AgentService CR) +- Not wired into the Rossoctl operator (no AgentService CR) - No real SPIRE SVID verification (header-based, not mTLS) - No Keycloak federation -- These are tracked as follow-up in [kagenti#1461](https://github.com/kagenti/kagenti/issues/1461) +- These are tracked as follow-up in [rossoctl#1461](https://github.com/rossoctl/rossoctl/issues/1461) ## Quick Start (Local) @@ -150,7 +150,7 @@ Without this, `GET /user/teams` returns an empty list even though the user belon Add this to your `~/.zshrc` (or `~/.bashrc`) so you can use `kwiki` from anywhere: ```bash -alias kwiki='uv run --directory ~/sandbox/kagenti-mvp/agent-examples/mcp/wiki_memory_tool python wiki_cli.py --base-url https://wiki-memory-service-team1.apps.ykt1.hcp.res.ibm.com' +alias kwiki='uv run --directory ~/sandbox/rossoctl-mvp/agent-examples/mcp/wiki_memory_tool python wiki_cli.py --base-url https://wiki-memory-service-team1.apps.ykt1.hcp.res.ibm.com' ``` Then reload: `source ~/.zshrc` @@ -683,7 +683,7 @@ curl -H "Authorization: Bearer " https://wiki-service/topics **Option B: SPIFFE Headers** (for agents) ```bash -curl -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent" \ +curl -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent" \ https://wiki-service/topics/ai/pages/doc.md ``` @@ -1041,7 +1041,7 @@ wiki_memory_tool/ |----------|---------|-------------| | `WIKI_ROOT` | `/data/wiki` | Local git repo path for wiki pages | | `ACL_FILE` | `/config/acl.yaml` | Path to per-topic ACL YAML | -| `SPIFFE_TRUST_DOMAIN` | `kagenti.example.com` | SPIFFE trust domain | +| `SPIFFE_TRUST_DOMAIN` | `rossoctl.example.com` | SPIFFE trust domain | | `WIKI_REMOTE_URL` | *(empty)* | Git remote URL (enables clone + push) | | `WIKI_PUSH_STRATEGY` | `immediate` | Push strategy: `immediate` | | `GITHUB_CLIENT_ID` | *(empty)* | GitHub OAuth App client ID | @@ -1076,7 +1076,7 @@ Use this workflow to diagnose authorization issues on the cluster: ```bash # 1. Set KUBECONFIG if needed -export KUBECONFIG=~/.kube/config-kagenti-eventing +export KUBECONFIG=~/.kube/config-rossoctl-eventing # 2. Check the pod is running the expected image oc get pods -n -o jsonpath='{.items[0].status.containerStatuses[0].imageID}' diff --git a/mcp/wiki_memory_tool/deploy.py b/mcp/wiki_memory_tool/deploy.py index 64941816..88a00453 100644 --- a/mcp/wiki_memory_tool/deploy.py +++ b/mcp/wiki_memory_tool/deploy.py @@ -147,7 +147,7 @@ def run_validation(): # Test topic listing headers = { - "X-Spiffe-Id": "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent", + "X-Spiffe-Id": "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent", "X-Original-Subject": "alice@example.com", } resp = client.get(f"{base}/topics", headers=headers) @@ -166,7 +166,7 @@ def run_validation(): # Test write (discovery agent) write_headers = { - "X-Spiffe-Id": "spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent", + "X-Spiffe-Id": "spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent", } test_page = "_deploy-validation-test.md" resp = client.post( diff --git a/mcp/wiki_memory_tool/k8s/acl-configmap.yaml b/mcp/wiki_memory_tool/k8s/acl-configmap.yaml index e446be5b..51dd8131 100644 --- a/mcp/wiki_memory_tool/k8s/acl-configmap.yaml +++ b/mcp/wiki_memory_tool/k8s/acl-configmap.yaml @@ -17,11 +17,11 @@ data: # AI/ML research topic — org members can read, ml-writers can write ai: writers: - - "spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent" + - "spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent" - "github:team:kaslomorg/ml-writers" - "github:team:kaslomorg/platform-admins" readers: - - "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" + - "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" - "github:org:kaslomorg" - "*" admins: @@ -31,11 +31,11 @@ data: # Security research — restricted to security team security: writers: - - "spiffe://kagenti.example.com/ns/topic-security/sa/discovery-agent" + - "spiffe://rossoctl.example.com/ns/topic-security/sa/discovery-agent" - "github:team:kaslomorg/security-team" - "github:team:kaslomorg/platform-admins" readers: - - "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" + - "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" - "github:team:kaslomorg/security-team" - "github:org:kaslomorg" admins: @@ -45,11 +45,11 @@ data: # ML research — ml-team can read and write ml: writers: - - "spiffe://kagenti.example.com/ns/topic-ml/sa/discovery-agent" + - "spiffe://rossoctl.example.com/ns/topic-ml/sa/discovery-agent" - "github:team:kaslomorg/ml-team" - "github:team:kaslomorg/ml-writers" readers: - - "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" + - "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" - "github:team:kaslomorg/ml-team" - "github:org:kaslomorg" admins: @@ -59,10 +59,10 @@ data: # Internal design — platform admins only internal-design: writers: - - "spiffe://kagenti.example.com/ns/topic-internal-design/sa/discovery-agent" + - "spiffe://rossoctl.example.com/ns/topic-internal-design/sa/discovery-agent" - "github:team:kaslomorg/platform-admins" readers: - - "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" + - "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" - "github:team:kaslomorg/platform-admins" - "github:user:aslom" admins: diff --git a/mcp/wiki_memory_tool/k8s/deployment.yaml b/mcp/wiki_memory_tool/k8s/deployment.yaml index 37da5da2..e91ae861 100644 --- a/mcp/wiki_memory_tool/k8s/deployment.yaml +++ b/mcp/wiki_memory_tool/k8s/deployment.yaml @@ -29,7 +29,7 @@ spec: - name: ACL_FILE value: /config/acl.yaml - name: SPIFFE_TRUST_DOMAIN - value: kagenti.example.com + value: rossoctl.example.com - name: WIKI_REMOTE_URL valueFrom: secretKeyRef: diff --git a/mcp/wiki_memory_tool/run_local.py b/mcp/wiki_memory_tool/run_local.py index 281eb772..09c3a156 100644 --- a/mcp/wiki_memory_tool/run_local.py +++ b/mcp/wiki_memory_tool/run_local.py @@ -16,7 +16,7 @@ os.environ["WIKI_ROOT"] = str(DATA_DIR) os.environ["ACL_FILE"] = str(SCRIPT_DIR / "test_acl.yaml") -os.environ["SPIFFE_TRUST_DOMAIN"] = "kagenti.example.com" +os.environ["SPIFFE_TRUST_DOMAIN"] = "rossoctl.example.com" os.environ.setdefault("JWT_SECRET_KEY", "local-dev-secret-do-not-use-in-production") os.environ["MCP_TRANSPORT"] = "streamable-http" os.environ["MCP_PORT"] = "8322" diff --git a/mcp/wiki_memory_tool/skills/wiki-discovery-api/SKILL.md b/mcp/wiki_memory_tool/skills/wiki-discovery-api/SKILL.md index 104429cf..e5dd94ed 100644 --- a/mcp/wiki_memory_tool/skills/wiki-discovery-api/SKILL.md +++ b/mcp/wiki_memory_tool/skills/wiki-discovery-api/SKILL.md @@ -17,7 +17,7 @@ Authorization: Bearer ### Option B: SPIFFE Headers (agent-to-agent) ``` -X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-{topic_id}/sa/discovery-agent +X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-{topic_id}/sa/discovery-agent ``` ## Procedure @@ -33,7 +33,7 @@ curl -s http://localhost:8321/templates/paper-summary ```bash curl -s -X POST http://localhost:8321/topics/{topic_id}/check-novelty \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-{topic_id}/sa/discovery-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-{topic_id}/sa/discovery-agent" \ -H "Content-Type: application/json" \ -d '{"title": "Page Title", "abstract": "Brief summary"}' ``` @@ -44,7 +44,7 @@ If `"novel": false`, do NOT write. ```bash curl -s -X POST http://localhost:8321/topics/{topic_id}/pages/{path} \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-{topic_id}/sa/discovery-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-{topic_id}/sa/discovery-agent" \ -H "Content-Type: application/json" \ -d '{"content": "---\ntags: [paper]\n---\n# Title\n\nContent...", "message": "commit message"}' ``` @@ -55,7 +55,7 @@ Response includes `suggested_links` to related pages. ```bash curl -s -X POST "http://localhost:8321/topics/{topic_id}/pages/{path}?draft=true" \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-{topic_id}/sa/discovery-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-{topic_id}/sa/discovery-agent" \ -H "Content-Type: application/json" \ -d '{"content": "# Draft\n\nPending review..."}' ``` @@ -86,13 +86,13 @@ curl -s http://localhost:8321/templates/paper-summary # Check novelty curl -s -X POST http://localhost:8321/topics/ai/check-novelty \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent" \ -H "Content-Type: application/json" \ -d '{"title": "LoRA", "abstract": "Low-rank adaptation for efficient fine-tuning"}' # Write if novel (with tags) curl -s -X POST http://localhost:8321/topics/ai/pages/lora.md \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent" \ -H "Content-Type: application/json" \ -d '{"content": "---\ntags: [paper, fine-tuning]\n---\n# LoRA\n\nLow-Rank Adaptation...", "message": "Add LoRA overview"}' ``` diff --git a/mcp/wiki_memory_tool/skills/wiki-discovery-cli/SKILL.md b/mcp/wiki_memory_tool/skills/wiki-discovery-cli/SKILL.md index dd11a582..e4a373d3 100644 --- a/mcp/wiki_memory_tool/skills/wiki-discovery-cli/SKILL.md +++ b/mcp/wiki_memory_tool/skills/wiki-discovery-cli/SKILL.md @@ -67,7 +67,7 @@ Without a cached token, the CLI uses simulated SPIFFE headers. |------|---------|-------------| | `--base-url` | `http://localhost:8321` | Service URL | | `--topic` | `ai` | Default topic (used for SPIFFE ID) | -| `--trust-domain` | `kagenti.example.com` | SPIFFE trust domain | +| `--trust-domain` | `rossoctl.example.com` | SPIFFE trust domain | ## Example Flow diff --git a/mcp/wiki_memory_tool/skills/wiki-query-api/SKILL.md b/mcp/wiki_memory_tool/skills/wiki-query-api/SKILL.md index 59c7bbc4..ea1df574 100644 --- a/mcp/wiki_memory_tool/skills/wiki-query-api/SKILL.md +++ b/mcp/wiki_memory_tool/skills/wiki-query-api/SKILL.md @@ -17,7 +17,7 @@ Authorization: Bearer ### Option B: SPIFFE Headers (agent OBO user) ``` -X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent +X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent X-Original-Subject: alice@example.com ``` @@ -27,7 +27,7 @@ X-Original-Subject: alice@example.com ```bash curl -s http://localhost:8321/topics \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" ``` @@ -35,7 +35,7 @@ curl -s http://localhost:8321/topics \ ```bash curl -s -X POST http://localhost:8321/topics/{topic_id}/query \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" \ -H "Content-Type: application/json" \ -d '{"query": "search terms", "limit": 10}' @@ -45,7 +45,7 @@ curl -s -X POST http://localhost:8321/topics/{topic_id}/query \ ```bash curl -s -X POST http://localhost:8321/search \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" \ -H "Content-Type: application/json" \ -d '{"query": "search terms", "limit": 10}' @@ -55,7 +55,7 @@ curl -s -X POST http://localhost:8321/search \ ```bash curl -s http://localhost:8321/topics/{topic_id}/pages/{path} \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" ``` @@ -64,12 +64,12 @@ curl -s http://localhost:8321/topics/{topic_id}/pages/{path} \ ```bash # Global curl -s http://localhost:8321/activity \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" # Topic-specific curl -s "http://localhost:8321/topics/{topic_id}/activity?limit=10" \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" ``` @@ -77,7 +77,7 @@ curl -s "http://localhost:8321/topics/{topic_id}/activity?limit=10" \ ```bash curl -s http://localhost:8321/topics/{topic_id}/backlinks/{path} \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" ``` @@ -86,12 +86,12 @@ curl -s http://localhost:8321/topics/{topic_id}/backlinks/{path} \ ```bash # List tags curl -s http://localhost:8321/topics/{topic_id}/tags \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" # Pages by tag curl -s http://localhost:8321/topics/{topic_id}/tags/{tag} \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" ``` @@ -99,7 +99,7 @@ curl -s http://localhost:8321/topics/{topic_id}/tags/{tag} \ ```bash curl -s http://localhost:8321/topics/{topic_id}/graph \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" \ + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" \ -H "X-Original-Subject: alice@example.com" ``` @@ -114,7 +114,7 @@ curl -s http://localhost:8321/templates/paper-summary ```bash curl -s http://localhost:8321/topics/{topic_id}/drafts \ - -H "X-Spiffe-Id: spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent" + -H "X-Spiffe-Id: spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent" ``` ## Notes diff --git a/mcp/wiki_memory_tool/skills/wiki-query-cli/SKILL.md b/mcp/wiki_memory_tool/skills/wiki-query-cli/SKILL.md index 0dd11dba..25802a8b 100644 --- a/mcp/wiki_memory_tool/skills/wiki-query-cli/SKILL.md +++ b/mcp/wiki_memory_tool/skills/wiki-query-cli/SKILL.md @@ -96,7 +96,7 @@ Without a cached token, the CLI uses simulated Query Agent SPIFFE headers with O |------|---------|-------------| | `--base-url` | `http://localhost:8321` | Service URL | | `--user` | `alice@example.com` | User identity for OBO | -| `--trust-domain` | `kagenti.example.com` | SPIFFE trust domain | +| `--trust-domain` | `rossoctl.example.com` | SPIFFE trust domain | ## Example Flow diff --git a/mcp/wiki_memory_tool/test_acl.yaml b/mcp/wiki_memory_tool/test_acl.yaml index 4b4dcf83..c4d2817f 100644 --- a/mcp/wiki_memory_tool/test_acl.yaml +++ b/mcp/wiki_memory_tool/test_acl.yaml @@ -1,11 +1,11 @@ topics: ai: writers: - - "spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent" + - "spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent" - "github:team:kaslomorg/ml-writers" - "github:team:kaslomorg/platform-admins" readers: - - "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" + - "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" - "github:org:kaslomorg" - "*" admins: @@ -14,11 +14,11 @@ topics: security: writers: - - "spiffe://kagenti.example.com/ns/topic-security/sa/discovery-agent" + - "spiffe://rossoctl.example.com/ns/topic-security/sa/discovery-agent" - "github:team:kaslomorg/security-team" - "github:team:kaslomorg/platform-admins" readers: - - "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" + - "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" - "github:team:kaslomorg/security-team" - "github:org:kaslomorg" admins: @@ -27,11 +27,11 @@ topics: ml: writers: - - "spiffe://kagenti.example.com/ns/topic-ml/sa/discovery-agent" + - "spiffe://rossoctl.example.com/ns/topic-ml/sa/discovery-agent" - "github:team:kaslomorg/ml-team" - "github:team:kaslomorg/ml-writers" readers: - - "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent" + - "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent" - "github:team:kaslomorg/ml-team" - "github:org:kaslomorg" admins: diff --git a/mcp/wiki_memory_tool/test_agents.py b/mcp/wiki_memory_tool/test_agents.py index 305a270e..e1728afe 100644 --- a/mcp/wiki_memory_tool/test_agents.py +++ b/mcp/wiki_memory_tool/test_agents.py @@ -26,11 +26,11 @@ BASE = os.environ.get("WIKI_SERVICE_URL", "http://localhost:8321") DISCOVERY_AGENT_HEADERS = { - "X-Spiffe-Id": "spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent", + "X-Spiffe-Id": "spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent", } QUERY_AGENT_HEADERS = { - "X-Spiffe-Id": "spiffe://kagenti.example.com/ns/wiki-system/sa/query-agent", + "X-Spiffe-Id": "spiffe://rossoctl.example.com/ns/wiki-system/sa/query-agent", "X-Original-Subject": "alice@example.com", } diff --git a/mcp/wiki_memory_tool/test_user_access.py b/mcp/wiki_memory_tool/test_user_access.py index 2ba690ca..45cf0c7c 100644 --- a/mcp/wiki_memory_tool/test_user_access.py +++ b/mcp/wiki_memory_tool/test_user_access.py @@ -1,5 +1,5 @@ """ -Test wiki access as logged-in user (bob-kagenti) against the live server. +Test wiki access as logged-in user (bob-rossoctl) against the live server. Tests both query and discovery operations using the user's OAuth token. diff --git a/mcp/wiki_memory_tool/test_user_skills.py b/mcp/wiki_memory_tool/test_user_skills.py index d5789ce2..e5178141 100644 --- a/mcp/wiki_memory_tool/test_user_skills.py +++ b/mcp/wiki_memory_tool/test_user_skills.py @@ -1,5 +1,5 @@ """ -Test all wiki skills as user bob-kagenti using FastAPI TestClient. +Test all wiki skills as user bob-rossoctl using FastAPI TestClient. Verifies query and discovery operations work correctly with OAuth user identity. @@ -25,13 +25,13 @@ client = TestClient(app) -USER_LOGIN = "bob-kagenti" +USER_LOGIN = "bob-rossoctl" USER_TOKEN = _sign_jwt( { "sub": f"github:{USER_LOGIN}", "github_login": USER_LOGIN, - "email": "bob@kagenti.io", - "groups": ["kagenti/ml-team"], + "email": "bob@rossoctl.io", + "groups": ["rossoctl/ml-team"], "iss": "wiki-memory-service", "iat": int(time.time()), "exp": int(time.time()) + 8 * 3600, @@ -41,7 +41,7 @@ AUTH_HEADERS = {"Authorization": f"Bearer {USER_TOKEN}"} DISCOVERY_HEADERS = { - "X-Spiffe-Id": "spiffe://kagenti.example.com/ns/topic-ai/sa/discovery-agent", + "X-Spiffe-Id": "spiffe://rossoctl.example.com/ns/topic-ai/sa/discovery-agent", } @@ -353,7 +353,7 @@ def main(): if failed: print(f" Failed: {failed}") sys.exit(1) - print(" All wiki skills verified for user bob-kagenti!") + print(" All wiki skills verified for user bob-rossoctl!") # Cleanup shutil.rmtree(WIKI_ROOT, ignore_errors=True) diff --git a/mcp/wiki_memory_tool/wiki_cli.py b/mcp/wiki_memory_tool/wiki_cli.py index 0234c208..0d155a2b 100644 --- a/mcp/wiki_memory_tool/wiki_cli.py +++ b/mcp/wiki_memory_tool/wiki_cli.py @@ -35,7 +35,7 @@ import httpx DEFAULT_BASE_URL = "http://localhost:8321" -DEFAULT_TRUST_DOMAIN = "kagenti.example.com" +DEFAULT_TRUST_DOMAIN = "rossoctl.example.com" TOKEN_DIR = Path.home() / ".wiki-memory" TOKEN_FILE = TOKEN_DIR / "token.json" diff --git a/mcp/wiki_memory_tool/wiki_service.py b/mcp/wiki_memory_tool/wiki_service.py index c64f4349..8ba88bc9 100644 --- a/mcp/wiki_memory_tool/wiki_service.py +++ b/mcp/wiki_memory_tool/wiki_service.py @@ -1,8 +1,8 @@ """ -Wiki Memory Service — Kagenti Research Wiki +Wiki Memory Service — Rossoctl Research Wiki Simplest possible implementation for the Wiki Service component from -the kagenti-research-wiki-2-simplified architecture. +the rossoctl-research-wiki-2-simplified architecture. Supports: - Per-topic namespaces with ACL (reader/writer/admin) @@ -41,7 +41,7 @@ WIKI_ROOT = Path(os.environ.get("WIKI_ROOT", "/data/wiki")) ACL_FILE = Path(os.environ.get("ACL_FILE", "/config/acl.yaml")) -TRUST_DOMAIN = os.environ.get("SPIFFE_TRUST_DOMAIN", "kagenti.example.com") +TRUST_DOMAIN = os.environ.get("SPIFFE_TRUST_DOMAIN", "rossoctl.example.com") WIKI_REMOTE_URL = os.environ.get("WIKI_REMOTE_URL", "") WIKI_PUSH_STRATEGY = os.environ.get("WIKI_PUSH_STRATEGY", "immediate") @@ -77,7 +77,7 @@ class Identity(BaseModel): kind: str # "workload" | "user" | "obo" actor: str | None = None # agent SPIFFE ID when kind=obo topics: list[str] = [] # topic scopes from token/SVID - groups: list[str] = [] # github teams (e.g. ["kagenti/ml-team"]) + groups: list[str] = [] # github teams (e.g. ["rossoctl/ml-team"]) class TopicACL(BaseModel): @@ -344,12 +344,12 @@ def _ensure_repo(): except RuntimeError: pass _git(["config", "user.name", "wiki-memory-service"]) - _git(["config", "user.email", "wiki@kagenti.local"]) + _git(["config", "user.email", "wiki@rossoctl.local"]) def _commit(rel_path: str, msg: str, author: str): _git(["add", rel_path]) - _git(["commit", "-m", msg, "--author", f"{author} <{author}@kagenti.local>", "--allow-empty"]) + _git(["commit", "-m", msg, "--author", f"{author} <{author}@rossoctl.local>", "--allow-empty"]) if WIKI_REMOTE_URL and WIKI_PUSH_STRATEGY == "immediate": try: _git(["pull", "--rebase", "origin", "main"], timeout=30) @@ -653,9 +653,9 @@ def get_activity(topic_id: str | None = None, limit: int = 20) -> list[dict]: _PAGES_SCAFFOLD = { "_config.yml": """\ -title: Kagenti Wiki Research +title: Rossoctl Wiki Research description: Multi-agent research knowledge base -baseurl: /kagenti-wiki-research +baseurl: /rossoctl-wiki-research url: https://kaslom.github.io markdown: kramdown exclude: @@ -683,7 +683,7 @@ def get_activity(topic_id: str | None = None, limit: int = 20) -> list[dict]: title: Home --- -# Kagenti Wiki Research +# Rossoctl Wiki Research A multi-agent research knowledge base. @@ -715,7 +715,7 @@ def get_activity(topic_id: str | None = None, limit: int = 20) -> list[dict]: {{ content }} @@ -1246,7 +1246,7 @@ def approve_draft(topic_id: str, path: str, request: Request): rel_live = str(live_file.relative_to(WIKI_ROOT)) rel_draft = str(draft_file.relative_to(WIKI_ROOT)) _git(["add", rel_live, rel_draft]) - _git(["commit", "-m", f"approve: {topic_id}/{path}", "--author", f"{identity.subject} "]) + _git(["commit", "-m", f"approve: {topic_id}/{path}", "--author", f"{identity.subject} "]) if WIKI_REMOTE_URL and WIKI_PUSH_STRATEGY == "immediate": try: _git(["pull", "--rebase", "origin", "main"], timeout=30) @@ -1274,7 +1274,7 @@ def reject_draft(topic_id: str, path: str, body: DraftReject, request: Request): _git(["add", rel]) reason = f" ({body.reason})" if body.reason else "" _git( - ["commit", "-m", f"reject: {topic_id}/{path}{reason}", "--author", f"{identity.subject} "] + ["commit", "-m", f"reject: {topic_id}/{path}{reason}", "--author", f"{identity.subject} "] ) return {"status": "rejected", "path": f"{topic_id}/{path}", "reason": body.reason} @@ -1363,7 +1363,7 @@ def delete_page(topic_id: str, path: str, request: Request): full.unlink() rel = str(full.relative_to(WIKI_ROOT)) _git(["add", rel]) - _git(["commit", "-m", f"delete: {topic_id}/{path}", "--author", f"{identity.subject} "]) + _git(["commit", "-m", f"delete: {topic_id}/{path}", "--author", f"{identity.subject} "]) return {"status": "deleted"} @@ -1418,7 +1418,7 @@ def init_pages_scaffold(request: Request): "-m", "Initialize GitHub Pages layout and fix page front-matter", "--author", - f"{identity.subject} ", + f"{identity.subject} ", "--allow-empty", ] ) diff --git a/skills/summarizer/README.md b/skills/summarizer/README.md index 056d45b7..4693ce57 100644 --- a/skills/summarizer/README.md +++ b/skills/summarizer/README.md @@ -210,4 +210,4 @@ No external dependencies required! ## License -Part of the Kagenti agent-examples project. +Part of the Rossoctl agent-examples project.