@nightkatana/kronosys-app 1.0.0-beta.19 → 1.0.0-beta.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -99,7 +99,7 @@ Sinon : `NODE_EXTRA_CA_CERTS` pointant vers le PEM racine de l’organisation, o
99
99
 
100
100
  ## Publication npm (`@nightkatana/kronosys-app`)
101
101
 
102
- La version est définie dans `package.json` (référence actuelle : **`1.0.0-beta.19`**). Avant la première publication : créer le scope **@nightkatana** sur [npmjs.com](https://www.npmjs.com/) si besoin, puis `npm login`. Depuis ce dossier :
102
+ La version est définie dans `package.json` (référence actuelle : **`1.0.0-beta.20`**). Avant la première publication : créer le scope **@nightkatana** sur [npmjs.com](https://www.npmjs.com/) si besoin, puis `npm login`. Depuis ce dossier :
103
103
 
104
104
  ```bash
105
105
  npm publish --access public
@@ -5,6 +5,14 @@ export type UserChangelogEntry = {
5
5
  };
6
6
 
7
7
  export const USER_CHANGELOG_ENTRIES: UserChangelogEntry[] = [
8
+ {
9
+ "version": "1.0.0-beta.20",
10
+ "items": [
11
+ "**Dépendances runtime** : `@types/node`, `@types/react` et `@types/react-dom` passées en **`dependencies`** avec `typescript` — Next.js 16 exige ces paquets pour la phase « Running TypeScript » du `next build` ; une installation **`npm install --omit=dev`** ne les omet plus (évite le message *It looks like you're trying to use TypeScript…* hors environnement de développement complet).",
12
+ "**Contenu du tarball publié** : suppression du champ **`files`** dans `package.json` (il neutralisait **`.npmignore`**, comportement **npm-packlist**) ; filtrage du paquet via **`.npmignore`** (fichiers `*.test.*` / `*.spec.*`, dossiers `e2e/`, `test/`, `docs/`, outils CI, etc.) en conservant les sources nécessaires au build.",
13
+ "Bump applicatif : **`1.0.0-beta.20`** (`package.json`, `package-lock.json`) ; **CHANGELOG** usager régénéré (`npm run changelog:build`)."
14
+ ]
15
+ },
8
16
  {
9
17
  "version": "1.0.0-beta.19",
10
18
  "items": [
@@ -55,7 +55,7 @@ const frBundle: ImplementationNotesBundle = {
55
55
  "Liste exhaustive des intentions utilisateur·rice·s : chaque ligne indique si la capacité est livrée (✓) ou absente / hors périmètre (✗). Les cases à droite servent à cocher une ligne « revue » sur cet appareil — le détail technique long reste dans le dépôt.",
56
56
  statusKeyLine:
57
57
  "✓ vert = implémenté dans le produit · ✗ rouge = non livré ou volontairement exclu.",
58
- lastUpdated: "Dernière mise à jour : 2026-05-12 (v1.0.0-beta.19)",
58
+ lastUpdated: "Dernière mise à jour : 2026-05-12 (v1.0.0-beta.20)",
59
59
  repositoryDocLabel: "Document dépôt : docs/IMPLEMENTATION_DETAILS.md",
60
60
  storyGroupsHeading: "Inventaire des user stories",
61
61
  implementationColumnLabel: "Implémentation",
@@ -92,7 +92,7 @@ const frBundle: ImplementationNotesBundle = {
92
92
  },
93
93
  {
94
94
  implemented: true,
95
- text: "Pour une livraison donnée (p. ex. 1.0.0-beta.19), valider le comportement en croisant la section correspondante du **CHANGELOG**, les récits marqués livrés sur cette page et `docs/IMPLEMENTATION_DETAILS.md`, puis cocher au besoin **intégration** / **E2E**.",
95
+ text: "Pour une livraison donnée (p. ex. 1.0.0-beta.20), valider le comportement en croisant la section correspondante du **CHANGELOG**, les récits marqués livrés sur cette page et `docs/IMPLEMENTATION_DETAILS.md`, puis cocher au besoin **intégration** / **E2E**.",
96
96
  },
97
97
  {
98
98
  implemented: true,
@@ -622,7 +622,7 @@ const enBundle: ImplementationNotesBundle = {
622
622
  "An exhaustive list of user intentions: each row shows whether the capability is shipped (✓) or missing / out of scope (✗). Checkboxes on the right mark a row as reviewed on this device — long technical detail stays in the repo doc.",
623
623
  statusKeyLine:
624
624
  "Green ✓ = implemented in the product · Red ✗ = not shipped or intentionally excluded.",
625
- lastUpdated: "Last updated: 2026-05-12 (v1.0.0-beta.19)",
625
+ lastUpdated: "Last updated: 2026-05-12 (v1.0.0-beta.20)",
626
626
  repositoryDocLabel: "Repository document: docs/IMPLEMENTATION_DETAILS.md",
627
627
  storyGroupsHeading: "User story inventory",
628
628
  implementationColumnLabel: "Implementation",
@@ -659,7 +659,7 @@ const enBundle: ImplementationNotesBundle = {
659
659
  },
660
660
  {
661
661
  implemented: true,
662
- text: "For a given release (e.g. 1.0.0-beta.19), cross-check the matching **CHANGELOG** section, the shipped stories on this page and `docs/IMPLEMENTATION_DETAILS.md`, then tick **Integration** / **E2E** as appropriate.",
662
+ text: "For a given release (e.g. 1.0.0-beta.20), cross-check the matching **CHANGELOG** section, the shipped stories on this page and `docs/IMPLEMENTATION_DETAILS.md`, then tick **Integration** / **E2E** as appropriate.",
663
663
  },
664
664
  {
665
665
  implemented: true,
package/next-env.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  /// <reference types="next" />
2
2
  /// <reference types="next/image-types/global" />
3
- import "./.next/dev/types/routes.d.ts";
3
+ import "./.next/types/routes.d.ts";
4
4
 
5
5
  // NOTE: This file should not be edited
6
6
  // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nightkatana/kronosys-app",
3
- "version": "1.0.0-beta.19",
3
+ "version": "1.0.0-beta.20",
4
4
  "description": "Kronosys — application Next.js (UI + API + SQLite).",
5
5
  "license": "MIT",
6
6
  "author": "nightkatana",
@@ -55,16 +55,16 @@
55
55
  "react-dom": "19.2.4",
56
56
  "react-markdown": "^10.1.0",
57
57
  "tailwindcss": "^4",
58
- "typescript": "^5.9.3"
58
+ "typescript": "^5.9.3",
59
+ "@types/node": "^22.15.21",
60
+ "@types/react": "^19",
61
+ "@types/react-dom": "^19"
59
62
  },
60
63
  "devDependencies": {
61
64
  "@changesets/cli": "^2.31.0",
62
65
  "@playwright/test": "^1.59.1",
63
66
  "@testing-library/react": "^16.3.0",
64
67
  "@testing-library/user-event": "^14.6.1",
65
- "@types/node": "^22.15.21",
66
- "@types/react": "^19",
67
- "@types/react-dom": "^19",
68
68
  "@vitest/coverage-v8": "^4.1.5",
69
69
  "eslint": "^9",
70
70
  "eslint-config-next": "16.2.3",
@@ -518,7 +518,11 @@ export function updateTaskStartTimeInSession(
518
518
  if (!subtaskRunning && task.manualTaskTimerPaused !== true && task.isDone !== true) {
519
519
  task[MAIN_TIMER_SEGMENT_STARTED_AT] = new Date(nowMs).toISOString();
520
520
  }
521
- ensureTaskParentDurationCoversSubtasksMs(task);
521
+ // Ne pas réimposer la somme des sous-tâches après un recalcul explicite (bornes ou manuel) :
522
+ // sinon la durée choisie par l’utilisateur·rice est écrasée.
523
+ if (mode === "keep") {
524
+ ensureTaskParentDurationCoversSubtasksMs(task);
525
+ }
522
526
  return true;
523
527
  }
524
528
 
@@ -563,7 +567,11 @@ export function updateTaskEndTimeInSession(
563
567
  } else {
564
568
  task.durationMs = Math.max(0, Math.floor(endMs - startMs));
565
569
  }
566
- ensureTaskParentDurationCoversSubtasksMs(task);
570
+ // Même logique que `updateTaskStartTimeInSession` : après « depuis début/fin » ou « manuel »,
571
+ // ne pas forcer le parent ≥ somme des sous-tâches (sinon le recalcul est annulé).
572
+ if (mode === "keep") {
573
+ ensureTaskParentDurationCoversSubtasksMs(task);
574
+ }
567
575
  return true;
568
576
  }
569
577