diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..6e8663f --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,36 @@ +changelog: + exclude: + labels: + - ignore-for-release + - skip-changelog + authors: + - dependabot + - dependabot[bot] + categories: + - title: "🚀 New Features" + labels: + - feature + - enhancement + - feat + - title: "🎨 Manifesto & UI" + labels: + - design + - ui + - manifesto + - content + - title: "🧹 Maintenance" + labels: + - chore + - refactor + - maintenance + - title: "🐛 Bug Fixes" + labels: + - bug + - fix + - title: "📚 Documentation" + labels: + - documentation + - docs + - title: "📦 Other Changes" + labels: + - "*" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..693e745 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,124 @@ +name: Release + +on: + workflow_dispatch: + inputs: + version: + description: "Semver version without v, for example 1.1.0" + required: true + type: string + target: + description: "Commit, tag, or branch to release" + required: true + default: main + type: string + draft: + description: "Create the GitHub release as a draft" + required: true + default: true + type: boolean + prerelease: + description: "Mark the GitHub release as a prerelease" + required: true + default: false + type: boolean + notes: + description: "Optional release notes override. Leave empty to use GitHub generated notes." + required: false + type: string + +concurrency: + group: release-${{ inputs.version }} + cancel-in-progress: false + +permissions: + contents: write + +jobs: + release: + name: Create GitHub release + runs-on: ubuntu-latest + + steps: + - name: Guard release branch + if: github.ref != 'refs/heads/main' + run: | + echo "Releases must be started from the main branch workflow." + echo "Current ref: ${GITHUB_REF}" + exit 1 + + - name: Checkout target + uses: actions/checkout@v6 + with: + ref: ${{ inputs.target }} + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version: "24" + cache: npm + cache-dependency-path: app/package-lock.json + + - name: Install dependencies + working-directory: app + run: npm ci + + - name: Build + working-directory: app + run: npm run build + + - name: Test + working-directory: app + run: npm test + + - name: Check component LOC budget + working-directory: app + run: bash tests/check-component-loc.sh + + - name: Create release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + VERSION: ${{ inputs.version }} + DRAFT: ${{ inputs.draft }} + PRERELEASE: ${{ inputs.prerelease }} + NOTES: ${{ inputs.notes }} + run: | + set -euo pipefail + + if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Version must be strict semver without a leading v, for example 1.1.0." + exit 1 + fi + + tag="v${VERSION}" + target_sha="$(git rev-parse HEAD)" + + if git ls-remote --exit-code --tags origin "refs/tags/${tag}" >/dev/null 2>&1; then + echo "Tag ${tag} already exists on origin." + exit 1 + fi + + args=( + "$tag" + --target "$target_sha" + --title "AIDD Manifesto ${tag}" + ) + + if [[ "$DRAFT" == "true" ]]; then + args+=(--draft) + fi + + if [[ "$PRERELEASE" == "true" ]]; then + args+=(--prerelease) + fi + + if [[ -n "$NOTES" ]]; then + notes_file="$(mktemp)" + printf '%s\n' "$NOTES" > "$notes_file" + gh release create "${args[@]}" --notes-file "$notes_file" + else + gh release create "${args[@]}" --generate-notes + fi + + echo "Created GitHub release ${tag} for ${target_sha}." diff --git a/AGENTS.md b/AGENTS.md index 106d878..db29dce 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -89,6 +89,19 @@ app/ - Edit mode parent iframe : sentinelle `/*EDITMODE-BEGIN*/…/*EDITMODE-END*/` préservée dans `src/components/ClientApp.astro` (ne pas renommer). +## Illustrations des commitments + +- Les démos des 12 commitments vivent dans `app/src/components/principles/PrincipleDemo.astro` et `app/src/styles/sections/principle-demos.css`. +- Elles doivent expliquer le principe par un mécanisme visuel minimal et animé, pas par des icônes décoratives, des faux terminaux, ou des cartes textuelles génériques. +- Une bonne démo montre une transformation lisible : bloc vers incréments vérifiés, spec qui s'écrit, plan qui relie humain/codebase, apprentissage capturé, etc. +- Ajouter du texte uniquement quand il rend le schéma plus évident. Les labels doivent nommer des objets réels du workflow AIDD (`DEV`, `Plan`, `Implement`, `Review`, `Test`, `compact`, `new chat`) plutôt que des lettres abstraites. +- Commitment 07 : représenter un développeur responsable de la revue et de la maintenance. Ne pas utiliser un hash ou une marque abstraite à la place de la personne. +- Commitment 08 : l'évaluation doit être explicite. Montrer que le développeur peut lire/tester avant de déléguer ; éviter les schémas ambigus de lentilles ou de sas sans contexte. +- Commitment 09 : nommer les phases d'implémentation (`Plan`, `Implement`, `Review`, `Test`) plutôt que des initiales. +- Commitment 10 : montrer la continuité de contexte sous forme de chat compacté ou de nouveau chat démarré depuis le contexte précédent. +- Commitment 11 : montrer l'échec IA comme un diagnostic actionnable, pas comme un effet décoratif. Le schéma doit faire comprendre qu'on inspecte scope, contexte, hypothèses et tests. +- Commitment 12 : pousser l'idée de transférabilité : plusieurs personnes/outils doivent passer par une même méthode et produire une qualité comparable. + ## Édition du contenu - Ajouter/modifier un principe : `app/src/content/principles.ts`. diff --git a/app/src/components/ClientApp.astro b/app/src/components/ClientApp.astro index 1ae0f6b..cb14243 100644 --- a/app/src/components/ClientApp.astro +++ b/app/src/components/ClientApp.astro @@ -3,10 +3,9 @@ // EDIT MODE sentinel preserved verbatim (do not rename markers). ---