Skip to content
Open
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
97 changes: 97 additions & 0 deletions docs/thunderstore_feature_parity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Feature Parity Document: Legacy vs New App

**Legacy App:** [thunderstore.io](https://thunderstore.io)
**New App:** [new.thunderstore.io](https://new.thunderstore.io)
**Local API docs:** [DOCS](http://localhost.thunderstore/api/docs)
---
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Fix unintended setext heading (markdownlint MD003).

The --- directly under “Local API docs” turns that line into a setext H2 instead of an HR. Insert a blank line before the dashes (or use three asterisks).

-**Local API docs:** [DOCS](http://localhost.thunderstore/api/docs)
----
+**Local API docs:** [DOCS](http://localhost.thunderstore/api/docs)
+
+---
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
---
**Local API docs:** [DOCS](http://localhost.thunderstore/api/docs)
---
🤖 Prompt for AI Agents
In docs/thunderstore_feature_parity.md around line 6, the line with just `---`
immediately following the "Local API docs" heading is being parsed as a setext
H2 instead of a horizontal rule; fix it by inserting a blank line above the
`---` (or alternatively replace the dashes with `***`) so the dashes are
rendered as an HR and satisfy markdownlint MD003.


## Status Legend

- ✅ Complete
- ⚠️ Partial
- ❌ Missing

---

## Feature Comparison

### Complete

#### Community

| Feature | Legacy App | New App | Status | Notes |
|---------|------------|---------|--------|-------|
|Get community list| ✅ | ✅ | Complete | GET /community/ |
|Get community| ✅ | ✅ | Complete | GET /community/{community_id}/ |
|Filter community| ✅ | ✅ | Complete | GET /community/{community_id}/filters/ |

#### Package listing

| Feature | Legacy App | New App | Status | Notes |
|---------|------------|---------|--------|-------|
|Get listing list for community| ✅ | ✅ | Complete | GET /listing/{community_id}/ |
|Get listing with community and namespace| ✅ | ✅ | Complete | GET /listing/{community_id}/{namespace_id}/ |
|Get listing with community, namespace and package name| ✅ | ✅ | Complete | GET /listing/{community_id}/{namespace_id}/{package_name}/ |
|Approve package listing| ✅ | ✅ | Complete | POST /listing/{community_id}/{namespace_id}/{package_name}/approve/ |
|Get packages depending on this package| ✅ | ✅ | Complete | GET /listing/{community_id}/{namespace_id}/{package_name}/dependants/ |
|Reject a package listing| ✅ | ✅ | Complete | POST /listing/{community_id}/{namespace_id}/{package_name}/reject/ |
|Update a package listing| ✅ | ✅ | Complete | POST /listing/{community_id}/{namespace_id}/{package_name}/update/ |

#### Package

| Feature | Legacy App | New App | Status | Notes |
|---------|------------|---------|--------|-------|
|Get the permissions for a package| ✅ | ✅ | Complete | GET /package/{community_id}/{namespace_id}/{package_name}/permissions/ |
|Deprecate a package| ✅ | ✅ | Complete | POST /package/{namespace_id}/{package_name}/deprecate/ |
|Get package changelog as html| ✅ | ✅ | Complete | GET /package/{namespace_id}/{package_name}/latest/changelog/ |
|Get package readme as html| ✅ | ✅ | Complete | GET /package/{namespace_id}/{package_name}/latest/readme/ |
|Rate a package| ✅ | ✅ | Complete | POST /package/{namespace_id}/{package_name}/rate/ |
|Get package version changelog| ✅ | ✅ | Complete | GET /package/{namespace_id}/{package_name}/v/{version_number}/changelog/ |
|Get package version readme| ✅ | ✅ | Complete | GET /package/{namespace_id}/{package_name}/v/{version_number}/readme/ |
|Get all versions for package| ✅ | ✅ | Complete | GET /package/{namespace_id}/{package_name}/versions/ |

#### Team

| Feature | Legacy App | New App | Status | Notes |
|---------|------------|---------|--------|-------|
|Create a new team| ✅ | ✅ | Complete | POST /team/create/ |
|Get team info| ✅ | ✅ | Complete | GET /team/{team_id}/ |
|Get list of team members| ✅ | ✅ | Complete | GET /team/{team_id}/member/ |
|Get service accounts for team| ✅ | ✅ | Complete | GET /team/{team_id}/service-account/ |
|Disband a team| ✅ | ✅ | Complete | DELETE /team/{team_name}/disband/ |
|Add a new team member to a team| ✅ | ✅ | Complete | POST /team/{team_name}/member/add/ |
|Update team details| ✅ | ✅ | Complete | PATCH /team/{team_name}/update/ |
Comment on lines +58 to +63
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Parameter naming mixes team_id and team_name; verify accuracy.

Rows use {team_id} for GET and {team_name} for other actions. If the API truly mixes ID vs slug/name, add a note; otherwise align the placeholders.


🏁 Script executed:

#!/bin/bash
# Inspect team routes to confirm param names
rg -nP -C2 'team/\{(team_id|team_name)\}/|member/(add|)|disband|update' --type=py --type=ts --type=tsx

Length of output: 27


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Checking repository for team route placeholders and related endpoints..."

if command -v rg >/dev/null 2>&1; then
  rg -n -C2 'team/\{team_id\}' || true
  rg -n -C2 'team/\{team_name\}' || true
  rg -n -C2 '/team/\{' || true
  rg -n -C2 'disband' || true
  rg -n -C2 'member/add' || true

  if [ -f docs/thunderstore_feature_parity.md ]; then
    echo
    echo "docs/thunderstore_feature_parity.md lines 58-63:"
    sed -n '58,63p' docs/thunderstore_feature_parity.md || true
  else
    echo "docs/thunderstore_feature_parity.md not found"
  fi
else
  echo "rg (ripgrep) not found — falling back to grep"
  grep -R -n -C2 -F 'team/{team_id}' || true
  grep -R -n -C2 -F 'team/{team_name}' || true
  grep -R -n -C2 -F '/team/{' || true
  grep -R -n -C2 -F 'disband' || true
  grep -R -n -C2 -F 'member/add' || true

  if [ -f docs/thunderstore_feature_parity.md ]; then
    echo
    echo "docs/thunderstore_feature_parity.md lines 58-63:"
    sed -n '58,63p' docs/thunderstore_feature_parity.md || true
  else
    echo "docs/thunderstore_feature_parity.md not found"
  fi
fi

Length of output: 50070


Use {team_name} (not {team_id}) in the docs — code uses name/slug.

Code and tests consistently use team_name (e.g. django/thunderstore/api/urls.py uses "team/str:team_name/", views/services accept kwargs/team_name, tests call /api/cyberstorm/team/{team.name}/). Update docs/thunderstore_feature_parity.md (lines 58–63) to replace {team_id} with {team_name} (or add an explicit note only if the API intentionally accepts both).

🤖 Prompt for AI Agents
In docs/thunderstore_feature_parity.md around lines 58 to 63, the API paths
incorrectly use {team_id} but the code and tests use {team_name}/{team.slug};
update the listed endpoints to use {team_name} (e.g. GET /team/{team_name}/, GET
/team/{team_name}/member/, GET /team/{team_name}/service-account/, DELETE
/team/{team_name}/disband/, POST /team/{team_name}/member/add/, PATCH
/team/{team_name}/update/) or add a single clarifying note if the API
intentionally accepts both, ensuring the doc matches the code/tests.



### Partial

| Feature | Legacy App | New App | Status | Notes |
|---------|------------|---------|--------|-------|
| Get Package Listing status info | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1179) |
| Unlist Package | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1178) |
| Fetch package source | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1094) |
| Create service account | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1098) |
| Delete service account | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1098) |
| Delete user | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1114) |
| Delete social auth account | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1114) |
| Update team member info | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1117) |
| Delete team member | ✅ | ⚠️ | Partial | In review [PR](https://github.com/thunderstore-io/Thunderstore/pull/1118) |


### Missing

| Feature | Legacy App | New App | Status | Notes |
|---------|------------|---------|--------|-------|
| Leave team | ✅ | ❌ | TODO | No API endpoint |
| Report package | ✅ | ❌ | TODO | No Cyberstorm API endpoint - exists in experimental API |
| Upload new package | ✅ | ❌ | TODO? | How should this be handled? |

Comment on lines +85 to +88
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Normalize Status values to match the legend.

Legend uses Complete/Partial/Missing, but rows use “TODO”/“TODO?”. Swap to “Missing” for consistency and clearer scanning.

-| Leave team | ✅ | ❌ | TODO | No API endpoint |
-| Report package | ✅ | ❌ | TODO | No Cyberstorm API endpoint - exists in experimental API |
-| Upload new package | ✅ | ❌ | TODO? | How should this be handled? |
+| Leave team | ✅ | ❌ | Missing | No API endpoint |
+| Report package | ✅ | ❌ | Missing | No Cyberstorm API endpoint — exists in experimental API |
+| Upload new package | ✅ | ❌ | Missing | How should this be handled? |
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| Leave team ||| TODO | No API endpoint |
| Report package ||| TODO | No Cyberstorm API endpoint - exists in experimental API |
| Upload new package ||| TODO? | How should this be handled? |
| Leave team ||| Missing | No API endpoint |
| Report package ||| Missing | No Cyberstorm API endpoint exists in experimental API |
| Upload new package ||| Missing | How should this be handled? |
🤖 Prompt for AI Agents
In docs/thunderstore_feature_parity.md around lines 85 to 88, the status cells
use "TODO" and "TODO?" which are inconsistent with the legend's
"Complete/Partial/Missing"; update those table cells to use "Missing" (or
"Partial" where appropriate) so the row values match the legend and scanning is
consistent—replace "TODO" and "TODO?" with "Missing" for the three listed rows
unless any are actually partially implemented, in which case use "Partial".


---

## Notes & Recommendations

- Prioritize high-impact missing features.
- Identify API gaps that block feature parity.
- Suggest roadmap or implementation order if possible.

Loading