Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
f2bf3ae
bump to 26.20
ForestOfLight Mar 10, 2026
9bafadf
add alpha channel to all debugShape colors
ForestOfLight Mar 10, 2026
8acd3df
add renderSignalStrength InfoDisplay rule
ForestOfLight Mar 10, 2026
1ba0a9e
refactor InfoDisplayElements to support Shapes
ForestOfLight Mar 11, 2026
716d844
fix rule object being inaccessible for InfoDisplayElements
ForestOfLight Mar 11, 2026
a34a29c
move text-based elements from debug-utilities to server module
ForestOfLight Mar 11, 2026
6da8ea9
improve curseforge upload automation
ForestOfLight Mar 27, 2026
c1b3aed
fix addon compilation step
ForestOfLight Mar 27, 2026
2213e38
update ja_JP.lang
ru-in-1 Apr 2, 2026
64918d6
centralize vitest mocks into __mocks__ files
ForestOfLight Apr 16, 2026
5db6a73
centralize @minecraft test mocks into __mocks__ files
ForestOfLight Apr 16, 2026
3377274
Fix linting errors
ForestOfLight Apr 16, 2026
9589dc8
100% test coverage for the canopy lib
ForestOfLight Apr 16, 2026
cd1e6f4
refactor Vector scaling
ForestOfLight Apr 16, 2026
cb2fa7c
solve a couple linting errors
ForestOfLight Apr 16, 2026
cd181ae
Add regolith release with auto-pulled mob data
ForestOfLight Apr 17, 2026
c798361
additional Vector.scale refactor
ForestOfLight Apr 17, 2026
1a1f6f8
Run CI on Ubuntu instead of Windows
ForestOfLight Apr 18, 2026
52fc6bb
Merge branch 'dev' of https://github.com/ForestOfLight/Canopy into dev
ForestOfLight Apr 18, 2026
c0c8104
Add LICENSE to packaged mcaddon
ForestOfLight Apr 19, 2026
5fc9fe4
Use package_mcaddon regolith filter for release
ForestOfLight Apr 19, 2026
2ccddc1
Merge pull request #77 from ru-in-1/dev
ForestOfLight Apr 22, 2026
b165e56
Rename Canopy [RP/BP] folders to have no space
ForestOfLight Apr 24, 2026
5e9adf6
chore: ignore Claude Superpowers documentation
ForestOfLight Apr 24, 2026
20ad7ce
docs: add CONTRIBUTING.md
ForestOfLight Apr 24, 2026
3384537
docs: add TRANSLATING.md
ForestOfLight Apr 24, 2026
5f2114c
docs: trim README contributing section, point to CONTRIBUTING.md
ForestOfLight Apr 24, 2026
478429e
test: update pack name test after pack folder rename
ForestOfLight Apr 24, 2026
c4dab91
docs: clean up after claude
ForestOfLight Apr 24, 2026
2692b21
docs: same
ForestOfLight Apr 24, 2026
26117e6
chore: add CustomCommandParamType and CommandPermissionLevel to serve…
ForestOfLight Apr 24, 2026
2459063
feat: add wikiDescription and suggestedOptions fields to Rule base class
ForestOfLight Apr 24, 2026
705eb86
feat: add VanillaCommands registry and wikiDescription metadata to Va…
ForestOfLight Apr 24, 2026
47c35b5
feat: add wikiDescription and suggestedOptions to all global rules
ForestOfLight Apr 24, 2026
73f56fe
feat: add wikiDescription to all InfoDisplay rules
ForestOfLight Apr 24, 2026
cbf289c
feat: add subCommandWikiDescription to biomeedges, camera, and hss co…
ForestOfLight Apr 24, 2026
9b67b7e
feat: add generator ESM loader and minecraft mock for Node.js context
ForestOfLight Apr 24, 2026
220fbd5
revert: undo Task 7 mock changes, will use Vitest-based approach instead
ForestOfLight Apr 24, 2026
5d277a8
feat: add Vitest-based wiki generator entry point and npm script
ForestOfLight Apr 24, 2026
acb3e1f
feat: build wiki generator script
ForestOfLight Apr 24, 2026
f60110b
fix: use Vitest 4-compatible timeout syntax in generate-wiki.test.js
ForestOfLight Apr 24, 2026
f99a8c6
docs: update lang strings and camera descriptions to match wiki prose
ForestOfLight Apr 24, 2026
14237e9
ci: add wiki generation workflow on push to main
ForestOfLight Apr 24, 2026
1190e80
revert: restore en_US.lang in-game descriptions to original short form
ForestOfLight Apr 24, 2026
3cf7c4e
feat: add logo header to generated rules pages
ForestOfLight Apr 24, 2026
e2647be
fix: resolve wiki build issues
ForestOfLight Apr 25, 2026
71f1aef
chore: make wiki generation workflow more verbose
ForestOfLight Apr 25, 2026
e767f1f
fix: make npm run test run normal tests
ForestOfLight Apr 25, 2026
e407197
chore: use @forestoflight/minecraft-vitest-mocks
ForestOfLight Apr 25, 2026
0bca2da
feat: start end gateway exit visualization
ForestOfLight Apr 26, 2026
f9e3715
Merge branch '26.20' into dev
ForestOfLight Apr 26, 2026
18a81e7
feat: add End Gateway Exit Render
ForestOfLight Apr 26, 2026
e163f39
feat: add renderEndGatewayExits
ForestOfLight Apr 26, 2026
ba7af7b
feat: complete renderEndGatewayExits
ForestOfLight Apr 26, 2026
51ae3bc
feat: add HandDurability to InfoDisplay
ForestOfLight Apr 28, 2026
023e397
fix: stale reference issue in handDurability
ForestOfLight Apr 29, 2026
dfc4dfb
fix: end gateway renders across all dimensions
ForestOfLight Apr 29, 2026
441b37a
feat: rename handDurability -> heldItemDurability
ForestOfLight Apr 29, 2026
a9ec2ba
fix: canopy menu defaults text fields to their current value
ForestOfLight Apr 29, 2026
3e6494c
perf: further optimize renderSignalStrength
ForestOfLight Apr 29, 2026
52ceb08
chore: remove .claude directory
ForestOfLight May 6, 2026
1c6b840
feat: bump versions to 1.5.6 & MC 1.26.20
ForestOfLight May 6, 2026
44fb305
fix: solve eslint errors
ForestOfLight May 6, 2026
0a4a207
test: fix tests
ForestOfLight May 6, 2026
2e4654e
chore: fix misconfigured path to the pack version
ForestOfLight May 6, 2026
8771ca8
fix: wiki generation errors
ForestOfLight May 6, 2026
463fad2
chore: fix linting and testing issues
ForestOfLight May 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ on:

