Release: merge development into beta#176
Conversation
- Merge openspec/README.md: keep Planix goal section, add artifact progression diagram, workflow steps, and full commands table - Add openspec/ROADMAP.md for feature tracking - Add openspec/architecture/README.md with ADR format guide - Add openspec/specs/README.md with feature spec format and lifecycle
…gn references Made-with: Cursor
Made-with: Cursor
…uestions - Resolve all 6 open research questions in ARCHITECTURE.md: CalDAV one-way export (V1), 1-level sub-tasks, configurable Procest bridge (Procest UI decides), per-task-only time tracking, GitHub sync via OpenConnector (V1), soft WIP limits - Update ADR-003 (Procest bridge) and ADR-004 (time tracking scope) - Create 8 OpenSpec changes with full artifacts (proposal, design, specs, tasks): register-schemas, projects, tasks, kanban-board, time-tracking, dashboard-my-work, admin-user-settings, procest-integration - Update all 7 feature specs to in-progress status with change links - Add conduction schema symlink (openspec/schemas/conduction) - Sync app description in info.xml and README.md with app-config.json goal
Replace example schema with 5 production schemas (task, project, column, timeEntry, label), add seed data (5 labels, 3 projects, 12 columns, 5 tasks, 3 time entries), register deep links for all schemas, and bump register version to 0.2.0.
…x data model Replace placeholder example schema with 5 production schemas (task, project, column, timeEntry, label) and 28 seed data objects. Fix repair step registration (info.xml), loadConfiguration() argument passing, and register definition fields required by ImportHandler. All quality checks pass (PHPCS, Psalm, PHPStan).
Implement register-schemas — 5 schemas with seed data for Planix data model
…, and l10n Add ProjectList, ProjectBoard, and ProjectBacklog views with supporting store, router entries, and MainMenu navigation. Include l10n strings, webpack config, and openspec plan/test-plan artifacts for the projects change and all related MVP changes.
Adds full project management surface to Planix — list, create, settings sidebar, member management, archive, and delete. All 47 tasks complete, verified by automated functional tests (all 11 TC pass). Key fixes applied during implementation: - webpack publicPath overridden to /apps-extra/planix/js/ (chunk 404s) - settings sidebar PATCH now includes members to prevent data loss on save - NcChip imported via component path (not available in @nextcloud/vue main index v8.16.0) - publicWrite/publicRead enabled on planix register via repair step migration
Add project management UI — list, create, settings, member management, archive and delete
…acking, settings, and procest integration Update README with restructured feature list, add six new feature docs with standards references, and include project screenshots.
Add bug tasks discovered by automated test agents to three changes: - admin-user-settings: health/metrics 500s, admin settings 404, label a11y - dashboard-my-work: KPI card a11y roles, missing alt text - tasks: status enum validation, PATCH support for partial updates
…Register init (#8) Merged by Hydra pipeline (admin override — PHPUnit CI failures are environment bootstrap issues, not code issues). All code review and security checks passed after 3 fix iterations.
Add 6 openspec change proposals (admin-settings-mvp archive, dashboard-my-work, kanban-mvp, label-crud, projects-crud, status-api) and 5 test scenarios for backend settings, frontend admin root, and default columns editor.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ✅ 215/215 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-04-14 05:30 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ✅ 215/215 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-04-14 08:41 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ✅ 215/215 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-04-14 09:21 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ❌ | ✅ 215/215 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-04-14 09:48 UTC
Download the full PDF report from the workflow artifacts.
Defense against supply-chain attacks (e.g. shai-hulud, nx-style compromised publishes) by blocking install of any package version published less than 24h ago. - .npmrc: `min-release-age=1` (npm 11.5+ native; older npm ignores it) - .github/dependabot.yml: `cooldown.default-days: 1`, with @conduction/* excluded so first-party releases reach our apps immediately For release-day consumption of fresh @conduction/* deps, use `npm install --min-release-age=0 @conduction/pkg@x.y.z`.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-17 07:42 UTC
Download the full PDF report from the workflow artifacts.
#201) NC stable31/32/33 IAppConfig::setValueString returns bool; the test mock callbacks declared void and returned null, causing a TypeError in every PHPUnit job across the matrix (PHP 8.3+8.4 x NC 31/32/33). Change both willReturnCallback callbacks in SettingsServiceTest to return bool and return true on success.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 03:27 UTC
Download the full PDF report from the workflow artifacts.
…ph (#198) @conduction/docusaurus-preset 2.10.0 ships: - deriveStability(version): 0.x → Beta, *-rc → RC, ≥1.0 → Stable, *-beta → Beta, *-alpha → Alpha - Navbar versionPill auto-uses the derived label so the chrome and the hero badge row can no longer disagree - <DetailHero/> reads version + status from customFields.appVersion (createConfig auto-populates this from appinfo/info.xml) when callers omit the props Three coordinated changes here: docs/package.json — bump @conduction/docusaurus-preset to ^2.10.0 docs/src/pages/index.js — drop hard-coded `status={...}` and `version="..."` props on <DetailHero>; the hero now auto-derives via the same source the navbar reads img/app-store.svg — shrink inner glyph (~40% of hex height instead of ~60%), better breathing room around the cobalt hex
Bumps the npm_and_yarn group with 5 updates in the / directory: | Package | From | To | | --- | --- | --- | | [picomatch](https://github.com/micromatch/picomatch) | `4.0.3` | `4.0.4` | | [picomatch](https://github.com/micromatch/picomatch) | `2.3.1` | `2.3.2` | | [brace-expansion](https://github.com/juliangruber/brace-expansion) | `1.1.12` | `1.1.14` | | [dompurify](https://github.com/cure53/DOMPurify) | `3.3.3` | `3.4.1` | | [follow-redirects](https://github.com/follow-redirects/follow-redirects) | `1.15.11` | `1.16.0` | | [lodash](https://github.com/lodash/lodash) | `4.17.23` | `4.18.1` | Updates `picomatch` from 4.0.3 to 4.0.4 - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](micromatch/picomatch@4.0.3...4.0.4) Updates `picomatch` from 2.3.1 to 2.3.2 - [Release notes](https://github.com/micromatch/picomatch/releases) - [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md) - [Commits](micromatch/picomatch@4.0.3...4.0.4) Updates `brace-expansion` from 1.1.12 to 1.1.14 - [Release notes](https://github.com/juliangruber/brace-expansion/releases) - [Commits](juliangruber/brace-expansion@v1.1.12...v1.1.14) Updates `dompurify` from 3.3.3 to 3.4.1 - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](cure53/DOMPurify@3.3.3...3.4.1) Updates `follow-redirects` from 1.15.11 to 1.16.0 - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](follow-redirects/follow-redirects@v1.15.11...v1.16.0) Updates `lodash` from 4.17.23 to 4.18.1 - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](lodash/lodash@4.17.23...4.18.1) --- updated-dependencies: - dependency-name: picomatch dependency-version: 4.0.4 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: picomatch dependency-version: 2.3.2 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: brace-expansion dependency-version: 1.1.14 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: dompurify dependency-version: 3.4.1 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: follow-redirects dependency-version: 1.16.0 dependency-type: indirect dependency-group: npm_and_yarn - dependency-name: lodash dependency-version: 4.18.1 dependency-type: indirect dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ruben van der Linde <rubenvdlinde@gmail.com>
) * fix: align webpack config and sidebar with shared patterns - Extend base webpack config instead of replacing resolve/module - Add NodePolyfillPlugin for process polyfill compatibility - Add CnObjectSidebar + objectSidebarState for proper sidebar positioning - Follows ADR-017 (component composition) and ADR-018 (header actions) * fix: settings pattern — use NcAppSettingsDialog modal (ADR-004) Settings link in gear foldout now opens NcAppSettingsDialog modal instead of routing to /settings page. Matches ADR-004 pattern: - Admin config: /settings/admin/{appid} (NC admin panel) - In-app settings: NcAppSettingsDialog modal from gear menu * feat(i18n): add 21 missing translation keys and fix bare t() calls - Fix bare t() to this.t() in Settings.vue methods - Add 21 missing keys to en.json and nl.json (108→129 keys) * fix(i18n): convert title case to sentence case in translation keys - "Default Project Configuration" → "Default project configuration" - "Register Setup" → "Register setup" - "Version Information" → "Version information"
* fix: align webpack config and sidebar with shared patterns
- Extend base webpack config instead of replacing resolve/module
- Add NodePolyfillPlugin for process polyfill compatibility
- Add CnObjectSidebar + objectSidebarState for proper sidebar positioning
- Follows ADR-017 (component composition) and ADR-018 (header actions)
* fix: settings pattern — use NcAppSettingsDialog modal (ADR-004)
Settings link in gear foldout now opens NcAppSettingsDialog modal
instead of routing to /settings page. Matches ADR-004 pattern:
- Admin config: /settings/admin/{appid} (NC admin panel)
- In-app settings: NcAppSettingsDialog modal from gear menu
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ⏭️ | ||||
| phpcs | ⏭️ | ||||
| phpmd | ⏭️ | ||||
| psalm | ⏭️ | ||||
| phpstan | ⏭️ | ||||
| phpmetrics | ⏭️ | ||||
| eslint | ⏭️ | ||||
| stylelint | ❌ | ||||
| composer | ⏭️ | ⏭️ | |||
| npm | ⏭️ | ⏭️ | |||
| PHPUnit | ❌ | ||||
| Newman | ❌ | ||||
| Playwright | ❌ |
Quality workflow — 2026-05-19 05:03 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 05:07 UTC
Download the full PDF report from the workflow artifacts.
The icon hex was filled with the legacy '#4376FC' (the conduction-design-tokens 'Conduction Cobalt'). The design-system has retired this in preview/colors.html with the caption > Our legacy blue (#4376FC) read as 'cloud / SaaS', light, frisky, > lacking weight. Cobalt is the official blue of the Dutch flag, > Dutch by birthright, dark enough to feel serious, light enough > to stay blue, and AAA-contrast on white so it can carry body > text. Swap to #21468B (--c-blue-cobalt in tokens.css) so the app-store hex matches the navbar wordmark and the rest of the brand chrome. Fleet sweep 2026-05-13.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 05:23 UTC
Download the full PDF report from the workflow artifacts.
…1468B IS canonical per design tokens) (#203)
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 05:30 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 05:33 UTC
Download the full PDF report from the workflow artifacts.
Replace bare-brand Layout title with descriptive form that includes the keyword payload. Docusaurus auto-appends the site title as suffix, so SERPs no longer show duplicate brand titles.
fix(docs): descriptive homepage title (#80)
Replace auto-generated meta descriptions on the highest-traffic pages with hand-written, CTR-tuned variants. Part of the SEO epic ConductionNL/.github#75.
fix(docs): hand-written meta descriptions (#81)
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 08:19 UTC
Download the full PDF report from the workflow artifacts.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 08:25 UTC
Download the full PDF report from the workflow artifacts.
Picks up the post-hydration stylesheet loader so canal-footer + kade-cyclist + decorative CSS no longer block first paint. Part of ConductionNL/.github#75 SEO epic.
chore(docs): bump @conduction/docusaurus-preset to 3.10.0 (#79)
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 215/215 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Coverage: 0% (0/3 statements)
Quality workflow — 2026-05-19 08:36 UTC
Download the full PDF report from the workflow artifacts.
Picks up the schema 2.7.0 + CnPageRenderer top-level field forwarding + CnDetailPage _lockState rename + config.schema → objectType bridging shipped in nextcloud-vue#317/#319/#320 tonight.
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ❌ | ||||
| stylelint | ❌ | ||||
| composer | ❌ | ✅ 100/100 | |||
| npm | ✅ | ✅ 404/404 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-21 10:17 UTC
Download the full PDF report from the workflow artifacts.
Phase 2 fleet rollout — sync planix to nextcloud-app-template's canonical phpcs/phpmd/psalm/phpstan configs and custom sniffs. Per the fleetwide directive (no per-app validation rules), this brings planix in line with the rest of the fleet. planix was already canonical-compatible at recon (3 of 17 apps with zero drift), so the diff is limited to the additive canonical pieces (custom sniffs, phpstan-baseline include, expanded exclude-pattern + stub allowlist). Quality gates after sync: - phpcs: 0 errors, 33 warnings (tolerated by ignore_warnings_on_exit) - phpstan: 0 errors (empty baseline) - psalm: 0 errors - phpmd: 1 architectural (BooleanArgumentFlag on loadConfiguration) Mechanical fix applied in source: - SettingsService::setAdminSettings() return type changed from array<string,string> to void (caller in updateSettings() never used the return; psalm flagged it as UnusedReturnValue). Remaining debt tracked in #223 (split loadConfiguration into loadConfiguration / reloadConfiguration per SRP).
Quality Report — ConductionNL/planix @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ❌ | ||||
| stylelint | ❌ | ||||
| composer | ❌ | ✅ 100/100 | |||
| npm | ✅ | ✅ 404/404 | |||
| PHPUnit | ⏭️ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ |
Quality workflow — 2026-05-21 20:26 UTC
Download the full PDF report from the workflow artifacts.
Automated PR to sync development changes to beta for beta release.
Merging this PR will trigger the beta release workflow.