Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
662b4d0
Add 'SkillForge' section to README
Laoujin Dec 18, 2025
77d3cec
Add preparation instructions in Prep.md
Laoujin Jan 5, 2026
91f62cf
Create DagIndeling.md
Laoujin Jan 5, 2026
fb5e504
Expand preparation instructions in Prep.md
Laoujin Jan 5, 2026
a648a16
initial commit
Laoujin Jan 5, 2026
3425bc4
organisations -> teams
Laoujin Jan 5, 2026
25b7ddf
collapse sidebar to icon
Laoujin Jan 5, 2026
1e0240a
Merge branch 'Bootcamp-Clone1'
Laoujin Jan 5, 2026
93ae44b
switch team icon
Laoujin Jan 5, 2026
341c12e
turn user.teams into a collection
Laoujin Jan 5, 2026
47089ef
simplify backend
Laoujin Jan 5, 2026
a656536
further simplification
Laoujin Jan 5, 2026
4373da0
sln files
Laoujin Jan 5, 2026
f0072b6
switch npm to bun
Laoujin Jan 5, 2026
6a0487c
Merge branch 'bun'
Laoujin Jan 5, 2026
eab5eae
commit bun.lock
Laoujin Jan 5, 2026
e8e9425
backend testing
Laoujin Jan 5, 2026
ee4688f
ci build
Laoujin Jan 5, 2026
1e39d5f
remove ci token for packages
Laoujin Jan 5, 2026
a9faf72
github token
Laoujin Jan 5, 2026
3d92a85
dotnet watch run
Laoujin Jan 5, 2026
e44b2b8
fix swagger with auth
Laoujin Jan 5, 2026
418977a
switch to postgres
Laoujin Jan 5, 2026
9ce0df3
run tests with transaction rollback
Laoujin Jan 5, 2026
aa4c6c3
e2e playwright tests
Laoujin Jan 5, 2026
a0ac1c5
run frontend on ci
Laoujin Jan 5, 2026
5d4cb41
frontend: build & lint
Laoujin Jan 5, 2026
e350349
e2e testing
Laoujin Jan 5, 2026
d28c8a2
Merge branch 'frontend-ci'
Laoujin Jan 5, 2026
27c091c
conditional local itenium-ui
Laoujin Jan 5, 2026
116e07a
upgrade itenium-ui
Laoujin Jan 5, 2026
84724fd
run e2e tests on ci
Laoujin Jan 5, 2026
15452f0
e2e testing
Laoujin Jan 5, 2026
1fe01af
tryout TODO
Laoujin Jan 5, 2026
2d0e1f6
update itenium-ui to 0.0.3
Laoujin Jan 5, 2026
f7f23f3
itenium colors
Laoujin Jan 7, 2026
f78e6c1
sign-in with img
Laoujin Jan 7, 2026
43c734e
sign-in img
Laoujin Jan 7, 2026
01b398d
test users: easier sign in
Laoujin Jan 7, 2026
db2f8cf
Update user roles and responsibilities in README
Laoujin Jan 7, 2026
79c6a92
added learner user
Laoujin Jan 7, 2026
6fb1e9e
rename 'local' to 'manager'
Laoujin Jan 7, 2026
056abe5
Merge branch 'master' of https://github.com/itenium-be/Bootcamp-AI
Laoujin Jan 7, 2026
949ecff
capabilities
Laoujin Jan 7, 2026
96d2ef8
Update user roles and responsibilities in README
Laoujin Jan 7, 2026
d481fe6
Merge branch 'master' of https://github.com/itenium-be/Bootcamp-AI
Laoujin Jan 7, 2026
e226120
menu items for different roles
Laoujin Jan 7, 2026
645b186
favicon
Laoujin Jan 7, 2026
92ea487
Merge branch 'favicon'
Laoujin Jan 7, 2026
15573ff
favicon
Laoujin Jan 7, 2026
cbcf8c5
Refactor backlog into structured teams and user stories
Laoujin Jan 7, 2026
d2d8978
Fix formatting in README for team sections
Laoujin Jan 7, 2026
a463b2a
Merge branch 'master' of https://github.com/itenium-be/Bootcamp-AI
Laoujin Jan 7, 2026
11aedc2
readme
Laoujin Jan 7, 2026
fce3387
add favicon to sign in page
Laoujin Jan 7, 2026
d18f2ab
remove certification
Laoujin Jan 7, 2026
c7d1075
the teams
Laoujin Jan 7, 2026
c1a52ee
Include demo time for teams in DagIndeling
Laoujin Jan 13, 2026
384f13e
teams
Laoujin Jan 27, 2026
ec79e25
Merge branch 'master' of https://github.com/itenium-be/Bootcamp-AI
Laoujin Jan 27, 2026
5292807
fix warnings
Laoujin Jan 27, 2026
21470b2
v1 pptx
Laoujin Jan 27, 2026
5af1503
gitignore
Laoujin Jan 28, 2026
e895d7d
pptx: ai track dates
Laoujin Feb 6, 2026
6446e9f
added memes
Laoujin Feb 6, 2026
c59d987
frontend: add vitest
Laoujin Feb 6, 2026
a62859f
add teamStore frontend tests
Laoujin Feb 6, 2026
065f2dc
add react component tests
Laoujin Feb 6, 2026
b56dbf3
add missing translations
Laoujin Feb 6, 2026
b7c3d33
Merge branch 'translations'
Laoujin Feb 6, 2026
c13ef46
frontend linting
Laoujin Feb 6, 2026
f5f067e
backend linting
Laoujin Feb 6, 2026
4ed01b4
Merge branch 'linter'
Laoujin Feb 6, 2026
39713a0
add jsdom
Laoujin Feb 6, 2026
6c00c18
gitignore claude & bmad
Laoujin Feb 6, 2026
9a561c5
ci name
Laoujin Feb 6, 2026
f505260
vulnerability scanning
Laoujin Feb 6, 2026
b4cf569
git hook: also do the backend formatting
Laoujin Feb 6, 2026
5209e78
brainstorming: competency framework functional requirements (WIP)
Laoujin Feb 9, 2026
16ac56b
claude settings
Laoujin Feb 25, 2026
89bf0e8
add minimal CLAUDE.md for AI coding guidelines
Laoujin Feb 25, 2026
bacdc81
add /pr workflow for AI-assisted pull requests
Laoujin Feb 25, 2026
197e586
Merge pull request #9 from itenium-be/feature/claude-pr-workflow
Laoujin Feb 25, 2026
b1f8bb8
fix bmad stuff
Laoujin Feb 25, 2026
90df648
Merge branch 'feature/claude-pr-workflow'
Laoujin Feb 25, 2026
fe675a0
enhance /pr to post line-specific review comments
Laoujin Feb 25, 2026
47c08b9
improve /pr to handle master branch and uncommitted changes
Laoujin Feb 25, 2026
927750c
Add files via upload
Laoujin Feb 27, 2026
c6d99a3
Add files via upload
Laoujin Feb 27, 2026
440c3aa
Add Product Requirements Document and Product Brief for Bootcamp-AI
oliviervdp Feb 27, 2026
33e9412
Refactor code structure for improved readability and maintainability
oliviervdp Feb 27, 2026
711d4fc
updated pptx
Laoujin Mar 3, 2026
1f7c79c
bootcamp setup md
Laoujin Mar 3, 2026
e19fcf1
Add db-setup script
BertVermorgen Mar 9, 2026
6782cc2
Update Bootcamp-Setup.md
BertVermorgen Mar 9, 2026
c264563
Update Bootcamp-Setup.md
BertVermorgen Mar 9, 2026
725f2c5
Updated claude md with TDD and other guidelines
BertVermorgen Mar 9, 2026
47df238
Create seperate instruction files to reduce claude md size
BertVermorgen Mar 11, 2026
5431cba
Create seperate instruction files to reduce claude md size
BertVermorgen Mar 11, 2026
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
25 changes: 25 additions & 0 deletions .claude/architecture.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Architecture

