diff --git a/.agents/skills/beads/SKILL.md b/.agents/skills/beads/SKILL.md deleted file mode 100644 index a5a3344..0000000 --- a/.agents/skills/beads/SKILL.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -name: beads -description: Use when working in a repository that uses bd or Beads for durable project task tracking, issue dependencies, blocker management, multi-session handoff, or shared work memory. Trigger when the user asks to find ready work, claim or close tasks, create follow-up work, inspect blockers, recover project context, or choose between local planning and persistent project tracking. ---- - -# Beads - -Use Beads as the shared project task system. Local plans, scratch files, and personal memories are useful, but they are not the durable source of truth for project work. - -## First Step - -Run: - -```bash -bd prime -``` - -If that prints nothing, check whether the repository has an active Beads workspace: - -```bash -bd where -``` - -## Preferred Route - -Use the `bd` CLI when shell access is available. It is the most compact and direct Beads interface. - -## Core CLI Workflow - -1. Find work: - -```bash -bd ready -bd list --status=open -bd list --status=in_progress -``` - -2. Inspect before editing: - -```bash -bd show -``` - -3. Claim work atomically: - -```bash -bd update --claim -``` - -4. Create durable follow-up work when implementation reveals new tasks: - -```bash -bd create "Short title" --description="Why this exists and what needs to be done" --type=task --priority=2 -``` - -5. Close completed work: - -```bash -bd close --reason="Completed" -``` - -## What Belongs In Beads - -Use Beads for: - -- shared project tasks -- blockers and dependencies -- discovered follow-up work -- work that must survive thread reset, compaction, or handoff -- status that another person or agent should be able to resume - -Use agent-local planning tools only for the current turn's execution checklist. Do not treat them as shared project state. - -## Rules - -- Do not create markdown TODO files as the source of truth when Beads is available. -- Do not use `bd edit`; it opens an interactive editor. Use `bd update` flags instead. -- Prefer `--json` when parsing `bd` output programmatically. -- If hooks are installed, `bd prime` may already be injected. Run it manually when context is missing. -- Do not auto-close or mutate tasks unless the work is actually complete. diff --git a/.agents/skills/beads/agents/openai.yaml b/.agents/skills/beads/agents/openai.yaml deleted file mode 100644 index 09c3b8f..0000000 --- a/.agents/skills/beads/agents/openai.yaml +++ /dev/null @@ -1,4 +0,0 @@ -interface: - display_name: "Beads" - short_description: "Project task tracking with bd" - default_prompt: "Use $beads to inspect ready work and manage durable project tasks." diff --git a/.beads/.gitignore b/.beads/.gitignore deleted file mode 100644 index f773858..0000000 --- a/.beads/.gitignore +++ /dev/null @@ -1,77 +0,0 @@ -# Dolt database (managed by Dolt, not git) -dolt/ -embeddeddolt/ -proxieddb/ - -# Runtime files -bd.sock -bd.sock.startlock -sync-state.json -last-touched -.exclusive-lock - -# Daemon runtime (lock, log, pid) -daemon.* - -# Push state (runtime, per-machine) -push-state.json - -# Lock files (various runtime locks) -*.lock - -# Credential key (encryption key for federation peer auth — never commit) -.beads-credential-key - -# Local version tracking (prevents upgrade notification spam after git ops) -.local_version - -proxied_server_client_info.json - -# Worktree redirect file (contains relative path to main repo's .beads/) -# Must not be committed as paths would be wrong in other clones -redirect - -# Sync state (local-only, per-machine) -# These files are machine-specific and should not be shared across clones -.sync.lock -export-state/ -export-state.json -last_pull - -# Ephemeral store (SQLite - wisps/molecules, intentionally not versioned) -ephemeral.sqlite3 -ephemeral.sqlite3-journal -ephemeral.sqlite3-wal -ephemeral.sqlite3-shm - -# Dolt server management (auto-started by bd) -dolt-server.pid -dolt-server.log -dolt-server.lock -dolt-server.port -dolt-server.activity - -# Debug-mode pprof artifacts (written when dolt.debug: true in config.yaml) -dolt-pprof/ - -# Corrupt backup directories (created by bd doctor --fix recovery) -*.corrupt.backup/ - -# Backup data (auto-exported JSONL, local-only) -backup/ - -# Per-project environment file (Dolt connection config, GH#2520) -.env - -# Legacy files (from pre-Dolt versions) -*.db -*.db?* -*.db-journal -*.db-wal -*.db-shm -db.sqlite -bd.db -# NOTE: Do NOT add negation patterns here. -# They would override fork protection in .git/info/exclude. -# Config files (metadata.json, config.yaml) are tracked by git by default -# since no pattern above ignores them. diff --git a/.beads/README.md b/.beads/README.md deleted file mode 100644 index 63e8f4c..0000000 --- a/.beads/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Beads - AI-Native Issue Tracking - -Welcome to Beads! This repository uses **Beads** for issue tracking - a modern, AI-native tool designed to live directly in your codebase alongside your code. - -## What is Beads? - -Beads is issue tracking that lives in your repo, making it perfect for AI coding agents and developers who want their issues close to their code. No web UI required - everything works through the CLI and integrates seamlessly with git. - -**Learn more:** [github.com/steveyegge/beads](https://github.com/steveyegge/beads) - -## Quick Start - -### Essential Commands - -```bash -# Create new issues -bd create "Add user authentication" - -# View all issues -bd list - -# View issue details -bd show - -# Update issue status -bd update --claim -bd update --status done - -# Sync with Dolt remote -bd dolt push -``` - -### Working with Issues - -Issues in Beads are: -- **Git-native**: Stored in Dolt database with version control and branching -- **AI-friendly**: CLI-first design works perfectly with AI coding agents -- **Branch-aware**: Issues can follow your branch workflow -- **Sync-ready**: Uses Dolt remotes for backup and team sharing - -## Why Beads? - -✨ **AI-Native Design** -- Built specifically for AI-assisted development workflows -- CLI-first interface works seamlessly with AI coding agents -- No context switching to web UIs - -🚀 **Developer Focused** -- Issues live in your repo, right next to your code -- Works offline, syncs when you push -- Fast, lightweight, and stays out of your way - -🔧 **Git Integration** -- Dolt-native sync via bd dolt push / bd dolt pull -- Branch-aware issue tracking -- Dolt-native three-way merge resolution - -## Get Started with Beads - -Try Beads in your own projects: - -```bash -# Install Beads -curl -sSL https://raw.githubusercontent.com/steveyegge/beads/main/scripts/install.sh | bash - -# Initialize in your repo -bd init - -# Create your first issue -bd create "Try out Beads" -``` - -## Learn More - -- **Documentation**: [github.com/steveyegge/beads/docs](https://github.com/steveyegge/beads/tree/main/docs) -- **Quick Start Guide**: Run `bd quickstart` -- **Examples**: [github.com/steveyegge/beads/examples](https://github.com/steveyegge/beads/tree/main/examples) - ---- - -*Beads: Issue tracking that moves at the speed of thought* ⚡ diff --git a/.beads/config.yaml b/.beads/config.yaml deleted file mode 100644 index 630f8e7..0000000 --- a/.beads/config.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Beads Configuration File -# This file configures default behavior for all bd commands in this repository -# All settings can also be set via environment variables (BD_* prefix) -# or overridden with command-line flags - -# Issue prefix for this repository (used by bd init) -# If not set, bd init will auto-detect from directory name -# Example: issue-prefix: "myproject" creates issues like "myproject-1", "myproject-2", etc. -# issue-prefix: "" - -# Use no-db mode: JSONL-only, no Dolt database -# When true, .beads/issues.jsonl is the only local store -# no-db: false - -# Enable JSON output by default -# json: false - -# Feedback title formatting for mutating commands (create/update/close/dep/edit) -# 0 = hide titles, N > 0 = truncate to N characters -# output: -# title-length: 255 - -# Default actor for audit trails (overridden by BEADS_ACTOR or --actor) -# actor: "" - -# Export events (audit trail) to .beads/events.jsonl on each flush/sync -# When enabled, new events are appended incrementally using a high-water mark. -# Use 'bd export --events' to trigger manually regardless of this setting. -# events-export: false - -# Multi-repo configuration (experimental - bd-307) -# Allows hydrating from multiple repositories and routing writes to the correct database -# repos: -# primary: "." # Primary repo (where this database lives) -# additional: # Additional repos to hydrate from (read-only) -# - ~/beads-planning # Personal planning repo -# - ~/work-planning # Work planning repo - -# Dolt-native backup (periodic backup for off-machine recovery) -# This is full database backup only. Cross-machine sync uses Dolt remotes. -# backup: -# enabled: false # Disable auto-backup entirely -# interval: 15m # Minimum time between auto-backups -# git-push: false # Disable git push (backup locally only) -# git-repo: "" # Separate git repo for backups (default: project repo) - -# Optional JSONL auto-export for viewers, interchange, and issue-level migration. -# Disabled by default; enable only when an integration needs fresh .beads/issues.jsonl. -# Use relative paths under .beads/ for JSONL import/export filenames. -# export: -# auto: false -# path: issues.jsonl -# interval: 60s -# git-add: false -# import: -# path: issues.jsonl - -# Integration settings (access with 'bd config get/set') -# Non-secret keys (stored in the database): -# - jira.url, jira.project -# - linear.team_id -# - github.org, github.repo -# -# Secret keys (stored in this file but prefer env vars to avoid git exposure): -# - linear.api_key → use LINEAR_API_KEY env var instead -# - github.token → use GITHUB_TOKEN env var instead - -sync.remote: "git+ssh://git@git.shinuwa.fr:2222/shinuwa/sokko-g.git" \ No newline at end of file diff --git a/.beads/hooks/post-checkout b/.beads/hooks/post-checkout deleted file mode 100755 index c560396..0000000 --- a/.beads/hooks/post-checkout +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env sh -# --- BEGIN BEADS INTEGRATION v1.2.2 --- -# This section is managed by beads. Do not remove these markers. -if command -v bd >/dev/null 2>&1; then - export BD_GIT_HOOK=1 - _bd_timeout=${BEADS_HOOK_TIMEOUT:-300} - _bd_used_perl=0 - if command -v timeout >/dev/null 2>&1; then - timeout "$_bd_timeout" bd hooks run post-checkout "$@" - _bd_exit=$? - elif command -v gtimeout >/dev/null 2>&1; then - gtimeout "$_bd_timeout" bd hooks run post-checkout "$@" - _bd_exit=$? - elif command -v perl >/dev/null 2>&1; then - _bd_used_perl=1 - perl -e 'alarm shift; exec @ARGV' "$_bd_timeout" bd hooks run post-checkout "$@" - _bd_exit=$? - else - echo >&2 "beads: hook 'post-checkout' running without timeout; install coreutils or perl to enable BEADS_HOOK_TIMEOUT" - bd hooks run post-checkout "$@" - _bd_exit=$? - fi - if [ $_bd_exit -eq 124 ] || { [ $_bd_used_perl -eq 1 ] && [ $_bd_exit -eq 142 ]; }; then - echo >&2 "beads: hook 'post-checkout' timed out after ${_bd_timeout}s — continuing without beads" - _bd_exit=0 - fi - if [ $_bd_exit -eq 3 ]; then - echo >&2 "beads: database not initialized — skipping hook 'post-checkout'" - _bd_exit=0 - fi - if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi -fi -# --- END BEADS INTEGRATION v1.2.2 --- diff --git a/.beads/hooks/post-merge b/.beads/hooks/post-merge deleted file mode 100755 index 496f175..0000000 --- a/.beads/hooks/post-merge +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env sh -# --- BEGIN BEADS INTEGRATION v1.2.2 --- -# This section is managed by beads. Do not remove these markers. -if command -v bd >/dev/null 2>&1; then - export BD_GIT_HOOK=1 - _bd_timeout=${BEADS_HOOK_TIMEOUT:-300} - _bd_used_perl=0 - if command -v timeout >/dev/null 2>&1; then - timeout "$_bd_timeout" bd hooks run post-merge "$@" - _bd_exit=$? - elif command -v gtimeout >/dev/null 2>&1; then - gtimeout "$_bd_timeout" bd hooks run post-merge "$@" - _bd_exit=$? - elif command -v perl >/dev/null 2>&1; then - _bd_used_perl=1 - perl -e 'alarm shift; exec @ARGV' "$_bd_timeout" bd hooks run post-merge "$@" - _bd_exit=$? - else - echo >&2 "beads: hook 'post-merge' running without timeout; install coreutils or perl to enable BEADS_HOOK_TIMEOUT" - bd hooks run post-merge "$@" - _bd_exit=$? - fi - if [ $_bd_exit -eq 124 ] || { [ $_bd_used_perl -eq 1 ] && [ $_bd_exit -eq 142 ]; }; then - echo >&2 "beads: hook 'post-merge' timed out after ${_bd_timeout}s — continuing without beads" - _bd_exit=0 - fi - if [ $_bd_exit -eq 3 ]; then - echo >&2 "beads: database not initialized — skipping hook 'post-merge'" - _bd_exit=0 - fi - if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi -fi -# --- END BEADS INTEGRATION v1.2.2 --- diff --git a/.beads/hooks/pre-commit b/.beads/hooks/pre-commit deleted file mode 100755 index b015c22..0000000 --- a/.beads/hooks/pre-commit +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env sh -# --- BEGIN BEADS INTEGRATION v1.2.2 --- -# This section is managed by beads. Do not remove these markers. -if command -v bd >/dev/null 2>&1; then - export BD_GIT_HOOK=1 - _bd_timeout=${BEADS_HOOK_TIMEOUT:-300} - _bd_used_perl=0 - if command -v timeout >/dev/null 2>&1; then - timeout "$_bd_timeout" bd hooks run pre-commit "$@" - _bd_exit=$? - elif command -v gtimeout >/dev/null 2>&1; then - gtimeout "$_bd_timeout" bd hooks run pre-commit "$@" - _bd_exit=$? - elif command -v perl >/dev/null 2>&1; then - _bd_used_perl=1 - perl -e 'alarm shift; exec @ARGV' "$_bd_timeout" bd hooks run pre-commit "$@" - _bd_exit=$? - else - echo >&2 "beads: hook 'pre-commit' running without timeout; install coreutils or perl to enable BEADS_HOOK_TIMEOUT" - bd hooks run pre-commit "$@" - _bd_exit=$? - fi - if [ $_bd_exit -eq 124 ] || { [ $_bd_used_perl -eq 1 ] && [ $_bd_exit -eq 142 ]; }; then - echo >&2 "beads: hook 'pre-commit' timed out after ${_bd_timeout}s — continuing without beads" - _bd_exit=0 - fi - if [ $_bd_exit -eq 3 ]; then - echo >&2 "beads: database not initialized — skipping hook 'pre-commit'" - _bd_exit=0 - fi - if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi -fi -# --- END BEADS INTEGRATION v1.2.2 --- diff --git a/.beads/hooks/pre-push b/.beads/hooks/pre-push deleted file mode 100755 index 1d4c4cc..0000000 --- a/.beads/hooks/pre-push +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env sh -# --- BEGIN BEADS INTEGRATION v1.2.2 --- -# This section is managed by beads. Do not remove these markers. -if command -v bd >/dev/null 2>&1; then - export BD_GIT_HOOK=1 - _bd_timeout=${BEADS_HOOK_TIMEOUT:-300} - _bd_used_perl=0 - if command -v timeout >/dev/null 2>&1; then - timeout "$_bd_timeout" bd hooks run pre-push "$@" - _bd_exit=$? - elif command -v gtimeout >/dev/null 2>&1; then - gtimeout "$_bd_timeout" bd hooks run pre-push "$@" - _bd_exit=$? - elif command -v perl >/dev/null 2>&1; then - _bd_used_perl=1 - perl -e 'alarm shift; exec @ARGV' "$_bd_timeout" bd hooks run pre-push "$@" - _bd_exit=$? - else - echo >&2 "beads: hook 'pre-push' running without timeout; install coreutils or perl to enable BEADS_HOOK_TIMEOUT" - bd hooks run pre-push "$@" - _bd_exit=$? - fi - if [ $_bd_exit -eq 124 ] || { [ $_bd_used_perl -eq 1 ] && [ $_bd_exit -eq 142 ]; }; then - echo >&2 "beads: hook 'pre-push' timed out after ${_bd_timeout}s — continuing without beads" - _bd_exit=0 - fi - if [ $_bd_exit -eq 3 ]; then - echo >&2 "beads: database not initialized — skipping hook 'pre-push'" - _bd_exit=0 - fi - if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi -fi -# --- END BEADS INTEGRATION v1.2.2 --- diff --git a/.beads/hooks/prepare-commit-msg b/.beads/hooks/prepare-commit-msg deleted file mode 100755 index 63a9226..0000000 --- a/.beads/hooks/prepare-commit-msg +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env sh -# --- BEGIN BEADS INTEGRATION v1.2.2 --- -# This section is managed by beads. Do not remove these markers. -if command -v bd >/dev/null 2>&1; then - export BD_GIT_HOOK=1 - _bd_timeout=${BEADS_HOOK_TIMEOUT:-300} - _bd_used_perl=0 - if command -v timeout >/dev/null 2>&1; then - timeout "$_bd_timeout" bd hooks run prepare-commit-msg "$@" - _bd_exit=$? - elif command -v gtimeout >/dev/null 2>&1; then - gtimeout "$_bd_timeout" bd hooks run prepare-commit-msg "$@" - _bd_exit=$? - elif command -v perl >/dev/null 2>&1; then - _bd_used_perl=1 - perl -e 'alarm shift; exec @ARGV' "$_bd_timeout" bd hooks run prepare-commit-msg "$@" - _bd_exit=$? - else - echo >&2 "beads: hook 'prepare-commit-msg' running without timeout; install coreutils or perl to enable BEADS_HOOK_TIMEOUT" - bd hooks run prepare-commit-msg "$@" - _bd_exit=$? - fi - if [ $_bd_exit -eq 124 ] || { [ $_bd_used_perl -eq 1 ] && [ $_bd_exit -eq 142 ]; }; then - echo >&2 "beads: hook 'prepare-commit-msg' timed out after ${_bd_timeout}s — continuing without beads" - _bd_exit=0 - fi - if [ $_bd_exit -eq 3 ]; then - echo >&2 "beads: database not initialized — skipping hook 'prepare-commit-msg'" - _bd_exit=0 - fi - if [ $_bd_exit -ne 0 ]; then exit $_bd_exit; fi -fi -# --- END BEADS INTEGRATION v1.2.2 --- diff --git a/.beads/interactions.jsonl b/.beads/interactions.jsonl deleted file mode 100644 index a225a5a..0000000 --- a/.beads/interactions.jsonl +++ /dev/null @@ -1,77 +0,0 @@ -{"id":"int-8d5f8f5714677d91360a20177b1f5a9e","kind":"field_change","created_at":"2026-08-27T12:58:35.614943857Z","actor":"Shinuwa","issue_id":"sokko-g-lki","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-206ccb97f9d09712e2b4136d115a0e43","kind":"field_change","created_at":"2026-08-27T13:09:45.211867088Z","actor":"Shinuwa","issue_id":"sokko-g-e7s","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed remaining toolbox control migration to NDS mixins and updated design-system catalogue examples."}} -{"id":"int-5131e4130f57a4e8a55f176a46240fad","kind":"field_change","created_at":"2026-08-27T16:19:44.570963534Z","actor":"Shinuwa","issue_id":"sokko-g-npt","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed NDS button variant cleanup and catalogue simplification."}} -{"id":"int-3db2dfcbabd4cbb63eaeedb1bea8ab47","kind":"field_change","created_at":"2026-08-27T16:43:20.612129607Z","actor":"Shinuwa","issue_id":"sokko-g-0o4","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed NDS data attribute API migration and validation."}} -{"id":"int-578a8a6aff782082d539f0e14bb0aa79","kind":"field_change","created_at":"2026-08-27T16:58:07.410812508Z","actor":"Shinuwa","issue_id":"sokko-g-alp","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Expanded /design-system into exhaustive NDS family attribute matrices."}} -{"id":"int-cc32f7330c12cf2d37b0d22650ccfb5e","kind":"field_change","created_at":"2026-08-27T17:13:59.871782552Z","actor":"Shinuwa","issue_id":"sokko-g-pp5","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Reworked /design-system into component cards with configurable attribute matrices."}} -{"id":"int-17da0005e87891c66734a766d8456459","kind":"field_change","created_at":"2026-08-27T17:23:07.045839669Z","actor":"Shinuwa","issue_id":"sokko-g-73i","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-d0531629593c076b63281346c729ac3e","kind":"field_change","created_at":"2026-08-27T17:28:11.740302589Z","actor":"Shinuwa","issue_id":"sokko-g-wnh","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-fb41489d0517f51fcda643c4230461fe","kind":"field_change","created_at":"2026-08-27T17:35:40.407737936Z","actor":"Shinuwa","issue_id":"sokko-g-s0a","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-b7bafbc214af080356e07d2d97f1ffba","kind":"field_change","created_at":"2026-08-27T21:32:26.611249333Z","actor":"Shinuwa","issue_id":"sokko-g-2u9","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-ea50d03c7c84b32ab2fce86f15bbe05f","kind":"field_change","created_at":"2026-08-27T21:43:00.775108889Z","actor":"Shinuwa","issue_id":"sokko-g-bh4","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Completed"}} -{"id":"int-4f7a574335bb2d616e9caae09e22e55b","kind":"field_change","created_at":"2026-08-27T21:45:18.547229481Z","actor":"Shinuwa","issue_id":"sokko-g-7jm","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-ae5fb0bbe41a7958929560a1bbf65052","kind":"field_change","created_at":"2026-08-27T21:48:45.268794089Z","actor":"Shinuwa","issue_id":"sokko-g-z2t","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-8e3b38de72d948a6c241b0d8b2f8077b","kind":"field_change","created_at":"2026-08-27T21:54:30.02159376Z","actor":"Shinuwa","issue_id":"sokko-g-coh","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Completed"}} -{"id":"int-0d86b94b9a04df5b68e2362e0824a37b","kind":"field_change","created_at":"2026-08-27T21:57:24.401323676Z","actor":"Shinuwa","issue_id":"sokko-g-hif","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed"}} -{"id":"int-3fcb6bc2b605db6210c0da18da07e902","kind":"field_change","created_at":"2026-08-27T22:01:35.180268661Z","actor":"Shinuwa","issue_id":"sokko-g-6fs","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Fixed NDS textarea min heights by size"}} -{"id":"int-611cb19bdd31f0e79cc8c2f2bb7a3dd7","kind":"field_change","created_at":"2026-08-28T07:13:54.812999765Z","actor":"Shinuwa","issue_id":"sokko-g-tvo","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Fixed NDS field hover cascade and replaced public date trigger with select trigger"}} -{"id":"int-0e1196655dabd3096c10beef1ba8aff2","kind":"field_change","created_at":"2026-08-28T07:19:28.131918475Z","actor":"Shinuwa","issue_id":"sokko-g-z4x","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Fixed select trigger hover chevron and focus-visible outline"}} -{"id":"int-9c27343c043121862608b8ed9013c306","kind":"field_change","created_at":"2026-08-28T07:25:53.259127006Z","actor":"Shinuwa","issue_id":"sokko-g-eln","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Fixed select trigger md hover/focus and disabled checkbox styling"}} -{"id":"int-da5413e82c18d19a8432288bec703dd7","kind":"field_change","created_at":"2026-08-28T07:50:07.033524644Z","actor":"Shinuwa","issue_id":"sokko-g-h7z","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed global NDS control migration and validation"}} -{"id":"int-42f39cb889dfab3bc998d4ce566d2339","kind":"field_change","created_at":"2026-08-28T08:09:50.738078383Z","actor":"Shinuwa","issue_id":"sokko-g-9p1","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Fixed filter radio group, sidebar storage buttons, memo controls, and textarea ghost variant"}} -{"id":"int-03ed1c823da90551f51a5a0d5691e440","kind":"field_change","created_at":"2026-08-28T12:35:29.257332022Z","actor":"Shinuwa","issue_id":"sokko-g-39h","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Applied NDS event-surface to calendar week and month events, documented data-color/data-size, and validated checks."}} -{"id":"int-88c39f90fdd5b81110acc4bdae55836c","kind":"field_change","created_at":"2026-09-10T11:49:36.768770213Z","actor":"Shinuwa","issue_id":"sokko-g-vfo","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Shared lazy React registry consumed by toolbox and library; obsolete static import assertions removed; all 17 library types exercised; npm run check and 13 E2E tests pass."}} -{"id":"int-7ec422ecc24735e12910a965567f32fe","kind":"field_change","created_at":"2026-09-10T12:17:38.573656548Z","actor":"Shinuwa","issue_id":"sokko-g-531","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Concurrent image batches merge current data after compression; calendar selection handlers update drafts outside state updaters. Behavioral image test and reverse week/month selection E2E pass; npm run check passes."}} -{"id":"int-1668982a1dda5d8304440ae699a32d40","kind":"field_change","created_at":"2026-09-10T12:22:11.969660039Z","actor":"Shinuwa","issue_id":"sokko-g-5u5","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Recursive cache enabled for completed evaluations. Before: 131054 reads for 16 cells; after: 50 reads for 50 cells. Regression test failed before fix and passes after; npm run check and table persistence E2E pass."}} -{"id":"int-903a25fde459880bbbadc2764da920a2","kind":"field_change","created_at":"2026-09-10T16:58:56.754421196Z","actor":"Shinuwa","issue_id":"sokko-g-hf6","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Unified confirmed-state queue for all writes; imports use current-state updaters; atomic creation/link/deletion and synchronous transaction abort. Removed obsolete checkpoints. Deterministic concurrency/failure tests and real IndexedDB abort E2E pass; full suite 15/15 and npm run check pass."}} -{"id":"int-16ba759581961e395e133df1c6019895","kind":"field_change","created_at":"2026-09-10T17:21:13.173981957Z","actor":"Shinuwa","issue_id":"sokko-g-ra9","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Implemented quota coalescing and shared helpers. npm run check and all 15 E2E tests with --workers=2 pass; default concurrency timeouts tracked separately."}} -{"id":"int-df984435537f78d51a7a309feda1109c","kind":"field_change","created_at":"2026-09-10T17:21:18.79044889Z","actor":"Shinuwa","issue_id":"sokko-g-ckq","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Implemented quota coalescing and shared helpers. npm run check and all 15 E2E tests with --workers=2 pass; default concurrency timeouts tracked separately."}} -{"id":"int-300128a7d6ed7fa43c5f43c7cb0b9dad","kind":"field_change","created_at":"2026-09-11T06:50:23.200542022Z","actor":"Shinuwa","issue_id":"sokko-g-v02","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Default E2E concurrency capped at two workers with failure traces; compact calendar titles kept in flow and sm padding corrected. Desktop/mobile geometry and editing regressions added. npm run check:full passed; second full E2E run passed all 17 tests without retries."}} -{"id":"int-a54950bb4a7dbb177188a5ec02e9d9fd","kind":"field_change","created_at":"2026-09-11T06:50:28.175047619Z","actor":"Shinuwa","issue_id":"sokko-g-328","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Default E2E concurrency capped at two workers with failure traces; compact calendar titles kept in flow and sm padding corrected. Desktop/mobile geometry and editing regressions added. npm run check:full passed; second full E2E run passed all 17 tests without retries."}} -{"id":"int-147c4573ce40577c21afec08775c2811","kind":"field_change","created_at":"2026-09-11T07:16:09.749977471Z","actor":"Shinuwa","issue_id":"sokko-g-55a","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Restored recommended purity lint; initialized alert clock in effect; removed post-commit draft synchronization from shared inline editing and reused it in Randomizer. 100 Node tests, lint, production build and all 19 E2E pass. StrictMode hook tests cover input/contentEditable, source updates, commit and Escape; broader C10 tracked in sokko-g-8po."}} -{"id":"int-f9e84a155b896c7f68c83ee2454f904d","kind":"field_change","created_at":"2026-09-11T11:56:43.680278965Z","actor":"Shinuwa","issue_id":"sokko-g-sc7","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Reproduced memo draft loss on notification, isolated per-memo drafts using useInlineEdit, preserved multiline/trim/delete behavior. Goal Tree reconciles selection and valid tabs before DOM commit with StrictMode regressions. npm run check:full passed: 100 Node tests and 21 E2E."}} -{"id":"int-4b64d68baf132fa99cb3244d8487034c","kind":"field_change","created_at":"2026-09-11T12:05:04.580370366Z","actor":"Shinuwa","issue_id":"sokko-g-kqo","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Shared keyed state initializes Notepad/ImageAnnotation temporary drawings and RNG history before DOM commit; ignores setters bound to a different active key. Storage keys and write/error paths preserved. npm run check:full passed: 100 Node tests and 23 E2E including StrictMode key switches and real Notepad canvas/page/reload checks."}} -{"id":"int-80659dd55d71f2a33d1067b008bf2abd","kind":"field_change","created_at":"2026-09-11T17:30:09.794064421Z","actor":"Shinuwa","issue_id":"sokko-g-275","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed RNG draft/edit transitions and ImageViewer pre-commit resets; cover decoding now guards stale completion/errors and releases resources. Four new StrictMode E2E cases pass; npm run check:full passes with 27 E2E. No storage or style changes."}} -{"id":"int-6ad8b329d6c9580520514a4234fc5230","kind":"field_change","created_at":"2026-09-11T18:38:38.171744457Z","actor":"Shinuwa","issue_id":"sokko-g-rcs","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed lazy game loading without synchronous effect state updates; AbortController reaches editorial, game and nested list requests. Stale outcomes ignored, navigation cache preserved. Three new StrictMode behavior tests; npm run check:full passes with 30 E2E; targeted set-state-in-effect lint passes."}} -{"id":"int-9cb5a663c6e65593625066b25976439c","kind":"field_change","created_at":"2026-09-11T19:15:51.529868089Z","actor":"Shinuwa","issue_id":"sokko-g-5i3","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Library category now derives from anchor navigation; same-page hash/history navigation works; malformed anchors handled and obsolete RAF/scroll timers cleaned up. Existing library coverage and two new behavioral E2E pass. npm run check:full passes with 32 E2E; targeted set-state-in-effect lint passes."}} -{"id":"int-4ece504edad6e21c4829485c33215835","kind":"field_change","created_at":"2026-09-12T07:06:41.579702638Z","actor":"Shinuwa","issue_id":"sokko-g-739","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Tutorial visibility now follows toolbox identity and request transitions before commit; tour keyed by toolbox resets step and start latch. Two StrictMode behavioral tests cover identity changes, one-time flag consumption, dismissal and pending requests. check:full passes with 34 E2E; targeted set-state-in-effect lint passes."}} -{"id":"int-c7fa4c94461f676392625658508ae231","kind":"field_change","created_at":"2026-09-12T10:15:48.480122568Z","actor":"Shinuwa","issue_id":"sokko-g-5rq","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Notepad now separates page identity from focused editing, replaces the editor DOM on page/module changes, preserves selection during local echoes and applies external updates after blur without stealing focus. Removed obsolete selection helpers and timestamp-only echo detection. check:full passes with 36 E2E; global set-state-in-effect diagnostic passes."}} -{"id":"int-e79db6c1131fb3c5c57dde09917ef735","kind":"field_change","created_at":"2026-09-12T10:50:44.387707762Z","actor":"Shinuwa","issue_id":"sokko-g-8po","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Enabled app-wide StrictMode, restored recommended react-hooks/set-state-in-effect rule, documented development checks and added an effective ESLint configuration regression test. npm run check:full passed: lint, 101 Node tests, build and 36 E2E. All C10 subsets complete."}} -{"id":"int-4d9a5305507377a0f0d42d8c0e073c0e","kind":"field_change","created_at":"2026-09-12T11:13:23.757763936Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-e86990d8d18afb8dec65036e0ab7712f","kind":"field_change","created_at":"2026-09-12T11:14:17.70653268Z","actor":"Shinuwa","issue_id":"sokko-g-usb","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Reproducible production profiling completed and documented: npm run profile:toolboxes, four disk-backed scenarios and five genuine reloads each, 117.9 MiB identical media dataset. Raw and analysis reports in ignored .local/performance. Closed media retains about118MiB extra JS heap. check:full passes lint,101 Node tests,build,40 E2E. Initial read failure handling tracked separately as P1 sokko-g-d5u; no storage/schema changes."}} -{"id":"int-5a1d6dccbbcebf69807b6134785175ef","kind":"field_change","created_at":"2026-09-12T18:30:49.351851361Z","actor":"Shinuwa","issue_id":"sokko-g-d5u","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Protected IndexedDB bootstrap: readiness granted only after complete successful reads; all store writes rejected before initialization; create/import/export guards; startup error/loading gate with non-destructive retry; rejected connection promise evicted for reopening; generic accurate write-error title. Editorial strings validated and storage/workflow docs updated. Four new E2E cover repeated open/read failures, preserved data and exports, creation after retry, direct command guards and later write errors. Desktop/mobile screenshots reviewed. npm run check:full passed lint,101 Node tests,build,44 E2E. No schema or format changes."}} -{"id":"int-224b7820169f57116ea4fd87a50560f1","kind":"field_change","created_at":"2026-09-12T21:26:21.88315065Z","actor":"Shinuwa","issue_id":"sokko-g-bhy","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Implemented selective images/imageAnnotation hydration with local retry, preserved unread values in atomic snapshots, and serialized complete exports without populating the UI cache. No schema change; timer/calendar remain eager. check:full passed including 52 E2E; four production scenarios profiled alone, five reloads each. 40-media baseline 120.68 to 2.78 MiB JS heap, 610.1 to 445.4 ms median ready. Reports in .local/performance; docs updated. Opened media remain cached until reload. No git commit or push performed."}} -{"id":"int-4036248c53312cfaafae4ee37bb145bd","kind":"field_change","created_at":"2026-09-12T21:26:40.724321767Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-37bf322d7d6ae9d06e033d9f16b7f057","kind":"field_change","created_at":"2026-09-12T21:33:50.250082802Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-cc87d51843f7ee62beb6445939aa30d5","kind":"field_change","created_at":"2026-09-13T06:35:52.804580049Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-e554bed2958d709f2965a55fea9aa956","kind":"field_change","created_at":"2026-09-13T06:53:17.211928645Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-6f399629fa8cc8212d36ca21853eaa52","kind":"field_change","created_at":"2026-09-13T17:46:00.430152831Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-3823a391b02ae7a3d58956b24c10e998","kind":"field_change","created_at":"2026-09-13T18:43:29.457174095Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-e3a2bea901894d43a31eb628b588648a","kind":"field_change","created_at":"2026-09-14T07:08:33.027716428Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-20d1e0d862e6155eadf2c36eced314db","kind":"field_change","created_at":"2026-09-14T11:56:36.962825878Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-cc67f2645165e0eac9f57d71e8a34e57","kind":"field_change","created_at":"2026-09-14T12:11:10.207360007Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-f9245b926aa0f581b75f6b5904778e4e","kind":"field_change","created_at":"2026-09-14T13:08:47.57641261Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-bb9e0e4a748e0fa71f7a88e8d5f1b9c1","kind":"field_change","created_at":"2026-09-17T15:41:40.939310492Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-8ce072a6196bda5d63c77776fe0a1c14","kind":"field_change","created_at":"2026-09-17T16:06:03.481316789Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-d8c4d7fe12bbb2589779d4fe3d920ba7","kind":"field_change","created_at":"2026-09-17T20:29:55.005289442Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"open","old_value":"in_progress"}} -{"id":"int-3504141284535c146e3b392ad6bf43c8","kind":"field_change","created_at":"2026-09-17T21:51:54.241158283Z","actor":"Shinuwa","issue_id":"sokko-g-zsd","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Completed agreed risk-based C06 scope on 2026-09-17: four final behavioral scenarios cover persistent Links, Counters, Checklist and planner subtree reorder; removed ten redundant implementation assertions. Coverage and optional extensions documented in docs/TEST_STRATEGY.md. npm run check:full passed: 107 Node tests, 113 development E2E and 1 production E2E. Exhaustive regex conversion and advanced permutations are explicitly outside closure scope."}} -{"id":"int-c3ca1d1966e94ad60e50b7651e69dd3c","kind":"field_change","created_at":"2026-10-01T13:07:29.412082155Z","actor":"Shinuwa","issue_id":"sokko-g-e0w","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-44218df9c59fe7b1e7751e0e5beda446","kind":"field_change","created_at":"2026-10-01T13:07:35.178021378Z","actor":"Shinuwa","issue_id":"sokko-g-hou","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-37af39aa8afb028e1b0a4ee7cb560e6f","kind":"field_change","created_at":"2026-10-01T13:07:41.11959149Z","actor":"Shinuwa","issue_id":"sokko-g-u3q","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-9aae527fb549b8615715abbb9866f7a4","kind":"field_change","created_at":"2026-10-01T13:07:48.244772328Z","actor":"Shinuwa","issue_id":"sokko-g-07n","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-4802ad9fa9819b02b2e80eca85a922e1","kind":"field_change","created_at":"2026-10-01T13:07:54.094982019Z","actor":"Shinuwa","issue_id":"sokko-g-116","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-8347873f5e7c633e42971023b30e2ebc","kind":"field_change","created_at":"2026-10-01T13:07:59.694616997Z","actor":"Shinuwa","issue_id":"sokko-g-04z","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-fa3cdcfa1cb186976fa055fa3d9c4a4d","kind":"field_change","created_at":"2026-10-01T13:08:04.727809097Z","actor":"Shinuwa","issue_id":"sokko-g-8gh","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-85cdca7795af3cdbd4729f959d8b5c81","kind":"field_change","created_at":"2026-10-01T13:08:09.98617258Z","actor":"Shinuwa","issue_id":"sokko-g-p1f","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-bd78f7eb64c9b7a5d617a9a856903a9c","kind":"field_change","created_at":"2026-10-01T13:08:15.31986785Z","actor":"Shinuwa","issue_id":"sokko-g-wjm","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-710f7ce7796af7f1398522cc5daa6e85","kind":"field_change","created_at":"2026-10-01T13:08:21.047364209Z","actor":"Shinuwa","issue_id":"sokko-g-kyz","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-6f6ea6c870883b1a82580a46bd0df5a2","kind":"field_change","created_at":"2026-10-01T13:08:25.569047764Z","actor":"Shinuwa","issue_id":"sokko-g-4i9","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-4b71144d1e015bb3fa6cf94d5fb2c90b","kind":"field_change","created_at":"2026-10-01T13:08:30.477630845Z","actor":"Shinuwa","issue_id":"sokko-g-mag","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-73ab6f8b2af7fdd86148531fd1eacb65","kind":"field_change","created_at":"2026-10-01T13:08:36.827446402Z","actor":"Shinuwa","issue_id":"sokko-g-fpd","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Delivered on main in the commits recorded in the issue description; reconstructed in Beads on 2026-10-01."}} -{"id":"int-1ee4fbc06ba1ca47d57a3938ce5c647a","kind":"field_change","created_at":"2026-10-01T13:17:28.985204569Z","actor":"Shinuwa","issue_id":"sokko-g-aut","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Backfilled 13 retrospective issues covering all 23 commits, validated the repository, initialized the empty Dolt remote, and published the complete Beads history."}} -{"id":"int-e642f21f88bfa85d4b4ba7746e994cd3","kind":"field_change","created_at":"2026-10-03T11:31:45.398002709Z","actor":"Shinuwa","issue_id":"sokko-g-noo","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Implemented Memos planner linking, reset warning ticker items, deletion cleanup, import/export remapping, documentation, unit coverage, and Playwright coverage. npm run check and the focused Memos E2E suite pass."}} -{"id":"int-e4050bca9a4c650f7447b7dac6c81ebb","kind":"field_change","created_at":"2026-10-03T13:02:57.878785474Z","actor":"Shinuwa","issue_id":"sokko-g-8wa","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Implemented shared toolbox configuration panels, migrated tool settings and text exchange, updated responsive styles, docs, and tests."}} -{"id":"int-c4a9c3aa90751550c16cf7e201af7259","kind":"field_change","created_at":"2026-10-03T13:40:04.048932123Z","actor":"Shinuwa","issue_id":"sokko-g-0x3","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Refined Configuration panel into a compact integrated layout with Organisation and Data on the first row, full-width tool settings below, shorter visible data actions, responsive stacking, documentation, and E2E coverage."}} -{"id":"int-11873ba8e71cce0b835e8d8d2124359b","kind":"field_change","created_at":"2026-10-03T13:48:06.348778272Z","actor":"Shinuwa","issue_id":"sokko-g-mwn","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Aligned the Espace select and import/export actions at small size, removed the redundant visible move label, retained accessible naming, and updated documentation and tests."}} -{"id":"int-66c90a8d8067d5ef4113abfb6bb08acb","kind":"field_change","created_at":"2026-10-04T07:35:34.548239131Z","actor":"Shinuwa","issue_id":"sokko-g-s8f","extra":{"field":"status","new_value":"closed","old_value":"open","reason":"Duplicate created during CLI retry"}} -{"id":"int-47ba58044a85b44f70cb202f254b6913","kind":"field_change","created_at":"2026-10-04T07:37:20.762939126Z","actor":"Shinuwa","issue_id":"sokko-g-b0e","extra":{"field":"status","new_value":"closed","old_value":"in_progress","reason":"Reused the shared module header layout for library tool previews; full validation passes."}} diff --git a/.beads/metadata.json b/.beads/metadata.json deleted file mode 100644 index c6472c8..0000000 --- a/.beads/metadata.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "database": "dolt", - "backend": "dolt", - "dolt_mode": "embedded", - "dolt_database": "sokko_g", - "project_id": "383fe8d1-bd71-460f-9ff5-e71f14df4827" -} \ No newline at end of file diff --git a/.claude/settings.json b/.claude/settings.json deleted file mode 100644 index c6907bf..0000000 --- a/.claude/settings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "hooks": { - "SessionStart": [ - { - "hooks": [ - { - "command": "bd prime --hook-json", - "type": "command" - } - ], - "matcher": "" - } - ] - } -} \ No newline at end of file diff --git a/.codex/config.toml b/.codex/config.toml deleted file mode 100644 index 146af7e..0000000 --- a/.codex/config.toml +++ /dev/null @@ -1,2 +0,0 @@ -[features] -hooks = true diff --git a/.codex/hooks.json b/.codex/hooks.json deleted file mode 100644 index 13c7229..0000000 --- a/.codex/hooks.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "hooks": { - "PostCompact": [ - { - "hooks": [ - { - "command": "bd codex-hook PostCompact", - "statusMessage": "Scheduling Beads context refresh", - "type": "command" - } - ], - "matcher": "manual|auto" - } - ], - "PreCompact": [ - { - "hooks": [ - { - "command": "bd codex-hook PreCompact", - "statusMessage": "Checking Beads context", - "type": "command" - } - ], - "matcher": "manual|auto" - } - ], - "SessionStart": [ - { - "hooks": [ - { - "command": "bd codex-hook SessionStart", - "statusMessage": "Loading Beads context", - "type": "command" - } - ], - "matcher": "startup|resume|clear" - } - ], - "UserPromptSubmit": [ - { - "hooks": [ - { - "command": "bd codex-hook UserPromptSubmit", - "statusMessage": "Refreshing Beads context", - "type": "command" - } - ] - } - ] - } -} diff --git a/.env.example b/.env.example deleted file mode 100644 index e37b69d..0000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -PORT=5173 diff --git a/.forgejo/workflows/deploy-prod.yml b/.forgejo/workflows/deploy-prod.yml deleted file mode 100644 index 1a52929..0000000 --- a/.forgejo/workflows/deploy-prod.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Deploy Sokko G - -on: - push: - branches: - - main - -jobs: - deploy: - runs-on: docker - - steps: - - name: Deploy on WebApps - env: - DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} - run: | - if ! command -v ssh >/dev/null 2>&1; then - apt-get update - apt-get install -y --no-install-recommends openssh-client - fi - - mkdir -p ~/.ssh - printf '%s\n' "$DEPLOY_SSH_KEY" > ~/.ssh/id_ed25519 - chmod 600 ~/.ssh/id_ed25519 - - ssh -o StrictHostKeyChecking=no \ - -i ~/.ssh/id_ed25519 \ - -p 2911 \ - shinuwa@192.168.0.100 \ - "sudo -u shinuwa git -C /data/webapps/sites/sokko-g clean -f -- package-lock.json && sudo /usr/local/bin/deploy-sokko-g" diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d9fef32..0000000 --- a/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -node_modules/ -website/dist/ -playwright-report/ -test-results/ -.env -.DS_Store -.local/ - -# Beads / Dolt files (added by bd init) -.dolt/ -*.db -.beads-credential-key -.beads/proxieddb/ diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index d89dd8a..0000000 --- a/AGENTS.md +++ /dev/null @@ -1,30 +0,0 @@ -# Agent Instructions - -Sokko G est une webapp React + Vite + Sass centrée sur des toolboxes locales et des pages de jeu. - -## Portée - -Les règles détaillées sont réparties par zone pour limiter le contexte chargé à chaque tâche : - -- `website/AGENTS.md` : application React, contenu éditable, serveur de développement, validation. -- `website/src/features/toolboxes/AGENTS.md` : outils toolbox, stockage IndexedDB, import/export, hooks partagés. -- `website/src/styles/AGENTS.md` : Sass, design system, composants visuels et patterns UI. -- `docs/AGENTS.md` : documentation projet, schémas de stockage et checklists. -- `tests/AGENTS.md` : validations de données et tests. - -Lire le fichier d'instructions le plus proche du code modifié avant d'intervenir. - -## Règles globales - -- Utiliser `rg`, `git status --short`, `git diff --stat` et les commandes ciblées avant les recherches larges. -- Concevoir l'interface pour un ordinateur utilisé en plein écran ou en demi-écran, avec `768px` comme largeur minimale validée. Ne pas créer de navigation, de composant ou de parcours propre au téléphone. Sous `768px`, préserver seulement l'accès au contenu et empêcher les débordements globaux, sans optimiser le confort d'usage. -- Ne pas réintroduire de fallback massif type `DEFAULT_SITE_CONTENT` dans le code React. -- Chaque nouveau fichier source ou test commence par un commentaire court `Rôle : ...` dans le style du langage. -- Ne pas lancer automatiquement un serveur sur `5174` si `5173` répond déjà. -- Avant de terminer une modification significative, lancer `npm run check`. -- Quand l'utilisateur indique qu'il va push, traiter le message comme une demande implicite de pré-push check : relire le diff, lancer les validations pertinentes et fournir un message de commit. Ne pas exécuter `git commit`, `git push` ou `git sync` sauf demande explicite. -- Proposer les messages de commit sous forme de phrase simple en anglais, sans préfixe Conventional Commits (`fix(...)`, `feat:`, etc.). - -## Beads - -Ce dépôt utilise Beads (`bd`) pour le suivi durable des tâches. Utiliser `bd prime` quand un workflow Beads est nécessaire, et ne pas commit/push/sync sans demande explicite. diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 100644 index db14bd1..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1,77 +0,0 @@ -# Project Instructions for AI Agents - -This file provides instructions and context for AI coding agents working on this project. - - -## Beads Issue Tracker - -This project uses **bd (beads)** for issue tracking. Run `bd prime` to see full workflow context and commands. - -### Quick Reference - -```bash -bd ready # Find available work -bd show # View issue details -bd update --claim # Claim work -bd close # Complete work -``` - -### Rules - -- Use `bd` for ALL task tracking — do NOT use TodoWrite, TaskCreate, or markdown TODO lists -- Run `bd prime` for detailed command reference and session close protocol -- Use `bd remember` for persistent knowledge — do NOT use MEMORY.md files - -**Architecture in one line:** issues live in a local Dolt DB; sync uses `refs/dolt/data` on your git remote; `.beads/issues.jsonl` is a passive export. See https://github.com/gastownhall/beads/blob/main/docs/SYNC_CONCEPTS.md for details and anti-patterns. - -## Agent Context Profiles - -The managed Beads block is task-tracking guidance, not permission to override repository, user, or orchestrator instructions. - -- **Conservative (default)**: Use `bd` for task tracking. Do not run git commits, git pushes, or Dolt remote sync unless explicitly asked. At handoff, report changed files, validation, and suggested next commands. -- **Minimal**: Keep tool instruction files as pointers to `bd prime`; use the same conservative git policy unless active instructions say otherwise. -- **Team-maintainer**: Only when the repository explicitly opts in, agents may close beads, run quality gates, commit, and push as part of session close. A current "do not commit" or "do not push" instruction still wins. - -## Session Completion - -This protocol applies when ending a Beads implementation workflow. It is subordinate to explicit user, repository, and orchestrator instructions. - -1. **File issues for remaining work** - Create beads for anything that needs follow-up -2. **Run quality gates** (if code changed) - Tests, linters, builds -3. **Update issue status** - Close finished work, update in-progress items -4. **Handle git/sync by active profile**: - ```bash - # Conservative/minimal/default: report status and proposed commands; wait for approval. - git status - - # Team-maintainer opt-in only, unless current instructions forbid it: - git pull --rebase - git push - git status - ``` -5. **Hand off** - Summarize changes, validation, issue status, and any blocked sync/commit/push step - -**Critical rules:** -- Explicit user or orchestrator instructions override this Beads block. -- Do not commit or push without clear authority from the active profile or the current user request. -- If a required sync or push is blocked, stop and report the exact command and error. - - - -## Build & Test - -_Add your build and test commands here_ - -```bash -# Example: -# npm install -# npm test -``` - -## Architecture Overview - -_Add a brief overview of your project architecture_ - -## Conventions & Patterns - -_Add your project-specific conventions here_ diff --git a/DESIGN_SYSTEM.md b/DESIGN_SYSTEM.md deleted file mode 100644 index 529c951..0000000 --- a/DESIGN_SYSTEM.md +++ /dev/null @@ -1,981 +0,0 @@ -# Nebula Design System - Sokko G - -Ce document est la reference visuelle du projet Sokko G. Toute nouvelle interface doit rester coherente avec le theme **Nebula Command** actuel et les controles du **Nebula Design System**. - -## 1. Vision - -Sokko G est une webapp gaming locale, pensee pour rester ouverte sur un second ecran pendant une session. L'interface doit etre sombre, lisible, dense sans etre surchargee, et suffisamment immersive pour evoquer une ambiance nebuleuse premium. - -Principes directeurs : - -- priorite a la lisibilite pendant de longues sessions ; -- pas de style RGB agressif ; -- violet et indigo pour la profondeur et les interactions ; -- dore pour les accents de hierarchie, les eyebrows, les focus et certaines bordures ; -- cyan conserve comme token secondaire, mais non dominant ; -- les effets lumineux doivent rester contenus. - -## 2. Tokens - -Les tokens source sont dans `website/src/styles/_tokens.scss`. Ne pas dupliquer les couleurs dans les composants. - -Couleurs principales : - -```css ---color-bg-page: #070913; ---color-bg-deep: #050711; ---color-bg-sidebar: #0b0e1b; ---color-bg-surface: #101426; ---color-bg-surface-alt: #151a30; ---color-bg-elevated: #1a2038; ---color-bg-hover: #202745; - ---color-primary: #8b5cf6; ---color-primary-hover: #9f7aea; ---color-primary-active: #7347dc; ---color-primary-soft: rgba(139, 92, 246, 0.14); ---color-primary-border: rgba(139, 92, 246, 0.45); - ---color-accent-gold: #f6c453; ---color-accent-cyan: #22d3ee; ---color-accent-pink: #d946ef; ---color-accent-indigo: #6366f1; - ---color-text-primary: #f5f7ff; ---color-text-secondary: #b4bdd3; ---color-text-muted: #7d879f; - ---color-border: rgba(150, 165, 205, 0.14); ---color-border-hover: rgba(150, 165, 205, 0.28); -``` - -Rayons : - -- `--radius-sm: 6px` -- `--radius-md: 10px` -- `--radius-lg: 14px` -- `--radius-xl: 18px` -- `--radius-pill: 999px` - -Espacements : - -- `--space-1: 0.25rem` -- `--space-2: 0.5rem` -- `--space-3: 0.75rem` -- `--space-4: 1rem` -- `--space-5: 1.25rem` -- `--space-6: 1.5rem` -- `--space-8: 2rem` -- `--space-10: 2.5rem` -- `--space-12: 3rem` - -Animations : - -- `--duration-fast: 120ms` -- `--duration-normal: 180ms` -- `--ease-standard: cubic-bezier(0.2, 0.8, 0.2, 1)` - -## 3. API Publique NDS - -Le Nebula Design System expose ses primitives publiques avec une classe de famille et des attributs `data-*`. - -Règles : - -- la classe décrit uniquement la famille : `nds-button`, `nds-icon-button`, `nds-input`, `nds-range`, `nds-select`, `nds-select-trigger`, `nds-time`, `nds-textarea`, `nds-inline-input`, `nds-switch`, `nds-radio-button-group`, `nds-checkbox`, `nds-quantity-stepper`, `nds-list-row`, `nds-large-icon-picker-trigger`, `nds-event-surface`, `nds-scrollbox` ; -- les patterns transverses utilisent aussi une classe de famille : `nds-panel`, `nds-card`, `nds-card-cover`, `nds-card-body`, `nds-card-actions`, `nds-tool-panel`, `nds-toolbar`, `nds-section-heading`, `nds-page-hero`, `nds-badge`, `nds-chip`, `nds-empty-state`, `nds-inline-notice`, `nds-progress`, `nds-filter-panel`, `nds-reorder-indicator`, `nds-modal`, `nds-modal-backdrop`, `nds-modal-footer`, `nds-drawer-panel`, `nds-drawer-resize-handle`, `nds-popover`, `nds-toast-stack`, `nds-toast` ; -- les variations passent par attributs : `data-size`, `data-variant`, `data-edge`, `data-border`, `data-axis` ; -- la page `/design-system` affiche aussi `data-state` comme axe de comparaison visuelle des états ; -- `data-size` accepte seulement les tailles prévues par la famille (`xs`, `sm`, `md`, `lg`, `xxs`, `micro` selon le contrôle) ; les checkboxes utilisent `md` 20 px, `sm` 18 px et `xs` 14 px ; -- `data-variant` couvre les intentions visuelles partagées : `primary`, `secondary`, `ghost`, `dashed`, `danger` et les variantes spécialisées documentées dans `/design-system`, dont `panel-toggle` pour les boutons icones accolés à un panneau, `icon-picker` pour les triggers de sélection compacts à icône, `interactive|tool|filter|modal` pour les surfaces, et `neutral|gold|success|warning|danger` pour les badges, notices et progress ; -- `data-edge="left|middle|right|top|center|bottom|top-left|top-right|bottom-right|bottom-left"` décrit la position d'un bouton dans un groupe ou contre un bord, et ajuste uniquement les coins ; -- `data-border="joined"` masque les bordures de jonction déduites depuis `data-edge` ; -- `data-border="none"` masque toutes les bordures sans changer la taille, le fond, le hover ou l'état actif ; -- `data-axis="horizontal|vertical"` reste réservé aux composants dont l'axe est métier, comme `nds-scrollbox` et `nds-reorder-indicator` ; -- les boutons icônes de réorganisation utilisent `nds-icon-button` avec `data-variant="secondary"` et une classe métier contenant `drag-handle` ; le curseur `grab/grabbing` est alors géré par le NDS ; -- les états fonctionnels restent portés par le HTML et l'application : `disabled`, `aria-pressed="true"`, `.active`, `.is-active`. - -Exemples : - -```html - - - - - -
-
-Rare -

