diff --git a/.gitea/scripts/bats-report.sh b/.gitea/scripts/bats-report.sh
new file mode 100644
index 0000000..fbebbfb
--- /dev/null
+++ b/.gitea/scripts/bats-report.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+REPORT_DIR="${1:-reports/bats}"
+INPUT="$REPORT_DIR/results.txt"
+OUTPUT="$REPORT_DIR/index.html"
+
+[ -f "$INPUT" ] || { echo "ERROR: $INPUT not found" >&2; exit 1; }
+
+TOTAL=$(grep -cE '^(ok|not ok) ' "$INPUT" 2>/dev/null || echo 0)
+PASS=$(grep -c '^ok ' "$INPUT" 2>/dev/null || echo 0)
+FAIL=$((TOTAL - PASS))
+
+{
+ echo '
'
+ echo "Bats test report ${GITHUB_SHA:0:8}"
+ echo ''
+ echo "Bats test report ${GITHUB_SHA:0:8}
"
+ echo "Total: ${TOTAL} | Passed: ${PASS} | Failed: ${FAIL}
"
+ echo '| # | Status | Test |
'
+
+ while IFS=' ' read -r status num rest; do
+ case "$status" in
+ ok) echo "| ${num} | PASS | ${rest} |
" ;;
+ not) echo "| ${num} | FAIL | ${rest} |
" ;;
+ esac
+ done < <(grep -E '^(ok|not ok) ' "$INPUT")
+
+ echo '
'
+} > "$OUTPUT"
+
+echo "$OUTPUT"
diff --git a/.gitea/workflows/build-feature.yml b/.gitea/workflows/build-feature.yml
index 34590f0..19b3144 100644
--- a/.gitea/workflows/build-feature.yml
+++ b/.gitea/workflows/build-feature.yml
@@ -45,15 +45,7 @@ jobs:
> "reports/${GITHUB_SHA:0:8}/bats/results.txt" 2>&1
BATS_EXIT=$?
docker volume rm bats-workspace > /dev/null 2>&1
- {
- echo "Bats tests
"
- for f in reports/${GITHUB_SHA:0:8}/bats/*; do
- b="$(basename $f)"
- [ "$b" = "index.html" ] && continue
- echo "- $b
"
- done
- echo "
"
- } > "reports/${GITHUB_SHA:0:8}/bats/index.html"
+ bash .ci/.gitea/scripts/bats-report.sh "reports/${GITHUB_SHA:0:8}/bats"
echo "BATS_EXIT=${BATS_EXIT}" >> "${GITHUB_ENV}"
exit ${BATS_EXIT}
@@ -137,7 +129,7 @@ jobs:
if [ "${TOOL_OK}" != "true" ]; then
STATUS="failure"
DESC="Cucumber tool unavailable"
- URL="https://gitea.app.keskikuja.site/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
+ URL="${GITEA_API_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}"
elif [ "${CUCUMBER_EXIT}" = "0" ]; then
STATUS="success"
DESC="Cucumber tests passed"
diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml
index b81e670..4d80a48 100644
--- a/.gitea/workflows/ci.yml
+++ b/.gitea/workflows/ci.yml
@@ -6,9 +6,9 @@ on:
jobs:
load-config:
- uses: niko/gitea-ci-library/.gitea/workflows/config-provider.yml@feature/pipeline-cleanup
+ uses: niko/gitea-ci-library/workflows/config-provider.yml@feature/pipeline-cleanup
with:
- config_path: feature-env.conf
+ config_path: .gitea/workflows/feature-env.conf
feature:
if: github.ref != 'refs/heads/main'
diff --git a/feature-env.conf b/.gitea/workflows/feature-env.conf
similarity index 100%
rename from feature-env.conf
rename to .gitea/workflows/feature-env.conf
diff --git a/docs/adr/0006-directory-ownership.md b/docs/adr/0006-directory-ownership.md
new file mode 100644
index 0000000..e124cb5
--- /dev/null
+++ b/docs/adr/0006-directory-ownership.md
@@ -0,0 +1,80 @@
+# 6. Directory ownership — provider vs consumer
+
+## Päätös
+
+Provider-repossa (`gitea-ci-library`) on seuraavat kansiot ja tiedostot,
+joilla on eri omistajuus- ja näkyvyyssäännöt:
+
+| Kansio | Omistaja | Näkyvyys | Tyyppi |
+|--------|----------|----------|--------|
+| `workflows/` | Provider | Consumer kutsuu `uses:` | Reusable workflowt |
+| `scripts/` | Provider | Vain providerin sisäinen | Bash-skriptit |
+| `.gitea/workflows/` | Consumer | Consumerin oma pipeline | Pipeline-logiikka |
+| `.gitea/scripts/` | Consumer | Consumerin oma | Consumer-skriptit |
+| `.gitea/workflows/feature-env.conf` | Consumer | Consumerin konffi | KEY=VALUE config |
+
+## Perustelu
+
+### Providerin `workflows/` (juuressa)
+
+Providerin reusable workflow -tiedostot, joita consumer kutsuu
+`uses:`-direktiivillä. Consumerilla on lukunäkyvyys mutta ei
+muokkausvastuuta. Esimerkki:
+
+```yaml
+uses: niko/gitea-ci-library/workflows/config-provider.yml@v1
+```
+
+Tämä on providerin julkinen rajapinta. Sijainti `workflows/` (juuressa)
+eikä `.gitea/workflows/` korostaa, että kyseessä on providerin tarjoama
+palvelu, ei consumerin oma pipeline.
+
+### Providerin `scripts/` (juuressa)
+
+Providerin sisäiset työkalut. Consumer ei koskaan kutsu näitä suoraan —
+vain providerin workflowt kutsuvat tupla checkoutin kautta:
+`.ci/scripts/publish-git-pages.sh`.
+
+Consumerilla ei ole suoraa polkua näihin tiedostoihin — ne saavuttaa
+vain providerin workflowjen kautta, jotka tupla checkouttaa providerin.
+
+### Consumerin `.gitea/workflows/`
+
+Consumerin oma pipeline-logiikka. Consumer omistaa ja muokkaa.
+Provider ei koskaan ohita tätä kansiota — ADR 0005.
+
+Tässä repossa (dogfood) consumer on sama repo, joten `.gitea/workflows/`
+näyttää providerin tiedostojen rinnalla. Arkkitehtuurisesti ne ovat
+erillisiä: jos consumer olisi eri repo, `.gitea/workflows/` olisi siellä.
+
+### Consumerin `.gitea/scripts/`
+
+Consumerin omat skriptit, jotka ovat osa consumerin pipeline-logiikkaa.
+Provider ei omista eikä ylläpidä näitä.
+
+Consumer-skriptit kutsutaan consumerin workflowista ilman tupla
+checkouttia: `.gitea/scripts/bats-report.sh`.
+
+### Consumerin `.gitea/workflows/feature-env.conf`
+
+Consumerin konfiguraatiotiedosto consumerin omassa kansiossa.
+Providerin `config-provider.yml` lukee tämän ja muuntaa JSONiksi, mutta
+consumer omistaa sisällön.
+
+## Vaikutukset
+
+- Provider voi muuttaa `workflows/` ja `scripts/` -kansioiden sisältöä
+ ilman consumerin hyväksyntää (versiovaihdon yhteydessä)
+- Consumer voi muuttaa `.gitea/workflows/` ja `.gitea/scripts/` -kansioiden
+ sisältöä ilman providerin muutoksia
+- Providerin workflowt käyttävät `.ci/scripts/...` -polkua (tupla checkout)
+- Consumerin workflowt käyttävät `.gitea/scripts/...` -polkua (natiivi checkout)
+- Config-tiedoston muoto on consumerin päätettävissä — provider vain lukee
+
+## Vertailu vanhaan rakenteeseen
+
+| Entinen sijainti | Uusi sijainti | Peruste |
+|------------------|---------------|---------|
+| `.gitea/workflows/config-provider.yml` | `workflows/config-provider.yml` | Providerin julkinen rajapinta pois consumer-kansiosta |
+| `.gitea/workflows/ci-engine.yml` | `workflows/ci-engine.yml` | Sama peruste |
+| `scripts/bats-report.sh` | `.gitea/scripts/bats-report.sh` | Consumerin oma skripti |
diff --git a/.gitea/workflows/ci-engine.yml b/workflows/ci-engine.yml
similarity index 100%
rename from .gitea/workflows/ci-engine.yml
rename to workflows/ci-engine.yml
diff --git a/.gitea/workflows/config-provider.yml b/workflows/config-provider.yml
similarity index 100%
rename from .gitea/workflows/config-provider.yml
rename to workflows/config-provider.yml