diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..3390c9e54 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,13 @@ +version: 2 +updates: + - package-ecosystem: "npm" + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 + cooldown: + default-days: 1 + include: + - "*" + exclude: + - "@conduction/*" diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..3942d3489 --- /dev/null +++ b/.npmrc @@ -0,0 +1,5 @@ +# Supply-chain hardening: reject any npm package published less than +# 24h ago. Compromised first-party-Conduction packages are excluded via +# Dependabot cooldown (.github/dependabot.yml); for fresh @conduction/* +# releases, override per-install with `npm install --min-release-age=0`. +min-release-age=1 diff --git a/docusaurus/.gitignore b/docs/.gitignore similarity index 100% rename from docusaurus/.gitignore rename to docs/.gitignore diff --git a/docusaurus/blog/2019-05-28-first-blog-post.md b/docs/blog/2019-05-28-first-blog-post.md similarity index 100% rename from docusaurus/blog/2019-05-28-first-blog-post.md rename to docs/blog/2019-05-28-first-blog-post.md diff --git a/docusaurus/blog/2019-05-29-long-blog-post.md b/docs/blog/2019-05-29-long-blog-post.md similarity index 100% rename from docusaurus/blog/2019-05-29-long-blog-post.md rename to docs/blog/2019-05-29-long-blog-post.md diff --git a/docusaurus/blog/2021-08-01-mdx-blog-post.mdx b/docs/blog/2021-08-01-mdx-blog-post.mdx similarity index 100% rename from docusaurus/blog/2021-08-01-mdx-blog-post.mdx rename to docs/blog/2021-08-01-mdx-blog-post.mdx diff --git a/docusaurus/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg b/docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg similarity index 100% rename from docusaurus/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg rename to docs/blog/2021-08-26-welcome/docusaurus-plushie-banner.jpeg diff --git a/docusaurus/blog/2021-08-26-welcome/index.md b/docs/blog/2021-08-26-welcome/index.md similarity index 100% rename from docusaurus/blog/2021-08-26-welcome/index.md rename to docs/blog/2021-08-26-welcome/index.md diff --git a/docusaurus/blog/authors.yml b/docs/blog/authors.yml similarity index 100% rename from docusaurus/blog/authors.yml rename to docs/blog/authors.yml diff --git a/docusaurus/blog/tags.yml b/docs/blog/tags.yml similarity index 100% rename from docusaurus/blog/tags.yml rename to docs/blog/tags.yml diff --git a/docusaurus/docusaurus.config.js b/docs/docusaurus.config.js similarity index 99% rename from docusaurus/docusaurus.config.js rename to docs/docusaurus.config.js index 9d6671978..71a832989 100644 --- a/docusaurus/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -119,6 +119,7 @@ const config = createConfig({ (colorMode + navbar + footer). Custom prism + mermaid theme overrides land alongside. */ themeConfig: { + image: 'img/og-openconnector.png', prism: { theme: { plain: { diff --git a/docusaurus/package-lock.json b/docs/package-lock.json similarity index 100% rename from docusaurus/package-lock.json rename to docs/package-lock.json diff --git a/docusaurus/package.json b/docs/package.json similarity index 89% rename from docusaurus/package.json rename to docs/package.json index ea8bd9b64..b17122fef 100644 --- a/docusaurus/package.json +++ b/docs/package.json @@ -6,6 +6,8 @@ "docusaurus": "docusaurus", "start": "docusaurus start", "build": "docusaurus build", + "postbuild": "validate-ai-baseline", + "validate:ai-baseline": "validate-ai-baseline", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", @@ -15,7 +17,7 @@ "ci": "npm ci --legacy-peer-deps && npm run build" }, "dependencies": { - "@conduction/docusaurus-preset": "^2.6.1", + "@conduction/docusaurus-preset": "^3.5.0", "@docusaurus/core": "^3.10.0", "@docusaurus/preset-classic": "^3.10.0", "@docusaurus/theme-mermaid": "^3.10.0", diff --git a/docusaurus/sidebars.js b/docs/sidebars.js similarity index 100% rename from docusaurus/sidebars.js rename to docs/sidebars.js diff --git a/docusaurus/src/components/HomepageFeatures/index.js b/docs/src/components/HomepageFeatures/index.js similarity index 100% rename from docusaurus/src/components/HomepageFeatures/index.js rename to docs/src/components/HomepageFeatures/index.js diff --git a/docusaurus/src/components/HomepageFeatures/styles.module.css b/docs/src/components/HomepageFeatures/styles.module.css similarity index 100% rename from docusaurus/src/components/HomepageFeatures/styles.module.css rename to docs/src/components/HomepageFeatures/styles.module.css diff --git a/docusaurus/src/css/custom.css b/docs/src/css/custom.css similarity index 100% rename from docusaurus/src/css/custom.css rename to docs/src/css/custom.css diff --git a/docusaurus/src/pages/index.js b/docs/src/pages/index.js similarity index 100% rename from docusaurus/src/pages/index.js rename to docs/src/pages/index.js diff --git a/docusaurus/src/pages/index.module.css b/docs/src/pages/index.module.css similarity index 100% rename from docusaurus/src/pages/index.module.css rename to docs/src/pages/index.module.css diff --git a/docusaurus/src/pages/markdown-page.md b/docs/src/pages/markdown-page.md similarity index 100% rename from docusaurus/src/pages/markdown-page.md rename to docs/src/pages/markdown-page.md diff --git a/docusaurus/static/.nojekyll b/docs/static/.nojekyll similarity index 100% rename from docusaurus/static/.nojekyll rename to docs/static/.nojekyll diff --git a/docusaurus/static/CNAME b/docs/static/CNAME similarity index 100% rename from docusaurus/static/CNAME rename to docs/static/CNAME diff --git a/docusaurus/static/img/docusaurus-social-card.jpg b/docs/static/img/docusaurus-social-card.jpg similarity index 100% rename from docusaurus/static/img/docusaurus-social-card.jpg rename to docs/static/img/docusaurus-social-card.jpg diff --git a/docusaurus/static/img/docusaurus.png b/docs/static/img/docusaurus.png similarity index 100% rename from docusaurus/static/img/docusaurus.png rename to docs/static/img/docusaurus.png diff --git a/docusaurus/static/img/favicon.ico b/docs/static/img/favicon.ico similarity index 100% rename from docusaurus/static/img/favicon.ico rename to docs/static/img/favicon.ico diff --git a/docusaurus/static/img/logo.svg b/docs/static/img/logo.svg similarity index 100% rename from docusaurus/static/img/logo.svg rename to docs/static/img/logo.svg diff --git a/docs/static/img/og-openconnector.png b/docs/static/img/og-openconnector.png new file mode 100644 index 000000000..9410b4336 Binary files /dev/null and b/docs/static/img/og-openconnector.png differ diff --git a/docusaurus/static/img/undraw_docusaurus_mountain.svg b/docs/static/img/undraw_docusaurus_mountain.svg similarity index 100% rename from docusaurus/static/img/undraw_docusaurus_mountain.svg rename to docs/static/img/undraw_docusaurus_mountain.svg diff --git a/docusaurus/static/img/undraw_docusaurus_react.svg b/docs/static/img/undraw_docusaurus_react.svg similarity index 100% rename from docusaurus/static/img/undraw_docusaurus_react.svg rename to docs/static/img/undraw_docusaurus_react.svg diff --git a/docusaurus/static/img/undraw_docusaurus_tree.svg b/docs/static/img/undraw_docusaurus_tree.svg similarity index 100% rename from docusaurus/static/img/undraw_docusaurus_tree.svg rename to docs/static/img/undraw_docusaurus_tree.svg diff --git a/docs/static/llms.txt b/docs/static/llms.txt new file mode 100644 index 000000000..3f776a55a --- /dev/null +++ b/docs/static/llms.txt @@ -0,0 +1,23 @@ +# OpenConnector + +> OpenConnector is an open-source data-synchronization app for the Nextcloud workspace. + +OpenConnector is an open-source data-synchronization app for the Nextcloud workspace. It connects APIs, databases, file systems, and external services to OpenRegister, transforms payloads through configurable mappings, and schedules automated sync jobs with event and webhook triggers. It also exposes endpoints, consumers, and business rules, so government teams can build integrations without a separate ESB. Released under EUPL-1.2 and maintained by Conduction since 2019. + +## Docs + +- [Documentation](https://openconnector.conduction.nl/docs/intro): main entry, including tutorials, user guide, and admin guide. +- [API reference](https://openconnector.conduction.nl/api): OpenAPI documentation. + +## Optional + +- [Install](https://www.conduction.nl/install): self-host on your Nextcloud instance. +- [Source code](https://github.com/ConductionNL/openconnector): repository and issue tracker. +- [App page](https://www.conduction.nl/apps/openconnector): product positioning on conduction.nl. + +## Contact + +- Email: info@conduction.nl +- Web: https://www.conduction.nl +- GitHub: https://github.com/ConductionNL +- Conduction B.V. · KvK 76741850 · Lauriergracht 14h, Amsterdam, Netherlands diff --git a/docusaurus/static/screenshots/tutorials/admin/.gitkeep b/docs/static/screenshots/tutorials/admin/.gitkeep similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/.gitkeep rename to docs/static/screenshots/tutorials/admin/.gitkeep diff --git a/docusaurus/static/screenshots/tutorials/admin/01-import-configuration-01.png b/docs/static/screenshots/tutorials/admin/01-import-configuration-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/01-import-configuration-01.png rename to docs/static/screenshots/tutorials/admin/01-import-configuration-01.png diff --git a/docusaurus/static/screenshots/tutorials/admin/01-import-configuration-02.png b/docs/static/screenshots/tutorials/admin/01-import-configuration-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/01-import-configuration-02.png rename to docs/static/screenshots/tutorials/admin/01-import-configuration-02.png diff --git a/docusaurus/static/screenshots/tutorials/admin/01-import-configuration-03.png b/docs/static/screenshots/tutorials/admin/01-import-configuration-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/01-import-configuration-03.png rename to docs/static/screenshots/tutorials/admin/01-import-configuration-03.png diff --git a/docusaurus/static/screenshots/tutorials/admin/01-import-configuration-04.png b/docs/static/screenshots/tutorials/admin/01-import-configuration-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/01-import-configuration-04.png rename to docs/static/screenshots/tutorials/admin/01-import-configuration-04.png diff --git a/docusaurus/static/screenshots/tutorials/admin/02-schedule-job-01.png b/docs/static/screenshots/tutorials/admin/02-schedule-job-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/02-schedule-job-01.png rename to docs/static/screenshots/tutorials/admin/02-schedule-job-01.png diff --git a/docusaurus/static/screenshots/tutorials/admin/02-schedule-job-02.png b/docs/static/screenshots/tutorials/admin/02-schedule-job-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/02-schedule-job-02.png rename to docs/static/screenshots/tutorials/admin/02-schedule-job-02.png diff --git a/docusaurus/static/screenshots/tutorials/admin/02-schedule-job-03.png b/docs/static/screenshots/tutorials/admin/02-schedule-job-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/02-schedule-job-03.png rename to docs/static/screenshots/tutorials/admin/02-schedule-job-03.png diff --git a/docusaurus/static/screenshots/tutorials/admin/02-schedule-job-04.png b/docs/static/screenshots/tutorials/admin/02-schedule-job-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/02-schedule-job-04.png rename to docs/static/screenshots/tutorials/admin/02-schedule-job-04.png diff --git a/docusaurus/static/screenshots/tutorials/admin/02-schedule-job-05.png b/docs/static/screenshots/tutorials/admin/02-schedule-job-05.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/02-schedule-job-05.png rename to docs/static/screenshots/tutorials/admin/02-schedule-job-05.png diff --git a/docusaurus/static/screenshots/tutorials/admin/03-review-logs-01.png b/docs/static/screenshots/tutorials/admin/03-review-logs-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/03-review-logs-01.png rename to docs/static/screenshots/tutorials/admin/03-review-logs-01.png diff --git a/docusaurus/static/screenshots/tutorials/admin/03-review-logs-02.png b/docs/static/screenshots/tutorials/admin/03-review-logs-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/03-review-logs-02.png rename to docs/static/screenshots/tutorials/admin/03-review-logs-02.png diff --git a/docusaurus/static/screenshots/tutorials/admin/03-review-logs-03.png b/docs/static/screenshots/tutorials/admin/03-review-logs-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/03-review-logs-03.png rename to docs/static/screenshots/tutorials/admin/03-review-logs-03.png diff --git a/docusaurus/static/screenshots/tutorials/admin/03-review-logs-04.png b/docs/static/screenshots/tutorials/admin/03-review-logs-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/03-review-logs-04.png rename to docs/static/screenshots/tutorials/admin/03-review-logs-04.png diff --git a/docusaurus/static/screenshots/tutorials/admin/03-review-logs-05.png b/docs/static/screenshots/tutorials/admin/03-review-logs-05.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/admin/03-review-logs-05.png rename to docs/static/screenshots/tutorials/admin/03-review-logs-05.png diff --git a/docusaurus/static/screenshots/tutorials/user/.gitkeep b/docs/static/screenshots/tutorials/user/.gitkeep similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/.gitkeep rename to docs/static/screenshots/tutorials/user/.gitkeep diff --git a/docusaurus/static/screenshots/tutorials/user/01-first-launch-01.png b/docs/static/screenshots/tutorials/user/01-first-launch-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/01-first-launch-01.png rename to docs/static/screenshots/tutorials/user/01-first-launch-01.png diff --git a/docusaurus/static/screenshots/tutorials/user/01-first-launch-02.png b/docs/static/screenshots/tutorials/user/01-first-launch-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/01-first-launch-02.png rename to docs/static/screenshots/tutorials/user/01-first-launch-02.png diff --git a/docusaurus/static/screenshots/tutorials/user/01-first-launch-03.png b/docs/static/screenshots/tutorials/user/01-first-launch-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/01-first-launch-03.png rename to docs/static/screenshots/tutorials/user/01-first-launch-03.png diff --git a/docusaurus/static/screenshots/tutorials/user/01-first-launch-04.png b/docs/static/screenshots/tutorials/user/01-first-launch-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/01-first-launch-04.png rename to docs/static/screenshots/tutorials/user/01-first-launch-04.png diff --git a/docusaurus/static/screenshots/tutorials/user/02-add-source-01.png b/docs/static/screenshots/tutorials/user/02-add-source-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/02-add-source-01.png rename to docs/static/screenshots/tutorials/user/02-add-source-01.png diff --git a/docusaurus/static/screenshots/tutorials/user/02-add-source-02.png b/docs/static/screenshots/tutorials/user/02-add-source-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/02-add-source-02.png rename to docs/static/screenshots/tutorials/user/02-add-source-02.png diff --git a/docusaurus/static/screenshots/tutorials/user/02-add-source-03.png b/docs/static/screenshots/tutorials/user/02-add-source-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/02-add-source-03.png rename to docs/static/screenshots/tutorials/user/02-add-source-03.png diff --git a/docusaurus/static/screenshots/tutorials/user/02-add-source-04.png b/docs/static/screenshots/tutorials/user/02-add-source-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/02-add-source-04.png rename to docs/static/screenshots/tutorials/user/02-add-source-04.png diff --git a/docusaurus/static/screenshots/tutorials/user/02-add-source-05.png b/docs/static/screenshots/tutorials/user/02-add-source-05.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/02-add-source-05.png rename to docs/static/screenshots/tutorials/user/02-add-source-05.png diff --git a/docusaurus/static/screenshots/tutorials/user/03-create-mapping-01.png b/docs/static/screenshots/tutorials/user/03-create-mapping-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/03-create-mapping-01.png rename to docs/static/screenshots/tutorials/user/03-create-mapping-01.png diff --git a/docusaurus/static/screenshots/tutorials/user/03-create-mapping-02.png b/docs/static/screenshots/tutorials/user/03-create-mapping-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/03-create-mapping-02.png rename to docs/static/screenshots/tutorials/user/03-create-mapping-02.png diff --git a/docusaurus/static/screenshots/tutorials/user/03-create-mapping-03.png b/docs/static/screenshots/tutorials/user/03-create-mapping-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/03-create-mapping-03.png rename to docs/static/screenshots/tutorials/user/03-create-mapping-03.png diff --git a/docusaurus/static/screenshots/tutorials/user/03-create-mapping-04.png b/docs/static/screenshots/tutorials/user/03-create-mapping-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/03-create-mapping-04.png rename to docs/static/screenshots/tutorials/user/03-create-mapping-04.png diff --git a/docusaurus/static/screenshots/tutorials/user/03-create-mapping-05.png b/docs/static/screenshots/tutorials/user/03-create-mapping-05.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/03-create-mapping-05.png rename to docs/static/screenshots/tutorials/user/03-create-mapping-05.png diff --git a/docusaurus/static/screenshots/tutorials/user/04-run-synchronization-01.png b/docs/static/screenshots/tutorials/user/04-run-synchronization-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/04-run-synchronization-01.png rename to docs/static/screenshots/tutorials/user/04-run-synchronization-01.png diff --git a/docusaurus/static/screenshots/tutorials/user/04-run-synchronization-02.png b/docs/static/screenshots/tutorials/user/04-run-synchronization-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/04-run-synchronization-02.png rename to docs/static/screenshots/tutorials/user/04-run-synchronization-02.png diff --git a/docusaurus/static/screenshots/tutorials/user/04-run-synchronization-03.png b/docs/static/screenshots/tutorials/user/04-run-synchronization-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/04-run-synchronization-03.png rename to docs/static/screenshots/tutorials/user/04-run-synchronization-03.png diff --git a/docusaurus/static/screenshots/tutorials/user/04-run-synchronization-04.png b/docs/static/screenshots/tutorials/user/04-run-synchronization-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/04-run-synchronization-04.png rename to docs/static/screenshots/tutorials/user/04-run-synchronization-04.png diff --git a/docusaurus/static/screenshots/tutorials/user/04-run-synchronization-05.png b/docs/static/screenshots/tutorials/user/04-run-synchronization-05.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/04-run-synchronization-05.png rename to docs/static/screenshots/tutorials/user/04-run-synchronization-05.png diff --git a/docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-01.png b/docs/static/screenshots/tutorials/user/05-expose-endpoint-01.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-01.png rename to docs/static/screenshots/tutorials/user/05-expose-endpoint-01.png diff --git a/docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-02.png b/docs/static/screenshots/tutorials/user/05-expose-endpoint-02.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-02.png rename to docs/static/screenshots/tutorials/user/05-expose-endpoint-02.png diff --git a/docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-03.png b/docs/static/screenshots/tutorials/user/05-expose-endpoint-03.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-03.png rename to docs/static/screenshots/tutorials/user/05-expose-endpoint-03.png diff --git a/docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-04.png b/docs/static/screenshots/tutorials/user/05-expose-endpoint-04.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-04.png rename to docs/static/screenshots/tutorials/user/05-expose-endpoint-04.png diff --git a/docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-05.png b/docs/static/screenshots/tutorials/user/05-expose-endpoint-05.png similarity index 100% rename from docusaurus/static/screenshots/tutorials/user/05-expose-endpoint-05.png rename to docs/static/screenshots/tutorials/user/05-expose-endpoint-05.png diff --git a/docusaurus/README.md b/docusaurus/README.md deleted file mode 100644 index 0c6c2c27b..000000000 --- a/docusaurus/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Website - -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. - -### Installation - -``` -$ yarn -``` - -### Local Development - -``` -$ yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -### Build - -``` -$ yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -### Deployment - -Using SSH: - -``` -$ USE_SSH=true yarn deploy -``` - -Not using SSH: - -``` -$ GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/openspec/changes/dso-omgevingsloket/tasks.md b/openspec/changes/dso-omgevingsloket/tasks.md index 1eb367803..1bd31b423 100644 --- a/openspec/changes/dso-omgevingsloket/tasks.md +++ b/openspec/changes/dso-omgevingsloket/tasks.md @@ -1,5 +1,7 @@ # Tasks: dso-omgevingsloket +> Sub-bullets describe the work per task. Each top-level checkbox is the unit Hydra tracks; flip when the whole task (implementation + tests) is done. ADR-032 cap respected (≤20). + ## Task 1: STAM Endpoint Registration (REQ-DSO-001) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-001` - **files**: `lib/Controller/DSOController.php`, `appinfo/routes.php` @@ -7,11 +9,8 @@ - GIVEN DSO adapter endpoint registered WHEN DSO-LV pushes verzoek THEN HTTP 202 returned with verzoekId - GIVEN invalid webhook signature WHEN request arrives THEN HTTP 401 returned - GIVEN malformed payload WHEN schema validation fails THEN HTTP 400 with field-level errors -- [ ] Implement DSOController with STAM endpoint -- [ ] Register route at /api/dso/stam/verzoeken -- [ ] Add webhook signature validation -- [ ] Add schema validation -- [ ] Test +- Implement DSOController with STAM endpoint, route registration, webhook signature + schema validation, tests +- [ ] Task complete ## Task 2: Verzoek Payload Parsing (REQ-DSO-004) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-004` @@ -20,12 +19,8 @@ - GIVEN verzoek with aanvrager, locatie, activiteiten WHEN parser runs THEN structured data extracted - GIVEN GML geometrie WHEN parser runs THEN GeoJSON conversion produced - GIVEN version mismatch WHEN parsing THEN auto-detection attempted with warning -- [ ] Implement DSOParserService -- [ ] Add BSN/KVK extraction -- [ ] Add locatie/BAG parsing -- [ ] Add activiteiten parsing -- [ ] Add GML to GeoJSON conversion -- [ ] Test +- Implement DSOParserService (BSN/KVK extraction, locatie/BAG parsing, activiteiten parsing, GML→GeoJSON), tests +- [ ] Task complete ## Task 3: Verzoek Schema Validation (REQ-DSO-006) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-006` @@ -33,10 +28,8 @@ - **acceptance_criteria**: - GIVEN missing required fields WHEN validation runs THEN descriptive errors returned - GIVEN invalid BSN (11-proef fails) WHEN validation runs THEN BSN error returned -- [ ] Implement STAM schema validation -- [ ] Add BSN 11-proef validation -- [ ] Add date format validation -- [ ] Test +- Implement STAM schema validation + BSN 11-proef + date format validation, tests +- [ ] Task complete ## Task 4: Melding and Informatieverzoek Reception (REQ-DSO-002, REQ-DSO-003) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-002`, `#req-dso-003` @@ -44,10 +37,8 @@ - **acceptance_criteria**: - GIVEN melding received WHEN processed THEN zaak created with "Melding" zaaktype - GIVEN vooroverleg received WHEN processed THEN lightweight zaak created -- [ ] Implement melding handling -- [ ] Implement informatieverzoek handling -- [ ] Implement vooroverleg handling -- [ ] Test +- Implement melding, informatieverzoek, vooroverleg handling, tests +- [ ] Task complete ## Task 5: Bijlagen Download and Storage (REQ-DSO-005) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-005` @@ -55,11 +46,8 @@ - **acceptance_criteria**: - GIVEN verzoek with bijlagen WHEN processed THEN files downloaded and stored in Nextcloud Files - GIVEN download failure WHEN retries exhausted THEN warning flagged on zaak -- [ ] Implement bijlagen download with mTLS -- [ ] Add retry with exponential backoff -- [ ] Add file size limit check -- [ ] Add folder structure creation -- [ ] Test +- Implement bijlagen download with mTLS + retry with exponential backoff + file size limit + folder structure, tests +- [ ] Task complete ## Task 6: Activiteiten-to-Zaaktype Mapping (REQ-DSO-010) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-010` @@ -67,9 +55,8 @@ - **acceptance_criteria**: - GIVEN mapping table configured WHEN verzoek has activiteit THEN correct zaaktype used - GIVEN empty mapping table WHEN admin loads defaults THEN 25+ mappings seeded -- [ ] Implement mapping table lookup -- [ ] Add default mapping seed -- [ ] Test +- Implement mapping table lookup + default mapping seed, tests +- [ ] Task complete ## Task 7: Samenloop Handling (REQ-DSO-011) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-011` @@ -77,18 +64,16 @@ - **acceptance_criteria**: - GIVEN multiple activiteiten with deelzaken strategy WHEN processed THEN hoofdzaak + deelzaken created - GIVEN gecombineerd strategy WHEN processed THEN single combined zaak created -- [ ] Implement deelzaken strategy -- [ ] Implement gecombineerd strategy -- [ ] Test +- Implement deelzaken + gecombineerd strategies, tests +- [ ] Task complete ## Task 8: Unmapped Activiteit Fallback (REQ-DSO-013) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-013` - **files**: `lib/Service/DSOAdapterService.php` - **acceptance_criteria**: - GIVEN unmapped activiteit WHEN processed THEN triage zaak created with notification -- [ ] Implement fallback zaaktype creation -- [ ] Add notification to triage user -- [ ] Test +- Implement fallback zaaktype creation + triage-user notification, tests +- [ ] Task complete ## Task 9: Automatic Zaak Creation (REQ-DSO-020) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-020` @@ -96,9 +81,8 @@ - **acceptance_criteria**: - GIVEN valid verzoek parsed WHEN zaak creation runs THEN zaak has all mapped fields - GIVEN zaak created WHEN complete THEN EventService dispatches event for n8n -- [ ] Implement zaak creation via OpenRegister -- [ ] Add event dispatch -- [ ] Test +- Implement zaak creation via OpenRegister + event dispatch, tests +- [ ] Task complete ## Task 10: DSO-SWF Samenwerking (REQ-DSO-030) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-030` @@ -106,9 +90,8 @@ - **acceptance_criteria**: - GIVEN zaak requires advies WHEN behandelaar marks for samenwerking THEN adviesverzoek sent via DSO-SWF - GIVEN advies received WHEN processed THEN stored and behandelaar notified -- [ ] Implement adviesverzoek sending -- [ ] Implement advies reception -- [ ] Test +- Implement adviesverzoek sending + advies reception, tests +- [ ] Task complete ## Task 11: Status Push to DSO-LV (REQ-DSO-040) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-040` @@ -116,9 +99,8 @@ - **acceptance_criteria**: - GIVEN zaak status changes WHEN DSO-originated zaak THEN status pushed to DSO-LV - GIVEN push fails WHEN retries exhausted THEN manual-retry task created -- [ ] Implement status mapping -- [ ] Implement outbound push with retry -- [ ] Test +- Implement status mapping + outbound push with retry, tests +- [ ] Task complete ## Task 12: PKIoverheid Certificate Authentication (REQ-DSO-050) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-050` @@ -126,9 +108,8 @@ - **acceptance_criteria**: - GIVEN PKIoverheid certificate configured WHEN outbound call made THEN mTLS used - GIVEN certificate expiring in 30 days WHEN health check runs THEN warning notification sent -- [ ] Implement certificate validation -- [ ] Add expiry monitoring -- [ ] Test +- Implement certificate validation + expiry monitoring, tests +- [ ] Task complete ## Task 13: Source Registration (REQ-DSO-060) - **spec_ref**: `specs/dso-omgevingsloket/spec.md#req-dso-060` @@ -136,26 +117,17 @@ - **acceptance_criteria**: - GIVEN new source type "dso" WHEN configured THEN DSO-specific fields stored - GIVEN DSO source WHEN test connection clicked THEN STAM probe validates connectivity -- [ ] Add "dso" source type -- [ ] Implement test connection -- [ ] Test +- Add "dso" source type + implement test connection (STAM probe), tests +- [ ] Task complete ## Task 14: Unit Tests - **spec_ref**: ADR-009 - **files**: `tests/Unit/Service/DSOParserServiceTest.php`, `tests/Unit/Controller/DSOControllerTest.php` -- [ ] Write parser tests (BSN validation, payload extraction, GML conversion) -- [ ] Write controller tests (endpoint responses, validation errors) -- [ ] Write adapter service tests (mapping, samenloop, fallback) +- Parser tests (BSN validation, payload extraction, GML conversion); controller tests (endpoint responses, validation errors); adapter service tests (mapping, samenloop, fallback) +- [ ] Task complete ## Task 15: API Documentation - **spec_ref**: ADR-010 - **files**: `docs/features/dso-omgevingsloket.md` -- [ ] Write endpoint documentation -- [ ] Write configuration guide -- [ ] Write mapping administration guide - -## Verification -- [ ] All tasks checked off -- [ ] Unit tests pass -- [ ] Integration with DSO-LV test environment verified -- [ ] Activiteiten mapping works end-to-end +- Endpoint documentation, configuration guide, mapping administration guide +- [ ] Task complete diff --git a/openspec/changes/ibabs-notubiz-connector/tasks.md b/openspec/changes/ibabs-notubiz-connector/tasks.md index 25c859ffa..e63db58d4 100644 --- a/openspec/changes/ibabs-notubiz-connector/tasks.md +++ b/openspec/changes/ibabs-notubiz-connector/tasks.md @@ -1,14 +1,15 @@ # Tasks: ibabs-notubiz-connector +> Sub-bullets describe the work per task. Each top-level checkbox is the unit Hydra tracks; flip when the whole task (implementation + tests) is done. ADR-032 cap respected (≤20). + ## Task 1: iBabs REST API Connection (REQ-RIS-001) - **spec_ref**: `specs/ibabs-notubiz-connector/spec.md#req-ris-001` - **files**: `lib/Service/IBabsConnectorService.php` - **acceptance_criteria**: - GIVEN iBabs source configured WHEN test connection clicked THEN API connectivity verified - GIVEN API key expired WHEN call returns 401 THEN Source status set to error with notification -- [ ] Implement IBabsConnectorService with connection management -- [ ] Add test connection method -- [ ] Test +- Implement IBabsConnectorService with connection management + test connection method, tests +- [ ] Task complete ## Task 2: Collegevoorstel Push to iBabs (REQ-RIS-002) - **spec_ref**: `specs/ibabs-notubiz-connector/spec.md#req-ris-002` @@ -16,10 +17,8 @@ - **acceptance_criteria**: - GIVEN zaak with voorstel WHEN pushed to iBabs THEN document uploaded with metadata - GIVEN DOCX document WHEN pushed THEN Docudesk converts to PDF first -- [ ] Implement document push via CallService -- [ ] Add PDF conversion via Docudesk -- [ ] Add geheimhouding flag support -- [ ] Test +- Implement document push via CallService + PDF conversion via Docudesk + geheimhouding flag support, tests +- [ ] Task complete ## Task 3: Agendapunt Creation (REQ-RIS-003) - **spec_ref**: `specs/ibabs-notubiz-connector/spec.md#req-ris-003` @@ -27,9 +26,8 @@ - **acceptance_criteria**: - GIVEN voorstel pushed WHEN auto-select configured THEN next vergadering selected - GIVEN no upcoming vergadering WHEN creating agendapunt THEN sync set to pending -- [ ] Implement agendapunt creation -- [ ] Add auto-select vergadering logic -- [ ] Test +- Implement agendapunt creation + auto-select vergadering logic, tests +- [ ] Task complete ## Task 4: Besluit Retrieval from iBabs (REQ-RIS-004) - **spec_ref**: `specs/ibabs-notubiz-connector/spec.md#req-ris-004` @@ -37,51 +35,41 @@ - **acceptance_criteria**: - GIVEN voorstel aangenomen WHEN poll retrieves besluit THEN zaak status updated - GIVEN voorstel verworpen WHEN retrieved THEN behandelaar notified -- [ ] Implement besluit polling cron job -- [ ] Add status mapping (aangenomen/verworpen/aangehouden/doorgeschoven) -- [ ] Test +- Implement besluit polling cron job + status mapping (aangenomen/verworpen/aangehouden/doorgeschoven), tests +- [ ] Task complete ## Task 5: Besluitenlijst Retrieval (REQ-RIS-005) - **spec_ref**: `specs/ibabs-notubiz-connector/spec.md#req-ris-005` - **files**: `lib/Service/IBabsConnectorService.php` - **acceptance_criteria**: - GIVEN vergadering concluded WHEN poll finds besluitenlijst THEN PDF stored in Nextcloud Files -- [ ] Implement besluitenlijst download -- [ ] Add file storage in /RIS-besluiten/ folder structure -- [ ] Test +- Implement besluitenlijst download + file storage in /RIS-besluiten/ folder structure, tests +- [ ] Task complete ## Task 6: NotuBiz API Connection (REQ-RIS-020) - **spec_ref**: `specs/ibabs-notubiz-connector/spec.md#req-ris-020` - **files**: `lib/Service/NotuBizConnectorService.php` - **acceptance_criteria**: - GIVEN NotuBiz source with OAuth2 WHEN configured THEN auto token refresh works -- [ ] Implement NotuBizConnectorService -- [ ] Add OAuth2 token management via AuthenticationService -- [ ] Test +- Implement NotuBizConnectorService + OAuth2 token management via AuthenticationService, tests +- [ ] Task complete ## Task 7: Vergaderstuk Push to NotuBiz (REQ-RIS-021) - **spec_ref**: `specs/ibabs-notubiz-connector/spec.md#req-ris-021` - **files**: `lib/Service/NotuBizConnectorService.php` - **acceptance_criteria**: - GIVEN zaak requires raadsbehandeling WHEN pushed THEN correct vergadertype used -- [ ] Implement vergaderstuk push -- [ ] Test +- Implement vergaderstuk push, tests +- [ ] Task complete ## Task 8: Unit Tests - **spec_ref**: ADR-009 - **files**: `tests/Unit/Service/IBabsConnectorServiceTest.php`, `tests/Unit/Service/NotuBizConnectorServiceTest.php` -- [ ] Write connection management tests -- [ ] Write document push tests -- [ ] Write besluit retrieval tests +- Connection management tests, document push tests, besluit retrieval tests +- [ ] Task complete ## Task 9: API Documentation - **spec_ref**: ADR-010 - **files**: `docs/features/ibabs-notubiz-connector.md` -- [ ] Write configuration guide -- [ ] Write workflow documentation - -## Verification -- [ ] All tasks checked off -- [ ] Unit tests pass -- [ ] iBabs integration verified with test API -- [ ] NotuBiz integration verified with test API +- Configuration guide + workflow documentation +- [ ] Task complete diff --git a/openspec/changes/openconnector-adopt-or-abstractions/tasks.md b/openspec/changes/openconnector-adopt-or-abstractions/tasks.md index baa792899..c47aa3150 100644 --- a/openspec/changes/openconnector-adopt-or-abstractions/tasks.md +++ b/openspec/changes/openconnector-adopt-or-abstractions/tasks.md @@ -1,69 +1,53 @@ # Tasks — openconnector: adopt OR abstractions -Spec-only change. Code paths listed are implementation hints for the apply phase. +Spec-only change. Code paths listed are implementation hints for the apply phase. Each phase's +sub-bullets describe the scope; flip the top-level checkbox when the phase is complete. ADR-032 +cap respected (≤20). ## Phase 1 — register-resolver consumption openconnector reads register/schema config in multiple places (RuleService, source/mapping loaders). Route through `RegisterResolverService` once OR ships the spec. -- [ ] 1.1 Inventory all `IAppConfig::getValueString(APP_ID, 'register'|'schema', '')` reads - and route through `RegisterResolverService`. -- [ ] 1.2 Replace eight schema-property GUID constants in - `lib/Service/RuleService.php:125-131` (`PROP_*`) with slug-based lookups via - `RegisterResolverService::resolveProperty($schemaSlug, $propertySlug)`. Brittle GUIDs - removed. +- Inventory all `IAppConfig::getValueString(APP_ID, 'register'|'schema', '')` reads and route through `RegisterResolverService`. +- Replace eight schema-property GUID constants in `lib/Service/RuleService.php:125-131` (`PROP_*`) with slug-based lookups via `RegisterResolverService::resolveProperty($schemaSlug, $propertySlug)`. Brittle GUIDs removed. +- [ ] Phase complete ## Phase 2 — lifecycle annotation migration Audit flagged inline status writes in two controllers/services and a state-enum smell in two more controllers. Migrate per ADR-022, with a per-value review of filter-vs-state. -- [ ] 2.1 `lib/Controller/DSOController.php:115` — `'status' => 'ontvangen'` migrate to - lifecycle transition. Define lifecycle states on the dso-message schema. -- [ ] 2.2 `lib/Service/EventService.php:170,256` — `'status' => 'pending'` migrate to - lifecycle transition on the event schema. -- [ ] 2.3 `lib/Controller/SynchronizationContractsController.php:366-368` — review - `'status' => 'active'|'inactive'|'error'` filter values: - - `active` / `inactive` are LIFECYCLE → migrate to lifecycle annotation. - - `error` is LIFECYCLE → already covered by lifecycle's error state. -- [ ] 2.4 `lib/Controller/SynchronizationsController.php:510-514` — review - `'status' => 'success'|'warning'|'info'|'debug'` filter values: - - These are LOG-LEVEL filters, NOT lifecycle. Keep as filter whitelist; document why - in the spec's scenario list. +- `lib/Controller/DSOController.php:115` — `'status' => 'ontvangen'` migrate to lifecycle transition. Define lifecycle states on the dso-message schema. +- `lib/Service/EventService.php:170,256` — `'status' => 'pending'` migrate to lifecycle transition on the event schema. +- `lib/Controller/SynchronizationContractsController.php:366-368` — `'status' => 'active'|'inactive'|'error'` are LIFECYCLE → migrate to lifecycle annotation (error already covered). +- `lib/Controller/SynchronizationsController.php:510-514` — `'status' => 'success'|'warning'|'info'|'debug'` are LOG-LEVEL filters, NOT lifecycle. Keep as filter whitelist; document in spec. +- [ ] Phase complete ## Phase 3 — notification annotation migration openconnector fires NC notifications on synchronization-failed, contract-broken, and job-failed events. Migrate to `x-openregister-notifications` per ADR-025. -- [ ] 3.1 Identify all direct `notificationManager->notify()` / `setSubject()` call sites - in `lib/Service/`. Replace with declarative `x-openregister-notifications` triggers. +- Identify all direct `notificationManager->notify()` / `setSubject()` call sites in `lib/Service/`. Replace with declarative `x-openregister-notifications` triggers. +- [ ] Phase complete ## Phase 4 — archival annotation The audit's biggest archival finding: triplicated retention constants across three services. Migrate to `x-openregister-archival` per ADR-024. -- [ ] 4.1 `lib/Service/JobService.php:60-61`, - `lib/Service/CallService.php:66-67`, - `lib/Service/SynchronizationService.php:83-84` — three identical - `DEFAULT_SUCCESS_LOG_RETENTION = 3600000` and - `DEFAULT_ERROR_LOG_RETENTION = 2592000000` constants. Declare - `x-openregister-archival.retention` ONCE on the relevant log schema (success - retention `PT1H`, error retention `P30D` — match current values). Remove all three - sets of source constants. -- [ ] 4.2 Verify retention values match the legal retention table (sync error logs may need - longer retention for audit purposes — confirm with the DPO during apply). +- `lib/Service/JobService.php:60-61`, `lib/Service/CallService.php:66-67`, `lib/Service/SynchronizationService.php:83-84` — three identical `DEFAULT_SUCCESS_LOG_RETENTION = 3600000` and `DEFAULT_ERROR_LOG_RETENTION = 2592000000` constants. Declare `x-openregister-archival.retention` ONCE on the relevant log schema (success `PT1H`, error `P30D`). Remove all three sets of source constants. +- Verify retention values match the legal retention table (sync error logs may need longer retention for audit purposes — confirm with the DPO during apply). +- [ ] Phase complete ## Phase 5 — calculation annotation openconnector's existing `prometheus-metrics` spec already declares computed metrics. No new calculation annotation work required for this change. -- [ ] 5.1 Cross-check `openspec/specs/prometheus-metrics/spec.md` for any inline - computations that should be `x-openregister-calculations` rather than ad-hoc service - methods. Flag for follow-up if found. +- Cross-check `openspec/specs/prometheus-metrics/spec.md` for any inline computations that should be `x-openregister-calculations` rather than ad-hoc service methods. Flag for follow-up if found. +- [ ] Phase complete ## Phase 6 — spec rewrites (stream 2) @@ -71,62 +55,45 @@ The audit (stream 2) finds `prometheus-metrics/spec.md` CURRENT, and the `ibabs-notubiz-connector` + `stuf-adapter` change folders represent legitimate per-protocol integrations. NO rewrites required for this change. -- [ ] 6.1 Add a `## See Also` block in this change's spec citing - `openspec/specs/prometheus-metrics/spec.md` (current) and the `ibabs-notubiz-connector` - and `stuf-adapter` change folders so downstream readers can find the integration - patterns. -- [ ] 6.2 Verify `prometheus-metrics/spec.md` still reflects current code (drift check, no - rewrite). +- Add a `## See Also` block in this change's spec citing `openspec/specs/prometheus-metrics/spec.md` (current) and the `ibabs-notubiz-connector` and `stuf-adapter` change folders so downstream readers can find the integration patterns. +- Verify `prometheus-metrics/spec.md` still reflects current code (drift check, no rewrite). +- [ ] Phase complete ## Phase 7 — hardcoded magic-number cleanup + naming All paths per `.claude/audit-2026-05-03/04-hardcoded.md` plus stream 1's rename. -- [ ] 7.1 Rename `lib/Service/ObjectService.php` to `lib/Service/SourceMappingService.php`. - Update all call sites. Add a deprecated PHP class alias `OCA\OpenConnector\Service\ObjectService` - that extends `SourceMappingService` for one minor version. -- [ ] 7.2 `lib/Service/EndpointCacheService.php:41` — `CACHE_TTL = 3600` → admin-config - `openconnector.endpoint_cache.ttl_seconds` (default `3600`). -- [ ] 7.3 `lib/Service/SoftwareCatalogueService.php:52` — `SUFFIX = '-sc'` → admin-config - `openconnector.software_catalogue.suffix` (default `-sc`). -- [ ] 7.4 Drop eight `PROP_*` GUID constants in `lib/Service/RuleService.php:125-131` - (already covered functionally in 1.2; this task confirms the constants are deleted). -- [ ] 7.5 Drop triplicated retention constants in `JobService`, `CallService`, - `SynchronizationService` (already covered functionally in 4.1; this task confirms - deletion). +- Rename `lib/Service/ObjectService.php` to `lib/Service/SourceMappingService.php`. Update all call sites. Add a deprecated PHP class alias `OCA\OpenConnector\Service\ObjectService` that extends `SourceMappingService` for one minor version. +- `lib/Service/EndpointCacheService.php:41` — `CACHE_TTL = 3600` → admin-config `openconnector.endpoint_cache.ttl_seconds` (default `3600`). +- `lib/Service/SoftwareCatalogueService.php:52` — `SUFFIX = '-sc'` → admin-config `openconnector.software_catalogue.suffix` (default `-sc`). +- Drop eight `PROP_*` GUID constants in `lib/Service/RuleService.php:125-131` (already covered functionally in Phase 1; confirm deletion). +- Drop triplicated retention constants in `JobService`, `CallService`, `SynchronizationService` (already covered functionally in Phase 4; confirm deletion). +- [ ] Phase complete ## Phase 8 — manifest adoption Cite `hydra/openspec/changes/adopt-app-manifest/`. -- [ ] 8.1 Create `openspec/manifest.yaml` with: `tier: 2`, - `dependencies: ["openregister"]`, - `consumes: [register-resolver-service, pluggable-integration-registry, - i18n-source-of-truth, i18n-api-language-negotiation, multi-tenancy-context]`. -- [ ] 8.2 Pin minimum OR version in the manifest. openconnector currently has no version - floor constant (unlike docudesk); this is the first time the floor is declared - machine-readably. -- [ ] 8.3 Validate the manifest with the Hydra manifest schema once it ships. +- Create `openspec/manifest.yaml` with: `tier: 2`, `dependencies: ["openregister"]`, `consumes: [register-resolver-service, pluggable-integration-registry, i18n-source-of-truth, i18n-api-language-negotiation, multi-tenancy-context]`. +- Pin minimum OR version in the manifest. openconnector currently has no version floor constant (unlike docudesk); this is the first time the floor is declared machine-readably. +- Validate the manifest with the Hydra manifest schema once it ships. +- [ ] Phase complete ## Phase 9 — multi-tenancy + i18n adoption Gated on nc-vue `multi-tenancy-context` and OR `i18n-source-of-truth` / `i18n-api-language-negotiation` shipping. -- [ ] 9.1 Adopt `multi-tenancy-context` in the openconnector frontend: read - `currentTenant` from the nc-vue composable in every store. The 20+ domain-specific - stores are KEPT but each must read tenant scope from the shared composable. -- [ ] 9.2 Adopt `i18n-source-of-truth` for translatable fields on source, mapping, endpoint, - rule, contract, and webhook schemas (label, description, error message templates). -- [ ] 9.3 Adopt `i18n-api-language-negotiation` for the openconnector API: respect the - `Accept-Language` header on read responses. -- [ ] 9.4 Document in the spec's scenario list that the 20+ Pinia modules are intentionally - domain-specific and not subject to the `createObjectStore` exemplar pattern. +- Adopt `multi-tenancy-context` in the openconnector frontend: read `currentTenant` from the nc-vue composable in every store. The 20+ domain-specific stores are KEPT but each must read tenant scope from the shared composable. +- Adopt `i18n-source-of-truth` for translatable fields on source, mapping, endpoint, rule, contract, and webhook schemas (label, description, error message templates). +- Adopt `i18n-api-language-negotiation` for the openconnector API: respect the `Accept-Language` header on read responses. +- Document in the spec's scenario list that the 20+ Pinia modules are intentionally domain-specific and not subject to the `createObjectStore` exemplar pattern. +- [ ] Phase complete ## Phase 10 — spec note: domain-specific stores stay Distinct from the apply work; recorded as a Phase so it's not lost. -- [ ] 10.1 Add an explicit "stores stay app-local" requirement (and its scenario) to the - capability spec, so future audits don't re-flag the 20+ Pinia modules as duplication. -- [ ] 10.2 Add an explicit "mapping/rule engine stays app-local" requirement and scenario. +- Add an explicit "stores stay app-local" requirement (and its scenario) to the capability spec, so future audits don't re-flag the 20+ Pinia modules as duplication. +- Add an explicit "mapping/rule engine stays app-local" requirement and scenario. +- [ ] Phase complete diff --git a/openspec/changes/openconnector-legacy-quality-cleanup/tasks.md b/openspec/changes/openconnector-legacy-quality-cleanup/tasks.md index cbfb3e7f8..faeca49ca 100644 --- a/openspec/changes/openconnector-legacy-quality-cleanup/tasks.md +++ b/openspec/changes/openconnector-legacy-quality-cleanup/tasks.md @@ -1,70 +1,56 @@ # Tasks: OpenConnector Legacy Quality Cleanup +> Sub-bullets describe each phase's scope. Flip the top-level checkbox when the phase is complete. ADR-032 cap respected (≤20). + ## Phase 1 — Inventory + planning -- [ ] Run `composer phpcs` and capture current baseline error count - (target: starting from 2 exclude-patterns in phpcs.xml) -- [ ] Run `composer phpmd` for the first time as a unified gate - and capture violation count + categories -- [ ] Run `composer phpstan` for the first time as a unified gate - and capture error count + categories -- [ ] Decide per gate: fix-outright (if <50 violations) or capture - a fresh baseline (if larger) -- [ ] Confirm CI runs `composer check:strict` on every PR before - starting burn-down work +- Run `composer phpcs` and capture current baseline error count (target: starting from 2 exclude-patterns in phpcs.xml). +- Run `composer phpmd` for the first time as a unified gate and capture violation count + categories. +- Run `composer phpstan` for the first time as a unified gate and capture error count + categories. +- Decide per gate: fix-outright (if <50 violations) or capture a fresh baseline (if larger). +- Confirm CI runs `composer check:strict` on every PR before starting burn-down work. +- [ ] Phase complete ## Phase 2 — PHPCS burn-down (per excluded file) -For each file: fix errors, remove the phpcs.xml `` -entry, verify gate stays green. +For each file: fix errors, remove the phpcs.xml `` entry, verify gate stays green. -- [ ] Excluded file 1 — fix sniffs + drop exclude -- [ ] Excluded file 2 — fix sniffs + drop exclude -- [ ] Once both excludes are gone, drop the legacy-debt block from - phpcs.xml entirely +- Excluded file 1 — fix sniffs + drop exclude. +- Excluded file 2 — fix sniffs + drop exclude. +- Once both excludes are gone, drop the legacy-debt block from phpcs.xml entirely. +- [ ] Phase complete ## Phase 3 — PHPMD burn-down -Contingent on Phase 1's first-run output. If volume is small, this -phase collapses to a single fix-outright PR. +Contingent on Phase 1's first-run output. If volume is small, this phase collapses to a single fix-outright PR. -- [ ] If baseline captured: ElseExpression — re-shape `if/else` to - early-return -- [ ] If baseline captured: CyclomaticComplexity / NPathComplexity — - extract methods -- [ ] If baseline captured: MissingImport — add `use` statements -- [ ] If baseline captured: StaticAccess — replace with DI -- [ ] If baseline captured: variable-naming sniffs (Long/Short/ - Undefined/UnusedFormalParameter) -- [ ] Once baseline reaches 0 lines: delete phpmd.baseline.xml and - drop `--baseline-file` from composer.json's phpmd script +- If baseline captured: ElseExpression — re-shape `if/else` to early-return. +- If baseline captured: CyclomaticComplexity / NPathComplexity — extract methods. +- If baseline captured: MissingImport — add `use` statements. +- If baseline captured: StaticAccess — replace with DI. +- If baseline captured: variable-naming sniffs (Long/Short/Undefined/UnusedFormalParameter). +- Once baseline reaches 0 lines: delete phpmd.baseline.xml and drop `--baseline-file` from composer.json's phpmd script. +- [ ] Phase complete ## Phase 4 — PHPStan burn-down -Contingent on Phase 1's first-run output. If volume is small, this -phase collapses to a single fix-outright PR. +Contingent on Phase 1's first-run output. If volume is small, this phase collapses to a single fix-outright PR. -- [ ] Inventory phpstan errors by file/type -- [ ] Common patterns to fix: - - [ ] Missing return-type / param-type declarations - - [ ] Mixed types (specify generic / union) - - [ ] Possibly-null dereferences -- [ ] Once baseline reaches 0 lines (or never created): confirm - gate runs clean against current code +- Inventory phpstan errors by file/type. +- Fix common patterns: missing return/param types; mixed types (specify generic/union); possibly-null dereferences. +- Once baseline reaches 0 lines (or never created): confirm gate runs clean against current code. +- [ ] Phase complete ## Phase 5 — CI integration -- [ ] Verify `composer check:strict` runs in CI on every PR -- [ ] Once all baselines are empty: - - [ ] Delete `phpmd.baseline.xml` (if it was created) - - [ ] Delete `phpstan-baseline.neon` (if it was created) - - [ ] Drop the legacy-debt section from `phpcs.xml` -- [ ] Add a smoke-test cron that runs `composer check:strict` - weekly on `development` +- Verify `composer check:strict` runs in CI on every PR. +- Once all baselines are empty: delete `phpmd.baseline.xml` (if created), delete `phpstan-baseline.neon` (if created), drop the legacy-debt section from `phpcs.xml`. +- Add a smoke-test cron that runs `composer check:strict` weekly on `development`. +- [ ] Phase complete ## Phase 6 — Documentation -- [ ] Update README quality-gates section -- [ ] Note in `app-config.json` that legacy quality cleanup is done -- [ ] Close the burn-down tracking issue once the last baseline - line is removed +- Update README quality-gates section. +- Note in `app-config.json` that legacy quality cleanup is done. +- Close the burn-down tracking issue once the last baseline line is removed. +- [ ] Phase complete diff --git a/openspec/changes/stuf-adapter/tasks.md b/openspec/changes/stuf-adapter/tasks.md index f1daa8722..cf8bbde3a 100644 --- a/openspec/changes/stuf-adapter/tasks.md +++ b/openspec/changes/stuf-adapter/tasks.md @@ -1,5 +1,7 @@ # Tasks: stuf-adapter +> Sub-bullets describe the work per task. Each top-level checkbox is the unit Hydra tracks; flip when the whole task (implementation + tests) is done. ADR-032 cap respected (≤20). + ## Task 1: StUF-BG Inbound Person Query (REQ-STUF-001) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-001` - **files**: `lib/Service/StUFBGService.php` @@ -7,10 +9,8 @@ - GIVEN npsLv01 request with BSN WHEN processed THEN npsLa01 response returned with person data - GIVEN BSN not found WHEN searched THEN empty npsLa01 returned (no error) - GIVEN malformed XML WHEN received THEN Fo01 fault returned -- [ ] Implement StUFBGService with npsLv01/npsLa01 handling -- [ ] Add SOAP XML parsing for person queries -- [ ] Add scope field filtering -- [ ] Test +- Implement StUFBGService (npsLv01/npsLa01 handling, SOAP XML parsing, scope field filtering), tests +- [ ] Task complete ## Task 2: StUF-BG Field Mapping (REQ-STUF-002) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-002` @@ -19,10 +19,8 @@ - GIVEN default BRP mapping WHEN person data mapped THEN StUF-BG XML fields correct - GIVEN custom field mapping WHEN configured THEN custom mapping used - GIVEN ISO date WHEN mapped THEN converted to YYYYMMDD format -- [ ] Implement StUFFieldMapper with configurable mappings -- [ ] Add date format transformation -- [ ] Add nested object mapping (verblijfsadres) -- [ ] Test +- Implement StUFFieldMapper (configurable mappings, date format transformation, nested object mapping verblijfsadres), tests +- [ ] Task complete ## Task 3: StUF-BG Address Query (REQ-STUF-004) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-004` @@ -30,8 +28,8 @@ - **acceptance_criteria**: - GIVEN adrLv01 with postcode WHEN searched THEN matching addresses returned - GIVEN no match WHEN searched THEN empty adrLa01 returned -- [ ] Implement adrLv01/adrLa01 handling -- [ ] Test +- Implement adrLv01/adrLa01 handling, tests +- [ ] Task complete ## Task 4: StUF XML Builder (REQ-STUF-001, REQ-STUF-002) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-001` @@ -39,10 +37,8 @@ - **acceptance_criteria**: - GIVEN person data WHEN building npsLa01 THEN valid StUF-BG 3.10 XML produced - GIVEN error condition WHEN building Fo01 THEN valid SOAP fault produced -- [ ] Implement StUFXMLBuilder for response generation -- [ ] Add namespace management for StUF-BG 3.10 -- [ ] Add Fo01 fault message generation -- [ ] Test +- Implement StUFXMLBuilder for response generation + namespace management for StUF-BG 3.10 + Fo01 fault message generation, tests +- [ ] Task complete ## Task 5: StUF-BG Outbound Query (REQ-STUF-010) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-010` @@ -50,10 +46,8 @@ - **acceptance_criteria**: - GIVEN StUF source configured WHEN BSN queried THEN npsLv01 sent via SOAPService - GIVEN Fo01 fault returned WHEN processed THEN mapped to CallLog entry -- [ ] Implement outbound npsLv01 query via SOAPService -- [ ] Add response parsing -- [ ] Add SynchronizationService integration -- [ ] Test +- Implement outbound npsLv01 query via SOAPService + response parsing + SynchronizationService integration, tests +- [ ] Task complete ## Task 6: PKIoverheid mTLS Authentication (REQ-STUF-011) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-011` @@ -61,8 +55,8 @@ - **acceptance_criteria**: - GIVEN PKIoverheid certificate in source WHEN SOAP request made THEN mTLS used - GIVEN expired certificate WHEN connection attempted THEN error logged -- [ ] Verify existing CallService certificate handling works for StUF -- [ ] Test +- Verify existing CallService certificate handling works for StUF, tests +- [ ] Task complete ## Task 7: WS-Security UsernameToken (REQ-STUF-012) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-012` @@ -70,9 +64,8 @@ - **acceptance_criteria**: - GIVEN WS-Security configured WHEN SOAP sent THEN wsse:Security header included - GIVEN PasswordDigest mode WHEN building header THEN Base64(SHA1(Nonce+Created+Password)) -- [ ] Add WS-Security UsernameToken auth type -- [ ] Implement PasswordDigest hashing -- [ ] Test +- Add WS-Security UsernameToken auth type + implement PasswordDigest hashing, tests +- [ ] Task complete ## Task 8: StUF-ZKN Inbound Zaak Management (REQ-STUF-020) - **spec_ref**: `specs/stuf-adapter/spec.md#req-stuf-020` @@ -80,27 +73,17 @@ - **acceptance_criteria**: - GIVEN zakLk01 message WHEN processed THEN zaak created in OpenRegister - GIVEN zakLv01 query WHEN processed THEN zaak data returned in StUF-ZKN format -- [ ] Implement StUFZKNService -- [ ] Add zakLk01 (create/update) handling -- [ ] Add zakLv01/zakLa01 (query) handling -- [ ] Test +- Implement StUFZKNService (zakLk01 create/update + zakLv01/zakLa01 query handling), tests +- [ ] Task complete ## Task 9: Unit Tests - **spec_ref**: ADR-009 - **files**: `tests/Unit/Service/StUFFieldMapperTest.php`, `tests/Unit/Service/StUFXMLBuilderTest.php` -- [ ] Write field mapper tests (BRP mapping, date conversion, nested objects) -- [ ] Write XML builder tests (valid StUF-BG output, Fo01 fault) -- [ ] Write service tests (query handling, response parsing) +- Field mapper tests (BRP mapping, date conversion, nested objects); XML builder tests (valid StUF-BG output, Fo01 fault); service tests (query handling, response parsing) +- [ ] Task complete ## Task 10: API Documentation - **spec_ref**: ADR-010 - **files**: `docs/features/stuf-adapter.md` -- [ ] Write WSDL endpoint documentation -- [ ] Write field mapping configuration guide -- [ ] Write WS-Security setup guide - -## Verification -- [ ] All tasks checked off -- [ ] Unit tests pass -- [ ] StUF-BG npsLv01/npsLa01 exchange works -- [ ] StUF-ZKN zakLk01 creates zaak +- WSDL endpoint documentation + field mapping configuration guide + WS-Security setup guide +- [ ] Task complete