Erreur compacte

-``` - -Les anciennes classes de variation `nds-*--*` ne doivent plus etre ajoutees. Les anciennes classes globales `.button`, `.primary`, `.danger`, `.ghost` et `.import-button` ne sont plus des APIs visuelles publiques : utiliser `nds-button` / `nds-icon-button` avec `data-variant`. Dans les outils, les classes métier peuvent rester pour le layout, la grille, les largeurs, le positionnement et les états fonctionnels. Le style visuel d'un contrôle générique doit venir de `website/src/styles/design-system/_controls.scss` ou de l'API publique `website/src/styles/design-system/_attributes.scss`. - -### Surfaces Et Patterns - -Les surfaces NDS couvrent les patterns transverses, pas les composants metier complets. - -- `nds-panel` : panneau de lecture non repete, sans hover par defaut. -- `nds-card` : element repete ou ouvrable ; utiliser `nds-card-cover`, `nds-card-body` et `nds-card-actions` quand la structure cover/contenu/actions est necessaire. -- `nds-tool-panel` : surface de travail d'outil, plus discrete qu'une card, avec accent dore bas/droite. -- `nds-filter-panel` : filtres verticaux ou horizontaux via `data-variant="vertical|horizontal-compact|horizontal-menu"` ; sans attribut, le rendu vertical historique est conservé. -- `nds-empty-state` : etat vide court, avec action optionnelle. -- `nds-inline-notice` : feedback compact inline, avec `data-variant="info|success|warning|danger"`. -- `nds-progress` : rail de progression (taille `md`/défaut : 8 px, `sm` : 4 px, via `data-size`) ; le remplissage est le premier `span` enfant ou `.nds-progress-bar`. -- `nds-modal`, `nds-drawer-panel`, `nds-popover`, `nds-toast` : surfaces d'overlay. Le comportement React reste gere par les composants existants. - -Les classes metier existantes peuvent coexister avec ces classes pendant la migration. Quand une classe metier reste necessaire, elle doit porter le layout, la grille ou le positionnement, pas recreer les fonds, bordures, hovers et focus partages. - -## 4. Fond Nebula - -Le fond global est defini dans `website/src/styles/_nebula.scss`. - -Regles : - -- fond de page tres sombre avec nebuleuses violettes, indigo, rose et leger accent dore ; -- etoiles statiques, reparties de facon non alignee ; -- pas d'animation permanente de fond ; -- le contenu reste prioritaire sur l'ambiance. - -Ne pas ajouter d'orbes decoratifs supplementaires. Si une section a besoin de profondeur, utiliser les fonds semi-transparents et les bordures existantes. - -## 5. Typographie - -Police principale : - -```css -font-family: Inter, "Segoe UI", system-ui, -apple-system, BlinkMacSystemFont, sans-serif; -``` - -Regles : - -- pas de letter-spacing negatif ; -- corps de texte entre 14 et 16 px ; -- titres de cartes/modules entre 15 et 18 px ; -- titres de page avec `clamp` deja defini dans `_home.scss` ; -- paragraphs limites visuellement, pas de longs blocs sans respiration ; -- les `` doivent etre en italique, pas utilises comme gris decoratif. - -## 6. Heroes - -Les heroes de la page d'accueil et des pages jeux utilisent le meme style via `.hero` et `.game-hero`. - -Sur la page d'accueil, le hero conserve deux colonnes en fenêtre large. Jusqu'à `1024px`, le groupe des deux statistiques passe sous le texte et les actions, aligné à gauche. Les deux cartes restent côte à côte tant que leur largeur le permet. - -L'action principale dépend des données locales : sans toolbox, « Créer ma première toolbox » ouvre directement la création guidée ; dès qu'une toolbox existe, « Voir mes toolboxes » mène à la liste. « Voir les jeux » reste l'action secondaire. - -Caracteristiques : - -- fond commun nebula sombre ; -- overlay sombre pour garder le texte lisible ; -- bordure gradient subtile dore/violet clair ; -- `border-radius: var(--radius-xl)` ; -- `box-shadow: var(--shadow-md)` ; -- les pages jeux peuvent fournir une image de hero via `--game-hero-image`. - -Les pages jeux doivent heriter du hero commun. Une image de jeu peut enrichir le hero quand elle reste lisible avec l'overlay commun ; les cards et covers restent les emplacements prioritaires pour les images inspectables. - -## 7. Cards - -Les cards representent les elements repetes : toolboxes, jeux, categories, monstres, faune. - -Style courant : - -- fond sombre `rgba(16, 20, 38, 0.88)` ; -- bordure gradient fine, majoritairement doree avec une petite presence cyan ; -- support optionnel de `corner-shape: scoop` quand le navigateur le supporte ; -- pas de translation au hover pour les cards principales ; -- hover en violet/violet clair avec glow contenu. - -La bordure haute/basse interne d'une cover doit rester doree quand elle separe une image du contenu. - -Les surfaces de cards reutilisent les mixins `card-surface`, `card-surface-hover` et `card-cover-divider` depuis `website/src/styles/design-system/_surfaces.scss`. - -Eviter les cards dans des cards. Les sections de page doivent rester des layouts ou panneaux, pas des empilements de cartes decoratives. - -## 8. Modules Toolbox - -Les modules sont des panneaux de travail, pas des cards classiques. - -Style courant : - -- fond semi-transparent `rgba(16, 20, 38, 0.42)` ; -- bordure neutre tres discrete ; -- accent dore leger en bas/droite ; -- hover violet/violet clair moins intense que les cards ; -- pas de mouvement au hover ; -- contenu interne au-dessus des pseudo-bordures via `z-index`. -- l'en-tête suit toujours l'ordre poignée de déplacement, icône, titre, switch de scroll éventuel, ajout éventuel, Configuration, suppression, chevron ; le titre peut se réduire mais les actions ne s'étirent pas ; -- le chevron de repli reste tout à droite ; l'état replié conserve l'en-tête et peut afficher le panneau Configuration sans révéler le contenu métier ; -- l'engrenage Configuration ouvre un panneau pleine largeur sous l'en-tête, nommé par `aria-controls` / `aria-expanded`. Il regroupe conditionnellement Espace, Guide, réglages propres à l'outil et Données (import/export) ; ouvrir l'ajout ferme Configuration et réciproquement ; -- dans Configuration, Espace et Données partagent la première ligne en deux colonnes. Espace affiche directement le sélecteur compact dont le placeholder décrit l'action. Les réglages propres à l'outil et la liaison Guide occupent toute la largeur en dessous ; si Espace est absent, Données utilise toute la première ligne ; -- le panneau Configuration reste une surface intégrée à l'outil : un seul contour discret, des sous-sections sans effet de carte imbriquée, séparées uniquement par des filets légers, avec libellés et contrôles compacts ; -- en fenêtre compacte, l'en-tête se répartit sur deux lignes et les sections/champs de Configuration passent en une colonne, dans l'ordre Espace, Données puis réglages spécifiques. - -Le mot visible cote utilisateur est **outil**, pas **module**. Le terme module reste acceptable uniquement dans le code. - -Les outils qui gèrent une collection affichent un message vide compact et discret tant -qu'aucun élément n'existe. Ce message réutilise le traitement visuel en pointillés du -planificateur de tâches, sans remplacer les états vides métier plus détaillés déjà -présents. Lorsqu'un outil vient d'être ajouté, la page défile doucement jusqu'à son -panneau afin qu'il reste immédiatement visible, y compris s'il a été inséré hors cadre. - -### Outils En Deux Colonnes - -Les outils avec controles a gauche et resultats a droite doivent reutiliser les classes generiques `tool-split-*`. - -Exemples actuels : - -- calculateur ; -- timer. - -Regles : - -- ratio de base 35 / 65 entre controles et resultats ; -- lorsque son outil mesure au plus 820 px de large, le calculateur empile la saisie au-dessus de la liste, avec Calcul/Actuel à gauche et Résultat à droite dans la carte ; sous 560 px, cette carte revient à une seule colonne ; -- panneau gauche compact, sans hauteur artificielle inutile ; -- panneau droit scrollable uniquement quand l'utilisateur active le switch dedie ; -- hauteur scrollable cible : environ 450 px ; -- boutons reset, copie, scroll et tri alignes en haut a droite du panneau de resultats ; -- edition inline des libelles plutot que boutons ou alertes navigateur ; -- styles specifiques autorises uniquement pour la logique propre a l'outil. - -### Champs Mixtes A Badges - -Les champs texte qui remplacent une valeur brute par un badge visuel doivent utiliser le pattern `MixTagsInput`. - -Regles : - -- le champ reprend le principe du mode mix Tagify : zone `contentEditable` et badges `contentEditable=false` ; -- la valeur sauvegardee reste une string normale, le badge est une representation atomique de cette valeur ; -- un badge est atomique : le curseur peut se placer avant ou apres, et la suppression retire toute la valeur associee ; -- la copie d'une selection contenant un badge doit copier la valeur brute, pas seulement le libelle visible. -- utiliser `size="small"` pour les champs compacts de 36 px, plutot que de deduire la taille depuis une classe metier. - -### Timer - -Le timer combine chronometre a etapes et comptes a rebours multiples. - -Regles UI : - -- tabs compactes avec icones uniquement et tooltips ; -- chronometre avec centiemes visibles en plus petit dans le timer principal ; -- les temps sauvegardes gardent une taille uniforme ; -- compte a rebours sans centiemes ; -- types visibles : `Duree`, `Heure precise`, `Pattern horaire`, `Intervalle` ; -- les libelles au-dessus des champs `hh:mm:ss` restent accessibles en `sr-only`, mais ne sont pas visibles ; -- les boutons de controle utilisent les icones `play-circle`, `pause-circle`, `record-circle`, `stop-circle`, `refresh`, `sort-time`, `scrollable`. -- pour `Heure precise` et `Intervalle`, le refresh inline est un toggle compact de repetition automatique ; il est bloque si la frequence est inferieure a 5 minutes. -- le formulaire `Intervalle` affiche deux champs `hh:mm:ss` compacts : duree de repetition et depart optionnel ; un depart vide signifie `Maintenant`. -- les invalidations du formulaire countdown s'affichent en notice inline rouge compacte, portée par `useDraftForm`. - -Alertes timer : - -- switch a 3 etats par compte a rebours : aucune alerte, alerte si la toolbox est visible, alerte globale site ; -- le garde-fou ne se base pas sur le temps restant, mais sur la frequence configuree ; -- le garde-fou bloque uniquement les comptes a rebours recurrents (`Pattern horaire`, `Intervalle`) si la repetition est inferieure a 5 minutes ; -- un `Pattern horaire` comme `X:24:X` cible `hh:24:00` et se repete toutes les heures. - -### Calendrier - -Le calendrier est un outil de planification visuelle, distinct du timer. - -Regles UI : - -- l'outil propose une grille hebdomadaire jours x creneaux de 30 minutes ou une grille mensuelle datée avec navigation par mois ; -- les 7 jours de la semaine doivent rester visibles sans scroll horizontal ; seul le scroll vertical sert a parcourir les heures ; -- le formulaire compact est masque par defaut ; il s'ouvre via le bouton `+` du module ou par clic sur une entree ; -- le bouton annuler ferme le formulaire, et desactiver le bouton `+` le ferme aussi quand il sert a creer une entree ; -- l'ajout manuel et la selection de cellules alimentent le meme formulaire compact quand il est ouvert ; -- les champs horaires hebdomadaires restent courts, acceptent un pas de 5 minutes, et les alertes d'echeance utilisent des checkboxes `10 min`, `5 min` et `Au debut et pendant` ; -- les evenements sont affiches comme des blocs colores dans la grille, sans boutons internes et sans dominer la palette globale ; -- quand deux evenements se chevauchent sur un meme jour, ils se partagent la largeur de la colonne ; la V1 gere visuellement jusqu'a deux evenements simultanes ; -- la suppression d'une entree se fait dans le formulaire d'edition ; -- la copie et le collage d'entree utilisent les raccourcis clavier `Ctrl+C` et `Ctrl+V` ; -- le mini-switch repetable est actif par defaut ; une entree non repetable est supprimee quand son echeance de la semaine courante est terminee ; -- les alertes reutilisent le switch a 3 etats du timer : aucune, toolbox visible, globale site ; -- le choix de couleur reprend le pattern de palette compacte du Bloc Note ; -- le choix initial s'affiche dans l'outil lui-meme ; la vue mensuelle affiche le nom du mois et des boutons mois precedent / courant / suivant ; -- en vue mensuelle, la règle mensuelle peut cibler le numero du jour ou le rang du jour de semaine via un switch 2 états compact, indépendamment du choix de répétition. -- en vue mensuelle, les dates de debut et de fin utilisent un champ compact qui ouvre un mini-calendrier avec navigation ; -- en vue mensuelle, le formulaire distingue date de debut et date de fin ; une plage d'un seul jour utilise la meme valeur pour les deux ; -- en vue mensuelle, la répétition propose `Aucune`, `Chaque semaine`, `Chaque mois`; `Chaque semaine` est indisponible pour la règle `Numéro du jour` ; -- en vue mensuelle, la suppression d'une entree repetee distingue suppression de l'occurrence affichee et suppression de toute la serie ; -- en vue mensuelle, un clic-glisse sur plusieurs cellules preconfigure la plage de jours du formulaire ; -- en vue mensuelle, les champs horaires ne sont pas affiches ; les evenements couvrent des journees completes ; -- en vue mensuelle, les evenements multi-jours s'affichent comme une barre horizontale et ne sont pas dupliques dans chaque cellule ; -- les vues hebdomadaire et mensuelle affichent un indicateur discret du moment actuel. -- en vue hebdomadaire, un switch standard peut masquer les longues plages horaires vides ; la tranche masquée reste indiquée dans la grille, pas dans un texte qui déborde de la colonne horaire. -- le calendrier supporte l'import/export texte via la section Données du panneau Configuration, pour les vues hebdomadaire et mensuelle. - -### Arbre D'objectifs - -L'arbre d'objectifs représente des chaînes de craft, de farm ou de prérequis sous forme d'arborescence dépliable. - -Regles UI : - -- utiliser le ratio `tool-split-*` 35 / 65 quand l'édition est visible ; -- le panneau gauche édite uniquement le nœud sélectionné via les onglets `Base`, `Contenu` quand le type le nécessite, et `Avancé` ; -- le panneau gauche ne doit pas porter les boutons d'ajout racine ou sous-étape ; l'ajout racine se fait via un bouton dans le schéma, long en haut en mode vertical et haut/étroit à gauche en mode horizontal, et les sous-étapes via le bouton `+` des cards ; -- l'onglet `Base` contient le type `Étape`, `Texte`, `Calculateur` ou `Checklist`, puis le titre ; pour une étape, il expose aussi l'icône et la couleur d'icône ; -- l'onglet `Contenu` est réservé aux types `Texte`, `Calculateur` et `Checklist` ; les étapes ne doivent pas afficher cet onglet ; -- l'onglet `Avancé` contient le reset par nœud ; pour une étape seulement, il ajoute les sections `Quantité` et `Progression`, avec un switch où l'état actif correspond à la progression automatique par les enfants ; -- le switch de progression expose une aide courte sous le contrôle afin de différencier calcul automatique et mise à jour manuelle ; -- une étape dont tous les enfants directs ont une cible de `1` se comporte par défaut en mise à jour manuelle, sauf choix explicite du mode automatique ; -- le panneau droit reste la source visuelle principale, avec branches compactes, liaisons SVG mesurées et barres de progression ; -- le panneau droit expose un switch avec icône `rotate` pour alterner entre organisation horizontale et verticale ; l'orientation est persistée par outil ; -- les liaisons entre nœuds doivent être dessinées par une couche dédiée basée sur les positions réelles des cartes, pas par des pseudo-éléments CSS dépendants de largeurs fixes ; -- une card peut avoir plusieurs prérequis visibles : elle garde un parent principal pour le placement, mais des liaisons supplémentaires peuvent converger vers elle ; -- tous les enfants restent rendus comme des nœuds d'organigramme, même sans sous-enfant, afin que l'ajout ultérieur d'un enfant ne change pas brutalement la structure ; -- l'ouverture d'une branche doit replier les branches sœurs du même niveau et leurs descendants, afin de limiter la largeur déployée en mode deux colonnes ; -- quand une branche ouverte contient un objectif à plusieurs parents, les branches nécessaires aux autres parents visibles doivent rester ouvertes afin que la convergence reste compréhensible ; -- les nœuds affichent une icône principale et révèlent leur titre via `Tooltip`, afin de garder une lecture proche organigramme ; -- les types `Texte`, `Calculateur` et `Checklist` sont des mini-contenus internes au nœud : leurs lignes doivent être visibles directement dans la carte, avec une zone d'ajout compacte ; -- les cards de liste doivent laisser leur preview interne occuper la largeur disponible de la card, sans largeur fixe plus étroite que la carte ; -- ces mini-contenus ne remplacent pas les sous-objectifs : les sous-objectifs restent des enfants d'organigramme séparés ; -- les lignes `Checklist` suivent le comportement de l'outil checklist : cible `1` affiche une checkbox ; cible supérieure à `1` affiche une quantité avec contrôles `-` et `+` ; -- les lignes `Calculateur` exposent une formule et un résultat ; la variable `base` référence la cible calculée du parent direct ; -- les cards peuvent exposer des actions secondaires au hover/focus, notamment modification et suppression, sans les rendre visibles au repos ; -- le bouton `+` d'une card ajoute toujours une sous-étape ; les nœuds `Texte`, `Calculateur` et `Checklist` exposent un bouton long dédié sous leur preview pour ajouter une entrée interne ; -- le bouton long d'entrée interne doit avoir une tooltip explicite, car son libellé visible reste volontairement compact ; -- l'accent de couleur d'un nœud doit s'appliquer à toute la card, y compris au hover, sans bordure latérale d'une couleur différente ; -- la card sélectionnée en mode édition doit être clairement identifiable par un contour et un halo plus présents que l'état sélectionné en lecture ; -- le drag & drop des nœuds doit afficher son indicateur selon l'orientation de la liste : gauche/droite en horizontal, haut/bas en vertical ; -- les actions de nœud utilisent des boutons icônes : ajout, repli, suppression, déplacement ; -- le bouton de déplacement doit rester clairement visible sur les cards compactes, notamment les nœuds `Texte` et `Checklist` ; -- la progression d'un parent doit rester agrégée et lisible sans afficher une formule détaillée dans la carte ; -- en panneau latéral ou fenêtre compacte, l'arbre passe en une colonne sans scroll horizontal. - -### Combos - -L'outil Combos affiche des inputs de manettes et clavier sous forme de tokens visuels compacts. - -Regles UI : - -- les touches simples sont rendues en HTML/CSS, pas en fichiers SVG distincts ; -- les formes specifiques peuvent utiliser de petits SVG inline ou des formes CSS si le HTML seul devient ambigu ; -- les couleurs de boutons restent des accents localises et ne doivent pas dominer le panneau ; -- les sequences longues doivent revenir a la ligne sans agrandir la largeur de l'outil ; -- l'edition utilise une palette guidee pour les manettes et une palette avec saisie courte pour clavier/souris ; -- l'ajout par clic cree des etapes successives par defaut, sans bouton dedie de nouvelle etape ; -- le clavier utilise AZERTY par defaut et propose un switch QWERTY ; -- le mode simultane doit etre volontaire, via switch ou depot d'une touche dans une etape existante ; -- les categories sont regroupees automatiquement depuis le champ categorie du combo. - -### Bloc Note Riche - -Le Bloc Note utilise une edition directe en `contentEditable`, sans mode preview separe. - -Regles UI : - -- pages multiples accessibles par un bouton icone `pages` pose en absolute sur la bordure gauche de l'outil ; -- le bouton ouvre toujours un menu deroulant de pages, y compris en page toolbox complete, avec deroulement de gauche vers la droite ; -- le renommage d'une page passe par un bouton edition qui active l'edition inline du titre ; -- toolbar compacte en haut de l'outil ; -- boutons courts pour gras, italique, souligne, barre, titre et listes ; -- le paragraphe est le style par defaut et n'a pas de bouton dedie ; -- les types de listes sont regroupes dans un dropdown compact ; -- couleurs texte et surlignage regroupees dans un dropdown unique avec icone arc-en-ciel et libelles de categories ; -- date de derniere modification affichee en pied d'outil, sans prendre le dessus sur le contenu ; -- switch de stockage des dessins en pied d'outil, avec icone sauvegarde et etat actif ; -- placeholder integre dans la surface d'edition quand la note est vide ; -- le HTML persiste doit rester nettoye via allowlist, jamais via HTML libre. - -### Mémos - -L'outil Mémos sert aux informations courtes type post-it. - -Regles UI : - -- cartes compactes, non imbriquees, avec accent couleur localise ; -- edition directe du texte court ; -- zone de texte en hauteur automatique, sans resize manuel ni scrollbar interne ; -- palette de couleurs compacte reprenant les swatches du Bloc Note ; -- la creation de mémo est masquee par defaut et s'ouvre via le bouton `+` du header d'outil ; -- réorganisation des cartes par poignée de drag & drop compacte ; -- bande deroulante visible uniquement quand elle est active et qu'au moins un mémo ou une alerte de planificateur existe ; elle affiche tous les mémos dans l'outil, peut intégrer les tâches non effectuées proches du reset depuis un ou tous les planificateurs de la même toolbox, et reste fixée en bas des pages complètes de cette toolbox ainsi que des pages du jeu qui lui est associé ; -- la bande fixe laisse le contenu verticalement accessible et suit la largeur disponible entre la sidebar et le bord droit. - -### Calque De Dessin - -Les annotations dessinees utilisent un canvas transparent superpose au contenu annote. - -Regles UI : - -- le calque est inactif par defaut pour laisser le contenu editable ; -- en mode dessin, les interactions pointer sont capturees par le canvas ; -- les controles de dessin sont regroupes dans un panneau reutilisable vertical, colle a droite de la surface annotee ; -- seuls les controles directement lies au dessin sont affiches quand le mode dessin est actif ; -- les controles restent compacts : gommer, annuler, effacer, couleur et epaisseur via dropdowns ; -- le mode temporaire privilegie le griffonnage de session et utilise `sessionStorage` ; -- le mode permanent suit le stockage IndexedDB de l'outil ; -- pour les surfaces scrollables, le canvas suit le contenu complet plutot que le viewport visible. -- sur les annotations d'images, les traits utilisent des coordonnees en pourcentage et restent visibles dans l'aperçu reduit ; l'edition se fait uniquement en plein ecran et le switch de sauvegarde reste disponible dans la barre de dessin. - -## 8. Tabs Et Switchs - -### Dropdowns Compacts - -Les menus flottants compacts d'icones, couleurs, epaisseurs ou actions rapides doivent reutiliser `CompactDropdown`. - -Regles : - -- conserver un trigger compact, idealement icone seule avec tooltip ; -- fermer au clic exterieur, a `Escape`, a la selection et quand le focus sort du menu ; -- garder le contenu interne libre pour supporter grilles d'icones, swatches, libelles de categories ou choix d'epaisseur ; -- reutiliser les classes visuelles existantes du contexte quand le menu appartient a un outil precis. - -Tabs : - -- utiliser le composant commun quand un outil doit alterner entre plusieurs modes ; -- icones seules quand les labels sont evidents ou fournis en tooltip ; -- etat actif sobre : bordure doree, fond legerement dore/violet, pas de gros glow. - -Switchs : - -- les switchs binaires utilisent l'icone a gauche et le rail a droite quand ils controlent un mode technique comme `scrollable` ; -- les switchs a plusieurs etats doivent rester compacts, avec icones et tooltips ; -- les etats desactives doivent etre clairement attenues et sans etat actif dore. - -## 9. Panneaux De Section - -Les grandes sections non repetitives, comme le dialogue d'origine et les sections de presentation, utilisent `.nebula-panel`. - -Style courant : - -- fond semi-transparent `rgba(16, 20, 38, 0.42)` ; -- bordure statique identique aux outils en etat normal ; -- accent dore leger en bas/droite ; -- pas de hover sur les panneaux de lecture ; -- implementation via le mixin `gold-panel-frame` dans `website/src/styles/_mixins.scss`. - -## 10. Catalogue Documentation - -La page catalogue des outils utilise un layout de documentation. - -Regles : - -- hero court, puis contenu principal en deux colonnes sur desktop ; -- sommaire a gauche en panneau sticky, avec categories puis liens d'outils de la categorie active ; -- une seule categorie d'usage est affichee a droite a la fois ; -- la categorie active commence par un mini-hero descriptif, sans compteur decoratif ; -- chaque fiche commence par le titre, l'icone, le badge de categorie et une description directe de l'outil ; -- l'exemple interactif reste visible en permanence et centre horizontalement ; -- les reperes de boutons propres a l'outil sont places a gauche de l'exemple, puis empiles au-dessus dans la disposition compacte jusqu'a `1024px` ; -- les reperes sont groupes par categorie de controles de l'outil, avec apercu visuel du bouton et label court ; -- les descriptions de reperes sont reservees aux comportements non evidents, par exemple un bouton qui agit sur toute la ligne ou une action de drag & drop ; -- les fonctionnalites detaillees et formats d'import texte sont presentes sous l'exemple dans un panneau repliable pour ne pas alourdir la lecture avant manipulation ; -- les controles propres au catalogue, comme la reinitialisation d'une demo, ne sont pas documentes comme fonctionnalites de l'outil ; -- en fenêtre compacte jusqu'a `1024px`, le sommaire devient un bloc normal place avant les fiches, sans position sticky ; -- sur l'accueil, cette même disposition masque l'illustration de la section « Origine du nom » et sa séparation verticale pour privilégier le dialogue. - -## 11. Boutons - -### Selects Des Outils - -Tous les `` texte doit declarer son `type` explicitement ; -- utiliser `time-control` pour les champs `input[type="time"]`, avec variante `sm` ou `xs` selon le contexte ; -- taille normale : `44px` minimum ; -- taille compacte `sm` : `36px` minimum ; -- taille dense `xs` : `32px` minimum ; -- utiliser `field-textarea` pour les textareas redimensionnables avec scrollbar stable : `md` `108px`, `sm` `88px`, `xs` `72px` minimum ; -- utiliser `data-variant="ghost"` sur `nds-textarea` pour les zones d'edition intégrées à une surface métier, comme les mémos ; -- placeholders via `field-placeholder` ; -- hover via `field-hover`, focus via `field-focus` ; -- disabled via `field-disabled` ; -- les variantes complexes comme les cellules de table et le champ timer `hh:mm:ss` utilisent des mixins dedies du meme fichier. - -Edition inline : - -- utiliser `inline-field` pour les inputs transparents au repos ; -- hover/focus via `inline-field-hover` ; -- utiliser `inline-textarea` pour les zones texte transparentes intégrées à une carte ; -- les outils peuvent changer la couleur texte selon le contexte, par exemple titre de section ou état terminé. - -Selects : - -- taille normale : `44px` minimum ; -- taille compacte toolbox : `36px` minimum ; -- taille dense `xs` : `32px` minimum ; -- fleche custom unique, jamais de chevrons natifs ou empiles ; -- fond sombre Nebula force via `background-color`, hover/focus violet avec chevron dore ; -- focus visible global dore conserve. - -Select triggers : - -- utiliser `select-trigger` pour les boutons qui ouvrent une liste, un picker ou un calendrier avec le langage visuel d'un select ; -- tailles disponibles : `md` `44px`, `sm` `36px`, `xs` `32px` ; -- le chevron est le meme asset CSS que `select-control`, pas une icone locale ; -- hover via `select-trigger-hover`, focus via `field-focus` et focus visible dore ; -- `date-picker-trigger` reste un alias de compatibilite pour les outils deja migrés. - -Menus et palettes : - -- utiliser `floating-control-menu` pour les menus flottants compacts ; -- les suggestions `.nds-autocomplete-option` utilisent le même fond doré au survol et en état `.is-active`, sans être écrasées par le hover générique des boutons ; -- utiliser `compact-menu-button` pour les options d'icones ou d'actions compactes ; -- utiliser `color-swatch`, `color-swatch-rainbow` et `color-swatch-active` pour les palettes couleur ; -- utiliser `large-icon-picker-trigger` pour les gros triggers de choix d'icone de toolbox ; -- les outils peuvent garder uniquement la position du menu, le nombre de colonnes et la variable de couleur métier. - -Champs horaires : - -- les champs `input[type="time"]` restent natifs ; -- utiliser `time-control` pour aligner le champ avec le theme Nebula ; -- la popup native du navigateur/OS n'est pas consideree comme stylable de facon fiable en CSS. - -Boutons texte : - -- utiliser `text-button` depuis `website/src/styles/design-system/_controls.scss` ; -- taille normale : hauteur minimale `42px` ; -- taille compacte `sm` : hauteur minimale `34px` ; -- taille dense `xs` : hauteur minimale `30px` ; -- le bouton standard sert de variant secondaire par defaut ; -- variants disponibles : `primary`, `secondary`, `ghost`, `dashed`, `danger` ; -- les boutons texte peuvent utiliser `data-edge` pour ajuster leurs coins et `data-border` pour gérer les bordures jointes ou masquées ; -- etat toggler via `.active` ou `.is-active`, avec le mixin `temporary-toggle-active` ; -- etat desactive via `control-disabled` ; -- les outils peuvent uniquement ajuster la largeur, l'alignement ou l'espacement environnant. - -Boutons icones : - -- taille normale : `40px`, icone `21px` ; -- taille compacte : `34px`, icone `19px` ; -- taille dense `xs` : `30px`, icone `17px` ; -- taille inline `xxs` : `26px`, icone `15px` ; -- taille micro reservee aux noeuds denses : `22px`, icone `12px` ; -- fond compact sombre, rayon `--radius-md`, hover violet contenu ; -- variant `primary` dore/violet pour les actions principales ; -- variant `ghost` transparent pour les handles discrets ; -- variant `danger` rouge contenu pour les suppressions ; -- variant de forme `button-edge(left|middle|right|top|center|bottom|top-left|top-right|bottom-right|bottom-left)` pour ajuster uniquement les coins contre une bordure ou dans un groupe ; -- variant de bordure `button-joined-border(...)` pour masquer les bordures de jonction déduites depuis `data-edge` ; -- variant de bordure `button-borderless` pour masquer toutes les bordures ; -- variant visuel `panel-toggle` pour les boutons icones accolés à un panneau, comme le bouton pages ; -- etat toggler via `.active` ou `.is-active`, avec le mixin `temporary-toggle-active`. -- les barres d'outils compactes reutilisent la famille bouton icone ; `toolbar-button` reste un alias pratique pour les boutons courts du Bloc Note (`B`, `I`, `U`) et les boutons de dessin. - -Boutons composes et toggles de bord : - -- utiliser `button-edge` + `button-joined-border` pour les boutons groupés type ajout + chevron ; -- utiliser `button-edge` pour la forme des toggles accoles au bord d'un module, et `icon-button-panel-toggle` pour leur rendu visuel quand ils reprennent le pattern du bouton `pages` ; -- utiliser `list-row-button` pour les lignes selectionnables type pages du Bloc Note ; -- utiliser `text-button-dashed` pour les actions d'ajout contextuelles encadrees en pointilles ; -- `split-button-start`, `split-button-end`, `edge-toggle` et `dashed-action-button` restent des alias de compatibilite internes, pas des familles visuelles separees ; -- les outils peuvent garder uniquement la position absolue, la largeur contextuelle et les icones ; -- l'etat actif/hover doit rester dans le DS, sans fond/bordure locale. - -Steppers de quantite : - -- utiliser `quantity-stepper` depuis `website/src/styles/design-system/_controls.scss` ; -- variante normale : checklist, boutons `28px` autour de la valeur editable ; -- variante compacte : arbre d'objectifs, boutons `18px` ou `16px` selon la densite du noeud ; -- hover des boutons via `quantity-stepper-button-hover`, pas via `icon-button-hover` ; -- les outils peuvent adapter la grille environnante, mais pas redefinir les boutons `- / +`, le hover ou le champ de valeur. - -Switchs binaires : - -- utiliser `switch-control` depuis `website/src/styles/design-system/_controls.scss` ; -- taille `lg` : switchs de module, hauteur `40px`, rail `30 x 16px` ; -- taille normale : tool-split, hauteur `34px`, rail `34 x 18px` ; -- taille compacte `sm` : contrôles denses, hauteur `28px`, rail `24 x 14px` ; -- taille inline `xs` : timer inline, hauteur `26px`, rail `18 x 12px` ; -- les variantes natives avec `