From 8a8fac75e675b239d7ce119e510dc8da2d92145c Mon Sep 17 00:00:00 2001 From: Johan LEROY Date: Sat, 27 Jun 2026 16:04:19 +0200 Subject: [PATCH] feat(site): showcase IDE workspace, diff/staging et services git distants MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - WorkspaceShowcase.vue : maquette fidèle de la vue /workspace (arbre de fichiers + panneau commit staging/amend + diff coloré + terminal corrélé). - RemoteGitSection.vue : connexions GitHub/GitLab/Gitea (chiffrées at-rest) + barre de progression de clone. - 5 cartes features, pilier sécurité « Encrypted secrets », 3 FAQ, ancre nav. - i18n EN/FR à parité ; meta description orientée IDE. Bump 0.2.0. --- packages/site/index.html | 6 +- packages/site/package.json | 2 +- packages/site/src/App.vue | 4 + packages/site/src/components/AppHeader.vue | 1 + .../site/src/components/FeaturesSection.vue | 35 +++ .../site/src/components/RemoteGitSection.vue | 83 +++++++ .../site/src/components/SecuritySection.vue | 5 + .../site/src/components/WorkspaceShowcase.vue | 231 ++++++++++++++++++ packages/site/src/i18n/content.ts | 24 ++ packages/site/src/i18n/en.ts | 49 ++++ packages/site/src/i18n/fr.ts | 49 ++++ 11 files changed, 485 insertions(+), 4 deletions(-) create mode 100644 packages/site/src/components/RemoteGitSection.vue create mode 100644 packages/site/src/components/WorkspaceShowcase.vue diff --git a/packages/site/index.html b/packages/site/index.html index 7dd7ca0..da082c1 100644 --- a/packages/site/index.html +++ b/packages/site/index.html @@ -9,7 +9,7 @@ Arboretum — Mission control for your AI coding agents @@ -19,7 +19,7 @@ @@ -30,7 +30,7 @@ diff --git a/packages/site/package.json b/packages/site/package.json index 5c157e7..08bfe32 100644 --- a/packages/site/package.json +++ b/packages/site/package.json @@ -1,7 +1,7 @@ { "name": "@arboretum/site", "private": true, - "version": "0.1.0", + "version": "0.2.0", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/site/src/App.vue b/packages/site/src/App.vue index 98414d7..159c3a7 100644 --- a/packages/site/src/App.vue +++ b/packages/site/src/App.vue @@ -6,6 +6,8 @@ import HeroSection from './components/HeroSection.vue'; 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 RemoteGitSection from './components/RemoteGitSection.vue'; import WorkGroupsSection from './components/WorkGroupsSection.vue'; import HowItWorksSection from './components/HowItWorksSection.vue'; import SecuritySection from './components/SecuritySection.vue'; @@ -62,6 +64,8 @@ const glowStyle = { + + diff --git a/packages/site/src/components/AppHeader.vue b/packages/site/src/components/AppHeader.vue index eb9a4e8..9ea23cf 100644 --- a/packages/site/src/components/AppHeader.vue +++ b/packages/site/src/components/AppHeader.vue @@ -8,6 +8,7 @@ const { t } = useI18n(); const navLinks = [ { href: '#features', key: 'navFeatures' }, + { href: '#workspace', key: 'navWorkspace' }, { href: '#how', key: 'navHow' }, { href: '#security', key: 'navSecurity' }, { href: '#faq', key: 'navFaq' }, diff --git a/packages/site/src/components/FeaturesSection.vue b/packages/site/src/components/FeaturesSection.vue index 804be86..99112fb 100644 --- a/packages/site/src/components/FeaturesSection.vue +++ b/packages/site/src/components/FeaturesSection.vue @@ -85,6 +85,41 @@ const { t } = useI18n(); {{ t('feat10Desc') }} + + + + {{ t('feat11Desc') }} + + + + + {{ t('feat12Desc') }} + + + + + {{ t('feat13Desc') }} + + + + + {{ t('feat14Desc') }} + + + + + {{ t('feat15Desc') }} + diff --git a/packages/site/src/components/RemoteGitSection.vue b/packages/site/src/components/RemoteGitSection.vue new file mode 100644 index 0000000..6fb060f --- /dev/null +++ b/packages/site/src/components/RemoteGitSection.vue @@ -0,0 +1,83 @@ + + + diff --git a/packages/site/src/components/SecuritySection.vue b/packages/site/src/components/SecuritySection.vue index 5366d0b..ff6bf7e 100644 --- a/packages/site/src/components/SecuritySection.vue +++ b/packages/site/src/components/SecuritySection.vue @@ -41,6 +41,11 @@ const { t } = useI18n();
{{ t('sec4Title') }}
{{ t('sec4Desc') }}
+
+ +
{{ t('sec5Title') }}
+
{{ t('sec5Desc') }}
+
diff --git a/packages/site/src/components/WorkspaceShowcase.vue b/packages/site/src/components/WorkspaceShowcase.vue new file mode 100644 index 0000000..8ccdab4 --- /dev/null +++ b/packages/site/src/components/WorkspaceShowcase.vue @@ -0,0 +1,231 @@ + + + diff --git a/packages/site/src/i18n/content.ts b/packages/site/src/i18n/content.ts index 5800ea7..586a8f6 100644 --- a/packages/site/src/i18n/content.ts +++ b/packages/site/src/i18n/content.ts @@ -29,6 +29,18 @@ export const FAQS: Record = { q: 'Is my code safe?', a: 'Arboretum binds to localhost, hashes access tokens at rest, and enforces strict origin checks on every request. Remote access runs through Tailscale rather than an open port.', }, + { + q: 'Can I edit files directly?', + a: 'Yes. The /workspace view is a real IDE: a file tree, a full Monaco editor with inline diffs, and the correlated session terminal. Stage changes file by file, write a commit message, amend, then push — all from the browser, on any device.', + }, + { + q: 'Can I connect GitHub, GitLab or Gitea and clone?', + a: 'Yes. Add a connection with a personal access token or app password — credentials are encrypted at rest (AES-256-GCM) and never returned in clear by the API. Then browse remote repos and clone over HTTPS with live progress.', + }, + { + q: 'What happens to old sessions?', + a: 'Finished sessions are archived automatically after a configurable retention window (30 days by default), so the dashboard stays focused on what is live without losing your history.', + }, ], fr: [ { @@ -51,6 +63,18 @@ export const FAQS: Record = { q: 'Mon code est-il en sécurité ?', a: "Arboretum se lie à localhost, hashe les tokens au repos, et applique une vérification d'origine stricte sur chaque requête. L'accès distant passe par Tailscale plutôt qu'un port ouvert.", }, + { + q: 'Puis-je éditer les fichiers directement ?', + a: "Oui. La vue /workspace est un vrai IDE : un arbre de fichiers, un éditeur Monaco complet avec les diffs inline, et le terminal de la session corrélée. Indexez les changements fichier par fichier, rédigez un message de commit, amendez, puis poussez — le tout depuis le navigateur, sur n'importe quel appareil.", + }, + { + q: 'Puis-je connecter GitHub, GitLab ou Gitea et cloner ?', + a: "Oui. Ajoutez une connexion avec un token d'accès personnel ou un app password — les identifiants sont chiffrés au repos (AES-256-GCM) et jamais renvoyés en clair par l'API. Parcourez ensuite les repos distants et clonez en HTTPS avec progression en direct.", + }, + { + q: "Qu'advient-il des anciennes sessions ?", + a: 'Les sessions terminées sont archivées automatiquement après une rétention configurable (30 jours par défaut), pour que le dashboard reste centré sur ce qui est en cours sans perdre votre historique.', + }, ], }; diff --git a/packages/site/src/i18n/en.ts b/packages/site/src/i18n/en.ts index 7311d76..6b50a5d 100644 --- a/packages/site/src/i18n/en.ts +++ b/packages/site/src/i18n/en.ts @@ -1,6 +1,7 @@ // Messages EN — copie fidèle du dict() du design Arboretum.dc.html. export default { navFeatures: 'Features', + navWorkspace: 'Workspace', navHow: 'How it works', navSecurity: 'Security', navFaq: 'FAQ', @@ -106,4 +107,52 @@ export default { copied: 'Copied', copyCommand: 'Copy command', copyUrl: 'Copy URL', + + // New feature cards (P7→P12: IDE worktree) + feat11Title: 'A real IDE for every worktree', + feat11Desc: 'Browse the file tree, edit in a full Monaco editor, and read changes as inline diffs — all in the /workspace view.', + feat12Title: 'Diff & selective staging', + feat12Desc: 'Stage, unstage or discard file by file, then commit (all or staged), amend, fetch and pull — without leaving the dashboard.', + feat13Title: 'Remote git services', + feat13Desc: 'Connect GitHub, GitLab or Gitea with a PAT or app password — credentials encrypted at rest — and clone over HTTPS with live progress.', + feat14Title: 'Auto-archive sessions', + feat14Desc: 'Finished sessions are archived automatically after a configurable retention window (30 days by default), keeping the list clean.', + feat15Title: 'Real-time file sync', + feat15Desc: 'A filesystem watcher streams changes the moment a file moves on disk — diffs and status update live, no refresh needed.', + + // Workspace IDE showcase + wsKicker: 'The worktree IDE', + wsTitle: 'A full IDE for every worktree, in the browser', + wsBody: + 'Open any worktree in /workspace: a file tree on the left, a Monaco editor and inline diff in the center, and the correlated session terminal on the right. Stage changes file by file, write a commit message, push — all without leaving the page, on any device.', + wsEditor: 'Editor', + wsDiff: 'Diff', + wsFiles: 'Files', + wsChanges: 'Changes', + wsStaged: 'Staged', + wsTerminal: 'Terminal', + wsCommitMsg: 'Implement token refresh', + wsCommitPlaceholder: 'Commit message…', + wsAmend: 'Amend last commit', + wsCommitBtn: 'Commit', + wsPushBtn: 'Push', + wsStage: 'Stage', + wsUnstage: 'Unstage', + wsDiscard: 'Discard', + + // Remote git services + clone + rgKicker: 'Remote git · encrypted', + rgTitle: 'Connect your git services and clone in a click', + rgBody: + 'Add GitHub, GitLab or Gitea connections with a personal access token or app password. Secrets are encrypted at rest (AES-256-GCM) and never returned in clear by the API. Browse remote repos and clone over HTTPS with live progress.', + rgConnections: 'Connections', + rgTested: 'tested', + rgAddConnection: 'Add connection', + rgEncrypted: 'Encrypted at rest', + rgCloning: 'Cloning', + rgCloneReceiving: 'Receiving objects', + + // Security pillar (encrypted secrets) + sec5Title: 'Encrypted secrets', + sec5Desc: 'Remote git credentials are encrypted at rest (AES-256-GCM) and never returned in clear by the API.', }; diff --git a/packages/site/src/i18n/fr.ts b/packages/site/src/i18n/fr.ts index 088325d..2cba10f 100644 --- a/packages/site/src/i18n/fr.ts +++ b/packages/site/src/i18n/fr.ts @@ -1,6 +1,7 @@ // Messages FR — copie fidèle du dict() du design Arboretum.dc.html. export default { navFeatures: 'Fonctionnalités', + navWorkspace: 'Workspace', navHow: 'Comment ça marche', navSecurity: 'Sécurité', navFaq: 'FAQ', @@ -106,4 +107,52 @@ export default { copied: 'Copié', copyCommand: 'Copier la commande', copyUrl: "Copier l'URL", + + // Nouvelles cartes de fonctionnalités (P7→P12 : IDE worktree) + feat11Title: 'Un vrai IDE pour chaque worktree', + feat11Desc: "Parcourez l'arbre de fichiers, éditez dans un éditeur Monaco complet, et lisez les changements en diff inline — le tout dans la vue /workspace.", + feat12Title: 'Diff & staging sélectif', + feat12Desc: 'Indexez, désindexez ou annulez fichier par fichier, puis commitez (tout ou indexé), amendez, fetchez et pullez — sans quitter le dashboard.', + feat13Title: 'Services git distants', + feat13Desc: 'Connectez GitHub, GitLab ou Gitea avec un PAT ou un app password — identifiants chiffrés au repos — et clonez en HTTPS avec progression en direct.', + feat14Title: 'Archivage auto des sessions', + feat14Desc: 'Les sessions terminées sont archivées automatiquement après une rétention configurable (30 jours par défaut), pour garder la liste propre.', + feat15Title: 'Synchro fichiers temps réel', + feat15Desc: "Un watcher du système de fichiers pousse les changements dès qu'un fichier bouge sur le disque — diffs et statut se mettent à jour en direct, sans rafraîchir.", + + // Showcase IDE workspace + wsKicker: "L'IDE worktree", + wsTitle: 'Un IDE complet pour chaque worktree, dans le navigateur', + wsBody: + "Ouvrez n'importe quel worktree dans /workspace : un arbre de fichiers à gauche, un éditeur Monaco et le diff inline au centre, et le terminal de la session corrélée à droite. Indexez les changements fichier par fichier, rédigez un message de commit, poussez — sans quitter la page, depuis n'importe quel appareil.", + wsEditor: 'Éditeur', + wsDiff: 'Diff', + wsFiles: 'Fichiers', + wsChanges: 'Changements', + wsStaged: 'Indexés', + wsTerminal: 'Terminal', + wsCommitMsg: 'Implémente le rafraîchissement du token', + wsCommitPlaceholder: 'Message de commit…', + wsAmend: 'Amender le dernier commit', + wsCommitBtn: 'Commit', + wsPushBtn: 'Push', + wsStage: 'Indexer', + wsUnstage: 'Désindexer', + wsDiscard: 'Annuler', + + // Services git distants + clone + rgKicker: 'Git distant · chiffré', + rgTitle: 'Connectez vos services git et clonez en un clic', + rgBody: + "Ajoutez des connexions GitHub, GitLab ou Gitea avec un token d'accès personnel ou un app password. Les secrets sont chiffrés au repos (AES-256-GCM) et jamais renvoyés en clair par l'API. Parcourez les repos distants et clonez en HTTPS avec progression en direct.", + rgConnections: 'Connexions', + rgTested: 'testée', + rgAddConnection: 'Ajouter une connexion', + rgEncrypted: 'Chiffré au repos', + rgCloning: 'Clonage', + rgCloneReceiving: 'Réception des objets', + + // Pilier sécurité (secrets chiffrés) + sec5Title: 'Secrets chiffrés', + sec5Desc: "Les identifiants git distants sont chiffrés au repos (AES-256-GCM) et jamais renvoyés en clair par l'API.", };