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

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added .archive/README.md
Empty file.
10 changes: 10 additions & 0 deletions .development/feature-T-001/implementation-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!--
generated-by: dddctl@1.0.0
source-ddd-kit: latest
resolved-uids:

action-run-id: manual-run
managed-block: begin
-->

# Implementation Notes for T-001
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<!--
generated-by: dddctl@1.0.0
source-ddd-kit: latest
resolved-uids:
- auth-service.ts@sha256:...
- user-model.ts@sha256:...
action-run-id: manual-run
managed-block: begin
-->

# Implementation Notes for integration.test.task.001

<!-- dddctl-managed:start:key=auth-service.ts -->

## Guidance from auth-service.ts

> Summary: Opinionated Express 5 guide for Node 20 services.

## When to use

Use Express 5 for building REST APIs in Node.js.

## Pre-reqs

- Node 20
- TypeScript

## Install / Setup

npm install express

## Code patterns

Use middleware for validation.

<!-- dddctl-managed:end:key=auth-service.ts -->

<!-- dddctl-managed:start:key=user-model.ts -->

## Guidance from user-model.ts

> Summary: Opinionated Express 5 guide for Node 20 services.

## When to use

Use Express 5 for building REST APIs in Node.js.

## Pre-reqs

- Node 20
- TypeScript

## Install / Setup

npm install express

## Code patterns

Use middleware for validation.

<!-- dddctl-managed:end:key=user-model.ts -->
35 changes: 35 additions & 0 deletions .development/feature-t.2025.0924.08/implementation-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
<!--
generated-by: dddctl@1.0.0
source-ddd-kit: latest
resolved-uids:
- tech:typescript/frameworks/express@5.0@sha256:...
action-run-id: manual-run
managed-block: begin
-->

# Implementation Notes for t.2025.0924.08

<!-- dddctl-managed:start:key=tech:typescript/frameworks/express@5.0 -->

## Guidance from tech:typescript/frameworks/express@5.0

> Summary: Opinionated Express 5 guide for Node 20 services.

## When to use

Use Express 5 for building REST APIs in Node.js.

## Pre-reqs

- Node 20
- TypeScript

## Install / Setup

npm install express

## Code patterns

Use middleware for validation.

<!-- dddctl-managed:end:key=tech:typescript/frameworks/express@5.0 -->
185 changes: 147 additions & 38 deletions .eslintrc.cjs
Original file line number Diff line number Diff line change
@@ -1,75 +1,184 @@
module.exports = {
root: true,
ignorePatterns: ['*.config.js', '*.config.cjs', 'tools/ci-scripts/**/*'],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaVersion: 2020,
sourceType: 'module',
project: './tsconfig.json',
},
plugins: ['@typescript-eslint', 'prettier'],
plugins: ['@typescript-eslint', 'prettier', 'import', 'security'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'plugin:import/recommended',
'plugin:import/typescript',
'plugin:prettier/recommended',
],
settings: {
// Removed problematic import resolver for now
},
env: {
node: true,
es6: true,
},
ignorePatterns: [
'*.config.js',
'*.config.ts',
'webpack.config.js',
'webpack.config.ts',
'tools/ci-scripts/**/*',
],
rules: {
// Prettier integration
'prettier/prettier': 'error',

// TypeScript strict rules
'@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-non-null-assertion': 'warn',
'@typescript-eslint/no-unnecessary-condition': 'error',
'@typescript-eslint/strict-boolean-expressions': 'error',
'@typescript-eslint/no-confusing-void-expression': 'error',
'@typescript-eslint/prefer-readonly': 'error',
'@typescript-eslint/prefer-readonly-parameter-types': 'off',

'import/no-unresolved': 'error',
// 'import/no-cycle': 'error',
'import/no-self-import': 'error',
// 'import/no-absolute-path': 'error',
// 'import/no-unused-modules': 'error',
'import/no-deprecated': 'warn',
'import/order': [
'error',
{
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index'],
'newlines-between': 'always',
},
],

// Sorting and ordering rules
'sort-keys': 'off', // Disabled to avoid conflicts with object properties
'sort-vars': 'error',
'@typescript-eslint/member-ordering': [
'error',
{
default: ['signature', 'field', 'constructor', 'method'],
},
],

// Security rules
'security/detect-object-injection': 'warn',
'security/detect-non-literal-fs-filename': 'warn',
'security/detect-unsafe-regex': 'error',

// General code quality
'no-unused-vars': 'off', // Use @typescript-eslint/no-unused-vars instead
'@typescript-eslint/no-unused-vars': [
'error',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
ignoreRestSiblings: true,
args: 'after-used',
caughtErrorsIgnorePattern: '^_',
},
],