The system is a **modular monolith**: a single deployable unit divided into cohesive modules with explicit boundaries. Modules communicate through well-defined interfaces (ports); never by directly referencing each other's internals. A module maps to a bounded context.

## Default: Clean (Onion) Architecture

Apply when domain logic is non-trivial:

- **Domain layer** (center): entities, value objects, aggregates, domain events, domain services. Zero dependencies on anything outside this layer.
- **Application layer**: use cases / command & query handlers (CQRS). Orchestrates domain objects. No infrastructure dependencies — depends on domain interfaces only.
- **Infrastructure layer**: persistence, messaging, external APIs. Implements interfaces defined inward. Never referenced by domain or application.
- **Presentation layer**: API controllers, CLI. Thin — validates input, delegates to application layer, maps response.
- Dependencies point **inward only**. Enforce with architecture tests (e.g., ArchUnit, NetArchTest).

## Alternative: Vertical Slice Architecture

Prefer vertical slices when a feature is CRUD-heavy with little shared domain logic and minimal interaction with other domain concepts. Each slice owns its request, handler, validation, and response — fully self-contained. When logic is shared across slices, extract it to the domain layer.

## Domain-Driven Design

- Use **ubiquitous language** everywhere: class names, methods, variables, and tests must use domain terminology, never technical jargon.
- **Bounded contexts** align with module boundaries. Each module owns its domain model. Shared concepts are translated at the boundary via an anti-corruption layer — never leaked directly.
- **Aggregates** protect invariants. Only the aggregate root is reachable from outside; enforce consistency within the aggregate boundary.
- **Value objects** for concepts defined by value, not identity (e.g., `Money`, `Email`, `DateRange`). Make them immutable.
- **Domain events** for cross-context communication. Never call another bounded context's internals directly.
90 changes: 90 additions & 0 deletions .claude/commands/pr.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Create PR with AI Code Review