jobs:
build:
runs-on: windows-latest
runs-on: ubuntu-latest

strategy:
matrix:
Expand Down
208 changes: 141 additions & 67 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,89 +8,163 @@ on:
types: [published]

jobs:
publish:
build:
runs-on: ubuntu-latest
outputs:
mcaddon: ${{ steps.artifact.outputs.mcaddon }}

steps:
- uses: actions/checkout@v4

- name: Package mcaddon
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '20'

- name: Install Regolith
run: |
VERSION=${{ github.event.release.tag_name }}
OUTPUT="Canopy-${VERSION}.mcaddon"
DOWNLOAD_URL=$(curl -sSL https://api.github.com/repos/Bedrock-OSS/regolith/releases/latest \
| jq -r '.assets[] | select(.name | test("Linux_x86_64\\.tar\\.gz")) | .browser_download_url')
curl -sSLf "$DOWNLOAD_URL" | tar -xz -C /usr/local/bin regolith

- name: Run release profile
run: regolith run release

- name: Get release artifact path
id: artifact
run: echo "mcaddon=$(ls build/*.mcaddon | head -1)" >> "$GITHUB_OUTPUT"

- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: mcaddon
path: ${{ steps.artifact.outputs.mcaddon }}

mkdir build
cp -r "Canopy [BP]" "build/Canopy[BP]"
cp -r "Canopy [RP]" "build/Canopy[RP]"
cp LICENSE "build/Canopy[BP]"
cp LICENSE "build/Canopy[RP]"
upload-github:
needs: build
runs-on: ubuntu-latest

cd build
zip -r "$OUTPUT" "Canopy[BP]" "Canopy[RP]"
mv "$OUTPUT" ..
cd ..
steps:
- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: mcaddon
path: build

