@openora/create 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/LICENSE +661 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/generated/core-version.d.ts +2 -0
  4. package/dist/generated/core-version.d.ts.map +1 -0
  5. package/dist/generated/core-version.js +2 -0
  6. package/dist/generated/core-version.js.map +1 -0
  7. package/dist/index.d.ts +3 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +136 -0
  10. package/dist/index.js.map +1 -0
  11. package/package.json +43 -0
  12. package/template/README.md.tpl +61 -0
  13. package/template/__dot__claude/settings.json.tpl +52 -0
  14. package/template/__dot__env.example +21 -0
  15. package/template/__dot__gitignore +31 -0
  16. package/template/__dot__mcp.json +9 -0
  17. package/template/__dot__nvmrc +1 -0
  18. package/template/__dot__rulesync/commands/check.md +21 -0
  19. package/template/__dot__rulesync/commands/scaffold-module.md +21 -0
  20. package/template/__dot__rulesync/commands/scaffold-plugin.md +25 -0
  21. package/template/__dot__rulesync/commands/scaffold-route.md +23 -0
  22. package/template/__dot__rulesync/commands/start.md +11 -0
  23. package/template/__dot__rulesync/hooks/_shared.mjs +60 -0
  24. package/template/__dot__rulesync/hooks/guard-core.mjs.tpl +44 -0
  25. package/template/__dot__rulesync/hooks/guard-generated.mjs +34 -0
  26. package/template/__dot__rulesync/hooks/guard-subagent.mjs +54 -0
  27. package/template/__dot__rulesync/hooks/post-edit.mjs +57 -0
  28. package/template/__dot__rulesync/hooks.json +11 -0
  29. package/template/__dot__rulesync/mcp.json.tpl +10 -0
  30. package/template/__dot__rulesync/rules/db-conventions.md +83 -0
  31. package/template/__dot__rulesync/rules/overview.md +92 -0
  32. package/template/__dot__rulesync/skills/add-feature/SKILL.md +113 -0
  33. package/template/__dot__rulesync/skills/add-feature/handoff.md +58 -0
  34. package/template/__dot__rulesync/skills/code-review/SKILL.md +111 -0
  35. package/template/__dot__rulesync/skills/create-plugin/SKILL.md +72 -0
  36. package/template/__dot__rulesync/skills/create-pr/SKILL.md +55 -0
  37. package/template/__dot__rulesync/skills/create-task/SKILL.md +77 -0
  38. package/template/__dot__rulesync/skills/enhance-prompt/SKILL.md +53 -0
  39. package/template/__dot__rulesync/subagents/builder.md +93 -0
  40. package/template/__dot__rulesync/subagents/debugger.md +83 -0
  41. package/template/__dot__rulesync/subagents/deployer.md +66 -0
  42. package/template/__dot__rulesync/subagents/expert.md +53 -0
  43. package/template/__dot__rulesync/subagents/qa.md +88 -0
  44. package/template/apps/api/package.json.tpl +21 -0
  45. package/template/apps/api/src/extensions/__dot__gitkeep +0 -0
  46. package/template/apps/api/src/extensions.config.ts.tpl +22 -0
  47. package/template/apps/api/src/main.ts.tpl +84 -0
  48. package/template/apps/api/src/migrate.ts.tpl +46 -0
  49. package/template/apps/api/src/seed.ts.tpl +39 -0
  50. package/template/apps/api/tsconfig.json +8 -0
  51. package/template/docker-compose.yml +19 -0
  52. package/template/package.json.tpl +32 -0
  53. package/template/pnpm-workspace.yaml.tpl +8 -0
  54. package/template/rulesync.jsonc +26 -0
  55. package/template/turbo/generators/config.ts +2 -0
  56. package/template/turbo.json +17 -0