Create a pull request and post an AI code review to GitHub with line-specific comments.

## Steps

1. **Check for uncommitted changes**
- Run `git status` to check for staged/unstaged changes
- If there are uncommitted changes:
- Run `git diff` to understand what changed
- Ask the user if they want to commit first, suggesting a commit message based on the changes
- Use AskUserQuestion with options like:
- "Yes, commit with suggested message" (show the suggestion)
- "Yes, but let me provide the message"
- "No, I'll handle it myself"
- If yes, stage and commit the changes

2. **Check branch state**
- Run `git branch --show-current` to get current branch
- If on master/main:
- Analyze the changes to suggest a branch name (e.g., `feature/add-user-auth`, `fix/login-validation`)
- Ask the user for the branch name using AskUserQuestion with options:
- The suggested branch name (recommended)
- "Let me type a different name"
- Create the branch: `git checkout -b <branch-name>`
- Run `git log origin/master..HEAD --oneline` to see commits for PR
- Push branch if not yet pushed: `git push -u origin HEAD`

3. **Analyze changes**
- Run `git diff origin/master...HEAD` to see all changes
- Understand what the PR accomplishes

4. **Create the PR**
- Use `gh pr create` with a clear title and summary
- Format body as:
```
## Summary
<bullet points of what changed>

## Test plan
<how to verify the changes>
```

5. **Perform code review**
Review the diff for:
- Bugs or logic errors
- Security issues (injection, secrets, auth)
- Missing error handling
- Performance concerns
- Anti-patterns (e.g., `catch (Exception ex) { throw ex; }` instead of `throw;`)

Be pragmatic - this is a hackathon. Flag real issues, not nitpicks.

6. **Post line-specific comments**
For each issue found, post a comment on the specific line:
```bash
# Get PR number and commit SHA
PR_NUMBER=$(gh pr view --json number --jq '.number')
COMMIT_SHA=$(gh pr view --json headRefOid --jq '.headRefOid')
REPO=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')

# Post comment on specific line
gh api repos/$REPO/pulls/$PR_NUMBER/comments \
--method POST \
--field body="Your comment here" \
--field commit_id="$COMMIT_SHA" \
--field path="path/to/file.cs" \
--field line=42 \
--field side="RIGHT"
```

