Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
name: Bug report
description: Something broke. Pure-Python reproductions land fastest.
title: "[bug] "
labels: ["bug", "triage"]
body:
- type: markdown
attributes:
value: |
Thanks for the report. Two minutes of structured detail saves a 30-minute back-and-forth.

Security vulnerabilities → please use the email in `SECURITY.md`, not this form.

- type: input
id: version
attributes:
label: TopicForge version
description: "Output of `python -m topicforge --version` or `pip show topicforge`."
placeholder: "topicforge 0.4.0"
validations:
required: true

- type: dropdown
id: mode
attributes:
label: Runtime mode
description: "From your `TOPICFORGE_MODE` env var or `health_check` output."
options:
- mock
- live
- auto (resolved to live)
- auto (resolved to mock)
- "I don't know"
validations:
required: true

- type: dropdown
id: dds-backend
attributes:
label: DDS backend (if relevant)
description: "Skip if the bug doesn't touch the DDS module."
options:
- "n/a — bug is on the ROS2 side"
- mock
- cyclone
- fast
- rti
- opendds
- dust
- other / Pro tier vendor
validations:
required: false

- type: dropdown
id: os
attributes:
label: Operating system
options:
- Windows (native)
- Windows (WSL2)
- Ubuntu / Debian
- macOS
- other Linux
- Docker container
validations:
required: true

- type: input
id: python
attributes:
label: Python version
placeholder: "3.12.3"
validations:
required: true

- type: textarea
id: what-happened
attributes:
label: What happened
description: Be precise. Quote the exact tool call and the exact response or exception text. Substring of the AdapterError message is gold.
placeholder: |
I called `peek_dds_samples(topic="/foo/bar", count=5)` and got
`AdapterError("CycloneDDS sample peek failed on topic ...")`.
validations:
required: true

- type: textarea
id: expected
attributes:
label: What you expected
placeholder: A SampleResult with up to 5 decoded samples.
validations:
required: true

- type: textarea
id: reproducer
attributes:
label: Minimal reproducer
description: |
A failing pytest is gold. A copy-pastable shell session is silver.
"It happens sometimes" is bronze — please include the env vars and command line at minimum.
render: shell
validations:
required: false

- type: textarea
id: env
attributes:
label: Environment variables set
description: "Only the `TOPICFORGE_*` and `ROS_*` / `CYCLONEDDS_*` / `FastDDS_*` ones. Redact anything sensitive."
render: shell
validations:
required: false

- type: checkboxes
id: checks
attributes:
label: Quick checks
options:
- label: I've read [docs/TROUBLESHOOTING.md](../blob/main/docs/TROUBLESHOOTING.md) and my error isn't covered there.
- label: This is not a security vulnerability (those go to the email in `SECURITY.md`).
11 changes: 11 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: Security vulnerability
url: https://github.com/yaniswav/TopicForge/blob/main/SECURITY.md
about: Vulnerability disclosures go to the email in SECURITY.md, not public issues.
- name: Troubleshooting
url: https://github.com/yaniswav/TopicForge/blob/main/docs/TROUBLESHOOTING.md
about: Common AdapterError messages and their remediation paths.
- name: DDS quickstart
url: https://github.com/yaniswav/TopicForge/blob/main/docs/DDS_QUICKSTART.md
about: 5-minute walkthrough for the DDS module — backend selection, QoS mismatch scenario.
78 changes: 78 additions & 0 deletions .github/ISSUE_TEMPLATE/feature_request.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Feature request
description: Propose a new capability. Read the scope notes first.
title: "[feature] "
labels: ["enhancement", "triage"]
body:
- type: markdown
attributes:
value: |
Before opening : TopicForge is intentionally small. The tool surface is capped at 11
as of v0.4.0 ; each new tool needs an explicit scope discussion (see `docs/product-plan.md §11`
"Scope creep within the TopicForge umbrella"). Many ideas land better in the Pro tier
roadmap (URDF inspection, bag anomaly detection) than as OSS additions.

