Merge branch 'main' of github.com:jcalixte/tps

This commit is contained in:
Julien Calixte
2026-01-01 21:40:05 +01:00
15 changed files with 33 additions and 253 deletions

View File

@@ -9,6 +9,11 @@
--gap: 1rem;
}
* {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
*:not(td):not(th) {
border-radius: 0.3rem;
}

View File

@@ -42,7 +42,7 @@
<section class="just-in-time-pilar">
<h3 class="just-in-time focusable">Just-in-time</h3>
<ul>
<li class="takt-time focusable">Takt time</li>
<li class="takt-time takt focusable">Takt time</li>
<li class="one-piece-flow focusable">One piece flow</li>
<li class="pull-system focusable">
<a href="/pull-system">Pull system</a>

View File

@@ -1,202 +0,0 @@
export const birds = [
'Varied Thrush',
'Rock Dove',
'California Quail',
'Yellow-faced Grassquit',
'American Dipper',
'Tufted Puffin',
"Le Conte's Thrasher",
"Cassin's Vireo",
'Buff-bellied Hummingbird',
'Red Crossbill',
'Little Ringed Plover',
'American Avocet',
'Little Curlew',
'Tree Swallow',
'Three-toed Woodpecker',
'Bahama Mockingbird',
'Wandering Albatross',
'Hepatic Tanager',
'Ashy Storm-Petrel',
'Hoary Redpoll',
'Lazuli Bunting',
'Common House-Martin',
'Varied Bunting',
'Pygmy Nuthatch',
'American Coot',
'Shiny Cowbird',
'Rufous-capped Warbler',
'Eastern Wood-Pewee',
'Common Snipe',
'Northern Pygmy-Owl',
'Wood Stork',
'Gray-spotted Flycatcher',
'Bahama Woodstar',
'Black-backed Wagtail',
'Bean Goose',
'Buff-breasted Sandpiper',
'Northern Shoveler',
'Cinnamon Teal',
'Ruffed Grouse',
'Orchard Oriole',
'Black-footed Albatross',
'Mottled Duck',
'Red-headed Woodpecker',
'Double-crested Cormorant',
'Little Gull',
'Rufous Hummingbird',
'American Tree Sparrow',
'Black Swift',
'Fish Crow',
'Yellow-nosed Albatross',
'Ruddy Ground-Dove',
'White-winged Scoter',
'Black-capped Vireo',
'Chestnut-sided Warbler',
'Turkey Vulture',
'Mississippi Kite',
'Sage Thrasher',
'Whiskered Screech-Owl',
'Yucatan Vireo',
'Mountain Chickadee',
"Lewis's Woodpecker",
'Passenger Pigeon',
"Sabine's Gull",
'Black-billed Magpie',
'Florida Scrub-Jay',
'Plumbeous Vireo',
'Hoary Redpoll',
'Dusky Warbler',
"Couch's Kingbird",
'Double-striped Thick-knee',
'Canvasback',
'Warbling Vireo',
'Western Scrub-Jay',
'Green-winged Teal',
'Spot-breasted Oriole',
'American Bittern',
'White-winged Dove',
'Fieldfare',
'Barn Swallow',
'Golden-crowned Kinglet',
'Alder Flycatcher',
'Spotted Rail',
'Great Egret',
'Peregrine Falcon',
'Pacific-slope Flycatcher',
'Far Eastern Curlew',
'Whiskered Auklet',
'Yellow-billed Magpie',
'Eurasian Woodcock',
'Hepatic Tanager',
'Buff-bellied Hummingbird',
'Indigo Bunting',
"Gambel's Quail",
'Northern Waterthrush',
'Eurasian Wryneck',
"Audubon's Oriole",
'Gilded Flicker',
'Red-tailed Hawk',
'Zenaida Dove',
'Common Black-Hawk',
'Swamp Sparrow',
'Bahama Swallow',
'Jack Snipe',
"Le Conte's Thrasher",
'House Wren',
'Osprey',
'Savannah Sparrow',
'Eurasian Wigeon',
'Mexican Jay',
'Yellow Wagtail',
'Green Sandpiper',
'Greater Shearwater',
'Black-legged Kittiwake',
'Elegant Tern',
'Tufted Duck',
'Gray-headed Chickadee',
'Spotted Sandpiper',
'Barn Swallow',
'Bank Swallow',
'Scarlet Ibis',
'Spotted Redshank',
'Lark Bunting',
'American Golden-Plover',
'House Sparrow',
'Laysan Albatross',
'Whooper Swan',
'Marbled Murrelet',
"Townsend's Solitaire",
'Flesh-footed Shearwater',
'European Storm-Petrel',
'Manx Shearwater',
'Fieldfare',
'Least Bittern',
'Eskimo Curlew',
'Buff-collared Nightjar',
'White-breasted Nuthatch',
'Lanceolated Warbler',
'Bridled Tern',
'Yellow Wagtail',
'Jack Snipe',
'Western Tanager',
'Common Goldeneye',
'Greater Scaup',
'Belted Kingfisher',
'Rustic Bunting',
'Olive-sided Flycatcher',
'Bahama Mockingbird',
'White-tailed Ptarmigan',
'Lesser Scaup',
'Common Murre',
'Siberian Rubythroat',
'Siberian Rubythroat',
'Eared Trogon',
'Swallow-tailed Kite',
'Sulphur-bellied Flycatcher',
'Bohemian Waxwing',
'Common Sandpiper',
'Altamira Oriole',
'Mountain Plover',
'Common Ground-Dove',
'Great Gray Owl',
'Common Tern',
'Great Black-backed Gull',
'Horned Lark',
'Tricolored Heron',
'California Towhee',
'Fulvous Whistling-Duck',
'Hoary Redpoll',
'Plumbeous Vireo',
'Caribbean Elaenia',
'Purple Martin',
'American Crow',
'Key West Quail-Dove',
'Jungle Nightjar',
'Common Redpoll',
'Dusky Warbler',
'Neotropic Cormorant',
'Chestnut-backed Chickadee',
'Black Catbird',
'Redhead',
'American Tree Sparrow',
"Le Conte's Sparrow",
'Neotropic Cormorant',
'Wood Duck',
'Plumbeous Vireo',
'Bahama Mockingbird',
'Greater White-fronted Goose',
'Elegant Trogon',
'Jack Snipe',
'American Black Duck',
'Killdeer',
'Brown Jay',
'Pine Warbler',
'Nashville Warbler',
'Winter Wren',
'Blue Jay',
'Snowy Egret',
'Gray Bunting',
"Steller's Jay",
'Wood Warbler'
]

View File

@@ -3,7 +3,6 @@ import { Chart as ChartJS, registerables } from 'chart.js'
import { useBoardGameStore } from '@/modules/5s/board-game-store'
import { toDuration, toSeconds } from '@/modules/5s/utils'
import { getNatural } from '@/utils'
import { _ } from '@faker-js/faker/dist/airline-D6ksJFwG'
import { computed, ref } from 'vue'
import { Bar } from 'vue-chartjs'

View File

@@ -8,6 +8,7 @@ import { onMounted, ref, toValue } from 'vue'
const userInput = ref('')
const mode = ref<_5S | null>(null)
const boardGameStore = useBoardGameStore()
if (import.meta.env.DEV) {
onMounted(() => {
boardGameStore.initGame()

View File

@@ -238,7 +238,7 @@ const createdAt = new Date('2025-01-08').toLocaleDateString(undefined, {
Now were pretty confident! As quality issues increase in the
<PushSystemIcon /> push system, defects and corrections accumulate,
leading to <span class="numeric">{{ meanLeadTimeDelta }}</span> days of
delay<template v-if="meanLeadTimeDeltaFloat > 12">!!</template
delay<template v-if="meanLeadTimeDeltaFloat > 12">!</template
><template v-else>.</template>
</p>
<p v-else class="waiting-simulations">

View File

@@ -12,7 +12,7 @@ const hasQualityIssues = computed(() => props.feature.qualityIssue > 0)
<template>
<div class="feature-item bin" :class="{ live: isLive }">
<div>
<div class="feature-name">
<!-- [complexity]
<span class="numeric">({{ feature.complexity }})</span> -->
{{ feature.name }}
@@ -37,11 +37,15 @@ const hasQualityIssues = computed(() => props.feature.qualityIssue > 0)
display: flex;
flex-direction: row;
gap: 1rem;
justify-content: space-around;
justify-content: space-between;
&.live {
visibility: hidden;
opacity: 0;
}
.feature-name {
flex: 1;
}
}
</style>

View File

@@ -10,7 +10,7 @@ defineProps<{ alias: string }>()
const featureStore = useFeatureStore()
onMounted(() => featureStore.initBoard('mobile-app', NUMBER_OF_FEATURES))
onMounted(() => featureStore.initBoard(NUMBER_OF_FEATURES))
</script>
<template>

View File

@@ -13,7 +13,7 @@ const featureStore = useFeatureStore()
const confirmReset = () => {
if (confirm('Are you sure you want to reset the board?')) {
featureStore.initBoard('mobile-app', NUMBER_OF_FEATURES)
featureStore.initBoard(NUMBER_OF_FEATURES)
}
}
</script>

View File

@@ -1,13 +1,9 @@
import { newsAppFeatures } from '@/data/app-feature'
import type {
Feature,
FeatureStatus
} from '@/modules/pull-system/feature/feature'
import type { FeatureStep } from '@/modules/pull-system/feature/feature-steps'
import {
birdFeatures,
mobileAppFeatures
} from '@/modules/pull-system/feature/feature.fixture'
import { mobileAppFeatures } from '@/modules/pull-system/feature/feature.fixture'
import type { Strategy } from '@/modules/pull-system/lean/strategy'
import type { FeatureState } from '@/store-type'
import {
@@ -74,9 +70,9 @@ const mayBeInProgress = ({
return feature.status
}
export const newBacklog = (type: 'bird' | 'mobile-app', limit?: number) => {
const initialFeatures =
type === 'bird' ? [...birdFeatures] : [...mobileAppFeatures]
export const newBacklog = (limit?: number) => {
const initialFeatures = [...mobileAppFeatures]
return limit !== undefined
? popNElement(shuffleArray(initialFeatures), limit)
: shuffleArray(initialFeatures)
@@ -254,8 +250,8 @@ export const nextDay = (
strategy: Strategy | 'problem-solving'
): FeatureState => {
state.meta.totalDays++
// // each day, the teams know how to better work together
// state.meta.teamWorkExperience += 0.1
// each day, the teams know how to better work together
// state.meta.teamWorkExperience += 0.1 // Removed with a simplified version of pull system without the problem-solving strategy
if (strategy === 'problem-solving') {
const hasTeamLearned = randomFloat(0, 1) > 0.25
@@ -306,7 +302,7 @@ export const simulate = (
): FeatureState => {
let i = 0
while (!isProjectFinished(state.features) && i++ < HARD_STOP) {
while (i++ < HARD_STOP && !isProjectFinished(state.features)) {
if (strategy.includes('dps')) {
if (state.meta.totalDays % 5 === 0) {
state = nextDay(state, 'problem-solving')

View File

@@ -34,9 +34,10 @@ export const useFeatureStore = defineStore('feature', {
meta: resetMeta()
}),
actions: {
async initBoard(type: 'bird' | 'mobile-app', limit?: number) {
this.backlog = newBacklog(type, limit)
async initBoard(limit?: number) {
this.backlog = newBacklog(limit)
this.steps = featureSteps
const initialSteps = featureSteps.filter(
(step) => step.title !== 'Release' && step.title !== 'Development'
)

View File

@@ -1,26 +1,7 @@
import { newsAppFeatures } from '@/data/app-feature'
import { birds } from '@/data/bird'
import { Feature } from '@/modules/pull-system/feature/feature'
import { randomInteger } from '@/utils'
export const features: Feature[] = birds.map((name) => ({
name,
complexity: randomInteger(1, 5),
leadTime: 0,
status: 'doing',
step: Infinity,
qualityIssue: 0
}))
export const birdFeatures: readonly Feature[] = birds.map((name) => ({
name,
complexity: randomInteger(1, 5),
leadTime: 0,
status: 'doing',
step: Infinity,
qualityIssue: 0
}))
export const mobileAppFeatures: readonly Feature[] = newsAppFeatures.map(
(name) => ({
name,

View File

@@ -45,12 +45,6 @@ const strategies: Strategy[] = ['push', 'pull']
{{ simulationStore.meanTotalDays(strategy) }}
</td>
</tr>
<tr>
<td>Mean lead time</td>
<td class="numeric" v-for="strategy in strategies" :key="strategy">
{{ simulationStore.meanLeadTime(strategy) }}
</td>
</tr>
<tr>
<td>Min lead time</td>
<td class="numeric" v-for="strategy in strategies" :key="strategy">
@@ -71,6 +65,12 @@ const strategies: Strategy[] = ['push', 'pull']
}}
</td>
</tr>
<tr>
<td>Mean lead time</td>
<td class="numeric" v-for="strategy in strategies" :key="strategy">
{{ simulationStore.meanLeadTime(strategy) }}
</td>
</tr>
<!-- <tr>
<td>Cycle time</td>
<td class="numeric" v-for="strategy in strategies" :key="strategy">

View File

@@ -70,7 +70,7 @@ export const useSimulationStore = defineStore('dashboard', {
actions: {
async simulate(strategy: Strategy) {
const steps = featureSteps
const backlog = await instance.newBacklog('mobile-app')
const backlog = await instance.newBacklog()
const features = await instance.initBoard(steps, backlog, true)
const newState = await instance.simulate(

5
src/shims-vue.d.ts vendored
View File

@@ -1,6 +1 @@
declare module '*.vue' {
import { defineComponent } from 'vue'
const component: ReturnType<typeof defineComponent>
export default component
}
declare module 'chart.xkcd'