Skip to content

feat: create riviere-extract-config package with JSON Schema - #53

Merged
NTCoding merged 12 commits into
mainfrom
issue-35-m1-d1-3-create-riviere-extract
Jan 6, 2026
Merged

NTCoding merged 12 commits into
mainfrom
issue-35-m1-d1-3-create-riviere-extract

Conversation

@NTCoding

@NTCoding NTCoding commented Jan 5, 2026 •

Copy link
Copy Markdown
Owner

Summary

Implements task #35: Create the @living-architecture/riviere-extract-config package with JSON Schema validation for the extraction DSL.

  • Package structure created using NX generator
  • JSON Schema defines extraction DSL with module-based configuration
  • 8 predicates implemented: hasDecorator, hasJSDoc, extendsClass, implementsInterface, nameEndsWith, nameMatches, inClassWith, and logical operators (and/or)
  • AJV-based validation with clear, actionable error messages
  • TypeScript types generated from schema
  • 100% test coverage across 39 tests
  • Package CLAUDE.md documenting core design principles

Test Plan

  • All tests passing with 100% coverage
  • Build succeeds
  • Lint passes
  • TypeScript compilation succeeds
  • Schema validates valid configs
  • Schema rejects invalid configs with clear errors

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Added a new package for defining, validating and parsing extraction configurations with JSON Schema and exported validation APIs (isValidExtractionConfig, validateExtractionConfig, parseExtractionConfig) plus error formatting.
  • Documentation

    • Included package README and a schema-focused doc describing schema shape, predicates, and validation principles.
  • Tests

    • Added comprehensive validation tests and fixtures covering many valid/invalid scenarios.
  • Chores

    • Project config and test/tooling setup (TypeScript, Vitest, build/export metadata, coverage exclusions).

✏️ Tip: You can customize this high-level summary in your review settings.

Implements task #35 - Create riviere-extract-config package with JSON Schema.

- Package structure created using NX generator
- JSON Schema defines extraction DSL with module-based config
- 8 predicates: hasDecorator, hasJSDoc, extendsClass,
  implementsInterface, nameEndsWith, nameMatches, inClassWith, and/or
- AJV validation with clear error messages
- TypeScript types matching schema
- 100% test coverage
- Package CLAUDE.md with core principles

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jan 5, 2026 •

Copy link
Copy Markdown

Deploying living-architecture with  Cloudflare Pages  Cloudflare Pages

Latest commit: 11c96ec
Status: ✅  Deploy successful!
Preview URL: https://44629ca8.living-architecture.pages.dev
Branch Preview URL: https://issue-35-m1-d1-3-create-rivi.living-architecture.pages.dev

View logs

@coderabbitai

coderabbitai Bot commented Jan 5, 2026 •

Copy link
Copy Markdown

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key(s) in object: 'tools'
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json
📝 Walkthrough

Walkthrough

Adds a new package riviere-extract-config that provides a JSON Schema, TypeScript types, AJV-based validation utilities, fixtures and tests, and package/build/test configuration for declaring and validating extraction-rule modules and composable predicates.

Changes

Cohort / File(s) Summary
Package foundation
packages/riviere-extract-config/package.json, packages/riviere-extract-config/project.json, packages/riviere-extract-config/README.md, packages/riviere-extract-config/CLAUDE.md
New ESM package metadata, README and CLAUDE docs; exposes schema and validation API.
Schema
packages/riviere-extract-config/extraction-config.schema.json
New strict JSON Schema for ExtractionConfig: modules array, per-module component rules (either notUsed or detection rule), find targets, and rich predicate types with and/or composition.
Types
packages/riviere-extract-config/src/types.ts
New exported TypeScript types and interfaces for FindTarget, ComponentType, Predicate variants, DetectionRule, ComponentRule, Module, and ExtractionConfig.
Validation implementation & public API
packages/riviere-extract-config/src/validation.ts, packages/riviere-extract-config/src/index.ts
AJV-based validator and helpers: isValidExtractionConfig, validateExtractionConfig, parseExtractionConfig, formatValidationErrors, mapAjvErrors; exports types and validation API.
Test fixtures & tests
packages/riviere-extract-config/src/validation-fixtures.ts, packages/riviere-extract-config/src/validation.spec.ts
Factory helpers and extensive tests covering valid/invalid configs, complex predicate compositions, error mapping and formatting, and parse behavior.
Build & test config
packages/riviere-extract-config/tsconfig.json, .../tsconfig.lib.json, .../tsconfig.spec.json, packages/riviere-extract-config/vite.config.ts, packages/riviere-extract-config/vitest.config.mts
TypeScript project references, library/test tsconfigs, Vite and Vitest configs (100% coverage thresholds).
Workspace and QA updates
tsconfig.json, sonar-project.properties, .coderabbit.yaml, .claude/agents/submit-pr.md, .claude/commands/complete-task.md
Adds project reference, Sonar exclusions for two files, CodeRabbit review settings and tools, and updates PR submission / feedback workflow and Sonar debugging guidance.

Sequence Diagram(s)

sequenceDiagram
  participant Caller as Caller (consumer/test)
  participant Validator as Validation module
  participant Schema as extraction-config.schema.json
  participant Ajv as AJV runtime

  Note over Caller,Validator: parseExtractionConfig(data)
  Caller->>Validator: parseExtractionConfig(data)
  Validator->>Ajv: ajv.validate(schema, data)
  Ajv-->>Validator: valid / errors
  alt valid
    Validator-->>Caller: return data (typed)
  else invalid
    Validator->>Validator: mapAjvErrors(errors) → formatValidationErrors
    Validator-->>Caller: throw Error(formatted messages)
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Possibly related issues

Possibly related PRs

Poem

🐇 I nibble schemas, tidy and neat,
Modules and predicates lined up to meet.
AJV checks, errors caught in a hop—
Parse, validate, and never stop! ✨

Pre-merge checks

✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: creating a new package with JSON Schema validation for extraction config, which is the primary deliverable of this PR.

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7f732c7 and 11c96ec.

📒 Files selected for processing (1)
  • packages/riviere-extract-config/README.md
🧰 Additional context used
🧠 Learnings (9)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T11:58:30.905Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-schema/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:30.905Z
Learning: Do not include riviere-schema in breaking change commits (`!` or `BREAKING CHANGE`) - this automatically bumps the major version

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T11:58:27.001Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-cli/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:27.001Z
Learning: When modifying CLI commands in the riviere-cli tool, update the corresponding workflow prompts in docs/workflow/ directory (step-1 through step-6) to keep the extraction workflow in sync

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-03T17:37:22.708Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/software-design.md:0-0
Timestamp: 2026-01-03T17:37:22.708Z
Learning: Applies to docs/conventions/**/*.{ts,tsx} : Use Zod for runtime validation. In TypeScript, use Zod schemas for parsing external data, API responses, and user input. Type inference from schemas keeps types and validation in sync.

Applied to files:

  • packages/riviere-extract-config/README.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: main
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (1)
packages/riviere-extract-config/README.md (1)

1-35: README successfully addresses previous feedback and is well-structured.

The README now includes the Documentation section (lines 28–31) with links to CLAUDE.md and the JSON Schema—exactly as requested in the previous review. The file is complete with clear usage examples, design principle and schema references, and building instructions.

One minor observation: Line 10 imports parseExtractionConfig but the usage examples (lines 16–25) only demonstrate isValidExtractionConfig and validateExtractionConfig. Consider showing how to use parseExtractionConfig as well, or remove the unused import for clarity.


Comment @coderabbitai help to get the list of available commands and usage tips.