- name: Upload asset to GitHub Release
uses: softprops/action-gh-release@e798e6a1ede8d07b74ac4cdac6bdfa4cc1653907
with:
files: Canopy-${{ github.event.release.tag_name }}.mcaddon
files: ${{ needs.build.outputs.mcaddon }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

upload-curseforge:
needs: build
runs-on: ubuntu-latest
env:
CF_PROJECT_ID: 1062078

steps:
- uses: actions/checkout@v4

- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: mcaddon
path: build

- name: Upload to CurseForge
env:
RELEASE_BODY: ${{ github.event.release.body }}
run: |
VERSION=${{ github.event.release.tag_name }}

# Read the game version from manifest.json
MIN_ENGINE_VERSION=$(jq -r '.header.min_engine_version | @csv' "Canopy [BP]/manifest.json")
IFS=',' read -r LEADING MAJOR MINOR <<< "$MIN_ENGINE_VERSION"
ENGINE_PREFIX="${MAJOR}.${MINOR}"

# Fetch all Bedrock versions from CurseForge API
CF_VERSIONS_JSON=$(curl -s -H "X-Api-Token: ${{ secrets.CF_API_TOKEN }}" \
"https://minecraft-bedrock.curseforge.com/api/game/versions")

# Extract all game version IDs whose name matches the game version from the manifest.json
GAME_VERSION_IDS=$(echo "$CF_VERSIONS_JSON" | jq -c --arg prefix "$ENGINE_PREFIX" '
[ .[] | select(.name | startswith($prefix)) | .id ]
')
if [ -z "$GAME_VERSION_IDS" ]; then
echo "No matching CurseForge versions found for engine prefix $ENGINE_PREFIX"
exit 1
fi
echo "Found CurseForge version IDs for game version $ENGINE_PREFIX: $GAME_VERSION_IDS"

ADDON_FILENAME=Canopy-$VERSION.mcaddon

# Build metadata as JSON so the changelog is uploaded with preserved Markdown.
printf "%s" "$RELEASE_BODY" > curseforge-changelog.md
jq -n \
--rawfile changelog curseforge-changelog.md \
--arg displayName "$ADDON_FILENAME" \
--argjson gameVersions "$GAME_VERSION_IDS" \
'{
changelog: $changelog,
changelogType: "markdown",
displayName: $displayName,
releaseType: "release",
gameVersions: $gameVersions
}' > curseforge-metadata.json

# Upload the addon
RESPONSE=$(curl -s --fail-with-body -X POST \
-H "X-Api-Token: ${{ secrets.CF_API_TOKEN }}" \
-F "metadata=@curseforge-metadata.json;type=application/json" \
-F "file=@$ADDON_FILENAME" \
https://minecraft-bedrock.curseforge.com/api/projects/1062078/upload-file
)

UPLOADED_ID=$(echo "$RESPONSE" | jq -r '.id // empty')
if [ -n "$UPLOADED_ID" ]; then
echo "Successfully uploaded release. File ID: $UPLOADED_ID"
else
echo "Upload failed. Response:"
echo "$RESPONSE"
exit 1
fi
set -euo pipefail
MCADDON="${{ needs.build.outputs.mcaddon }}"
PACK_FILENAME=$(basename "$MCADDON")
BP_SOURCE=$(jq -r '.packs.behaviorPack' config.json | sed 's|^\./||')

# Read the game version from manifest.json
MIN_ENGINE_VERSION=$(sed -E 's,//.*$,,' "$BP_SOURCE/manifest.json" | jq -r '.header.min_engine_version | @csv')
IFS=',' read -r LEADING MAJOR MINOR <<< "$MIN_ENGINE_VERSION"
ENGINE_PREFIX="${MAJOR}.${MINOR}"

# Fetch all Bedrock versions from CurseForge API
CF_VERSIONS_HTTP=$(curl -sS -L \
-o curseforge-versions.json \
-w "%{http_code}" \
-H "Accept: application/json" \
-H "X-Api-Token: ${{ secrets.CF_API_TOKEN }}" \
"https://minecraft-bedrock.curseforge.com/api/game/versions")
if [ "$CF_VERSIONS_HTTP" -lt 200 ] || [ "$CF_VERSIONS_HTTP" -ge 300 ]; then
echo "CurseForge versions API returned HTTP $CF_VERSIONS_HTTP"
cat curseforge-versions.json
exit 1
fi

# Guard against non-JSON responses (HTML/proxy errors), which break jq parsing later.
if ! jq -e . curseforge-versions.json >/dev/null; then
echo "CurseForge versions API response was not valid JSON"
cat curseforge-versions.json
exit 1
fi

# Extract all game version IDs whose name matches the game version from the manifest.json
GAME_VERSION_IDS=$(jq -c --arg prefix "$ENGINE_PREFIX" '
if type == "array" then
[ .[] | select((.name // "") | startswith($prefix)) | .id ]
elif (type == "object" and has("data") and (.data | type == "array")) then
[ .data[] | select((.name // "") | startswith($prefix)) | .id ]
else
[]
end
' curseforge-versions.json)
if [ "$GAME_VERSION_IDS" = "[]" ]; then
echo "No matching CurseForge versions found for engine prefix $ENGINE_PREFIX"
exit 1
fi
echo "Found CurseForge version IDs for game version $ENGINE_PREFIX: $GAME_VERSION_IDS"

# Build metadata as JSON so the changelog is uploaded with preserved Markdown.
printf "%s" "$RELEASE_BODY" > curseforge-changelog.md
jq -n \
--rawfile changelog curseforge-changelog.md \
--arg displayName "$PACK_FILENAME" \
--argjson gameVersions "$GAME_VERSION_IDS" \
'{
changelog: $changelog,
changelogType: "markdown",
displayName: $displayName,
releaseType: "release",
gameVersions: $gameVersions
}' > curseforge-metadata.json
METADATA_JSON=$(jq -c . curseforge-metadata.json)

# Upload the mcaddon
UPLOAD_HTTP=$(curl -sS -X POST \
-o curseforge-upload-response.json \
-w "%{http_code}" \
-H "Accept: application/json" \
-H "X-Api-Token: ${{ secrets.CF_API_TOKEN }}" \
--form-string "metadata=$METADATA_JSON" \
-F "file=@$MCADDON" \
https://minecraft-bedrock.curseforge.com/api/projects/$CF_PROJECT_ID/upload-file
)
if [ "$UPLOAD_HTTP" -lt 200 ] || [ "$UPLOAD_HTTP" -ge 300 ]; then
echo "CurseForge upload returned HTTP $UPLOAD_HTTP"
cat curseforge-upload-response.json
exit 1
fi

if ! jq -e . curseforge-upload-response.json >/dev/null; then
echo "CurseForge upload response was not valid JSON"
cat curseforge-upload-response.json
exit 1
fi

UPLOADED_ID=$(jq -r '.id // empty' curseforge-upload-response.json)
if [ -n "$UPLOADED_ID" ]; then
echo "Successfully uploaded release. File ID: $UPLOADED_ID"
else
echo "Upload failed. Response:"
cat curseforge-upload-response.json
exit 1
fi
51 changes: 51 additions & 0 deletions .github/workflows/wiki.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: Update Wiki

on:
push:
branches:
- main

jobs:
update-wiki:
runs-on: ubuntu-latest

steps:
- name: Checkout Canopy repo
uses: actions/checkout@v4

- name: Checkout Wiki repo (master branch)
uses: actions/checkout@v4
with:
repository: ${{ github.repository }}.wiki
path: wiki
ref: master
token: ${{ secrets.GITHUB_TOKEN }}

- name: Use Commands.md template from template branch
working-directory: wiki
run: git fetch origin template && git show origin/template:Commands.md > Commands.md

- name: Use Node.js 20.14.0
uses: actions/setup-node@v4
with:
node-version: 20.14.0
cache: 'npm'

- name: Install dependencies
run: npm install

- name: Generate wiki content
run: WIKI_PATH=./wiki npm run generate-wiki

- name: Commit and push wiki changes
working-directory: wiki
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add -A
if git diff --staged --quiet; then
echo "No wiki changes to commit."
else
git commit -m "docs: auto-update wiki from source [skip ci]"
git push
fi
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@
node_modules/
coverage/
/build
/.regolith
/.regolith
/docs/superpowers/
.claude/
.env
4 changes: 2 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"name": "Debug with Minecraft",
"mode": "listen",
"targetModuleUuid": "3d753132-e3c9-4305-a995-eae30b486093",
"localRoot": "${workspaceFolder}/Canopy [BP]/scripts",
"localRoot": "${workspaceFolder}/Canopy[BP]/scripts",
"port": 19144
}
]
}
}
43 changes: 39 additions & 4 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
"version": "2.0.0",
"tasks": [
{
"label": "regolith: run",
"label": "regolith: run default",
"type": "shell",
"command": "regolith run",
"command": "regolith run default",
"problemMatcher": [],
"group": {
"kind": "build",
Expand All @@ -16,7 +16,42 @@
}
},
{
"label": "regolith: watch",
"label": "regolith: run preview",
"type": "shell",
"command": "regolith run preview",
"problemMatcher": [],
"group": "build",
"presentation": {
"echo": true,
"close": true
}
},
{
"label": "regolith: run release",
"type": "shell",
"command": "regolith run release",
"problemMatcher": [],
"group": "build",
"presentation": {
"echo": true,
"reveal": "always",
"close": false
}
},
{
"label": "regolith: bump version",
"type": "shell",
"command": "regolith run bump-version",
"problemMatcher": [],
"presentation": {
"echo": true,
"reveal": "always",
"panel": "new",
"close": false
}
},
{
"label": "regolith: watch default",
"type": "shell",
"command": "regolith watch default",
"isBackground": true,
Expand Down Expand Up @@ -66,4 +101,4 @@
}
}
]
}
}
Loading
Loading