For parser fixes on a new ROS2 distro, please file a bug instead with a failing test.

- type: textarea
id: problem
attributes:
label: What problem are you trying to solve?
description: Concrete, user-facing. Avoid solution language at this stage.
placeholder: |
"When I bring up a new robot stack I cannot tell from `list_topics` alone
which nodes own which topics — I have to cross-reference `ros2 node list`
manually."
validations:
required: true

- type: textarea
id: proposal
attributes:
label: Proposed shape
description: |
Tool name, parameters, return shape if you have a concrete idea.
Drop a Pydantic-like sketch if it helps — the maintainer will refine.
placeholder: |
`list_nodes(name_filter: str | None = None) -> list[NodeInfo]`
where `NodeInfo` carries `name`, `namespace`, `publishers`, `subscribers`, `services`.
validations:
required: false

- type: dropdown
id: tier
attributes:
label: Which tier should this live in?
options:
- "OSS (core)"
- "Pro tier (URDF / bag anomaly / multi-bag diff family)"
- "I don't know — maintainer decides"
validations:
required: true

- type: textarea
id: alternatives
attributes:
label: Alternatives considered
description: What did you try before opening this? `ros2` CLI commands, scripts, other MCPs?
placeholder: |
I currently run `ros2 node list && ros2 node info <each>` then paste the
output into Claude manually.
validations:
required: false

- type: textarea
id: who-benefits
attributes:
label: Who else benefits?
description: Solo dev? Small team? Specific industry? Helps with scope decisions.
validations:
required: false

- type: checkboxes
id: checks
attributes:
label: Quick checks
options:
- label: I've checked `docs/product-plan.md` and this is not already on a roadmap.
- label: I've checked existing issues for duplicates.
- label: I understand TopicForge is read-only by architecture and will not propose write/command/publish capabilities.
36 changes: 36 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<!--
Thanks for opening a PR. Three short sections below — keep it tight. The
maintainer's review goes faster when the diff matches a concrete need
described here. See CONTRIBUTING.md for the full contract.
-->

## Summary

<!-- 1-3 sentences. What does this PR change, and why. Link the issue
it addresses if any (`Closes #N` works). -->

## Test plan

<!-- How you verified the change. At minimum:
- [ ] `make check` is green (or the underlying ruff + pytest commands on Windows)
- [ ] Added / updated tests for the new behavior — list them
- [ ] If the PR touches docs only, say so

For a non-trivial change, include a paste of the manual scenario you
ran end-to-end (mock-mode tool calls, expected payloads, etc.). -->

## Backward-compatibility checklist

<!-- Tick what applies. If anything is unchecked, explain in a paragraph why. -->

- [ ] No new MCP tool added — or, if added : see `docs/product-plan.md §11` (the 11-tool cap requires a scope discussion)
- [ ] No change to Pydantic schemas — or, if changed : every new field has a safe default (`extra="forbid"` + additive optional only)
- [ ] No change to the telemetry 6-field contract pinned by `tests/test_telemetry.py::test_payload_contains_only_whitelisted_keys`
- [ ] No new environment variable name — or, if added : documented in README "Configuration reference" and `.env.example`
- [ ] No removal of an existing public API symbol — or, if removed : CHANGELOG `### Removed` line in `[Unreleased]`

## Notes for the maintainer

<!-- Anything that needs context: a tradeoff you weighed, a follow-up you're not
bundling here, an external service to check (PyPI metadata, README rendering).
Optional. -->
5 changes: 3 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ on:
jobs:
check:
name: Lint + format + tests
runs-on: ubuntu-latest
runs-on: ${{ matrix.os }}

strategy:
fail-fast: false
matrix:
python-version: ["3.11", "3.12"]
os: [ubuntu-latest, windows-latest]
python-version: ["3.11", "3.12", "3.13"]

steps:
- name: Checkout
Expand Down
Loading
Loading