// Enforce consistent coding style
eqeqeq: ['error', 'always', { null: 'ignore' }],
'consistent-return': 'error',
'no-implicit-coercion': 'error',
yoda: 'error',
'no-bitwise': 'warn',
'no-lone-blocks': 'error',
'no-multi-assign': 'error',
'no-new-object': 'error',
'no-array-constructor': 'error',
'no-new-wrappers': 'error',
'no-extend-native': 'error',
'no-implicit-globals': 'error',
'no-invalid-this': 'error',
'no-shadow': 'off', // Disabled in favor of @typescript-eslint/no-shadow
'@typescript-eslint/no-shadow': 'error',
'no-undef': 'error',
'no-undefined': 'error',
'no-use-before-define': 'error',
'@typescript-eslint/no-use-before-define': 'error',

// Code complexity and maintainability
'max-lines-per-function': ['error', 50],
'max-params': ['error', 4],
'max-depth': ['error', 4],
'max-nested-callbacks': ['error', 3],
complexity: ['error', 10],
'max-lines': ['error', 300],

// Security rules (additional to plugin)
'no-eval': 'error',
'no-implied-eval': 'error',
'no-new-func': 'error',
'no-script-url': 'error',

// Performance rules
'no-loop-func': 'error',

// Best practices
'no-else-return': 'error',
'no-lonely-if': 'error',
'no-unneeded-ternary': 'error',
'no-useless-computed-key': 'error',
'no-useless-rename': 'error',
'prefer-object-spread': 'error',
'default-case': 'error',
'default-case-last': 'error',
'no-fallthrough': 'error',
'no-case-declarations': 'error',
'no-constructor-return': 'error',
'no-duplicate-case': 'error',
'no-self-compare': 'error',
'no-template-curly-in-string': 'error',
'no-unreachable-loop': 'error',
'require-atomic-updates': 'error',
'no-param-reassign': 'error',
'no-return-assign': 'error',
'no-return-await': 'error',
'require-await': 'error',
'no-async-promise-executor': 'error',
'no-await-in-loop': 'warn',
'no-promise-executor-return': 'error',
},
overrides: [
{
files: ['test/**/*.js', 'test/**/*.ts'],
files: ['**/*.test.ts', '**/*.spec.ts', '**/__tests__/**/*'],
parserOptions: {
project: './tsconfig.test.json',
},
env: {
jest: true,
},
},
{
files: ['src/types/**/*.ts', 'src/validation/**/*.ts', 'src/core/**/*.ts'],
rules: {
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
ignoreRestSiblings: true,
args: 'none',
caughtErrorsIgnorePattern: '^_',
},
],
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-unused-vars': 'off',
'@typescript-eslint/no-unnecessary-condition': 'off',
'@typescript-eslint/strict-boolean-expressions': 'off',
'no-unused-vars': 'off',
'max-lines-per-function': 'off',
complexity: 'off',
},
},
{
files: ['src/commands/**/*.ts'],
files: ['src/types/**/*.ts'],
rules: {
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: 'options',
argsIgnorePattern: '^_',
varsIgnorePattern: '^_',
ignoreRestSiblings: true,
args: 'after-used',
caughtErrorsIgnorePattern: '^_',
},
],
},
},
],
rules: {
'prettier/prettier': 'error',
'@typescript-eslint/no-explicit-any': 'error',
'no-unused-vars': 'warn',
'@typescript-eslint/no-unused-vars': [
'warn',
{
argsIgnorePattern: 'options',
varsIgnorePattern: '^_',
ignoreRestSiblings: true,
args: 'after-used',
caughtErrorsIgnorePattern: '^_',
},
],
eqeqeq: ['error', 'always'],
'consistent-return': 'error',
'no-implicit-coercion': 'warn',
'@typescript-eslint/explicit-module-boundary-types': 'warn',
},
};
23 changes: 23 additions & 0 deletions .github/workflows/catalogs-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Build Catalogs
on:
push:
branches: [main]
paths:
- 'standards/**'
- 'tech/**'
- 'templates/**'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npm run build
- run: node tools/ci-scripts/build-catalogs.js
- uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: 'Update catalogs'
file_pattern: 'standards/catalogs/*.json'
18 changes: 18 additions & 0 deletions .github/workflows/docs-validate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: Validate Docs
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npm run build
- run: node tools/ci-scripts/build-catalogs.js
- run: npm run cli ref audit
14 changes: 14 additions & 0 deletions .github/workflows/linkcheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: Link Check
on:
schedule:
- cron: '0 0 * * 0' # Weekly
jobs:
linkcheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: gaurav-nelson/github-action-markdown-link-check@v1
with:
use-quiet-mode: 'yes'
use-verbose-mode: 'yes'
config-file: '.github/linkcheck.json'
4 changes: 2 additions & 2 deletions .github/workflows/validate-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,5 @@ jobs:
- name: Run validator unit tests
run: npm test

- name: List TODO (smoke)
run: node dist/cli.js todo list || true
- name: List Tasks (smoke)
run: node dist/cli.js task list || true
Loading
Loading