Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
0759e94
Add library rule packs to amber-lsp
crimson-knight Sep 23, 2026
5a43008
feat(amber-lsp): detect Grant tenancy from AST rule packs
crimson-knight Sep 24, 2026
95f04cf
fix(amber-lsp): narrow rule pack rescues
crimson-knight Sep 24, 2026
83344e7
feat: add Amber agent setup loop
crimson-knight Oct 3, 2026
768233e
fix: support installed Crystal agent hooks
crimson-knight Oct 3, 2026
99bf975
feat(onboarding): generate hash-locked web apps with Minecart
crimson-knight Oct 4, 2026
0331e23
fix(onboarding): keep Minecart assistant setup compact
crimson-knight Oct 4, 2026
33f66da
docs(release): align source archive instructions with workflow
crimson-knight Oct 4, 2026
7ff11a0
feat(amber-lsp): add --version with the amber_cli release and build c…
crimson-knight Oct 5, 2026
32acd65
amber-lsp: add FSDD rules (method type signature, doc block, process-…
crimson-knight Jun 1, 2026
a81c40a
amber-lsp: add scripts/lsp_smoke.rb live-fire stdio proof
crimson-knight Aug 1, 2026
c08a8c1
spec: the e2e "fixed" fixture must satisfy OUR OWN FSDD rules (dogfoo…
crimson-knight Aug 1, 2026
66ecb4a
feat(amber-lsp): parse typed messages and handle full-document didChange
crimson-knight Oct 5, 2026
2099826
feat: merge Amber agent setup and one-shot LSP checks
crimson-knight Oct 5, 2026
d16759f
feat: merge Amber library rule packs
crimson-knight Oct 6, 2026
8e2ed64
feat(amber-lsp): report explicit coverage states
crimson-knight Oct 6, 2026
8c37b0d
feat(amber-lsp): activate analysis across the Amber stack
crimson-knight Oct 6, 2026
107b96e
fix(amber-lsp): scope action checks to public methods
crimson-knight Oct 6, 2026
84f434b
feat(amber-lsp): exercise unsaved didChange in smoke probe
crimson-knight Oct 6, 2026
44b142f
feat(amber-cli): record agent setup metadata
crimson-knight Oct 6, 2026
1283a12
feat(lsp): build layered Crystal docs API index
crimson-knight Oct 6, 2026
db77bb2
feat(lsp): resolve Crystal API lookup queries
crimson-knight Oct 6, 2026
a9b4e6b
feat(lsp): report lookup status and freshness
crimson-knight Oct 6, 2026
105305b
feat(lsp): verify Crystal API lookups with compiler probes
crimson-knight Oct 6, 2026
48660bf
feat(lsp): add amber-lsp lookup command
crimson-knight Oct 6, 2026
7041a36
feat(lsp): load versioned Crystal API cards
crimson-knight Oct 6, 2026
0288d97
feat(lsp): add API lookup LSP methods
crimson-knight Oct 6, 2026
8f70642
feat(amber-cli): add cached agent readiness check
crimson-knight Oct 6, 2026
c7131c4
fix(lsp): index dependencies in isolated docs workspaces
crimson-knight Oct 6, 2026
acb9c04
feat(amber-cli): register LSP through local Claude marketplace
crimson-knight Oct 6, 2026
f46934b
feat(amber-cli): enforce agent setup in project hooks
crimson-knight Oct 6, 2026
2c24e45
feat(amber-cli): add agent setup doctor checks
crimson-knight Oct 6, 2026
0bcef8c
feat(amber-cli): set up agent hooks for new projects
crimson-knight Oct 6, 2026
69faedf
fix(amber-cli): anchor agent hook commands to project root
crimson-knight Oct 6, 2026
5536df4
fix(lsp): format class and extended method lookups
crimson-knight Oct 6, 2026
ac1b116
fix(lsp): fail coverage when rule packs cannot load
crimson-knight Oct 6, 2026
14b4ac1
fix(lsp): propagate tenancy source parse failures
crimson-knight Oct 6, 2026
d56c765
feat(lsp): add compiler error hint command
crimson-knight Oct 6, 2026
080efbf
fix(amber-cli): match agent post tool payloads
crimson-knight Oct 6, 2026
277c6ba
fix(amber-cli): block post hook without amber-lsp
crimson-knight Oct 6, 2026
504a715
fix(lsp): index all dependency docs entries
crimson-knight Oct 6, 2026
99e8e24
fix(lsp): index source entries in library projects
crimson-knight Oct 6, 2026
48f2a0c
fix(lsp): resolve receiver-specific return types
crimson-knight Oct 6, 2026
755f4e4
fix(lsp): bind generic lookup receivers
crimson-knight Oct 6, 2026
e84e2dd
fix(lsp): resolve overload return types independently
crimson-knight Oct 6, 2026
a59644a
fix(lsp): preserve unknown return types
crimson-knight Oct 6, 2026
6a70f62
fix(lsp): index Crystal docs constructors
crimson-knight Oct 6, 2026
aba94c8
fix(lsp): resolve included module methods
crimson-knight Oct 6, 2026
61e38c8
feat(lsp): verify lookup return types
crimson-knight Oct 6, 2026
bdef75a
feat(lsp): interpolate API card hint captures
crimson-knight Oct 6, 2026
18a4ba1
fix(lsp): store portable library index paths
crimson-knight Oct 6, 2026
193093f
fix(lsp): filter foreign docs layer entries
crimson-knight Oct 6, 2026
eb44077
feat(agent): enforce Amber LSP setup in project hooks
crimson-knight Oct 6, 2026
3041554
feat(onboarding): pin generated web app dependencies
crimson-knight Oct 6, 2026
4fe3ab5
build(release): verify Crystal and binary archive checksums
crimson-knight Oct 6, 2026
ebf66dd
docs(agent): explain project setup and LSP lookup
crimson-knight Oct 6, 2026
bc08f83
feat(lsp): load bundled API cards
crimson-knight Oct 6, 2026
647ca6e
Merge commit '193093f' into release/2.0.7-lsp
crimson-knight Oct 6, 2026
a28008b
fix(build): fall back to shards when Minecart is not installed
crimson-knight Oct 6, 2026
a638d82
fix(agent): require API lookup guidance
crimson-knight Oct 6, 2026
75eb171
feat(lsp): add Crystal language API card
crimson-knight Oct 6, 2026
a58715a
feat(lsp): add Crystal card evaluation
crimson-knight Oct 6, 2026
497b4b8
merge(lsp): integrate Crystal API card release work
crimson-knight Oct 6, 2026
d3980f8
test(agent): assert readiness cache hit by invocation count
crimson-knight Oct 6, 2026
647da53
fix(release): support macOS Bash platform flags
crimson-knight Oct 6, 2026
dc97420
fix(agent): allow plain Crystal readiness
crimson-knight Oct 6, 2026
2daf3a4
fix(agent): keep post-edit hook quiet in plain Crystal projects
crimson-knight Oct 6, 2026
1b4cb41
feat(lsp): print usage for amber-lsp --help and each subcommand
crimson-knight Oct 6, 2026
daf310c
fix(lookup): fall back to stock crystal when crystal-alpha is absent
crimson-knight Oct 6, 2026
f6df051
docs: explain agent tooling for Amber, plain Crystal apps, and shards
crimson-knight Oct 6, 2026
af34c36
build(ci): pin Minecart 2025.11.25.7 at 091e8e2
crimson-knight Oct 6, 2026
9861c9f
build(ci): pin Minecart 2025.11.25.8 and build it with stock crystal
crimson-knight Oct 6, 2026
9690dfb
ci: run lookup specs and the beta contract on stock Crystal runners
crimson-knight Oct 6, 2026
8b87126
ci: test with Homebrew Crystal on macOS and the installed compiler ve…
crimson-knight Oct 6, 2026
faed4b2
build(release): put shards on PATH from the pinned macOS Crystal archive
crimson-knight Oct 6, 2026
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
5 changes: 4 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,11 @@ jobs:
restore-keys: |
${{ runner.os }}-shards-

- name: Build pinned Minecart
run: scripts/install_pinned_minecart.sh

- name: Install dependencies
run: shards install
run: minecart install --frozen --skip-ai-docs

- name: Build LSP binary for integration specs
run: |
Expand Down
21 changes: 18 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,16 @@ jobs:
run: sudo apt-get update

- name: Install Crystal
if: runner.os == 'Linux'
uses: crystal-lang/install-crystal@d8ef131ecec0352ce0e39b81b0a6d95def58fe2f # v1
with:
crystal: ${{ matrix.crystal }}

- name: Install Crystal with Homebrew
# Homebrew's Crystal brings llvm-config, which the API lookup specs need to
# build the standard library docs; the install-crystal macOS tarball has none.
if: runner.os == 'macOS'
run: brew install crystal

- name: Cache shards
uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4
Expand All @@ -43,8 +49,11 @@ jobs:
restore-keys: |
${{ runner.os }}-shards-

- name: Build pinned Minecart
run: scripts/install_pinned_minecart.sh

- name: Install dependencies
run: shards install
run: minecart install --frozen --skip-ai-docs

- name: Check Amber V2 beta contract
run: scripts/check_beta_contract.sh
Expand Down Expand Up @@ -120,8 +129,11 @@ jobs:
restore-keys: |
${{ runner.os }}-shards-

- name: Build pinned Minecart
run: scripts/install_pinned_minecart.sh

- name: Install dependencies
run: shards install
run: minecart install --frozen --skip-ai-docs

- name: Test CLI functionality
run: |
Expand Down Expand Up @@ -155,8 +167,11 @@ jobs:
with:
crystal: latest

- name: Build pinned Minecart
run: scripts/install_pinned_minecart.sh

- name: Install dependencies
run: shards install
run: minecart install --frozen --skip-ai-docs

- name: Run integration tests
run: |
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,11 @@ jobs:
with:
crystal: latest

- name: Build pinned Minecart
run: scripts/install_pinned_minecart.sh

- name: Install dependencies
run: shards install
run: minecart install --frozen --skip-ai-docs

- name: Generate documentation
run: |
Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/platform-compile.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,11 @@ jobs:
with:
crystal: latest

- name: Build pinned Minecart
run: scripts/install_pinned_minecart.sh

- name: Install CLI dependencies
run: shards install
run: minecart install --frozen --skip-ai-docs

- name: Build Amber CLI
run: crystal build src/amber_cli.cr --no-debug -o amber
Expand Down Expand Up @@ -62,8 +65,12 @@ jobs:
"CRYSTAL_LIBRARY_PATH=$env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\lib;$crystalLibraryPath" >> $env:GITHUB_ENV
"$env:VCPKG_INSTALLATION_ROOT\installed\x64-windows\bin" >> $env:GITHUB_PATH

- name: Build pinned Minecart
shell: pwsh
run: scripts/install_pinned_minecart.ps1

- name: Install CLI dependencies
run: shards install
run: minecart install --frozen --skip-ai-docs

- name: Build Amber CLI
run: crystal build src/amber_cli.cr --no-debug -o amber.exe
Expand Down
168 changes: 117 additions & 51 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,36 +23,33 @@ jobs:
matrix:
include:
- target: darwin-arm64
os: macos-latest
crystal_arch: aarch64
os: macos-26
runner_arch: arm64
- target: linux-x86_64
os: ubuntu-latest
crystal_arch: x86_64
os: ubuntu-24.04
runner_arch: x86_64
- target: linux-arm64
os: ubuntu-24.04-arm
crystal_arch: aarch64
runner_arch: aarch64

steps:
- name: Checkout code
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
ref: ${{ github.event.release.tag_name || github.event.inputs.ref }}

- name: Refresh apt package index
# install-crystal runs apt-get install without an update, so a stale
# runner image index 404s on superseded packages.
if: runner.os == 'Linux'
run: sudo apt-get update

- name: Install Crystal (Linux)
if: startsWith(matrix.target, 'linux-')
uses: crystal-lang/install-crystal@d8ef131ecec0352ce0e39b81b0a6d95def58fe2f # v1
with:
crystal: latest
- name: Verify runner architecture
run: |
actual_arch="$(uname -m)"
expected_arch="${{ matrix.runner_arch }}"
if [[ "$actual_arch" != "$expected_arch" ]]; then
printf 'Runner architecture mismatch: expected %s, got %s\n' "$expected_arch" "$actual_arch" >&2
exit 1
fi
printf 'Verified runner architecture: %s\n' "$actual_arch"

- name: Install Crystal and OpenSSL (macOS)
if: matrix.target == 'darwin-arm64'
run: brew install crystal openssl@3
- name: Install hash-verified Crystal
run: scripts/install_pinned_crystal.sh "${{ matrix.target }}"

- name: Verify release versions agree
run: |
Expand All @@ -64,25 +61,25 @@ jobs:
test "v$shard_version" = "$requested_ref"
fi

- name: Build pinned Minecart
run: scripts/install_pinned_minecart.sh
env:
CRYSTAL: crystal-alpha

- name: Install dependencies
run: |
if [ -f shard.lock ]; then
shards install --production
else
shards install
fi
run: minecart install --frozen --production --skip-ai-docs

- name: Build binaries (Linux)
if: startsWith(matrix.target, 'linux-')
run: |
crystal build src/amber_cli.cr -o amber --release --static
crystal build src/amber_lsp.cr -o amber-lsp --release --static
crystal-alpha build src/amber_cli.cr -o amber --release --static
crystal-alpha build src/amber_lsp.cr -o amber-lsp --release --static

- name: Build binaries (macOS ARM64)
if: matrix.target == 'darwin-arm64'
run: |
crystal build src/amber_cli.cr -o amber --release
crystal build src/amber_lsp.cr -o amber-lsp --release
crystal-alpha build src/amber_cli.cr -o amber --release
crystal-alpha build src/amber_lsp.cr -o amber-lsp --release

- name: Verify binaries
run: |
Expand All @@ -103,8 +100,22 @@ jobs:

- name: Create archive
run: |
mkdir -p dist
tar -czf dist/amber_cli-${{ matrix.target }}.tar.gz amber amber-lsp
mkdir -p dist/package/share/amber_cli/api dist/verify
cp amber amber-lsp dist/package/
cp src/amber_lsp/cards/crystal.yml dist/package/share/amber_cli/api/crystal.yml
if command -v sha256sum >/dev/null 2>&1; then
(cd dist/package && sha256sum amber amber-lsp > checksums.txt)
else
(cd dist/package && shasum -a 256 amber amber-lsp > checksums.txt)
fi
tar -czf dist/amber_cli-${{ matrix.target }}.tar.gz -C dist/package amber amber-lsp checksums.txt share
tar -xzf dist/amber_cli-${{ matrix.target }}.tar.gz -C dist/verify
if command -v sha256sum >/dev/null 2>&1; then
(cd dist/verify && sha256sum --check checksums.txt)
else
(cd dist/verify && shasum -a 256 -c checksums.txt)
fi
tar -tzf dist/amber_cli-${{ matrix.target }}.tar.gz | grep -Fx 'share/amber_cli/api/crystal.yml'

- name: Calculate checksum
id: checksum
Expand All @@ -115,7 +126,7 @@ jobs:
else
shasum -a 256 amber_cli-${{ matrix.target }}.tar.gz > amber_cli-${{ matrix.target }}.tar.gz.sha256
fi
echo "sha256=$(cat amber_cli-${{ matrix.target }}.tar.gz.sha256 | cut -d' ' -f1)" >> $GITHUB_OUTPUT
echo "sha256=$(cat amber_cli-${{ matrix.target }}.tar.gz.sha256 | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"

- name: Upload artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
Expand All @@ -125,22 +136,64 @@ jobs:
dist/amber_cli-${{ matrix.target }}.tar.gz
dist/amber_cli-${{ matrix.target }}.tar.gz.sha256

package-source:
name: Package checksummed source archive
runs-on: ubuntu-24.04
steps:
- name: Checkout source
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
ref: ${{ github.event.release.tag_name || github.event.inputs.ref }}

- name: Verify release version
run: |
version="$(awk '/^version:/ { print $2; exit }' shard.yml)"
requested_ref="${{ github.event.release.tag_name || github.event.inputs.ref }}"
if [[ "$requested_ref" == v* ]]; then
test "v$version" = "$requested_ref"
fi

- name: Create checksummed source archive
run: |
version="$(awk '/^version:/ { print $2; exit }' shard.yml)"
mkdir -p dist
git archive --format=tar.gz --prefix="amber_cli-${version}/" HEAD > "dist/amber_cli-source-${version}.tar.gz"
cd dist
sha256sum "amber_cli-source-${version}.tar.gz" > "amber_cli-source-${version}.tar.gz.sha256"
printf 'CI source archive SHA-256: %s\n' "$(cut -d' ' -f1 < "amber_cli-source-${version}.tar.gz.sha256")"

- name: Upload source archive for preflight and release
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
with:
name: amber_cli-source
path: |
dist/amber_cli-source-*.tar.gz
dist/amber_cli-source-*.tar.gz.sha256

upload-assets:
name: Upload Release Assets
needs: build
runs-on: ubuntu-latest
needs: [build, package-source]
runs-on: ubuntu-24.04
if: github.event_name == 'release'

steps:
- name: Checkout release source
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
ref: ${{ github.event.release.tag_name }}

- name: Download all artifacts
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
with:
path: artifacts

- name: Verify artifacts exist
run: |
set -e
set -euo pipefail
version="$(sed -n 's/^version: *//p' shard.yml | head -1)"
for f in \
"artifacts/amber_cli-source/amber_cli-source-${version}.tar.gz" \
"artifacts/amber_cli-source/amber_cli-source-${version}.tar.gz.sha256" \
artifacts/amber_cli-darwin-arm64/amber_cli-darwin-arm64.tar.gz \
artifacts/amber_cli-darwin-arm64/amber_cli-darwin-arm64.tar.gz.sha256 \
artifacts/amber_cli-linux-x86_64/amber_cli-linux-x86_64.tar.gz \
Expand All @@ -156,6 +209,30 @@ jobs:
echo "OK: $f"
done

- name: Verify archive hashes and write release notes
run: |
set -euo pipefail
version="$(sed -n 's/^version: *//p' shard.yml | head -1)"
commit_hash="$(git rev-parse HEAD)"
source_archive="amber_cli-source-${version}.tar.gz"
source_checksum_file="artifacts/amber_cli-source/${source_archive}.sha256"
(cd artifacts/amber_cli-source && sha256sum --check "${source_archive}.sha256")
mkdir -p dist
{
printf "# Amber CLI v%s\n\n" "$version"
printf "Release commit: \`%s\`\n\n" "$commit_hash"
printf "Archive SHA-256 values:\n\n"
printf "| Archive | SHA-256 |\n|---|---|\n"
printf "| \`%s\` | \`%s\` |\n" "$source_archive" "$(cut -d' ' -f1 < "$source_checksum_file")"
for target in darwin-arm64 linux-x86_64 linux-arm64; do
archive="amber_cli-${target}.tar.gz"
checksum_file="artifacts/amber_cli-${target}/${archive}.sha256"
(cd "artifacts/amber_cli-${target}" && sha256sum --check "${archive}.sha256")
printf "| \`%s\` | \`%s\` |\n" "$archive" "$(cut -d' ' -f1 < "$checksum_file")"
done
} > dist/release-notes.md
cat dist/release-notes.md

- name: Upload release assets
uses: softprops/action-gh-release@c12583777ecdfd3be55c69cf75464299dc01057e # v3
with:
Expand All @@ -166,22 +243,11 @@ jobs:
artifacts/amber_cli-linux-x86_64/amber_cli-linux-x86_64.tar.gz.sha256
artifacts/amber_cli-linux-arm64/amber_cli-linux-arm64.tar.gz
artifacts/amber_cli-linux-arm64/amber_cli-linux-arm64.tar.gz.sha256
artifacts/amber_cli-source/amber_cli-source-*.tar.gz
artifacts/amber_cli-source/amber_cli-source-*.tar.gz.sha256
tag_name: ${{ github.event.release.tag_name }}
fail_on_unmatched_files: true
body_path: dist/release-notes.md
append_body: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

notify-homebrew:
name: Notify Homebrew Tap
needs: upload-assets
runs-on: ubuntu-latest
if: github.event_name == 'release'

steps:
- name: Dispatch to underscore tap (homebrew-amber_cli)
uses: peter-evans/repository-dispatch@28959ce8df70de7be546dd1250a005dd32156697 # v4
with:
token: ${{ secrets.HOMEBREW_TAP_TOKEN }}
repository: amberframework/homebrew-amber_cli
event-type: release-published
client-payload: '{"version": "${{ github.event.release.tag_name }}"}'
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ Thumbs.db
/docs/**
!/docs/*.md
!/docs/.gitkeep
!/docs/guides/
!/docs/guides/*.md

# Build artifacts
/amber
Expand Down
4 changes: 4 additions & 0 deletions .minecart-policy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
version: 1
rules:
dependencies:
require_exact: true
Loading
Loading