Removes unused @swc/helpers devDependency flagged by knip.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Fix all issues with AI Agents 🤖
In @tsconfig.json:
- Around line 23-26: The tsconfig.json now references
"./packages/riviere-extract-config" but the corresponding Nx project.json is
missing; run `nx sync` to generate the missing project.json for the
riviere-extract-config package and ensure it matches the workspace conventions
used by other packages (riviere-builder, riviere-cli, riviere-query,
riviere-schema), then commit the generated project.json so the new project
reference in tsconfig.json is fully integrated into the Nx workspace.
🧹 Nitpick comments (11)
packages/riviere-extract-config/README.md (1)

1-7: Consider expanding the README with usage examples and purpose.

The README is minimal and only includes build instructions. Since this package introduces a new public API for JSON Schema validation with 8 predicate types and AJV-based validation (per the PR objectives), consider adding:

  • A brief description of the package's purpose (extraction DSL with JSON Schema validation)
  • Basic usage examples
  • Links to the schema or main exports
packages/riviere-extract-config/vitest.config.mts (1)

16-16: Remove redundant type assertion.

The as const assertion on line 16 is unnecessary since 'v8' is already a string literal constant in this context.

🔎 Proposed fix
-      provider: 'v8' as const,
+      provider: 'v8',
packages/riviere-extract-config/vite.config.ts (2)

17-17: Remove redundant type assertion.

The as const assertion on line 17 is unnecessary since 'v8' is already a string literal constant in this context.

🔎 Proposed fix
-      provider: 'v8' as const,
+      provider: 'v8',

15-18: Consider adding coverage thresholds to match vitest.config.mts.

The coverage configuration here is missing the enabled, reporter, and thresholds settings that are present in vitest.config.mts. If both configs are maintained, consider keeping their coverage settings consistent to match the project's 100% coverage requirement.

🔎 Proposed addition
     coverage: {
+      enabled: true,
       reportsDirectory: './test-output/vitest/coverage',
       provider: 'v8',
+      reporter: ['text', 'lcov'],
+      thresholds: {
+        lines: 100,
+        statements: 100,
+        functions: 100,
+        branches: 100,
+      },
     },
packages/riviere-extract-config/tsconfig.spec.json (2)

5-10: Types array extends beyond minimal vitest/globals configuration.

The types array includes vitest/importMeta, vite/client, node, and vitest in addition to vitest/globals. While these may be necessary for full Vite/Vitest functionality, the learnings suggest keeping types minimal with just ["vitest/globals"].

Based on learnings, consider simplifying to:

     "types": [
-      "vitest/globals",
-      "vitest/importMeta",
-      "vite/client",
-      "node",
-      "vitest"
+      "vitest/globals"
     ],

Only if testing reveals missing type definitions should additional types be added back.


27-27: Declaration files included in spec configuration.

Line 27 includes src/**/*.d.ts, which are type declaration files rather than test files. Per learnings, tsconfig.spec.json should include only test files.

Consider removing if type declarations are not required for test compilation:

     "src/**/*.spec.jsx",
-    "src/**/*.d.ts"
   ],
packages/riviere-extract-config/src/validation.spec.ts (1)

62-62: Minor: Remove trailing space after module.

Trailing whitespace detected after module in the destructuring assignment. This pattern appears on lines 62, 73, 84, 95, 111, and 122.

🔎 Fix for line 62 (apply similar fix to lines 73, 84, 95, 111, 122)
     const {
-      config, module 
+      config, module
     } = createMutableConfig()
packages/riviere-extract-config/extraction-config.schema.json (1)

277-313: Consider recursion depth limit for nested predicates (optional).

The recursive predicate definitions (inClassWith, and, or) allow unlimited nesting depth. While this provides maximum flexibility, extremely deep nesting could:

  • Impact validation performance
  • Create hard-to-debug configurations
  • Potentially cause stack overflow in some scenarios

For configuration files, this is likely acceptable since they're typically human-authored and reasonably shallow. However, if configs might be generated programmatically, consider adding a practical depth limit (e.g., maxDepth: 10) in the future.

packages/riviere-extract-config/src/types.ts (3)

5-37: Consider adding JSDoc comments for better DX.

The predicate interfaces form a well-designed composable structure. Consider adding JSDoc comments to document the purpose and usage of each predicate type, especially for the recursive structures (InClassWithPredicate, AndPredicate, OrPredicate).

Example documentation
+/**
+ * Matches code elements that have a specific decorator.
+ * @example { hasDecorator: { name: 'Controller', from: '@nestjs/common' } }
+ */
 export interface HasDecoratorPredicate {
   hasDecorator: {
     name: string | string[]
     from?: string
   }
 }

+/**
+ * Combines multiple predicates with logical AND.
+ * All predicates must match for the rule to succeed.
+ */
 export interface AndPredicate {and: Predicate[]}

39-46: Consider whether optional fields would be more ergonomic than NotUsed.

The NotUsed pattern enforces explicit configuration for every component type. While this provides clarity, it can be verbose when many component types are unused. Consider whether making component rules optional in the Module interface (lines 48-56) would improve the developer experience without sacrificing clarity.

Example alternative:

export interface Module {
  path: string
  api?: DetectionRule
  useCase?: DetectionRule
  // ... etc
}

The current explicit approach has merit for validation and type safety, so this is purely a design consideration.


48-56: Consider using Record type for more maintainable component rules.

The current explicit property approach provides excellent autocomplete and type safety. However, if ComponentType changes frequently, consider using a Record type to automatically sync with the ComponentType union:

export interface Module {
  path: string
} & Record<ComponentType, ComponentRule>

This would automatically include all component types from the ComponentType union and reduce maintenance when adding new component types. The current explicit approach is also valid and may be preferred for clarity.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b4ed119 and 14ac74d.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (16)
  • package.json
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/extraction-config.schema.json
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/src/types.ts
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/src/validation.spec.ts
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/vitest.config.mts
  • tsconfig.json
🧰 Additional context used
📓 Path-based instructions (4)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,js,jsx}: Do not log sensitive data (passwords, tokens, PII)
Use cross-project imports with package names (e.g., import { X } from '@living-architecture/[pkg-name]'), not relative paths

Files:

  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/src/types.ts
  • packages/riviere-extract-config/src/validation.spec.ts
**/package.json

📄 CodeRabbit inference engine (CLAUDE.md)

When adding dependencies between projects, add "@living-architecture/[pkg-name]": "workspace:*" to the consuming project's package.json

Files:

  • package.json
  • packages/riviere-extract-config/package.json
**/tsconfig.{json,lib.json,spec.json}

📄 CodeRabbit inference engine (CLAUDE.md)

After generating a new project, create a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, tsconfig.spec.json

Files:

  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.json
  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
**/*.{test,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{test,spec}.{ts,tsx,js,jsx}: Enforce 100% test coverage as mandatory and not optional
Follow docs/conventions/testing.md when writing tests

Files:

  • packages/riviere-extract-config/src/validation.spec.ts
🧠 Learnings (32)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/extraction-config.schema.json
  • packages/riviere-extract-config/src/types.ts
  • tsconfig.json
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/extraction-config.schema.json
  • packages/riviere-extract-config/src/types.ts
  • tsconfig.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/package.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/extraction-config.schema.json
  • tsconfig.json
📚 Learning: 2026-01-03T17:37:22.708Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/software-design.md:0-0
Timestamp: 2026-01-03T17:37:22.708Z
Learning: Applies to docs/conventions/**/*.{ts,tsx} : Use Zod for runtime validation. In TypeScript, use Zod schemas for parsing external data, API responses, and user input. Type inference from schemas keeps types and validation in sync.

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/src/validation.ts
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.spec.json : tsconfig.spec.json must include only test files (src/**/*.test.ts) and set types to [vitest/globals]

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/src/types.ts
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Run nx sync after adding projects and updating tsconfig references

Applied to files:

  • package.json
  • packages/riviere-extract-config/tsconfig.json
  • tsconfig.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/vitest.config.ts : Add vitest.config.ts to new projects if tests are needed, with 100% coverage as the default

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to eslint.config.mjs|tsconfig.base.json|nx.json|vite.config.*|vitest.config.mts : Do not modify root configuration files (eslint.config.mjs, tsconfig.base.json, nx.json, vite.config, vitest.config.mts)

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.lib.json : tsconfig.lib.json must exclude test files (src/**/*.test.ts) and set outDir to ./dist with rootDir to ./src

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/tsconfig.{json,lib.json,spec.json} : After generating a new project, create a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, tsconfig.spec.json

Applied to files:

  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.json
  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/@(tsconfig.json|tsconfig.lib.json|tsconfig.spec.json) : Each app and package requires a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, and tsconfig.spec.json with proper references and extends setup

Applied to files:

  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.json
  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Follow `docs/conventions/testing.md` when writing tests

Applied to files:

  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Create `<module>-fixtures.ts` files alongside `<module>.spec.ts` to reduce duplication when multiple tests share similar setup data

Applied to files:

  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.test.ts : Shared test fixtures used across multiple test files may be grouped in files like test-fixtures.ts

Applied to files:

  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Use fixture builder functions like `buildArgs(options = {})` to provide default test data with the ability to override specific values

Applied to files:

  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for collections: empty collection, single element, duplicates, nested structures, circular references, large collections, sparse arrays, and mixed types

Applied to files:

  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test violated domain constraints: uniqueness violations, missing relationships, ordering violations, range breaches, state inconsistencies, format mismatches, and temporal ordering

Applied to files:

  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for null and undefined: null input, undefined input, missing optional properties, and explicit undefined vs missing keys

Applied to files:

  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-02T11:58:27.001Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-cli/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:27.001Z
Learning: After modifying CLI commands, run `nx generate-docs riviere-cli` to regenerate CLI reference documentation

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies

Applied to files:

  • packages/riviere-extract-config/package.json
  • tsconfig.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation

Applied to files:

  • packages/riviere-extract-config/package.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json

Applied to files:

  • packages/riviere-extract-config/package.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths

Applied to files:

  • packages/riviere-extract-config/package.json
  • tsconfig.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: After modifying tsconfig references or adding dependencies between projects, run `nx sync` to update TypeScript project references

Applied to files:

  • packages/riviere-extract-config/tsconfig.json
  • tsconfig.json
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.{ts,tsx,js,jsx} : Check for `/* v8 ignore next -- preserve */` coverage skip directives. These should only be used for unreachable code necessary to satisfy the compiler. Extract code or write tests to mock behavior instead when possible.

Applied to files:

  • packages/riviere-extract-config/src/types.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Use cross-project imports with package names (e.g., `import { X } from 'living-architecture/[pkg-name]'`), not relative paths

Applied to files:

  • tsconfig.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Enforce 100% test coverage as mandatory and not optional

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test domain-specific edge cases: email formats, URLs with protocols/ports, international phone formats, addresses with Unicode, currency rounding, and percentage boundaries

Applied to files:

  • packages/riviere-extract-config/src/validation.spec.ts
🧬 Code graph analysis (2)
packages/riviere-extract-config/src/validation-fixtures.ts (1)
packages/riviere-extract-config/src/types.ts (2)
  • Module (48-56)
  • ExtractionConfig (58-61)
packages/riviere-extract-config/src/validation.spec.ts (3)
packages/riviere-extract-config/src/validation.ts (5)
  • isValidExtractionConfig (11-13)
  • validateExtractionConfig (40-53)
  • formatValidationErrors (55-60)
  • parseExtractionConfig (62-68)
  • mapAjvErrors (30-38)
packages/riviere-extract-config/src/validation-fixtures.ts (6)
  • createMinimalConfig (39-41)
  • createFullConfig (55-89)
  • createMutableConfig (43-53)
  • createMinimalModule (27-37)
  • createModuleWithoutPath (5-14)
  • createModuleWithoutApi (16-25)
packages/riviere-extract-config/src/types.ts (1)
  • ExtractionConfig (58-61)
🪛 LanguageTool
packages/riviere-extract-config/CLAUDE.md

[grammar] ~9-~9: Ensure spelling is correct
Context: ...mponent types per module (api, useCase, domainOp, event, eventHandler, ui) - Detection r...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: main
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (13)
package.json (1)

87-87: Verify the purpose of the empty dependencies object.

An empty dependencies object has been added to the root package.json. Since this is a private monorepo root, this won't affect publishing, but it's worth confirming whether this is intentional or an artifact from tooling.

packages/riviere-extract-config/package.json (1)

26-29: No security concerns — versions ajv@^8.17.1 and ajv-formats@^3.0.1 are current and secure.

Both packages are at their latest available versions with no known security vulnerabilities or CVEs.

packages/riviere-extract-config/vitest.config.mts (1)

1-26: No changes needed. Both vite.config.ts and vitest.config.mts coexist intentionally across all packages in the monorepo (riviere-builder, riviere-cli, riviere-extract-config, riviere-query, riviere-schema). This is the established pattern: vitest.config.mts contains the test-specific and coverage configuration and takes precedence for test runs, while vite.config.ts provides the base Vite setup. This dual-config structure aligns with the monorepo conventions documented in CLAUDE.md and docs/conventions/codebase-structure.md.

packages/riviere-extract-config/tsconfig.json (1)

1-13: LGTM! Correct 3-file tsconfig structure.

The base tsconfig correctly extends the workspace base configuration and references both library and spec configurations, following the required project structure.

packages/riviere-extract-config/tsconfig.lib.json (1)

1-28: LGTM! Library configuration follows conventions perfectly.

The library tsconfig correctly:

  • Sets rootDir to "src" and outDir to "dist"
  • Excludes all test files (.test., .spec.)
  • Excludes test configuration files
  • Includes only source TypeScript files

This aligns perfectly with the learnings for tsconfig.lib.json structure.

Based on learnings.

packages/riviere-extract-config/src/index.ts (1)

1-10: LGTM! Clean public API surface.

The barrel export pattern clearly defines the package's public API, exposing types and validation utilities. The separation of type exports (line 1) and named validation exports (lines 2-10) provides a well-organized interface.

packages/riviere-extract-config/CLAUDE.md (1)

1-18: LGTM! Documentation clearly describes the package purpose and principles.

The static analysis warning about "domainOp" on line 9 is a false positive—this is an intentional domain-specific term (domain operation) used consistently throughout the codebase.

packages/riviere-extract-config/src/validation.spec.ts (1)

18-385: Excellent test coverage across all validation scenarios.

The test suite comprehensively covers:

  • Valid configs: minimal, full, multiple modules, all predicate types, nested predicates
  • Invalid configs: edge cases for empty arrays, missing required fields, invalid values, constraints violations
  • Error handling: null/undefined inputs, error formatting, error mapping
  • Parsing behavior: success and failure paths with detailed error messages

This aligns with the 100% coverage requirement and testing best practices per coding guidelines.

packages/riviere-extract-config/src/validation-fixtures.ts (1)

1-89: LGTM! Fixtures follow best practices for test data management.

The fixture functions provide:

  • Sensible defaults for minimal valid configurations
  • Rich examples for comprehensive testing (createFullConfig)
  • Mutable configs for property-specific test variations
  • Partial configs for testing validation failures

This approach reduces test duplication and follows the pattern from learnings about creating dedicated fixture files.

packages/riviere-extract-config/extraction-config.schema.json (1)

1-315: Well-structured JSON Schema with comprehensive validation rules.

The schema effectively defines:

  • Strict module structure with all 6 required component types
  • Clear separation between notUsed marker and detectionRule
  • 8 predicate types with proper validation constraints
  • Recursive predicates (inClassWith, and, or) for flexible composition
  • additionalProperties: false throughout to catch configuration typos

The use of const: true for notUsed (line 79) correctly prevents notUsed: false, ensuring the field is only used as an explicit marker.

packages/riviere-extract-config/src/validation.ts (1)

1-68: No changes needed. The implementation follows the established architectural pattern for Rivière validation packages.

The use of AJV + JSON Schema is consistent with packages/riviere-schema/src/validation.ts and appears to be an intentional design choice for validation library packages. The Zod requirement from project guidelines applies only to docs/conventions/**/*.{ts,tsx}, not to files in packages/. This file is outside the scope of that requirement.

Likely an incorrect or invalid review comment.

packages/riviere-extract-config/src/types.ts (2)

1-3: LGTM: Clean union type definitions.

The string literal unions for FindTarget and ComponentType are clear and type-safe.


58-61: LGTM: Clean top-level configuration interface.

The ExtractionConfig interface is well-structured with an optional $schema reference for JSON Schema tooling and a required modules array.

Comment thread tsconfig.json
@NTCoding NTCoding changed the title [M1-D1.3] Create riviere-extract-config package with JSON Schema feat: create riviere-extract-config package with JSON Schema Jan 5, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
package.json (1)

85-86: Clarify the purpose of the empty dependencies object.

An empty "dependencies": {} object has been added to the root package.json. Since this is a private monorepo root and the object is empty, it doesn't serve a functional purpose currently. Was this added by tooling (e.g., nx sync or package manager normalization) or in preparation for future dependencies?

</review_comment_end -->

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 14ac74d and 1f6855d.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (1)
  • package.json
🧰 Additional context used
📓 Path-based instructions (1)
**/package.json

📄 CodeRabbit inference engine (CLAUDE.md)

When adding dependencies between projects, add "@living-architecture/[pkg-name]": "workspace:*" to the consuming project's package.json

Files:

  • package.json
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Use cross-project imports with package names (e.g., `import { X } from 'living-architecture/[pkg-name]'`), not relative paths
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json

Applied to files:

  • package.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies

Applied to files:

  • package.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Run nx sync after adding projects and updating tsconfig references

Applied to files:

  • package.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: main
  • GitHub Check: Cloudflare Pages

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Fix all issues with AI Agents 🤖
In @.claude/agents/submit-pr.md:
- Line 15: Replace the unhyphenated phrase "10 minute timeout" with the compound
adjective "10-minute timeout" in the README/instructions text (locate the line
containing the string `Run ./scripts/submit-pr.sh --title "<title>" --body
"<body>" (use 10 minute timeout - script waits for CI)` and update it to use the
hyphenated form to correctly form the compound adjective before "timeout").
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1f6855d and 5873768.

📒 Files selected for processing (1)
  • .claude/agents/submit-pr.md
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Use cross-project imports with package names (e.g., `import { X } from 'living-architecture/[pkg-name]'`), not relative paths
🪛 LanguageTool
.claude/agents/submit-pr.md

