Armonia as default workspace — sidebar tree, session cwd, cleanup #326

Description

@jeonghun-jj-lee

Armonia as default workspace — sidebar tree, session cwd, cleanup

Important

Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

Acceptance Criteria

  • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
  • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
  • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
  • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
  • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
  • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
  • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
  • amicode.catalog view removed from package.json; SessionCatalogTree deleted
  • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
  • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
  • Dead resolvePersonalVault removed from vault_store.ts
  • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

Key Decisions

DecisionRationale
ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

Constraints & Invariants

  • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
  • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
  • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
  • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

Prior Art

Source

Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

Notes

  • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
  • files-changed scoping is out of scope — separate plans.
  • Bug report flow (gh CLI) is intentionally preserved.
  • The Catalog panel may return in a future issue once its scope is defined.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

hitlNeeds human decision or review

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
     blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
    }
    } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
    })();
    (function(){
    try {
    var __m = "github.com";
    var __re = new RegExp('^' + "github\\.com" + '
    
    Skip to content

    Armonia as default workspace — sidebar tree, session cwd, cleanup #326

    Description

    @jeonghun-jj-lee

    Armonia as default workspace — sidebar tree, session cwd, cleanup

    Important

    Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

    Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

    Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

    Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

    Acceptance Criteria

    • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
    • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
    • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
    • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
    • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
    • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
    • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
    • amicode.catalog view removed from package.json; SessionCatalogTree deleted
    • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
    • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
    • Dead resolvePersonalVault removed from vault_store.ts
    • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

    Key Decisions

    DecisionRationale
    ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
    Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
    Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
    Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
    Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
    Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

    Constraints & Invariants

    • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
    • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
    • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
    • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

    Prior Art

    Source

    Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

    Notes

    • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
    • files-changed scoping is out of scope — separate plans.
    • Bug report flow (gh CLI) is intentionally preserved.
    • The Catalog panel may return in a future issue once its scope is defined.

    Activity

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Labels

    hitlNeeds human decision or review

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      Armonia as default workspace — sidebar tree, session cwd, cleanup #326

      Description

      @jeonghun-jj-lee

      Armonia as default workspace — sidebar tree, session cwd, cleanup

      Important

      Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

      Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

      Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

      Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

      Acceptance Criteria

      • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
      • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
      • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
      • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
      • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
      • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
      • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
      • amicode.catalog view removed from package.json; SessionCatalogTree deleted
      • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
      • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
      • Dead resolvePersonalVault removed from vault_store.ts
      • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

      Key Decisions

      DecisionRationale
      ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
      Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
      Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
      Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
      Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
      Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

      Constraints & Invariants

      • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
      • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
      • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
      • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

      Prior Art

      Source

      Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

      Notes

      • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
      • files-changed scoping is out of scope — separate plans.
      • Bug report flow (gh CLI) is intentionally preserved.
      • The Catalog panel may return in a future issue once its scope is defined.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Labels

      hitlNeeds human decision or review

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        Armonia as default workspace — sidebar tree, session cwd, cleanup #326

        Description

        @jeonghun-jj-lee

        Armonia as default workspace — sidebar tree, session cwd, cleanup

        Important

        Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

        Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

        Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

        Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

        Acceptance Criteria

        • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
        • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
        • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
        • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
        • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
        • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
        • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
        • amicode.catalog view removed from package.json; SessionCatalogTree deleted
        • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
        • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
        • Dead resolvePersonalVault removed from vault_store.ts
        • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

        Key Decisions

        DecisionRationale
        ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
        Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
        Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
        Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
        Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
        Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

        Constraints & Invariants

        • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
        • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
        • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
        • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

        Prior Art

        Source

        Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

        Notes

        • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
        • files-changed scoping is out of scope — separate plans.
        • Bug report flow (gh CLI) is intentionally preserved.
        • The Catalog panel may return in a future issue once its scope is defined.

        Activity

        Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

        Metadata

        Metadata

        Labels

        hitlNeeds human decision or review

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          Armonia as default workspace — sidebar tree, session cwd, cleanup #326

          Description

          @jeonghun-jj-lee

          Armonia as default workspace — sidebar tree, session cwd, cleanup

          Important

          Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

          Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

          Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

          Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

          Acceptance Criteria

          • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
          • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
          • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
          • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
          • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
          • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
          • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
          • amicode.catalog view removed from package.json; SessionCatalogTree deleted
          • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
          • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
          • Dead resolvePersonalVault removed from vault_store.ts
          • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

          Key Decisions

          DecisionRationale
          ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
          Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
          Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
          Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
          Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
          Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

          Constraints & Invariants

          • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
          • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
          • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
          • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

          Prior Art

          Source

          Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

          Notes

          • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
          • files-changed scoping is out of scope — separate plans.
          • Bug report flow (gh CLI) is intentionally preserved.
          • The Catalog panel may return in a future issue once its scope is defined.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Labels

          hitlNeeds human decision or review

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            Armonia as default workspace — sidebar tree, session cwd, cleanup #326

            Description

            @jeonghun-jj-lee

            Armonia as default workspace — sidebar tree, session cwd, cleanup

            Important

            Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

            Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

            Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

            Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

            Acceptance Criteria

            • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
            • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
            • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
            • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
            • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
            • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
            • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
            • amicode.catalog view removed from package.json; SessionCatalogTree deleted
            • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
            • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
            • Dead resolvePersonalVault removed from vault_store.ts
            • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

            Key Decisions

            DecisionRationale
            ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
            Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
            Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
            Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
            Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
            Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

            Constraints & Invariants

            • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
            • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
            • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
            • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

            Prior Art

            Source

            Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

            Notes

            • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
            • files-changed scoping is out of scope — separate plans.
            • Bug report flow (gh CLI) is intentionally preserved.
            • The Catalog panel may return in a future issue once its scope is defined.

            Activity

            Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

            Metadata

            Metadata

            Labels

            hitlNeeds human decision or review

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Armonia as default workspace — sidebar tree, session cwd, cleanup #326

              Description

              @jeonghun-jj-lee

              Armonia as default workspace — sidebar tree, session cwd, cleanup

              Important

              Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

              Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

              Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

              Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

              Acceptance Criteria

              • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
              • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
              • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
              • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
              • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
              • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
              • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
              • amicode.catalog view removed from package.json; SessionCatalogTree deleted
              • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
              • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
              • Dead resolvePersonalVault removed from vault_store.ts
              • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

              Key Decisions

              DecisionRationale
              ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
              Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
              Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
              Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
              Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
              Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

              Constraints & Invariants

              • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
              • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
              • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
              • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

              Prior Art

              Source

              Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

              Notes

              • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
              • files-changed scoping is out of scope — separate plans.
              • Bug report flow (gh CLI) is intentionally preserved.
              • The Catalog panel may return in a future issue once its scope is defined.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Labels

              hitlNeeds human decision or review

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                Armonia as default workspace — sidebar tree, session cwd, cleanup #326

                Description

                @jeonghun-jj-lee

                Armonia as default workspace — sidebar tree, session cwd, cleanup

                Important

                Problem: Amicode's UI has no awareness of the canonical ~/armonia/ workspace layout. The sidebar's Armonia panel is a placeholder stub, the agent session runs in whatever VS Code folder the user opened, and stale vault-setup machinery exists for a flow that bootstrap-armonia.sh now owns.

                Approach: Introduce an ArmoniaService that owns workspace discovery and layout model, a structured ArmoniaTreeProvider that replaces both the placeholder and the catalog panel, override the session cwd to always resolve against armonia, and clean up superseded vault code.

                Scope: Extension-only (packages/extension/ + opencode fork app). Does NOT touch the agent's tool permissions (the agent can still reach outside armonia). Does NOT add a user-facing setting to change the working directory (separate issue). Does NOT touch files-changed (separate plans).

                Assumptions: PR #308 (bootstrap-armonia.sh) merges first — this issue gates on it. The canonical layout (repos/{packages,demos}, data/{env,problems,runs,vaults}) is stable.

                Acceptance Criteria

                • ArmoniaService resolves the armonia root from hidden amicode.armoniaRoot setting (default ~/armonia/), exposes bootstrap state, and watches the filesystem for changes
                • ArmoniaTreeProvider renders six semantic buckets (Packages, Demos, Problems, Runs, Vaults, Environments) expanding into full filesystem subtrees; replaces both PlaceholderTree and SessionCatalogTree
                • When ~/armonia/ does not exist, the tree shows a "Set up Armonia" action that opens a tier quick-picker (--minimal / --standard / --full) and runs bootstrap-armonia.sh in the integrated terminal
                • Contextual actions on tree items: Runs → Open in Run Inspector / View result.toml; pulse.jld2 → Load pulse; Vault notes → Open preview; Packages → Run tests; Problems → Resume session / Open solve.jl; Demos → Run script
                • Agent session cwd is ArmoniaService.root (falls back to workspace folder if not bootstrapped)
                • open-file bridge resolves relative paths against armonia root; absolute paths pass through unrestricted
                • The breadcrumb bar (project selector + workspace selector + git status) is hidden when running as Amicode
                • amicode.catalog view removed from package.json; SessionCatalogTree deleted
                • amicode.setupVault command removed; ensureDefaultPersonalVault() removed; vault_setup.ts deleted
                • mount_store.ts resolves vaults from armoniaRoot/data/vaults/ (with amicode.vaultDir as hidden dev override)
                • Dead resolvePersonalVault removed from vault_store.ts
                • CONTEXT.md updated: Project definition reflects armonia as default; Armonia definition updated to reflect dual role (workspace + knowledge stack)

                Key Decisions

                DecisionRationale
                ArmoniaService as a class, not inline in tree providerReusable across extension (cwd, open-file, future features); testable in isolation; already referenced in trees.ts comments
                Semantic buckets skip repos/ and data/ intermediaryUsers think in terms of "my packages" / "my runs", not filesystem hierarchy; the Explorer shows raw paths for power users
                Session cwd override with workspace-folder fallbackGraceful degradation before bootstrap; no broken state
                Gate on #308, don't inline bootstrapSingle source of truth for workspace setup; bootstrap tiers (clone logic) are too complex to duplicate
                Hidden amicode.armoniaRoot settingForward-compatible with "let users change working directory" issue; testable with non-standard paths during dev
                Catalog panel removed rather than keptScope unclear; the Runs bucket + Run Inspector cover the primary use case; can return with clear scope later

                Constraints & Invariants

                • The agent is NOT jailed to armonia — tools can reach any absolute path. Armonia is the cwd (relative path resolution), not a sandbox.
                • open-file must continue to work with absolute paths outside armonia (existing behavior preserved).
                • The amicode.vaultDir setting survives as a hidden dev escape hatch — vault resolution can be forced independently of the armonia root.
                • Bootstrap detection is structural (checks for expected subdirectories), not marker-file-based — a manually created ~/armonia/ with the right shape is valid.

                Prior Art

                Source

                Brainstorming session 2026-08-10. Grilled with grill-with-docs against CONTEXT.md.

                Notes

                • The "let users change working directory" feature is a separate issue — this ships the armonia-is-always-the-root default.
                • files-changed scoping is out of scope — separate plans.
                • Bug report flow (gh CLI) is intentionally preserved.
                • The Catalog panel may return in a future issue once its scope is defined.

                Activity

                Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                Metadata

                Metadata

                Labels

                hitlNeeds human decision or review

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions