Repository navigation
feat(kanban): add view for kanban case #1149
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [main] | |
| pull_request: | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| packages: write | |
| id-token: write | |
| jobs: | |
| commitlint: | |
| name: Commitlint | |
| runs-on: ubuntu-latest | |
| if: "!startsWith(github.head_ref, 'release-please--')" | |
| permissions: | |
| contents: read | |
| pull-requests: read | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| fetch-depth: 0 | |
| - uses: wagoid/commitlint-github-action@b948419dd99f3fd78a6548d48f94e3df7f6bf3ed # v6.2.1 | |
| with: | |
| configFile: commitlint.config.cjs | |
| commitDepth: 1 | |
| release-please: | |
| name: Release Please | |
| runs-on: ubuntu-latest | |
| needs: [commitlint] | |
| if: | | |
| always() && | |
| github.event_name == 'push' && | |
| (needs.commitlint.result == 'success' || needs.commitlint.result == 'skipped') | |
| outputs: | |
| release_created: ${{ steps.release.outputs.release_created }} | |
| tag_name: ${{ steps.release.outputs.tag_name }} | |
| version: ${{ steps.release.outputs.version }} | |
| paths_released: ${{ steps.release.outputs.paths_released }} | |
| aidd_context_release_created: ${{ steps.release.outputs['plugins/aidd-context--release_created'] }} | |
| aidd_context_version: ${{ steps.release.outputs['plugins/aidd-context--version'] }} | |
| aidd_context_tag_name: ${{ steps.release.outputs['plugins/aidd-context--tag_name'] }} | |
| aidd_dev_release_created: ${{ steps.release.outputs['plugins/aidd-dev--release_created'] }} | |
| aidd_dev_version: ${{ steps.release.outputs['plugins/aidd-dev--version'] }} | |
| aidd_dev_tag_name: ${{ steps.release.outputs['plugins/aidd-dev--tag_name'] }} | |
| aidd_vcs_release_created: ${{ steps.release.outputs['plugins/aidd-vcs--release_created'] }} | |
| aidd_vcs_version: ${{ steps.release.outputs['plugins/aidd-vcs--version'] }} | |
| aidd_vcs_tag_name: ${{ steps.release.outputs['plugins/aidd-vcs--tag_name'] }} | |
| aidd_pm_release_created: ${{ steps.release.outputs['plugins/aidd-pm--release_created'] }} | |
| aidd_pm_version: ${{ steps.release.outputs['plugins/aidd-pm--version'] }} | |
| aidd_pm_tag_name: ${{ steps.release.outputs['plugins/aidd-pm--tag_name'] }} | |
| aidd_orchestrator_release_created: ${{ steps.release.outputs['plugins/aidd-orchestrator--release_created'] }} | |
| aidd_orchestrator_version: ${{ steps.release.outputs['plugins/aidd-orchestrator--version'] }} | |
| aidd_orchestrator_tag_name: ${{ steps.release.outputs['plugins/aidd-orchestrator--tag_name'] }} | |
| aidd_refine_release_created: ${{ steps.release.outputs['plugins/aidd-refine--release_created'] }} | |
| aidd_refine_version: ${{ steps.release.outputs['plugins/aidd-refine--version'] }} | |
| aidd_refine_tag_name: ${{ steps.release.outputs['plugins/aidd-refine--tag_name'] }} | |
| steps: | |
| - uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 | |
| id: app-token | |
| with: | |
| app-id: ${{ secrets.AIDD_BOT_APP_ID }} | |
| private-key: ${{ secrets.AIDD_BOT_PRIVATE_KEY }} | |
| - uses: googleapis/release-please-action@45996ed1f6d02564a971a2fa1b5860e934307cf7 # v5.0.0 | |
| id: release | |
| with: | |
| token: ${{ steps.app-token.outputs.token }} | |
| config-file: release-please-config.json | |
| manifest-file: .release-please-manifest.json | |
| # Auto-merge the Release PR release-please just opened/updated, with the | |
| # App token. `--admin` is required: a plain `gh pr merge` is refused by the | |
| # branch policy ("base branch policy prohibits the merge") even for a | |
| # bypass actor (verified in a sandbox). `--admin` performs the override | |
| # merge that the ruleset's bypass_actors entry permits for this App. | |
| # An App-token merge also re-fires the `push: main` and `release: published` | |
| # workflows that a GITHUB_TOKEN merge would not. | |
| # Guard on prs_created (PR opened), not releases_created (fires on merge). | |
| - name: Auto-merge the Release PR | |
| if: ${{ steps.release.outputs.prs_created == 'true' }} | |
| env: | |
| GH_TOKEN: ${{ steps.app-token.outputs.token }} | |
| run: gh pr merge "${{ fromJSON(steps.release.outputs.pr).number }}" --squash --admin --repo "${{ github.repository }}" | |
| # Pin GitHub's "Latest" badge to the umbrella marketplace release. | |
| # release-please creates the umbrella + every plugin release in one run | |
| # with no ordering guarantee, and GitHub marks whichever release is created | |
| # last as "Latest" (the create API defaults make_latest to true). That | |
| # lets a plugin release (e.g. aidd-dev-v2.3.0) outrank the marketplace | |
| # version whenever a cycle ships plugins alongside the umbrella. Bare | |
| # `tag_name` is the root "." package tag (the umbrella `v*`, the tag that | |
| # carries the marketplace bundle); forcing it latest auto-unsets the plugin | |
| # release that held the badge. The umbrella bumps every cycle, so a | |
| # release run always has a root tag to pin. | |
| - name: Pin umbrella release as latest | |
| if: ${{ steps.release.outputs.release_created == 'true' }} | |
| env: | |
| GH_TOKEN: ${{ steps.app-token.outputs.token }} | |
| run: gh release edit "${{ steps.release.outputs.tag_name }}" --latest --repo "${{ github.repository }}" | |
| build-and-attach: | |
| name: Build and attach marketplace | |
| needs: [release-please] | |
| if: needs.release-please.outputs.release_created == 'true' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| - name: Build clean marketplace bundle | |
| # A self-contained marketplace a user can extract and register with | |
| # `/plugin marketplace add ./aidd-framework-marketplace-<version>`. | |
| # Contains only what the marketplace needs: the catalog manifest and | |
| # the plugins. No framework-internal files (aidd_docs/, scripts/, etc.). | |
| run: | | |
| VERSION="${{ needs.release-please.outputs.version }}" | |
| STAGE_PARENT="$(mktemp -d)" | |
| STAGE="${STAGE_PARENT}/aidd-framework-marketplace-${VERSION}" | |
| mkdir -p "${STAGE}" | |
| cp -R .claude-plugin "${STAGE}/" | |
| cp -R plugins "${STAGE}/" | |
| ( cd "${STAGE_PARENT}" && zip -q -r "/tmp/aidd-framework-marketplace-${VERSION}.zip" "aidd-framework-marketplace-${VERSION}" ) | |
| - name: Attach marketplace bundle to release | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| VERSION="${{ needs.release-please.outputs.version }}" | |
| TAG="${{ needs.release-please.outputs.tag_name }}" | |
| gh release upload "${TAG}" \ | |
| "/tmp/aidd-framework-marketplace-${VERSION}.zip" \ | |
| --clobber | |
| build-per-tool: | |
| name: Build and attach per-tool distribution | |
| needs: [release-please] | |
| if: needs.release-please.outputs.release_created == 'true' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| # 9-cell matrix: 4 marketplace (claude/cursor/copilot/codex) + 5 flat | |
| # (+opencode, which is flat-only). Mirrors the CLI golden snapshot matrix. | |
| matrix: | |
| include: | |
| - { tool: claude, mode: marketplace, flag: "" } | |
| - { tool: cursor, mode: marketplace, flag: "" } | |
| - { tool: copilot, mode: marketplace, flag: "" } | |
| - { tool: codex, mode: marketplace, flag: "" } | |
| - { tool: claude, mode: flat, flag: "--flat" } | |
| - { tool: cursor, mode: flat, flag: "--flat" } | |
| - { tool: copilot, mode: flat, flag: "--flat" } | |
| - { tool: codex, mode: flat, flag: "--flat" } | |
| - { tool: opencode, mode: flat, flag: "--flat" } | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 | |
| with: | |
| node-version: "22" | |
| - name: Build the target-native distribution | |
| # Pin the CLI version: a future CLI release must not silently change | |
| # framework dist output. Bump deliberately alongside a framework change. | |
| run: | | |
| VERSION="${{ needs.release-please.outputs.version }}" | |
| NAME="aidd-framework-${{ matrix.tool }}-${{ matrix.mode }}-${VERSION}" | |
| # --out must live outside --source: the CLI refuses to build when one | |
| # path contains the other. Stage under RUNNER_TEMP, not the repo tree. | |
| OUT="${RUNNER_TEMP}/dist/${{ matrix.tool }}/${{ matrix.mode }}" | |
| mkdir -p "$OUT" | |
| npx --yes @ai-driven-dev/cli@5.1.1 framework build \ | |
| --source . --target ${{ matrix.tool }} --out "$OUT" ${{ matrix.flag }} | |
| STAGE="$(mktemp -d)/${NAME}" | |
| mkdir -p "$STAGE" | |
| cp -R "$OUT"/. "$STAGE"/ | |
| ( cd "$(dirname "$STAGE")" && zip -q -r "/tmp/${NAME}.zip" "${NAME}" ) | |
| - name: Attach per-tool distribution to release | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| VERSION="${{ needs.release-please.outputs.version }}" | |
| TAG="${{ needs.release-please.outputs.tag_name }}" | |
| NAME="aidd-framework-${{ matrix.tool }}-${{ matrix.mode }}-${VERSION}" | |
| gh release upload "${TAG}" "/tmp/${NAME}.zip" --clobber | |
| build-plugin: | |
| name: Build and attach plugin | |
| needs: [release-please] | |
| if: needs.release-please.outputs.paths_released != '' && needs.release-please.outputs.paths_released != '[]' | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| plugin: [aidd-context, aidd-dev, aidd-vcs, aidd-pm, aidd-orchestrator, aidd-refine] | |
| steps: | |
| - name: Check if this plugin was released | |
| id: check | |
| run: | | |
| PATHS='${{ needs.release-please.outputs.paths_released }}' | |
| if echo "$PATHS" | jq -e --arg p "plugins/${{ matrix.plugin }}" 'map(. == $p) | any' > /dev/null 2>&1; then | |
| echo "released=true" >> $GITHUB_OUTPUT | |
| else | |
| echo "released=false" >> $GITHUB_OUTPUT | |
| fi | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| if: steps.check.outputs.released == 'true' | |
| - name: Get plugin version | |
| id: version | |
| if: steps.check.outputs.released == 'true' | |
| run: | | |
| VERSION=$(jq -r '.version' "plugins/${{ matrix.plugin }}/.claude-plugin/plugin.json") | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| - name: Build plugin bundle | |
| if: steps.check.outputs.released == 'true' | |
| # Clean, self-contained plugin directory. A user extracts it and | |
| # installs the plugin locally. No framework-internal files. | |
| run: | | |
| PLUGIN="${{ matrix.plugin }}" | |
| VERSION="${{ steps.version.outputs.version }}" | |
| ( cd plugins && zip -q -r "/tmp/${PLUGIN}-v${VERSION}.zip" "${PLUGIN}" ) | |
| - name: Attach plugin bundle to release | |
| if: steps.check.outputs.released == 'true' | |
| env: | |
| GH_TOKEN: ${{ github.token }} | |
| run: | | |
| PLUGIN="${{ matrix.plugin }}" | |
| VERSION="${{ steps.version.outputs.version }}" | |
| TAG="${PLUGIN}-v${VERSION}" | |
| gh release upload "${TAG}" \ | |
| "/tmp/${PLUGIN}-v${VERSION}.zip" \ | |
| --clobber | |
| publish-cli: | |
| name: Publish cli | |
| needs: [release-please] | |
| if: needs.release-please.outputs.paths_released != '' && contains(fromJSON(needs.release-please.outputs.paths_released), 'cli') | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| - name: Install pnpm | |
| run: | | |
| corepack enable | |
| corepack prepare pnpm@latest --activate | |
| - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 | |
| with: | |
| node-version: "22" | |
| # kanban/ is bundled into the CLI from source, so its dependencies must be | |
| # installed before the build can resolve them. | |
| - run: cd kanban && pnpm install --frozen-lockfile | |
| - run: cd cli && pnpm install --frozen-lockfile | |
| - run: cd cli && pnpm build | |
| - name: Publish to GitHub Packages | |
| continue-on-error: true | |
| working-directory: cli | |
| run: | | |
| printf '%s\n%s\n' "@ai-driven-dev:registry=https://npm.pkg.github.com" "//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}" > .npmrc | |
| pnpm publish --no-git-checks | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| # Real OIDC trusted publishing (npm CLI >= 11.5.1, Node >= 22.14.0), not a | |
| # token — matches the npmjs.com trusted-publisher entry for | |
| # ai-driven-dev/framework, workflow ci.yml. No NPM_TOKEN secret needed. | |
| # `npm publish`, not `pnpm publish`: pnpm's OIDC support is unverified/ | |
| # buggy as of this writing (pnpm/pnpm#9812, #11513) — npm's own CLI is | |
| # the reference implementation for its own feature. | |
| - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 | |
| with: | |
| node-version: "22" | |
| registry-url: "https://registry.npmjs.org" | |
| - name: Publish to npm | |
| working-directory: cli | |
| run: | | |
| rm -f .npmrc | |
| npm install -g npm@latest | |
| npm publish --access public |