[grammar] ~15-~15: Use a hyphen to join words.
Context: ...title "<title>" --body ""` (use 10 minute timeout - script waits for CI) 5....

(QB_NEW_EN_HYPHEN)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: main
  • GitHub Check: Cloudflare Pages

Comment thread .claude/agents/submit-pr.md Outdated
NTCoding and others added 3 commits January 5, 2026 23:30
- gitleaks for secrets detection
- semgrep for vulnerability scanning
- actionlint for GitHub Actions validation
- linked_issue warning for task workflow
- sequence_diagrams for visual flow

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Fix all issues with AI Agents 🤖
In @.coderabbit.yaml:
- Around line 15-16: The config uses an unsupported property name `linked_issue`
under `pre_merge_checks`; replace it with the correct property
`issue_assessment` so the schema recognizes the check. Update the
`.coderabbit.yaml` entry by renaming `linked_issue:` to `issue_assessment:` and
preserve any nested values under that key so the existing behavior is retained.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5873768 and 2d1abf9.

📒 Files selected for processing (2)
  • .coderabbit.yaml
  • sonar-project.properties
🧰 Additional context used
🧠 Learnings (8)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/vitest.config.ts : Add vitest.config.ts to new projects if tests are needed, with 100% coverage as the default
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds

Applied to files:

  • sonar-project.properties
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.{ts,tsx,js,jsx} : Check for `/* v8 ignore next -- preserve */` coverage skip directives. These should only be used for unreachable code necessary to satisfy the compiler. Extract code or write tests to mock behavior instead when possible.

Applied to files:

  • sonar-project.properties
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.lib.json : tsconfig.lib.json must exclude test files (src/**/*.test.ts) and set outDir to ./dist with rootDir to ./src

Applied to files:

  • sonar-project.properties
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.spec.json : tsconfig.spec.json must include only test files (src/**/*.test.ts) and set types to [vitest/globals]

Applied to files:

  • sonar-project.properties
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Enforce 100% test coverage as mandatory and not optional

Applied to files:

  • sonar-project.properties
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/vitest.config.ts : Add vitest.config.ts to new projects if tests are needed, with 100% coverage as the default

Applied to files:

  • sonar-project.properties
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Follow `docs/conventions/testing.md` when writing tests

Applied to files:

  • sonar-project.properties
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: main
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (4)
.coderabbit.yaml (3)

7-7: LGTM! Assertive profile aligns with enhanced review objectives.

The assertive profile is correctly configured and will provide more comprehensive feedback during code reviews.


9-9: LGTM! Sequence diagrams enhance architectural visibility.

Enabling sequence diagrams will provide visual flow documentation in PR walkthroughs, which aligns well with the flow-based architecture approach.


18-24: LGTM! Security and quality tooling properly configured.

The tools section correctly enables three valuable static analysis tools:

  • Gitleaks for secret scanning
  • Semgrep for security vulnerability detection
  • actionlint for GitHub Actions workflow validation

These additions strengthen the repository's security posture and CI/CD quality checks.

sonar-project.properties (1)

10-10: Exclusions are justified.

The excluded files contain no testable runtime code. types.ts is a pure TypeScript type definition file, and index.ts is a bare re-export file that re-exports everything from ./types and selected exports from ./validation.

All public API functions (isValidExtractionConfig, validateExtractionConfig, parseExtractionConfig, formatValidationErrors, mapAjvErrors) are fully tested in validation.spec.ts. The barrel file itself has no logic to test, making the exclusion a standard and appropriate practice in TypeScript monorepos. The 100% coverage requirement is satisfied—what matters is that all testable code is covered, which it is.

Comment thread .coderabbit.yaml Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Fix all issues with AI Agents 🤖
In @.claude/commands/complete-task.md:
- Around line 94-96: Update the SonarCloud curl guidance to (1) show how to
obtain the PR number (e.g., mention using the GitHub CLI: gh pr view --json
number -q .number or checking the PR URL) so readers know what to substitute for
<PR_NUMBER>, and (2) replace the hard-coded project key
NTCoding_living-architecture with a placeholder like <PROJECT_KEY> so the
command is reusable; keep the existing note that metricKeys=new_coverage returns
a single measure so .measures[0].value is safe.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2d1abf9 and 4daca3f.

📒 Files selected for processing (3)
  • .claude/commands/complete-task.md
  • .coderabbit.yaml
  • packages/riviere-extract-config/vitest.config.mts
🧰 Additional context used
🧠 Learnings (6)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/vitest.config.ts : Add vitest.config.ts to new projects if tests are needed, with 100% coverage as the default

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to eslint.config.mjs|tsconfig.base.json|nx.json|vite.config.*|vitest.config.mts : Do not modify root configuration files (eslint.config.mjs, tsconfig.base.json, nx.json, vite.config, vitest.config.mts)

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.spec.json : tsconfig.spec.json must include only test files (src/**/*.test.ts) and set types to [vitest/globals]

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.lib.json : tsconfig.lib.json must exclude test files (src/**/*.test.ts) and set outDir to ./dist with rootDir to ./src

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: main
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (3)
.coderabbit.yaml (1)

7-24: LGTM! Configuration changes align with schema and best practices.

The configuration updates are valid:

  • Assertive profile will yield more comprehensive feedback
  • Sequence diagrams enabled for better visualization
  • Pre-merge checks appropriately configured with docstrings off and issue assessment on warning mode
  • Security and linting tools (Gitleaks, Semgrep, actionlint) properly enabled
packages/riviere-extract-config/vitest.config.mts (1)

1-29: LGTM! Well-configured Vitest setup with proper SonarCloud integration.

The configuration correctly:

  • Sets 100% coverage thresholds as required by project conventions
  • Configures the lcov reporter with projectRoot: repoRoot for repo-relative paths, addressing SonarCloud requirements
  • Uses appropriate test environment (node) for a configuration validation package
  • Follows package naming conventions (@living-architecture/riviere-extract-config)

Based on learnings, this aligns with project standards for Vitest configuration.

.claude/commands/complete-task.md (1)

99-102: Root cause criteria align well with PR context.

The three root cause categories (null paths, 0.0 coverage, type-only exclusions) are clearly articulated and directly align with the lcov path configuration and coverage exclusions introduced in this PR. This section effectively connects debugging steps to actionable resolution strategies.

[optional_note]
The guidance to exclude type-only files (interfaces, types) is particularly timely given that this PR defines exclusions for packages/riviere-extract-config/src/types.ts and packages/riviere-extract-config/src/index.ts in the coverage configuration.

Comment thread .claude/commands/complete-task.md
NTCoding and others added 2 commits January 6, 2026 00:17
Encodes the principle: "nitpicks contain valuable information and
should not be ignored."

Changes:
- Add step 5 "Resolve nitpicks" requiring each nitpick to be either
  fixed or documented with reason for not fixing
- Update workflow diagram to show nitpick handling flow
- Add structured success message format with pipeline status,
  nitpick resolution details, and PR URL

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
…ring PR ready

Root cause fixes:
1. Process now checks reviewDecision status - CHANGES_REQUESTED means not mergeable
2. Must address ALL CodeRabbit feedback (comments + nitpicks) before success
3. Success message includes CodeRabbit status and "ready to merge"

Also fixes CodeRabbit issues:
- Add missing project.json for riviere-extract-config
- Fix hyphenation: "10 minute" → "10-minute"
- Add PR number hint to SonarCloud debugging

Principles encoded:
- CHANGES_REQUESTED means not mergeable
- Nitpicks contain valuable information and should not be ignored

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Fix all issues with AI Agents 🤖
In @.claude/agents/submit-pr.md:
- Line 14: Update Step 3 around the text "Derive PR title (must be conventional
commit format)" to include a concise guideline and examples for conventional
commits: state the accepted pattern (e.g., type(scope): short description), list
common types (feat, fix, chore, docs, refactor, test, perf), show two examples
like "feat(auth): add OAuth2 login" and "fix(api): handle null response", and
optionally add a short link to the spec; ensure the wording is brief and placed
immediately after the existing Step 3 instruction so the derived title follows
this format.

In @packages/riviere-extract-config/project.json:
- Around line 1-3: Update the "name" field in project.json from
"@living-architecture/riviere-extract-config" to "riviere-extract-config" to
match workspace convention; leave the scoped name in package.json as-is for npm
publishing and ensure the project.json "name" exactly matches other workspace
project.json files (e.g., "riviere-extract-config").
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4daca3f and 764f308.

📒 Files selected for processing (3)
  • .claude/agents/submit-pr.md
  • .claude/commands/complete-task.md
  • packages/riviere-extract-config/project.json
🧰 Additional context used
🧠 Learnings (12)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: After addressing code review issues, complete the task by following docs/workflow/task-workflow.md → Completing Tasks.

Applied to files:

  • .claude/commands/complete-task.md
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Follow the task workflow steps exactly in `docs/workflow/task-workflow.md` before making any changes or committing code

Applied to files:

  • .claude/commands/complete-task.md
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.{ts,tsx,js,jsx} : Check for `/* v8 ignore next -- preserve */` coverage skip directives. These should only be used for unreachable code necessary to satisfy the compiler. Extract code or write tests to mock behavior instead when possible.

Applied to files:

  • .claude/commands/complete-task.md
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/tsconfig.{json,lib.json,spec.json} : After generating a new project, create a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, tsconfig.spec.json

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture

Applied to files:

  • packages/riviere-extract-config/project.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: main
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (3)
.claude/agents/submit-pr.md (1)

14-16: The script already accepts the --title and --body parameters. No action needed.

Likely an incorrect or invalid review comment.

.claude/commands/complete-task.md (2)

88-98: Clarify the order of operations for PR number retrieval.

Line 89 retrieves the PR number, but it's used in the conditional logic that starts at line 91. Consider restructuring this section so the PR number is fetched once at the top of step 5, then reused throughout, making the flow more logical.

🔎 Proposed restructuring
 5. **Resolve CodeRabbit feedback** (principles: CHANGES_REQUESTED means not mergeable; nitpicks contain valuable information):
+   - Get PR number: `gh pr view --json number -q .number`
+   - Check reviewDecision: `gh pr view --json reviewDecision -q .reviewDecision`
-   - Get PR number: `gh pr view --json number -q .number`
-   - Check reviewDecision: `gh pr view --json reviewDecision -q .reviewDecision`
    - If CHANGES_REQUESTED:

This keeps the PR number fetch at the logical start of the section rather than nested within conditional logic.

⛔ Skipped due to learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: After addressing code review issues, complete the task by following docs/workflow/task-workflow.md → Completing Tasks.

117-130: SonarCloud API parameters confirmed as correct.

The API endpoint and all query parameters (component, pullRequest, metricKeys, strategy, ps) are valid according to SonarCloud API documentation. The metric key new_coverage (Coverage on new code) is also correct. The strategy=leaves value filters results to leaf nodes (files), and the jq filter logic properly selects components with null or zero coverage values.

Comment thread .claude/agents/submit-pr.md Outdated
Comment thread packages/riviere-extract-config/project.json
- Fix project.json name to match workspace convention (riviere-extract-config)
- Add conventional commit format example to submit-pr.md

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
@NTCoding

NTCoding commented Jan 6, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jan 6, 2026

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@NTCoding

NTCoding commented Jan 6, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jan 6, 2026

Copy link
Copy Markdown
✅ Actions performed

Full review triggered.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Fix all issues with AI Agents
In @package.json:
- Line 86: The root package.json contains an unnecessary empty "dependencies"
field; remove the "dependencies": {} entry from the root package.json so the
monorepo relies on each package's own package.json for dependencies (ensure only
the empty object is removed and the surrounding JSON remains valid).

In @packages/riviere-extract-config/README.md:
- Around line 1-7: Update the README to include a short purpose/description for
riviere-extract-config, a minimal usage example showing the public API (e.g.,
import { validate, parse } from '@living-architecture/riviere-extract-config'
and a sample validate call), links to CLAUDE.md and the JSON schema
(extraction-config.schema.json), and a brief schema/reference section; keep the
existing build instructions but prepend these docs so consumers can understand
and use validate/parse without opening source files.

In @packages/riviere-extract-config/vite.config.ts:
- Around line 8-19: This file duplicates Vitest settings: remove the entire
test: { ... } block from vite.config.ts so vitest.config.mts remains the single
source of truth; if you must keep test config in vite.config.ts instead, add the
same coverage.thresholds object (lines for statements, branches, functions,
lines = 100) inside the test.coverage property to match vitest.config.mts and
ensure 100% coverage enforcement.

In @packages/riviere-extract-config/vitest.config.mts:
- Line 20: The reporter config uses an overly verbose explicit tuple assertion;
change the expression `reporter: ['text', ['lcov', { projectRoot: repoRoot }]]
as ['text', ['lcov', { projectRoot: string }]]` to a simpler, inference-friendly
form (e.g., use `as const` on the literal or extract the tuple into a properly
typed constant) so TypeScript can infer the correct readonly tuple type without
hard-coding the shape; update the `reporter` assignment in the vitest config
accordingly (referencing the `reporter` property in this file and the literal
array value shown).
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b4ed119 and 92f8169.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (21)
  • .claude/agents/submit-pr.md
  • .claude/commands/complete-task.md
  • .coderabbit.yaml
  • package.json
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/extraction-config.schema.json
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/src/types.ts
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/src/validation.spec.ts
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/vitest.config.mts
  • sonar-project.properties
  • tsconfig.json
🧰 Additional context used
📓 Path-based instructions (4)
**/tsconfig.{json,lib.json,spec.json}

📄 CodeRabbit inference engine (CLAUDE.md)

After generating a new project, create a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, tsconfig.spec.json

Files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.json
**/*.{test,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{test,spec}.{ts,tsx,js,jsx}: Enforce 100% test coverage as mandatory and not optional
Follow docs/conventions/testing.md when writing tests

Files:

  • packages/riviere-extract-config/src/validation.spec.ts
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,js,jsx}: Do not log sensitive data (passwords, tokens, PII)
Use cross-project imports with package names (e.g., import { X } from '@living-architecture/[pkg-name]'), not relative paths

Files:

  • packages/riviere-extract-config/src/validation.spec.ts
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/src/types.ts
**/package.json

📄 CodeRabbit inference engine (CLAUDE.md)

When adding dependencies between projects, add "@living-architecture/[pkg-name]": "workspace:*" to the consuming project's package.json

Files:

  • packages/riviere-extract-config/package.json
  • package.json
🧠 Learnings (37)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/vitest.config.ts : Add vitest.config.ts to new projects if tests are needed, with 100% coverage as the default

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
  • sonar-project.properties
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
  • sonar-project.properties
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to eslint.config.mjs|tsconfig.base.json|nx.json|vite.config.*|vitest.config.mts : Do not modify root configuration files (eslint.config.mjs, tsconfig.base.json, nx.json, vite.config, vitest.config.mts)

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.spec.json
  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.spec.json : tsconfig.spec.json must include only test files (src/**/*.test.ts) and set types to [vitest/globals]

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
  • sonar-project.properties
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/src/types.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.lib.json : tsconfig.lib.json must exclude test files (src/**/*.test.ts) and set outDir to ./dist with rootDir to ./src

Applied to files:

  • packages/riviere-extract-config/vitest.config.mts
  • packages/riviere-extract-config/tsconfig.spec.json
  • sonar-project.properties
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/tsconfig.{json,lib.json,spec.json} : After generating a new project, create a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, tsconfig.spec.json

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/@(tsconfig.json|tsconfig.lib.json|tsconfig.spec.json) : Each app and package requires a 3-file tsconfig structure: tsconfig.json, tsconfig.lib.json, and tsconfig.spec.json with proper references and extends setup

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/tsconfig.json
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Create `<module>-fixtures.ts` files alongside `<module>.spec.ts` to reduce duplication when multiple tests share similar setup data

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Follow `docs/conventions/testing.md` when writing tests

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • sonar-project.properties
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/vite.config.ts
  • packages/riviere-extract-config/tsconfig.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • tsconfig.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/src/validation.spec.ts
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/extraction-config.schema.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/src/types.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.test.ts : Shared test fixtures used across multiple test files may be grouped in files like test-fixtures.ts

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Enforce 100% test coverage as mandatory and not optional

Applied to files:

  • packages/riviere-extract-config/tsconfig.spec.json
  • packages/riviere-extract-config/src/validation.spec.ts
  • sonar-project.properties
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: After modifying tsconfig references or adding dependencies between projects, run `nx sync` to update TypeScript project references

Applied to files:

  • tsconfig.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Run nx sync after adding projects and updating tsconfig references

Applied to files:

  • tsconfig.json
  • packages/riviere-extract-config/tsconfig.json
  • package.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{ts,tsx,js,jsx} : Use cross-project imports with package names (e.g., `import { X } from 'living-architecture/[pkg-name]'`), not relative paths

Applied to files:

  • tsconfig.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/*.ts : Import from other projects using package names (living-architecture/[pkg-name]) instead of relative paths

Applied to files:

  • tsconfig.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/package.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts

Applied to files:

  • tsconfig.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/extraction-config.schema.json
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : When importing from another project, explicitly add living-architecture/[pkg-name] with workspace:* to package.json dependencies

Applied to files:

  • tsconfig.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/package.json
  • package.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components

Applied to files:

  • tsconfig.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/src/validation.spec.ts
  • packages/riviere-extract-config/src/index.ts
  • packages/riviere-extract-config/tsconfig.lib.json
  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/tsconfig.json
  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/extraction-config.schema.json
  • packages/riviere-extract-config/src/validation-fixtures.ts
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/src/types.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Verify and update package.json name to living-architecture/[project-name] after project generation

Applied to files:

  • tsconfig.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/package.json
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/package.json : When adding dependencies between projects, add `"living-architecture/[pkg-name]": "workspace:*"` to the consuming project's package.json

Applied to files:

  • tsconfig.json
  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/package.json
  • package.json
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/package.json : Use domain language in package names, not technical jargon (e.g., living-architecture/order-processing instead of living-architecture/order-utils)

Applied to files:

  • packages/riviere-extract-config/project.json
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively

Applied to files:

  • packages/riviere-extract-config/project.json
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test violated domain constraints: uniqueness violations, missing relationships, ordering violations, range breaches, state inconsistencies, format mismatches, and temporal ordering

Applied to files:

  • packages/riviere-extract-config/src/validation.spec.ts
  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for collections: empty collection, single element, duplicates, nested structures, circular references, large collections, sparse arrays, and mixed types

Applied to files:

  • packages/riviere-extract-config/src/validation.spec.ts
  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test domain-specific edge cases: email formats, URLs with protocols/ports, international phone formats, addresses with Unicode, currency rounding, and percentage boundaries

Applied to files:

  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test edge cases for null and undefined: null input, undefined input, missing optional properties, and explicit undefined vs missing keys

Applied to files:

  • packages/riviere-extract-config/src/validation.spec.ts
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: After addressing code review issues, complete the task by following docs/workflow/task-workflow.md → Completing Tasks.

Applied to files:

  • .claude/commands/complete-task.md
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Follow the task workflow steps exactly in `docs/workflow/task-workflow.md` before making any changes or committing code

Applied to files:

  • .claude/commands/complete-task.md
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.{ts,tsx,js,jsx} : Check for `/* v8 ignore next -- preserve */` coverage skip directives. These should only be used for unreachable code necessary to satisfy the compiler. Extract code or write tests to mock behavior instead when possible.

Applied to files:

  • .claude/commands/complete-task.md
  • sonar-project.properties
  • packages/riviere-extract-config/src/types.ts
📚 Learning: 2026-01-03T17:37:22.708Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/software-design.md:0-0
Timestamp: 2026-01-03T17:37:22.708Z
Learning: Applies to docs/conventions/**/*.{ts,tsx} : Use Zod for runtime validation. In TypeScript, use Zod schemas for parsing external data, API responses, and user input. Type inference from schemas keeps types and validation in sync.

Applied to files:

  • packages/riviere-extract-config/src/validation.ts
  • packages/riviere-extract-config/CLAUDE.md
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture

Applied to files:

  • packages/riviere-extract-config/package.json
  • packages/riviere-extract-config/CLAUDE.md
  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Use fixture builder functions like `buildArgs(options = {})` to provide default test data with the ability to override specific values

Applied to files:

  • packages/riviere-extract-config/src/validation-fixtures.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Update CLAUDE.md 'Current packages' section when adding new packages

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
📚 Learning: 2026-01-02T11:58:34.018Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: AGENTS.md:0-0
Timestamp: 2026-01-02T11:58:34.018Z
Learning: Read and follow all instructions in CLAUDE.md

Applied to files:

  • packages/riviere-extract-config/CLAUDE.md
📚 Learning: 2026-01-02T11:58:27.001Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-cli/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:27.001Z
Learning: After modifying CLI commands, run `nx generate-docs riviere-cli` to regenerate CLI reference documentation

Applied to files:

  • packages/riviere-extract-config/README.md
🧬 Code graph analysis (3)
packages/riviere-extract-config/src/validation.spec.ts (3)
packages/riviere-extract-config/src/validation.ts (5)
  • isValidExtractionConfig (11-13)
  • validateExtractionConfig (40-53)
  • formatValidationErrors (55-60)
  • parseExtractionConfig (62-68)
  • mapAjvErrors (30-38)
packages/riviere-extract-config/src/validation-fixtures.ts (6)
  • createMinimalConfig (39-41)
  • createFullConfig (55-89)
  • createMutableConfig (43-53)
  • createMinimalModule (27-37)
  • createModuleWithoutPath (5-14)
  • createModuleWithoutApi (16-25)
packages/riviere-extract-config/src/types.ts (1)
  • ExtractionConfig (58-61)
packages/riviere-extract-config/src/validation.ts (3)
packages/riviere-builder/src/builder.ts (1)
  • validate (765-767)
packages/riviere-extract-config/src/index.ts (7)
  • isValidExtractionConfig (3-3)
  • ValidationError (8-8)
  • ValidationResult (9-9)
  • mapAjvErrors (7-7)
  • validateExtractionConfig (4-4)
  • formatValidationErrors (6-6)
  • parseExtractionConfig (5-5)
packages/riviere-extract-config/src/types.ts (1)
  • ExtractionConfig (58-61)
packages/riviere-extract-config/src/validation-fixtures.ts (1)
packages/riviere-extract-config/src/types.ts (2)
  • Module (48-56)
  • ExtractionConfig (58-61)
🪛 LanguageTool
packages/riviere-extract-config/CLAUDE.md

[grammar] ~9-~9: Ensure spelling is correct
Context: ...mponent types per module (api, useCase, domainOp, event, eventHandler, ui) - Detection r...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (18)
packages/riviere-extract-config/project.json (1)

1-3: LGTM! Project name follows workspace convention.

The project name correctly uses the simple naming format without the @living-architecture/ prefix, consistent with other project.json files in the workspace.

packages/riviere-extract-config/tsconfig.json (1)

1-13: LGTM! Correctly implements 3-file tsconfig structure.

The configuration properly extends the base config and references the lib and spec configs, following the workspace convention for project TypeScript setup.

As per coding guidelines, this matches the required 3-file tsconfig structure (tsconfig.json, tsconfig.lib.json, tsconfig.spec.json).

sonar-project.properties (1)

10-10: Exclusions for types.ts and index.ts are justified.

types.ts contains only type definitions with no executable code. index.ts is a barrel re-export file forwarding exports from ./types and ./validation—no testable logic resides in the file itself. Both meet the project requirement for coverage exclusions (type definitions and barrel re-exports with no testable logic). The actual logic in validation.ts should be tested directly.

.coderabbit.yaml (1)

7-24: LGTM! Well-configured CodeRabbit settings.

The configuration changes are all valid and enhance the review process:

  • Assertive profile will provide more thorough feedback
  • Sequence diagrams add valuable context to reviews
  • Pre-merge checks appropriately configured (docstrings off, issue assessment as warning)
  • Security and workflow tooling (Gitleaks, Semgrep, Actionlint) properly enabled
.claude/agents/submit-pr.md (1)

14-16: LGTM! Previous review feedback addressed.

The updated steps now include:

  • Clear conventional commit format guidance with example
  • Properly hyphenated "10-minute timeout"
  • Explicit parameters for the submission script

The documentation is clear and actionable.

packages/riviere-extract-config/CLAUDE.md (1)

1-18: LGTM! Clear and well-structured documentation.

The CLAUDE.md file effectively documents the extraction config DSL with:

  • Clear purpose statement
  • Comprehensive validation scope
  • Well-defined guiding principles emphasizing schema-first design and fail-fast validation

Note: The LanguageTool hint about "domainOp" is a false positive—it's a technical term (domain operation) specific to this DSL.

packages/riviere-extract-config/tsconfig.lib.json (1)

1-28: LGTM! TypeScript configuration follows conventions.

The library configuration is properly set up:

  • Correct rootDir/outDir structure (src → dist)
  • Comprehensive test file exclusions
  • Appropriate Node.js types
  • Extends base configuration correctly

As per coding guidelines, this follows the required 3-file tsconfig structure for packages.

packages/riviere-extract-config/tsconfig.spec.json (1)

1-34: LGTM! Test configuration is properly structured.

The tsconfig.spec.json correctly extends the base configuration, includes all test files and Vitest/Vite config files, and references the library configuration. The types array appropriately includes Vitest globals and related type definitions needed for the test environment.

packages/riviere-extract-config/vitest.config.mts (1)

16-27: LGTM! Coverage configuration enforces 100% thresholds.

The coverage configuration correctly enforces 100% thresholds for all metrics (lines, statements, functions, branches) as per project conventions.

packages/riviere-extract-config/src/index.ts (1)

1-10: LGTM! Public API surface is well-structured.

The entry point properly re-exports both types and validation functions, creating a clean public API for consumers. The use of relative paths for internal module imports is correct.

packages/riviere-extract-config/package.json (2)

1-30: LGTM! Package configuration is well-structured.

The package.json correctly defines the package name following workspace conventions, includes a proper exports map with source/types/import conditions, and appropriately lists the distribution files.


26-29: The specified versions of ajv (^8.17.1) and ajv-formats (^3.0.1) are already at their latest releases and have no known security vulnerabilities. No action needed.

packages/riviere-extract-config/src/validation.spec.ts (1)

1-385: Excellent test coverage across all validation functions.

The test suite is comprehensive and well-structured, covering:

  • Valid scenarios with minimal, full, and multi-module configurations
  • All eight predicate types (hasDecorator, hasJSDoc, extendsClass, implementsInterface, nameEndsWith, nameMatches, inClassWith, and/or)
  • Nested and composite predicates
  • Edge cases: null, undefined, empty arrays, missing/empty required fields
  • Error formatting and mapping
  • Parse function with success and failure paths

This achieves the required 100% test coverage and follows testing conventions for edge cases and domain constraints.

packages/riviere-extract-config/src/validation-fixtures.ts (1)

1-89: Well-designed fixture utilities following best practices.

The fixture builders provide excellent test data patterns:

  • createMinimalModule/Config for valid baseline scenarios
  • createModuleWithout* variants for testing missing required fields
  • createMutableConfig returns both config and module reference, enabling tests to modify properties in place
  • createFullConfig demonstrates all predicate types with realistic examples

This follows the learning to use fixture builder functions that provide defaults with override capability, reducing test duplication.

packages/riviere-extract-config/src/validation.ts (2)

1-68: Clean validation implementation with robust error handling.

The implementation is well-structured:

  • Type guard pattern with isValidExtractionConfig provides type narrowing
  • Error mapping normalizes Ajv errors into consistent ValidationError format
  • Fallback messages for edge cases (empty errors array, missing messages)
  • parseExtractionConfig throws with formatted, actionable error messages

The use of Ajv aligns with the PR's stated deliverable of "AJV-based validation producing clear, actionable error messages."


4-4: Import assertion syntax is fully supported—no action needed.

The project's TypeScript version (5.9.2) and Node.js version (22, enforced in CI) exceed the minimum requirements for import assertion support. The compiler configuration (target: es2023, module: ESNext, moduleResolution: bundler) fully supports this syntax.

packages/riviere-extract-config/extraction-config.schema.json (1)

1-315: Comprehensive and well-structured JSON Schema for extraction DSL.

The schema design is excellent:

  • Eight predicate types with clear semantics (hasDecorator, hasJSDoc, extendsClass, implementsInterface, nameEndsWith, nameMatches, inClassWith, and/or)
  • Recursive predicates (inClassWith, and, or) properly reference #/$defs/predicate
  • Strict validation with additionalProperties: false prevents typos and invalid properties
  • Minimum length/item constraints prevent empty values (e.g., minLength: 1, minItems: 2 for and/or)
  • notUsed: { const: true } ensures only valid marker values
  • Clear descriptions aid IDE autocomplete and developer understanding
  • Schema aligns perfectly with TypeScript types in types.ts
packages/riviere-extract-config/src/types.ts (1)

1-61: TypeScript types perfectly mirror the JSON Schema.

The type definitions are clean and idiomatic:

  • Union types (FindTarget, ComponentType, Predicate, ComponentRule) match schema enums and oneOf structures
  • Predicate interfaces align with their corresponding schema definitions
  • Recursive types (InClassWithPredicate, AndPredicate, OrPredicate) properly reference the Predicate union
  • NotUsed uses literal type true matching the schema's const: true
  • Module and ExtractionConfig structures match schema requirements exactly

This strong alignment between schema and types ensures type safety for consumers and enables IDE autocomplete based on the validation rules.

Comment thread package.json Outdated
Comment thread packages/riviere-extract-config/vite.config.ts Outdated
Comment thread packages/riviere-extract-config/vitest.config.mts
- Remove duplicate test config from vite.config.ts (authoritative config in vitest.config.mts)
- Remove empty dependencies object from root package.json
- Add usage examples to riviere-extract-config README

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI Agents
In @packages/riviere-extract-config/README.md:
- Around line 1-30: Add a "Documentation" section to
packages/riviere-extract-config/README.md immediately after the Usage examples
and before the existing "Building" heading; create a second-level heading "##
Documentation" and include two bullet links: one to CLAUDE.md with a short label
like "Design principles and schema overview" and one to
extraction-config.schema.json labeled "JSON Schema reference" so reviewers can
find the design doc and schema.
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 92f8169 and 7f732c7.

📒 Files selected for processing (2)
  • packages/riviere-extract-config/README.md
  • packages/riviere-extract-config/vite.config.ts
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,js,jsx}: Do not log sensitive data (passwords, tokens, PII)
Use cross-project imports with package names (e.g., import { X } from '@living-architecture/[pkg-name]'), not relative paths

Files:

  • packages/riviere-extract-config/vite.config.ts
🧠 Learnings (18)
📓 Common learnings
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/software-design.md:0-0
Timestamp: 2026-01-03T17:37:22.708Z
Learning: Applies to docs/conventions/**/*.{ts,tsx} : Use Zod for runtime validation. In TypeScript, use Zod schemas for parsing external data, API responses, and user input. Type inference from schemas keeps types and validation in sync.
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/vitest.config.ts : Add vitest.config.ts to new projects if tests are needed, with 100% coverage as the default

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/vitest.config.ts : Create vitest.config.ts for each app and package with 100% coverage thresholds

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to eslint.config.mjs|tsconfig.base.json|nx.json|vite.config.*|vitest.config.mts : Do not modify root configuration files (eslint.config.mjs, tsconfig.base.json, nx.json, vite.config, vitest.config.mts)

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Enforce 100% test coverage as mandatory and not optional

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-05T13:01:42.216Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/workflow/code-review.md:0-0
Timestamp: 2026-01-05T13:01:42.216Z
Learning: Applies to docs/workflow/**/*.{ts,tsx,js,jsx} : Check for `/* v8 ignore next -- preserve */` coverage skip directives. These should only be used for unreachable code necessary to satisfy the compiler. Extract code or write tests to mock behavior instead when possible.

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.spec.json : tsconfig.spec.json must include only test files (src/**/*.test.ts) and set types to [vitest/globals]

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Applies to **/*.{test,spec}.{ts,tsx,js,jsx} : Follow `docs/conventions/testing.md` when writing tests

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*.spec.{ts,tsx,js,jsx} : Test violated domain constraints: uniqueness violations, missing relationships, ordering violations, range breaches, state inconsistencies, format mismatches, and temporal ordering

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-05T13:01:29.359Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/codebase-structure.md:0-0
Timestamp: 2026-01-05T13:01:29.359Z
Learning: Applies to docs/conventions/**/tsconfig.lib.json : tsconfig.lib.json must exclude test files (src/**/*.test.ts) and set outDir to ./dist with rootDir to ./src

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-04T17:04:31.747Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/testing.md:0-0
Timestamp: 2026-01-04T17:04:31.747Z
Learning: Applies to docs/conventions/**/*-fixtures.ts : Create `<module>-fixtures.ts` files alongside `<module>.spec.ts` to reduce duplication when multiple tests share similar setup data

Applied to files:

  • packages/riviere-extract-config/vite.config.ts
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Use Rivière Builder library to programmatically build the schema graph when writing extraction code

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/*extract*.{js,ts,jsx,tsx} : Extraction code should use the Rivière Builder library to parse code and emit schema components

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Use the Rivière CLI for building and validating schemas interactively

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T11:58:30.905Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: packages/riviere-schema/CLAUDE.md:0-0
Timestamp: 2026-01-02T11:58:30.905Z
Learning: Do not include riviere-schema in breaking change commits (`!` or `BREAKING CHANGE`) - this automatically bumps the major version

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-04T18:35:42.314Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: CLAUDE.md:0-0
Timestamp: 2026-01-04T18:35:42.314Z
Learning: Extract software architecture from code as living documentation using Riviere schema for flow-based (not structural) architecture

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-02T17:46:54.167Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/architecture/overview.md:0-0
Timestamp: 2026-01-02T17:46:54.167Z
Learning: Applies to docs/architecture/**/{client,frontend,browser,public,src}/**/*.{js,ts,jsx,tsx} : Use Rivière Query library for querying and analyzing the schema in browser-safe contexts

Applied to files:

  • packages/riviere-extract-config/README.md
📚 Learning: 2026-01-03T17:37:22.708Z
Learnt from: CR
Repo: NTCoding/living-architecture PR: 0
File: docs/conventions/software-design.md:0-0
Timestamp: 2026-01-03T17:37:22.708Z
Learning: Applies to docs/conventions/**/*.{ts,tsx} : Use Zod for runtime validation. In TypeScript, use Zod schemas for parsing external data, API responses, and user input. Type inference from schemas keeps types and validation in sync.

Applied to files:

  • packages/riviere-extract-config/README.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Cloudflare Pages
  • GitHub Check: main
🔇 Additional comments (2)
packages/riviere-extract-config/vite.config.ts (2)

1-1: LGTM!

The import statement is correct and uses the standard Vite configuration API.


3-7: LGTM! Previous duplication issue resolved.

The configuration is now minimal and appropriate. The test configuration has been correctly removed, delegating that responsibility to vitest.config.mts as the single source of truth. The remaining Vite settings (root, cacheDir, plugins) are properly configured for an NX monorepo package.

Comment thread packages/riviere-extract-config/README.md
… schema

Addresses CodeRabbit feedback to provide references to design principles
and schema documentation.

NOT FIXING: vitest.config.mts type assertion simplification (nitpick) -
removing the explicit type assertion breaks TypeScript typecheck because
vitest's CoverageReporter type requires the exact tuple shape and neither
inference nor `as const` produces a compatible type.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <[email protected]>
@sonarqubecloud

sonarqubecloud Bot commented Jan 6, 2026

Copy link
Copy Markdown

@NTCoding
NTCoding merged commit 1aed4f3 into main Jan 6, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant