release: git-arboretum 3.3.0 (« Démarrer le projet » : lancement multi-terminaux), vscode 0.4.0, desktop 0.1.3
All checks were successful
CI / Build & test (Node 22) (push) Successful in 10m17s
CI / Build & test (Node 24) (push) Successful in 10m13s
CI / No em/en dashes (push) Successful in 4s
Deploy site (production) / build-and-deploy (push) Successful in 24s
Release / Publish to Gitea npm registry (push) Successful in 10m17s
VSCode Release / Package VSIX (push) Successful in 9m39s
Desktop Release / Build Linux (AppImage + deb) (push) Successful in 15m41s
CI / Pack & boot smoke (Node 22) (push) Successful in 10m3s
All checks were successful
CI / Build & test (Node 22) (push) Successful in 10m17s
CI / Build & test (Node 24) (push) Successful in 10m13s
CI / No em/en dashes (push) Successful in 4s
Deploy site (production) / build-and-deploy (push) Successful in 24s
Release / Publish to Gitea npm registry (push) Successful in 10m17s
VSCode Release / Package VSIX (push) Successful in 9m39s
Desktop Release / Build Linux (AppImage + deb) (push) Successful in 15m41s
CI / Pack & boot smoke (Node 22) (push) Successful in 10m3s
« Démarrer le projet » : un repo définit une fois ses commandes de démarrage (serveur de dev, API, base de données), un clic ouvre un terminal PTY par commande dans le dock IDE. Serveur (additif, PROTOCOL_VERSION inchangé) : - LaunchCommand[] persistées sur repos.launch_commands (migration 13) ; champ additif SessionSummary.launchRunId. - POST /repos/:id/launch : résolution du worktree côté serveur, cwd de commande borné (anti-traversal), commandIds outrepasse enabled. - GET /repos/:id/launch/detect : détection package.json / Procfile / docker-compose. - Shell de login interactif ($SHELL -l -i, charge le PATH nvm/asdf) + auto-type de la commande ; le shell survit à la commande (échec visible). Web : LaunchProjectModal + actions (ProjectTreeNode, SessionsPanel, CommandPalette), stores sessions/worktrees, i18n EN/FR. Alignement du reste du projet : - Extension VS Code 0.4.0 : commande Start Project (repo/worktree), Stop Launch, badge « launch » dans l'arbre, méthode REST startLaunch. - Site vitrine : 16e feature card (Rocket) + section showcase « Start the project » (mockup fidèle au modal), i18n EN/FR. - Documentation : README (EN + FR), help-content (EN + FR), CHANGELOGs server + vscode. Vérifié : 430 tests, typecheck, build (web + site + vscode), acceptance-p13 ALL GREEN, VSIX packagé, garde anti-tirets, vérif visuelle du site (thèmes clair et sombre).
This commit is contained in:
@@ -7,6 +7,7 @@ import ProblemSection from './components/ProblemSection.vue';
|
||||
import FeaturesSection from './components/FeaturesSection.vue';
|
||||
import ShowcaseSection from './components/ShowcaseSection.vue';
|
||||
import WorkspaceShowcase from './components/WorkspaceShowcase.vue';
|
||||
import LaunchShowcase from './components/LaunchShowcase.vue';
|
||||
import DownloadSection from './components/DownloadSection.vue';
|
||||
import RemoteGitSection from './components/RemoteGitSection.vue';
|
||||
import WorkGroupsSection from './components/WorkGroupsSection.vue';
|
||||
@@ -68,6 +69,7 @@ const glowStyle = {
|
||||
<FeaturesSection />
|
||||
<ShowcaseSection />
|
||||
<WorkspaceShowcase />
|
||||
<LaunchShowcase />
|
||||
<DownloadSection />
|
||||
<RemoteGitSection />
|
||||
<WorkGroupsSection />
|
||||
|
||||
@@ -120,6 +120,13 @@ const { t } = useI18n();
|
||||
</template>
|
||||
{{ t('feat15Desc') }}
|
||||
</FeatureCard>
|
||||
|
||||
<FeatureCard :title="t('feat16Title')">
|
||||
<template #icon>
|
||||
<svg width="21" height="21" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" /><path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" /><path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" /><path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" /></svg>
|
||||
</template>
|
||||
{{ t('feat16Desc') }}
|
||||
</FeatureCard>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
84
packages/site/src/components/LaunchShowcase.vue
Normal file
84
packages/site/src/components/LaunchShowcase.vue
Normal file
@@ -0,0 +1,84 @@
|
||||
<script setup lang="ts">
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
// Commandes de démarrage du mockup (fidele a LaunchProjectModal : label + commande mono).
|
||||
const cmds = [
|
||||
{ label: 'web', run: 'npm run dev' },
|
||||
{ label: 'api', run: 'npm run api' },
|
||||
{ label: 'db', run: 'docker compose up' },
|
||||
];
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<section id="launch" class="mx-auto max-w-[1200px] scroll-mt-[84px] px-6 pb-[100px]">
|
||||
<div v-reveal class="flex flex-wrap items-center gap-12">
|
||||
<!-- texte -->
|
||||
<div class="min-w-[280px] flex-[1_1_360px]">
|
||||
<div class="mb-3 font-mono text-xs uppercase tracking-[0.12em] text-accent">{{ t('launchScKicker') }}</div>
|
||||
<h2 class="m-0 mb-4 text-[clamp(26px,3vw,34px)] font-semibold leading-[1.15] tracking-[-0.025em] text-fg">
|
||||
{{ t('launchScTitle') }}
|
||||
</h2>
|
||||
<p class="m-0 text-[16.5px] leading-[1.6] text-fg-muted">{{ t('launchScBody') }}</p>
|
||||
</div>
|
||||
|
||||
<!-- mockup : modal « Démarrer le projet » puis dock a un onglet terminal par commande -->
|
||||
<div class="flex min-w-[280px] flex-[1_1_440px] flex-col gap-3">
|
||||
<!-- modal (fidele a LaunchProjectModal) -->
|
||||
<div class="overflow-hidden rounded-xl border border-border bg-surface-1 shadow-card">
|
||||
<header class="flex items-center gap-2 border-b border-border px-3 py-2.5">
|
||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" class="text-accent" aria-hidden="true"><path d="M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z" /><path d="m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z" /><path d="M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0" /><path d="M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5" /></svg>
|
||||
<span class="text-sm font-semibold text-fg">{{ t('launchModalTitle') }}</span>
|
||||
<span class="ml-auto rounded bg-surface-2 px-1.5 py-0.5 font-mono text-[11px] text-fg-muted">api</span>
|
||||
</header>
|
||||
<div class="flex flex-col gap-2 p-3">
|
||||
<div v-for="c in cmds" :key="c.label" class="flex items-center gap-2">
|
||||
<span class="inline-flex h-4 w-4 flex-none items-center justify-center rounded bg-accent-solid text-white">
|
||||
<svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6 9 17l-5-5" /></svg>
|
||||
</span>
|
||||
<span class="w-16 flex-none truncate rounded bg-surface-2 px-1.5 py-1 text-xs font-medium text-fg">{{ c.label }}</span>
|
||||
<span class="min-w-0 flex-1 truncate rounded border border-border bg-surface-0 px-2 py-1 font-mono text-xs text-fg-muted">{{ c.run }}</span>
|
||||
</div>
|
||||
<div class="mt-1 flex items-center gap-2">
|
||||
<span class="inline-flex items-center gap-1.5 rounded-lg border border-border bg-surface-2 px-2.5 py-1.5 text-xs font-medium text-fg-muted">
|
||||
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l1.9 5.8a2 2 0 0 0 1.3 1.3L21 12l-5.8 1.9a2 2 0 0 0-1.3 1.3L12 21l-1.9-5.8a2 2 0 0 0-1.3-1.3L3 12l5.8-1.9a2 2 0 0 0 1.3-1.3z" /></svg>
|
||||
{{ t('launchDetect') }}
|
||||
</span>
|
||||
<span class="ml-auto inline-flex items-center gap-1.5 rounded-lg bg-accent-solid px-2.5 py-1.5 text-xs font-semibold text-white">
|
||||
<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polygon points="6 3 20 12 6 21 6 3" /></svg>
|
||||
{{ t('launchStartN') }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- fleche vers le dock -->
|
||||
<div class="flex justify-center text-fg-subtle">
|
||||
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 5v14" /><path d="m19 12-7 7-7-7" /></svg>
|
||||
</div>
|
||||
|
||||
<!-- dock IDE : un onglet terminal par commande lancée -->
|
||||
<div class="overflow-hidden rounded-xl border border-border bg-surface-0 shadow-card">
|
||||
<div class="flex items-stretch border-b border-border text-[11px]">
|
||||
<span class="label-mono flex items-center gap-1 px-2 py-1.5">
|
||||
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m7 11 2-2-2-2" /><path d="M11 13h4" /><rect width="18" height="18" x="3" y="3" rx="2" /></svg>
|
||||
{{ t('mTerminal') }}
|
||||
</span>
|
||||
<span class="flex items-center gap-1.5 border-l border-border bg-surface-0 px-2.5 py-1.5 font-mono text-fg">
|
||||
<span class="h-1.5 w-1.5 animate-pulse-sky rounded-full bg-info"></span>web
|
||||
</span>
|
||||
<span class="flex items-center gap-1.5 border-l border-border px-2.5 py-1.5 font-mono text-fg-muted">api</span>
|
||||
<span class="flex items-center gap-1.5 border-l border-border px-2.5 py-1.5 font-mono text-fg-muted">db</span>
|
||||
</div>
|
||||
<div class="min-h-[104px] p-[11px] font-mono text-[11px] leading-[1.7] text-fg-muted">
|
||||
<div class="text-fg-subtle">$ npm run dev</div>
|
||||
<div class="text-accent">VITE v6 ready in 312 ms</div>
|
||||
<div class="text-fg-subtle">Local: http://localhost:5173/</div>
|
||||
<div><span class="text-accent">$</span><span class="ml-1 inline-block h-[11px] w-1.5 animate-blink bg-fg align-middle"></span></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
@@ -39,6 +39,8 @@ export default {
|
||||
feat9Desc: 'Drive worktrees and attach sessions in native terminals, right inside your editor.',
|
||||
feat10Title: 'New project in one click',
|
||||
feat10Desc: 'Create a project folder anywhere (optional git init) and start a Claude session in it, from any device.',
|
||||
feat16Title: 'Start your project',
|
||||
feat16Desc: 'Define your dev commands once (dev server, API, database), then launch each in its own terminal in a single click.',
|
||||
scAKicker: 'Session supervision',
|
||||
scATitle: 'See what needs you, before anything stalls',
|
||||
scABody:
|
||||
@@ -148,6 +150,15 @@ export default {
|
||||
wsUnstage: 'Unstage',
|
||||
wsDiscard: 'Discard',
|
||||
|
||||
// « Start the project » : lancement multi-terminaux
|
||||
launchScKicker: 'Start the project',
|
||||
launchScTitle: 'One click, every terminal your project needs',
|
||||
launchScBody:
|
||||
'Most projects need more than one long-running command: a dev server, an API, a database. Define them once per project (auto-detected from package.json, Procfile or docker-compose), then launch them all at once. Each command opens in its own docked terminal you can attach to, restart, or stop as a group.',
|
||||
launchModalTitle: 'Start the project',
|
||||
launchDetect: 'Detect',
|
||||
launchStartN: 'Start (3)',
|
||||
|
||||
// Remote git services + clone
|
||||
rgKicker: 'Remote git · encrypted',
|
||||
rgTitle: 'Connect your git services and clone in a click',
|
||||
|
||||
@@ -39,6 +39,8 @@ export default {
|
||||
feat9Desc: 'Pilotez vos worktrees et attachez vos sessions dans des terminaux natifs, directement dans votre éditeur.',
|
||||
feat10Title: 'Nouveau projet en un clic',
|
||||
feat10Desc: "Créez un dossier de projet où vous voulez (git init optionnel) et lancez-y une session Claude, depuis n'importe quel appareil.",
|
||||
feat16Title: 'Démarrez votre projet',
|
||||
feat16Desc: 'Définissez vos commandes de démarrage une fois (serveur de dev, API, base de données), puis lancez chacune dans son terminal en un seul clic.',
|
||||
scAKicker: 'Supervision des sessions',
|
||||
scATitle: 'Voyez ce qui vous attend, avant que ça ne bloque',
|
||||
scABody:
|
||||
@@ -148,6 +150,15 @@ export default {
|
||||
wsUnstage: 'Désindexer',
|
||||
wsDiscard: 'Annuler',
|
||||
|
||||
// « Démarrer le projet » : lancement multi-terminaux
|
||||
launchScKicker: 'Démarrer le projet',
|
||||
launchScTitle: 'Un clic, tous les terminaux dont votre projet a besoin',
|
||||
launchScBody:
|
||||
"La plupart des projets exigent plusieurs commandes longue durée : un serveur de dev, une API, une base de données. Définissez-les une fois par projet (détectées depuis package.json, Procfile ou docker-compose), puis lancez-les toutes d'un coup. Chaque commande ouvre son propre terminal en dock, que vous pouvez attacher, relancer ou arrêter en groupe.",
|
||||
launchModalTitle: 'Démarrer le projet',
|
||||
launchDetect: 'Détecter',
|
||||
launchStartN: 'Démarrer (3)',
|
||||
|
||||
// Services git distants + clone
|
||||
rgKicker: 'Git distant · chiffré',
|
||||
rgTitle: 'Connectez vos services git et clonez en un clic',
|
||||
|
||||
Reference in New Issue
Block a user