Files
ADconsle/docs/CONTRIBUTING.md
kzbkowskiandClaude Sonnet 5 b313c126ce
CI / PHP 8.2 (push) Failing after 1m40s
CI / PHP 8.3 (push) Failing after 55s
CI / PHP 8.4 (push) Failing after 1m11s
Release image / image (push) Successful in 2m33s
ADconsole v1.1.0
Config backup, a Docker dev/prod split, and a Gitea-built release image.

Added
- /settings -> General -> "Configuration backup": JSON export/import of the
  panel's general settings + attribute definitions
  (App\Services\ConfigBackupService); audited as config.export / config.import.
  Export can leave out the attribute-encryption key. No AD data included.
- docker/compose.dev.yaml: live-reload dev stack that bind-mounts the working
  tree. docker/php/Dockerfile is now multi-stage (base -> dev / prod).
- .github/workflows/release.yml: on every vX.Y.Z tag, builds the prod image and
  pushes gitea.kzbikowski.pl/kzbkowski/adconsole:{X.Y.Z,X.Y,latest}.

Changed
- docker/compose.yaml: self-contained prod image (app code + composer install
  --no-dev baked in via COPY); persistent state in docker/data/{app_storage,db};
  defaults to the released image (ADCONSOLE_VERSION pins a tag, ADCONSOLE_IMAGE
  replaces the ref). Apache now honours public/.htaccess (AllowOverride All).
  Run from the repo root with --env-file .env.
- Repo root now holds only README.md; CHANGELOG / CONTRIBUTING / SECURITY /
  CODE_OF_CONDUCT moved under docs/.

Upgrade notes: docs/upgrading.md#v110--docker-layout. Full log: docs/CHANGELOG.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JKT9p3bfP8RZesExdYCS52
2026-09-10 09:13:04 +02:00

68 lines
2.5 KiB
Markdown

# Contributing to ADconsole
Thanks for helping out. This is a small, focused project — a web UI for everyday
Active Directory administration. Contributions that keep it small and sharp are
very welcome.
## Before you start
- Read [`CLAUDE/AGENTS.md`](../CLAUDE/AGENTS.md) (the architecture in one page) and
[`architecture.md`](architecture.md).
- By participating you agree to the [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md).
- For anything non-trivial, open an issue first so we can agree on the approach.
## Ground rules
1. **No SQL storage for AD objects.** All directory reads/writes go through
LdapRecord. The database is for app infrastructure and `panel_settings` only.
2. **Every user-facing string is a translation key** in *both*
`lang/pl/*` and `lang/en/*`. No inline copy.
3. **Keep it dependency-light.** No new runtime Composer/npm package without a
clear reason in the issue.
4. **Least privilege.** New AD operations must be documented in
[`active-directory.md`](active-directory.md) with the exact right
they require.
5. **Security-sensitive by nature** — think about what a hostile panel user or a
compromised service account could do with your change.
## Dev loop
```sh
composer install
cp .env.example .env && php artisan key:generate
php artisan migrate
php artisan test
vendor/bin/pint
```
See [`development.md`](development.md) for the details (SQLite for dev,
the fake `ldap` guard in tests, the harmless `DEPR` tag, etc.).
## Pull requests
- Branch from `main`; keep the PR focused on one thing.
- Include tests for logic changes. Feature tests may seed caches / fake the
guard rather than hitting a real DC (see `tests/Feature/DashboardTest.php`).
- Run `php artisan test` and `vendor/bin/pint --test` — both must be green
(`DEPR` in the test summary is fine; `failed` is not).
- Update the relevant `docs/` page and add a `CHANGELOG.md` entry under
*Unreleased*.
- Describe the change, the motivation, and any AD permission / migration impact
in the PR body.
## Reporting bugs
Open an issue with: ADconsole version / commit, PHP version, how it's deployed
(Docker / bare metal), the exact error (with `APP_DEBUG=true` and the relevant
`storage/logs/laravel.log` lines — **redact DNs, hostnames and account names**),
and steps to reproduce.
## Security issues
**Do not** open a public issue — see [`SECURITY.md`](SECURITY.md).
## Licence
By contributing you agree your work is released under the project's
[MIT Licence](../LICENSE).