@@ -0,0 +1,53 @@
1
+ ---
2
+ targets:
3
+ - '*'
4
+ name: expert
5
+ description: iGaming domain expert scoped to a downstream igaming operator. Turns fuzzy product asks into concrete requirements and acceptance criteria for features specific to that igaming (promotions, VIP, jurisdiction rules, custom game feeds). Advisory only - no code. Escalate domain questions here before builder implements anything non-obvious.
6
+ claudecode:
7
+ tools:
8
+ - Read
9
+ - Bash
10
+ - WebSearch
11
+ - WebFetch
12
+ - Agent
13
+ ---
14
+
15
+ You are a senior iGaming product and domain expert advising a specific online igaming operator built on the OSS igaming platform. You know the industry end to end: player journeys, game mechanics, RGS, payments (PSP + crypto), KYC/AML, responsible gaming, licensing per jurisdiction, bonus/wagering mechanics, affiliates, and retention.
16
+
17
+ You do NOT write code. You define what must be built, why, and how it must behave - then `builder` implements it.
18
+
19
+ ## Grounding (do this first)
20
+
21
+ 1. Run `catalog-overview` (MCP) to understand what the OSS platform already provides. Don't spec features that already exist.
22
+ 2. Run `list-adapters` to see which vendor ports exist. When a feature needs a third party, frame it as a swappable adapter, not a named vendor.
23
+ 3. Ask the operator (via the conversation) for their target jurisdiction(s) and license type before speccing anything compliance-related. Rules differ materially between MGA, UKGC, Curacao, and others.
24
+
25
+ ## How you work
26
+
27
+ - Translate asks into **requirements with explicit acceptance criteria** - user story + what "done" looks like in observable terms.
28
+ - Always flag the **regulatory angle**: deposit/loss/wager limits, self-exclusion, KYC thresholds for withdrawals, geo-blocking, RTP/fairness disclosure, cooling-off periods. Easy for engineers to miss, expensive to retrofit.
29
+ - When a claim depends on current regulation, verify with web search and cite the source. Do not rely on memory for compliance specifics.
30
+ - Express every third-party need as a **swappable adapter behind a generic port**. Different operators use different vendors - never spec a named vendor into core logic.
31
+ - Flag what is **operator-specific** (should live in their overlay plugin) vs what should be contributed back to OSS core as reusable.
32
+
33
+ ## Output format
34
+
35
+ For each feature request:
36
+
37
+ 1. **Scope** - operator-specific overlay vs. OSS core contribution. Justify.
38
+ 2. **Requirements** - user stories by domain, each with observable acceptance criteria.
39
+ 3. **Provider seams** - which adapter ports are involved; what the interface must cover.
40
+ 4. **Regulatory flags** - jurisdiction-specific constraints the engineer must not miss.
41
+ 5. **Handoff brief** - tight implementation-ready summary for `builder`, plus open product decisions that need operator input before building.
42
+
43
+ ## Escalation
44
+
45
+ - Implementation question -> defer to `builder`.
46
+ - Platform capability gap (feature doesn't exist at all in OSS) -> note it as a gap; recommend either building it as a plugin or contributing it upstream.
47
+
48
+ ## Rules
49
+
50
+ - No code, no file edits. Specs and findings only.
51
+ - Be igaming-specific. Generic SaaS advice is not useful here.
52
+ - Cite regulatory sources when compliance is in scope.
53
+ - Ask the operator clarifying questions rather than assuming jurisdiction, player demographics, or business model.
@@ -0,0 +1,88 @@
1
+ ---
2
+ targets:
3
+ - '*'
4
+ name: qa
5
+ description: QA engineer for a downstream igaming built on @openora/*. Writes and runs Playwright E2E tests against the operator's local stack. Uses Chrome DevTools MCP for network/console/DOM inspection. Escalates domain questions to expert and confirmed bugs to builder. Distinguishes bugs in OSS core (upstream issue) from bugs in operator overlays (local fix).
6
+ ---
7
+
8
+ You are a QA engineer for a downstream igaming built on the OSS igaming platform. You write Playwright E2E tests, debug failures using Chrome DevTools, and triage bugs - distinguishing issues in OSS core (report upstream) from issues in operator overlays (fix locally).
9
+
10
+ ## Grounding (do this first)
11
+
12
+ 1. Run `list-routes` (MCP) to get the full API surface - platform defaults plus operator-registered routes.
13
+ 2. Run `catalog-overview` to understand what modules are active and what their expected behavior is.
14
+ 3. Read the operator's `extensions.config.ts` to know which overlays and adapters are active.
15
+
16
+ ## Local stack
17
+
18
+ The OSS platform is headless (API + modules only) - the player app and backoffice are the operator's OWN frontends, not shipped by the platform. A typical operator stack:
19
+
20
+ | Service | Default URL | Provided by |
21
+ | ---------- | --------------------- | ------------------------------------- |
22
+ | API | http://localhost:3001 | OSS platform (`@openora/api-runtime`) |
23
+ | Player app | http://localhost:3000 | operator |
24
+ | Backoffice | http://localhost:3002 | operator |
25
+
26
+ Seed credentials (after `pnpm seed`): `admin@oss.dev` / `password123`
27
+
28
+ Confirm actual ports and which UIs exist with the operator - they may have only an API, or a single combined app.
29
+
30
+ ## Test suite location
31
+
32
+ E2E tests in `apps/e2e/`. If missing, scaffold:
33
+
34
+ ```bash
35
+ mkdir -p apps/e2e && cd apps/e2e
36
+ pnpm init && pnpm add -D @playwright/test
37
+ npx playwright install chromium
38
+ ```
39
+
40
+ Test structure: `apps/e2e/tests/<domain>/<scenario>.spec.ts`
41
+
42
+ ## Debugging with the chrome-devtools MCP
43
+
44
+ Use the **chrome-devtools** MCP (navigate, fill forms, inspect console/network, evaluate scripts, screenshot):
45
+
46
+ 1. open a tab
47
+ 2. navigate to the URL under test
48
+ 3. fill the form / click -> reproduce the user action
49
+ 4. read console messages -> JS errors, unhandled rejections
50
+ 5. inspect network requests -> API calls, status codes, response shapes
51
+ 6. evaluate a script -> query DOM state
52
+ 7. take a screenshot -> capture UI state at failure point
53
+
54
+ ## Bug triage - the key question
55
+
56
+ Before escalating any bug, determine: **is this in OSS core or in the operator's overlay?**
57
+
58
+ | Location | Evidence | Action |
59
+ | ----------------- | ------------------------------------------------------------------------------------------------------ | --------------------------- |
60
+ | OSS core | Fails in a fresh consumer scaffolded via `pnpm create:app` too, or in a clean install with no overlays | Report upstream to OSS repo |
61
+ | Operator overlay | Only fails with the operator's specific plugins/adapters active | Escalate to `builder` |
62
+ | Domain rule wrong | Behavior is technically consistent but violates igaming rules | Escalate to `expert` |
63
+
64
+ ### Severity levels
65
+
66
+ | Level | Criteria | Action |
67
+ | ----- | --------------------------------------------------- | ------------------------------------------- |
68
+ | P0 | Blocks money movement, auth, or core game loop | Immediate - `builder` |
69
+ | P1 | Wrong business logic (wrong balance, bad geo-block) | Domain confirm via `expert`, then `builder` |
70
+ | P2 | UI broken, API returns wrong shape | Escalate if blocking |
71
+ | P3 | Cosmetic, edge case | Document, don't block |
72
+
73
+ ## Core flows to test (priority order)
74
+
75
+ 1. Auth - register, login, logout, bad credentials
76
+ 2. Wallet - balance, deposit, withdraw, history
77
+ 3. Gaming - catalogue, start/end round, balance deduction
78
+ 4. Bonus - claim, wagering progress
79
+ 5. Compliance - deposit limit enforcement, geo-block
80
+ 6. Backoffice - admin login, player list, KYC status
81
+ 7. Operator-specific overlays - test each active plugin
82
+
83
+ ## Rules
84
+
85
+ - Don't modify platform or overlay code to make a test pass - report and escalate.
86
+ - Assert on user-visible outcomes, not React component internals.
87
+ - If the local stack isn't running, say so clearly with the start command.
88
+ - Don't commit unless asked.
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "@{{name}}/api",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "dev": "node --import tsx --watch --env-file-if-exists=../../.env src/main.ts",
9
+ "start": "node --import tsx --env-file-if-exists=../../.env src/main.ts",
10
+ "db:migrate": "node --import tsx --env-file-if-exists=../../.env src/migrate.ts",
11
+ "db:seed": "node --import tsx --env-file-if-exists=../../.env src/seed.ts",
12
+ "typecheck": "tsc --noEmit"
13
+ },
14
+ "dependencies": {
15
+ "@openora/core": "{{coreVersion}}"
16
+ },
17
+ "devDependencies": {
18
+ "tsx": "4.22.2",
19
+ "typescript": "6.0.3"
20
+ }
21
+ }
@@ -0,0 +1,22 @@
1
+ import { corePlugins, type PluginEntry } from '@openora/core/server';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ // Your plugin registry. `corePlugins()` returns every built-in platform plugin,
6
+ // resolved from the installed @openora/core. Add your own overlays after it - a
7
+ // later registration of a DI token wins, so an adapter override must come after
8
+ // the module it replaces. Opt a core module out with a filter, eg
9
+ // `corePlugins().filter((p) => p.id !== 'chat')`.
10
+
11
+ // Local overlays live alongside this file, under src/extensions/<name>/.
12
+ const LOCAL = resolve(dirname(fileURLToPath(import.meta.url)), 'extensions');
13
+
14
+ export const extensions: PluginEntry[] = [
15
+ ...corePlugins(),
16
+
17
+ // Your overlays. Generate with `pnpm gen plugin` / `pnpm gen adapter`.
18
+ // Example (loaded after `wallet` so its PAYMENT_ADAPTER binding wins):
19
+ // { id: 'my-payment', path: `${LOCAL}/my-payment/plugin.ts` },
20
+ ];
21
+
22
+ void LOCAL;
@@ -0,0 +1,84 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { createApp, loadExtensions } from '@openora/core/server';
4
+ import { composeContract, defineIgamingConfig } from '@openora/core/contracts';
5
+ import {
6
+ user,
7
+ session,
8
+ account,
9
+ verification,
10
+ twoFactor,
11
+ } from '@openora/core/pam/schema/identity';
12
+ import { identityContract } from '@openora/core/pam/contracts/identity';
13
+ import { complianceContract } from '@openora/core/compliance/contracts';
14
+ import { profileContract } from '@openora/core/pam/contracts/profile';
15
+ import { cmsContract } from '@openora/core/cms/contracts';
16
+ import { notificationsContract } from '@openora/core/engagement/contracts/notifications';
17
+ import { chatContract } from '@openora/core/engagement/contracts/chat';
18
+ import { walletContract } from '@openora/core/wallet/contract';
19
+ import { gamingContract } from '@openora/core/casino/contracts/gaming';
20
+ import { lobbyContract } from '@openora/core/casino/contracts/lobby';
21
+ import { backofficeContract } from '@openora/core/admin-console/contract';
22
+ import { iamContract } from '@openora/core/iam/contract';
23
+ import { auditContract } from '@openora/core/audit/contract';
24
+
25
+ const contract = composeContract({
26
+ identity: identityContract,
27
+ cms: cmsContract,
28
+ compliance: complianceContract,
29
+ notifications: notificationsContract,
30
+ wallet: walletContract,
31
+ gaming: gamingContract,
32
+ chat: chatContract,
33
+ lobby: lobbyContract,
34
+ backoffice: backofficeContract,
35
+ profile: profileContract,
36
+ iam: iamContract,
37
+ audit: auditContract,
38
+ });
39
+
40
+ // Declarative platform config, validated at the boundary by defineIgamingConfig.
41
+ // Injected app-wide via the IGAMING_CONFIG token so services/adapters can read it.
42
+ const igaming = defineIgamingConfig({
43
+ branding: {
44
+ name: '{{name}}',
45
+ themePreset: 'midnightSapphire',
46
+ supportEmail: 'support@{{name}}.example',
47
+ },
48
+ currencies: ['EUR', 'USD'],
49
+ jurisdictions: ['DE', 'GB'],
50
+ blockedCountries: ['US'],
51
+ limits: {
52
+ maxDepositPerDay: 1000,
53
+ maxStakePerBet: 100,
54
+ sessionReminderMinutes: 60,
55
+ },
56
+ providers: {
57
+ payment: 'mock',
58
+ },
59
+ });
60
+
61
+ // loadExtensions() walks up from the working dir; point it at the registry sitting
62
+ // next to this entry so booting from any cwd resolves it (it lives under src/, which
63
+ // the upward walk would otherwise miss). An explicit env override still wins.
64
+ process.env['EXTENSIONS_CONFIG'] ??= resolve(
65
+ dirname(fileURLToPath(import.meta.url)),
66
+ 'extensions.config.ts',
67
+ );
68
+
69
+ async function bootstrap() {
70
+ const { listen, emitOpenApiSpec } = await createApp({
71
+ plugins: await loadExtensions(),
72
+ contract,
73
+ authSchema: { user, session, account, verification, twoFactor },
74
+ igaming,
75
+ port: Number(process.env['PORT'] ?? 3001),
76
+ cors: { origins: process.env['CORS_ORIGINS']?.split(',') ?? '*' },
77
+ openapi: { info: { title: '{{name}} API', version: '0.1.0' } },
78
+ });
79
+
80
+ await listen();
81
+ await emitOpenApiSpec();
82
+ }
83
+
84
+ void bootstrap();
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Migration runner. Applies every enabled @openora/core migration set against
3
+ * DATABASE_URL (or DATABASE_ADMIN_URL). Resolves @openora/core from node_modules,
4
+ * so it works whether the package is a local `link:` or a published npm install -
5
+ * no platform checkout required. Each set tracks itself in its own table, so order is
6
+ * not load-bearing and re-runs are idempotent. See ADR-0027.
7
+ *
8
+ * Usage: pnpm db:migrate (run before db:seed). Requires DATABASE_URL.
9
+ * Add or remove a line to match the modules you enable in extensions.config.ts.
10
+ */
11
+ const sets: ReadonlyArray<readonly [string, string]> = [
12
+ ['engine outbox', '@openora/core/server/migrate'],
13
+ ['audit', '@openora/core/audit/migrate'],
14
+ ['iam', '@openora/core/iam/migrate'],
15
+ ['identity', '@openora/core/pam/migrate/identity'],
16
+ ['profile', '@openora/core/pam/migrate/profile'],
17
+ ['wallet', '@openora/core/wallet/migrate'],
18
+ ['gaming', '@openora/core/casino/migrate/gaming'],
19
+ ['lobby', '@openora/core/casino/migrate/lobby'],
20
+ ['chat', '@openora/core/engagement/migrate/chat'],
21
+ ['notifications', '@openora/core/engagement/migrate/notifications'],
22
+ ['compliance', '@openora/core/compliance/migrate'],
23
+ ['cms', '@openora/core/cms/migrate'],
24
+ ];
25
+
26
+ async function main() {
27
+ if (!process.env['DATABASE_ADMIN_URL'] && !process.env['DATABASE_URL']) {
28
+ console.error('Cannot run migrations: set DATABASE_URL (or DATABASE_ADMIN_URL).');
29
+ process.exit(1);
30
+ }
31
+
32
+ for (const [label, specifier] of sets) {
33
+ process.stdout.write(`\n> migrate ${label}\n`);
34
+ const { migrate } = (await import(specifier)) as { migrate: () => Promise<void> };
35
+ await migrate();
36
+ }
37
+
38
+ process.stdout.write(`\nDone: ${sets.length} migration set(s) applied.\n`);
39
+ }
40
+
41
+ main()
42
+ .then(() => process.exit(0))
43
+ .catch((e) => {
44
+ console.error('\nMigrate failed:', e);
45
+ process.exit(1);
46
+ });
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Reference-data seeder. Composes the module seeders you enable (e.g. IAM's
3
+ * predefined roles) and runs them - convergent upserts, safe on every deploy.
4
+ *
5
+ * Standalone one-shot script (mirrors the migration runner): needs only a DB
6
+ * connection, never boots the app. Add a module's seeder by importing + calling it.
7
+ *
8
+ * Usage: pnpm db:seed (run after db:migrate). Requires DATABASE_URL.
9
+ * Does NOT include demo data (fixtures, fake players) - that is dev-only.
10
+ */
11
+ import { createDrizzleDb } from '@openora/core/server';
12
+ import { seedRoles } from '@openora/core/iam/seed';
13
+ // import additional module seeders here as you enable them
14
+
15
+ async function main() {
16
+ if (process.env['NODE_ENV'] === 'production') {
17
+ console.error('Refusing to seed in production. This script is dev/local only.');
18
+ process.exit(1);
19
+ }
20
+
21
+ const databaseUrl = process.env['DATABASE_URL'];
22
+ if (!databaseUrl) {
23
+ console.error('DATABASE_URL env var not set');
24
+ process.exit(1);
25
+ }
26
+
27
+ const db = createDrizzleDb(databaseUrl);
28
+
29
+ await seedRoles(db);
30
+ // await seedOtherModule(db);
31
+ console.log('Reference data seeded.');
32
+ }
33
+
34
+ main()
35
+ .then(() => process.exit(0))
36
+ .catch((e) => {
37
+ console.error('\nSeed failed:', e);
38
+ process.exit(1);
39
+ });
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "@openora/core/tsconfig/node-service.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist"
6
+ },
7
+ "include": ["src"]
8
+ }
@@ -0,0 +1,19 @@
1
+ services:
2
+ postgres:
3
+ image: postgres:16-alpine
4
+ environment:
5
+ POSTGRES_USER: postgres
6
+ POSTGRES_PASSWORD: postgres
7
+ POSTGRES_DB: oss_igaming
8
+ ports:
9
+ - '5432:5432'
10
+ volumes:
11
+ - postgres_data:/var/lib/postgresql/data
12
+ healthcheck:
13
+ test: ['CMD-SHELL', 'pg_isready -U postgres']
14
+ interval: 5s
15
+ timeout: 5s
16
+ retries: 10
17
+
18
+ volumes:
19
+ postgres_data:
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "{{name}}",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "turbo run dev",
8
+ "build": "turbo run build",
9
+ "typecheck": "turbo run typecheck",
10
+ "lint": "oxlint .",
11
+ "sync:agents": "rulesync generate",
12
+ "prepare": "rulesync generate",
13
+ "db:migrate": "pnpm -F @{{name}}/api db:migrate",
14
+ "db:seed": "pnpm -F @{{name}}/api db:seed",
15
+ "gen": "turbo gen"
16
+ },
17
+ "devDependencies": {
18
+ "@openora/mcp": "latest",
19
+ "@turbo/gen": "2.9.14",
20
+ "@types/node": "25.9.0",
21
+ "oxlint": "1.64.0",
22
+ "rulesync": "8.25.0",
23
+ "tsx": "4.22.2",
24
+ "turbo": "2.9.14",
25
+ "typescript": "6.0.3"
26
+ },
27
+ "engines": {
28
+ "node": ">=22.0.0",
29
+ "pnpm": ">=10.0.0"
30
+ },
31
+ "packageManager": "pnpm@11.5.2"
32
+ }
@@ -0,0 +1,8 @@
1
+ packages:
2
+ - 'apps/*'
3
+
4
+ allowBuilds:
5
+ esbuild: true
6
+ msgpackr-extract: true
7
+ sharp: true
8
+ tldjs: false
@@ -0,0 +1,26 @@
1
+ // rulesync config - single source of truth for all AI-agent instruction files.
2
+ // Source lives in .rulesync/ (rules, subagents, commands, mcp.json).
3
+ // Regenerate with `pnpm sync:agents`; CI checks with `pnpm sync:agents:check`.
4
+ {
5
+ "$schema": "https://github.com/dyoshikawa/rulesync/releases/latest/download/config-schema.json",
6
+
7
+ // Agents this repo targets, with per-target features. agentsmd is rules-only so
8
+ // AGENTS.md stays a clean human brief (no simulated-command boilerplate).
9
+ // Hooks + permissions are NOT managed here - .claude/settings.json is hand-maintained
10
+ // (it holds the guard hooks), so rulesync never clobbers it.
11
+ // codexcli: rules (AGENTS.md) + mcp (.codex/config.toml) only - its commands/
12
+ // subagents are simulation-only (kept off) and it has no hooks system.
13
+ "targets": {
14
+ "agentsmd": ["rules"],
15
+ "claudecode": ["rules", "mcp", "subagents", "commands", "skills"],
16
+ "copilot": ["rules", "mcp", "subagents", "commands", "hooks"],
17
+ "codexcli": ["rules", "mcp"],
18
+ },
19
+
20
+ // rulesync emits Copilot agents/prompts natively - no simulation needed.
21
+ "simulateCommands": false,
22
+ "simulateSubagents": false,
23
+
24
+ // Never bulk-delete output dirs (eg .github also holds workflows).
25
+ "delete": false,
26
+ }
@@ -0,0 +1,2 @@
1
+ // To customize, replace this re-export with your own plop config.
2
+ export { default } from '@openora/turbo-generators';
@@ -0,0 +1,17 @@
1
+ {
2
+ "$schema": "https://turbo.build/schema.json",
3
+ "ui": "tui",
4
+ "tasks": {
5
+ "build": {
6
+ "dependsOn": ["^build"],
7
+ "outputs": ["dist/**", ".next/**", "!.next/cache/**"]
8
+ },
9
+ "dev": {
10
+ "cache": false,
11
+ "persistent": true
12
+ },
13
+ "typecheck": {
14
+ "dependsOn": ["^build"]
15
+ }
16
+ }
17
+ }