Common issues to flag:
- `throw ex;` → "Use `throw;` to preserve stack trace"
- `catch (Exception) { }` → "Empty catch block swallows errors"
- Hardcoded secrets → "Move to configuration/environment variables"
- Missing null checks → "Potential NullReferenceException"
- SQL concatenation → "Use parameterized queries to prevent SQL injection"

7. **Post summary review**
After line comments, post overall review:
```bash
gh pr review --comment --body "AI Review: Found N issues - see inline comments."
```

Or if no issues:
```bash
gh pr review --approve --body "AI Review: Code looks good."
```

8. **Return the PR URL** so the user can view it.
47 changes: 47 additions & 0 deletions .claude/frontend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Frontend (React)

## React Version & Patterns

- Before implementing any React feature, consult **[react.dev](https://react.dev)** to verify the current recommended approach. Use `WebFetch` on react.dev when in doubt — never rely solely on training data for React APIs.
- Use **React Server Components (RSC)** for data fetching and server-side logic by default. Mark components `"use client"` only when interactivity or browser APIs require it.
- Use **hooks exclusively** — no class components, no legacy lifecycle methods.
- Prefer modern built-in hooks: `use()`, `useActionState`, `useOptimistic`, `useFormStatus`. Avoid legacy workarounds they replace.
- Never use patterns marked deprecated on react.dev. Migrate proactively on major releases.
- Avoid `useEffect` for data fetching; use RSC or Suspense-compatible data fetching instead.

## Component Design

- **Composition over configuration**: small, single-purpose components composed together.
- Keep components **pure**: no side effects during render. Side effects belong in event handlers or `useEffect` (sparingly).
- Colocate state as close as possible to where it is used. Lift only when siblings genuinely share it.
- The React Compiler handles most memoization — do not manually add `useMemo`/`useCallback`/`React.memo` unless profiling proves it necessary.

## State Management

- **Local state first** (`useState`, `useReducer`). Lift to shared context only when needed.
- Use `useContext` for low-frequency global state (theme, current user). For high-frequency updates, use Zustand or Jotai.
- **Server state belongs server-side**: RSC or TanStack Query — not `useState` + `useEffect`.
- Avoid Redux unless already established in the project.

## Accessibility

- Use **semantic HTML** elements. Never use a `<div>` or `<span>` where a semantic element exists.
- Every interactive element must be keyboard-navigable and have an accessible label.
- Use ARIA attributes only when semantic HTML is insufficient.
- Accessibility violations are bugs. Include axe-core checks in the E2E suite.

## TDD for Frontend

- Use **React Testing Library + Vitest** for component and hook tests.
- Test **behaviour, not implementation**: query by role, label, or text — never by CSS class or component internals.
- Never assert on internal state directly.
- Mock at the **network boundary using MSW** (Mock Service Worker), not at the module level.
- One failing test at a time — same hard rules as backend TDD apply.

## E2E Testing with Playwright

- E2E tests cover **complete user journeys**: happy path + critical error paths.
- Use **Page Object Model (POM)** to encapsulate selectors and interactions.
- Prefer semantic selectors: `getByRole` → `getByLabel` → `getByText` → `data-testid`.
- Run Playwright tests in CI against a real running application, not mocks.
- Include **axe-core accessibility checks** (`@axe-core/playwright`) on every critical page.
52 changes: 52 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{
"permissions": {
"allow": [
"Bash(bun install)",
"Bash(bun run *)",
"Bash(bun add *)",
"Bash(bun remove *)",
"Bash(dotnet build*)",
"Bash(dotnet test*)",
"Bash(dotnet run*)",
"Bash(dotnet watch*)",
"Bash(dotnet format*)",
"Bash(dotnet ef migrations*)",
"Bash(dotnet restore*)",
"Bash(docker compose*)",
"Bash(git status*)",
"Bash(git diff*)",
"Bash(git log*)",
"Bash(git branch*)",
"Bash(git checkout*)",
"Bash(git switch*)",
"Bash(git add*)",
"Bash(git commit*)",
"Bash(git pull*)",
"Bash(git fetch*)",
"Bash(git stash*)",
"Bash(git merge*)",
"Bash(git rebase*)",
"Bash(npx playwright*)",
"Bash(npx vitest*)",
"Bash(ls *)",
"Bash(dir *)",
"Bash(pwd)",
"Bash(cat *)",
"Bash(head *)",
"Bash(tail *)"
],
"deny": [
"Bash(rm -rf /)",
"Bash(rm -rf ~)",
"Bash(rm -rf .)",
"Bash(git push --force*)",
"Bash(git push -f *)",
"Bash(git reset --hard*)",
"Bash(git clean -fd*)",
"Bash(git checkout -- .)",
"Bash(git restore .)",
"Bash(: > *)",
"Bash(truncate *)"
]
}
}
17 changes: 17 additions & 0 deletions .claude/tdd.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Test-Driven Development

Work **one test at a time** through the red-green-refactor cycle:

1. **Red** — write one failing test for a single acceptance criterion. Run tests; confirm it fails for the right reason (not a compile error or wrong assertion).
2. **Green** — write the minimum code to make it pass. Fake it (hardcode a return value) if that suffices; only generalize when a new test forces it. Run tests; confirm green.
3. **Refactor** — improve structure and clarity without changing behaviour. Run tests; confirm still green.
4. Repeat for the next requirement.

## Hard Rules

- Never write production code without a currently failing test that requires it.
- Never have more than one failing test at a time.
- Never refactor while any test is red.
- Each test validates exactly one acceptance criterion — name it accordingly.

For new features or non-trivial changes, always invoke the `tdd-guide` skill to drive the cycle. Skip only for trivial changes (typos, config, renaming).
96 changes: 96 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: Build & Test

on:
push:
branches: [master]
pull_request:
branches: [master]

jobs:
backend:
name: Backend Build
runs-on: ubuntu-latest

defaults:
run:
working-directory: Itenium.SkillForge/backend

steps:
- uses: actions/checkout@v4

- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Authenticate to GitHub Packages
run: dotnet nuget update source itenium --username laoujin --password ${{ secrets.NUGET_AUTH_TOKEN }} --store-password-in-clear-text

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --no-restore

- name: Format check
run: dotnet format --verify-no-changes --no-restore

- name: Test
run: dotnet test --no-build --verbosity normal

- name: Vulnerability scan
run: dotnet list package --vulnerable --include-transitive 2>&1 | tee /dev/stderr | grep -q "no vulnerable packages" || (echo "::error::Vulnerable packages found" && exit 1)

frontend:
name: Frontend Build
runs-on: ubuntu-latest

defaults:
run:
working-directory: Itenium.SkillForge/frontend

steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '22'

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Authenticate to GitHub Packages (npm)
run: |
echo "@itenium-forge:registry=https://npm.pkg.github.com" >> .npmrc
echo "//npm.pkg.github.com/:_authToken=${{ secrets.NUGET_AUTH_TOKEN }}" >> .npmrc

- name: Install dependencies
run: bun install

- name: Format check
run: bun run format:check

- name: Lint
run: bun run lint

- name: Type check
run: bun run typecheck

- name: Unit tests
run: bun run test

- name: Build
run: bun run build

- name: Vulnerability scan
run: bun audit --production || true

- name: Install Playwright browsers
run: npx playwright install --with-deps chromium

- name: Run E2E tests
run: bun run test:e2e
env:
NUGET_USER: ${{ github.actor }}
NUGET_TOKEN: ${{ secrets.NUGET_AUTH_TOKEN }}
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
~$Bootcamp-AI.pptx
_bmad
.claude/settings.local.json
.claude/commands/bmad*
Loading