Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
</p>

<p align="center">
<a href="https://codeberg.org/Conduction/nextcloud-app-template/releases"><img src="https://img.shields.io/gitea/v/release/Conduction/nextcloud-app-template?gitea_url=https%3A%2F%2Fcodeberg.org" alt="Latest release"></a>
<a href="https://codeberg.org/Conduction/nextcloud-app-template/src/branch/main/LICENSE"><img src="https://img.shields.io/badge/license-EUPL--1.2-blue" alt="License"></a>
<a href="https://ci.codeberg.org/repos/Conduction/nextcloud-app-template"><img src="https://ci.codeberg.org/api/badges/Conduction/nextcloud-app-template/status.svg" alt="Code quality"></a>
<a href="https://github.com/ConductionNL/nextcloud-app-template/releases"><img src="https://img.shields.io/github/v/release/ConductionNL/nextcloud-app-template" alt="Latest release"></a>
<a href="https://github.com/ConductionNL/nextcloud-app-template/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-EUPL--1.2-blue" alt="License"></a>
<a href="https://github.com/ConductionNL/nextcloud-app-template/actions/workflows/code-quality.yml"><img src="https://github.com/ConductionNL/nextcloud-app-template/actions/workflows/code-quality.yml/badge.svg" alt="Code quality"></a>
</p>

---
Expand All @@ -20,7 +20,7 @@ A starting point for building Nextcloud apps following ConductionNL conventions.

> **Manifest-first** — pages, navigation, and dependencies are declared in `src/manifest.json`. The shell (CnAppRoot) reads the manifest at boot and renders index / detail / dashboard / settings pages without per-page Vue files. Reach for a custom Vue component only when the page is `type: "custom"`. See `openspec/architecture/` and hydra ADR-024 for the architectural rationale.

> **Pre-wired for [OpenRegister](https://codeberg.org/Conduction/openregister)** — `manifest.dependencies` lists `openregister`, so CnAppRoot's dependency-check phase ensures the OR app is installed and enabled before the UI mounts. If your app does not need OpenRegister, remove the entry from `src/manifest.json`, `appinfo/info.xml`, and `openspec/app-config.json`.
> **Pre-wired for [OpenRegister](https://github.com/ConductionNL/openregister)** — `manifest.dependencies` lists `openregister`, so CnAppRoot's dependency-check phase ensures the OR app is installed and enabled before the UI mounts. If your app does not need OpenRegister, remove the entry from `src/manifest.json`, `appinfo/info.xml`, and `openspec/app-config.json`.

> **Canonical root configs** — `phpcs.xml`, `phpmd.xml`, `psalm.xml`, `phpstan.neon`, and `phpstan-bootstrap.php` in this repo are the fleet canonical. All Conduction PHP apps are expected to mirror these files byte-for-byte; per-app deviations belong in baselines (`phpstan-baseline.neon`, `psalm-baseline.xml`) not in the canonical files. Submit changes here and they propagate to the fleet via the template-sync flow — do **not** diverge per-app.

Expand Down Expand Up @@ -168,7 +168,7 @@ apptemplate/
| Nextcloud | 28 – 33 |
| PHP | 8.1+ |
| Node.js | 20+ |
| [OpenRegister](https://codeberg.org/Conduction/openregister) | latest |
| [OpenRegister](https://github.com/ConductionNL/openregister) | latest |

## Installation

Expand All @@ -184,7 +184,7 @@ apptemplate/

```bash
cd /var/www/html/custom_apps
git clone https://codeberg.org/Conduction/nextcloud-app-template.git apptemplate
git clone https://github.com/ConductionNL/nextcloud-app-template.git apptemplate
cd apptemplate
npm install && npm run build
php occ app:enable apptemplate
Expand Down Expand Up @@ -288,7 +288,7 @@ shapes into a single uniform `widgets[]` array with grid coordinates on every
page type, and introduces a five-kind component registry.

**Design reference:** hydra
[ADR-036 (Universal Widget Manifest v2)](https://codeberg.org/Conduction/hydra/src/branch/development/openspec/architecture/adr-036-universal-widget-manifest.md)
[ADR-036 (Universal Widget Manifest v2)](https://github.com/ConductionNL/hydra/blob/development/openspec/architecture/adr-036-universal-widget-manifest.md)

**Migration guide** (for apps migrating from v1): `@conduction/nextcloud-vue`
docs `migrating-to-v2.md` covers the codemod CLI and manual migration steps.
Expand Down Expand Up @@ -378,7 +378,7 @@ Companion (a floating assistant rendered by `CnAppRoot` from
alias `OCA\OpenRegister\Mcp\IMcpToolProvider::{appId}`; OpenRegister's
`McpToolsService` discovers per-app providers by exactly that alias.
- `tests/Stubs/Mcp/IMcpToolProvider.php` — a stand-in for the interface until
[openregister PR #1466](https://codeberg.org/Conduction/openregister/pulls/1466)
openregister PR #1466 (Codeberg PR number, pre-migration, not mapped to GitHub)
merges; once the openregister app is installed alongside your app the real
interface takes over transparently.
- `tests/Unit/Mcp/ExampleToolProviderTest.php` — the contract test.
Expand All @@ -396,7 +396,7 @@ Companion (a floating assistant rendered by `CnAppRoot` from
structured `['error' => ['code' => ..., 'message' => ...]]` array.

References: hydra
[ADR-034 (AI Chat Companion)](https://codeberg.org/Conduction/hydra/src/branch/development/openspec/architecture/adr-034-ai-chat-companion.md)
[ADR-034 (AI Chat Companion)](https://github.com/ConductionNL/hydra/blob/development/openspec/architecture/adr-034-ai-chat-companion.md)
and ADR-035; and decidesk's `OCA\Decidesk\Mcp\DecideskToolProvider` as the
production example (five real tools, deep links, source descriptors).

Expand Down Expand Up @@ -505,7 +505,7 @@ Project / spec documentation:

## Related Apps

- **[OpenRegister](https://codeberg.org/Conduction/openregister)** — Object storage layer (required dependency)
- **[OpenRegister](https://github.com/ConductionNL/openregister)** — Object storage layer (required dependency)

_Add related apps here as integrations are built._

Expand Down
6 changes: 3 additions & 3 deletions docs/canonical-files.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ carry per-app values, which are app-private, and which should never exist in
a repo root.

The authoritative architecture decision is
[ADR-033 in hydra](https://codeberg.org/Conduction/hydra/src/branch/development/openspec/architecture/adr-033-root-config-consolidation.md);
[ADR-039 in hydra](https://github.com/ConductionNL/hydra/blob/development/openspec/architecture/adr-039-root-config-consolidation.md);
this doc is the developer-facing summary. When the two disagree, ADR-033 wins.

## Tier A — Strictly canonical (byte-for-byte synced)

Identical across every fleet app. When the template's copy changes, the
[`hydra/scripts/fleet-sync/`](https://codeberg.org/Conduction/hydra/src/branch/development/scripts/fleet-sync)
[`hydra/scripts/fleet-sync/`](https://github.com/ConductionNL/hydra/tree/development/scripts/fleet-sync)
tool — run locally by a developer — opens a PR on every app in the fleet.

| File | What it does |
Expand Down Expand Up @@ -171,7 +171,7 @@ a canonical change. That's a small cost paid for a real security
improvement.

Full design rationale + the sync script are in
[`hydra/scripts/fleet-sync/`](https://codeberg.org/Conduction/hydra/src/branch/development/scripts/fleet-sync).
[`hydra/scripts/fleet-sync/`](https://github.com/ConductionNL/hydra/tree/development/scripts/fleet-sync).

## What's NOT in scope

Expand Down
6 changes: 3 additions & 3 deletions docs/docusaurus.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ const config = createConfig({
plus the standard node_modules bucket. */
exclude: ['**/node_modules/**', 'src/**'],
sidebarPath: require.resolve('./sidebars.js'),
editUrl: 'https://codeberg.org/Conduction/nextcloud-app-template/src/branch/development/docs/',
editUrl: 'https://github.com/ConductionNL/nextcloud-app-template/edit/development/docs/',
},
blog: false,
theme: {
Expand All @@ -96,8 +96,8 @@ const config = createConfig({
label: 'Documentation',
},
{
href: 'https://codeberg.org/Conduction/nextcloud-app-template',
label: 'Codeberg',
href: 'https://github.com/ConductionNL/nextcloud-app-template',
label: 'GitHub',
position: 'right',
},
{ type: 'localeDropdown', position: 'right' },
Expand Down
2 changes: 1 addition & 1 deletion docs/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ directory name must equal the app id — Nextcloud loads an app from

```bash
cd /var/www/html/custom_apps
git clone https://codeberg.org/Conduction/nextcloud-app-template.git apptemplate
git clone https://github.com/ConductionNL/nextcloud-app-template.git apptemplate
cd apptemplate
npm install && npm run build
php occ app:enable apptemplate
Expand Down
2 changes: 1 addition & 1 deletion openspec/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ This folder contains feature specifications, architectural decisions, and implem
| `architecture/` | App-specific Architectural Decision Records (ADRs) |
| `changes/` | Individual change directories, each with a full set of specification artifacts (created on first change) |

> If `app-config.json` has `"requiresOpenRegister": true`, install [OpenRegister](https://codeberg.org/Conduction/openregister) before enabling this app. Set to `false` if your app does not use OpenRegister.
> If `app-config.json` has `"requiresOpenRegister": true`, install [OpenRegister](https://github.com/ConductionNL/openregister) before enabling this app. Set to `false` if your app does not use OpenRegister.

## app-config.json — Key Fields

Expand Down
2 changes: 1 addition & 1 deletion openspec/app-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
"version": "0.1.0",
"license": "EUPL-1.2",
"author": "Conduction B.V.",
"repository": "https://codeberg.org/Conduction/nextcloud-app-template",
"repository": "https://github.com/ConductionNL/nextcloud-app-template",
"dependencies": {
"requiresOpenRegister": true,
"additionalCiApps": [
Expand Down
2 changes: 1 addition & 1 deletion openspec/changes/apphost-tutorial-overwrite/hydra.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"spec_slug": "apphost-tutorial-overwrite",
"title": "App template: AppHost three-layer tutorial restructure",
"app": "nextcloud-app-template",
"repo": "https://codeberg.org/Conduction/nextcloud-app-template",
"repo": "https://github.com/ConductionNL/nextcloud-app-template",
"depends_on": ["apphost-observability-engine", "apphost-boilerplate-controllers"],
"issue": null
}
2 changes: 1 addition & 1 deletion openspec/changes/template-manifest-v1/design.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ the template still produces a working app:

```bash
# 1. Clone + rename
git clone https://codeberg.org/Conduction/nextcloud-app-template.git my-app
git clone https://github.com/ConductionNL/nextcloud-app-template.git my-app
cd my-app

# 2. Customise app id (search-and-replace 'apptemplate' → 'myapp'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ than retrofitting it into every downstream consumer.

The template's `src/manifest.json` MUST exist, MUST be valid JSON,
and MUST set `$schema` to
`https://codeberg.org/Conduction/nextcloud-vue/raw/branch/main/src/schemas/app-manifest.schema.json`.
`https://github.com/ConductionNL/nextcloud-vue/raw/main/src/schemas/app-manifest.schema.json`.
The file MUST validate against the v1.x schema published by
`@conduction/nextcloud-vue` with zero errors.

Expand Down
2 changes: 1 addition & 1 deletion openspec/changes/template-manifest-v1/tasks.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
- [x] 1.3 Declare `dependencies: ["openregister"]` (the template's pre-wired default; downstream apps remove if they don't need OR).
- [x] 1.4 Settings page declares a `version-info` rich-section widget; the `register-mapping` widget is NOT in the template manifest (per-app decision).
- [x] 1.5 Set top-level `version` to `0.1.0` (template content version, distinct from the schema version).
- [x] 1.6 Set `$schema` to `https://codeberg.org/Conduction/nextcloud-vue/raw/branch/main/src/schemas/app-manifest.schema.json`.
- [x] 1.6 Set `$schema` to `https://github.com/ConductionNL/nextcloud-vue/raw/main/src/schemas/app-manifest.schema.json`.

## 2. Bootstrap pattern

Expand Down
2 changes: 1 addition & 1 deletion publiccode.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
publiccodeYmlVersion: "0.3"

name: "App Template"
url: "https://codeberg.org/Conduction/nextcloud-app-template"
url: "https://github.com/ConductionNL/nextcloud-app-template"
softwareVersion: "0.1.2"
releaseDate: "2026-01-01"
softwareType: "addon"
Expand Down
2 changes: 1 addition & 1 deletion src/manifest.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "https://codeberg.org/Conduction/nextcloud-vue/raw/branch/main/src/schemas/app-manifest-v2.schema.json",
"$schema": "https://github.com/ConductionNL/nextcloud-vue/raw/main/src/schemas/app-manifest-v2.schema.json",
"version": "0.2.0",
"dependencies": [
"openregister"
Expand Down
2 changes: 1 addition & 1 deletion src/registry.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
// 3. Add a manifest page entry with type: "custom", component: "<your-key>",
// and a _note explaining why a standard page type was not feasible.
//
// See: https://codeberg.org/Conduction/hydra → openspec/architecture/adr-036-universal-widget-manifest.md
// See: https://github.com/ConductionNL/hydra → openspec/architecture/adr-036-universal-widget-manifest.md

import StatusBadge from './cellRenderers/StatusBadge.vue'
import EmailField from './formFields/EmailField.vue'
Expand Down
Loading