Not in the top 1,000 by GitHub stars

Cavalry-Collective/visual-stack

A visual interface for building software with Claude Code/Codex.

History

Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.

View weekly changes

plugins/vstack/experimental/go/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

plugins/vstack/experimental/phase-build/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

plugins/vstack/experimental/phase-preview/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Local scripts

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

plugins/vstack/experimental/spec/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

plugins/vstack/experimental/start/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

plugins/vstack/skills/review/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

plugins/vstack/skills/user-story-map/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

plugins/vstack/skills/wireframe/SKILL.md

Week of Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Instructions only

First observation → 0f2e1a8c0f95

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 0f2e1a8c0f95aa486aa88f0abae347ea16e4b809

git clone --filter=blob:none --no-checkout https://github.com/Cavalry-Collective/visual-stack.git .hotskills/cavalry-collective-visual-stack && git -C .hotskills/cavalry-collective-visual-stack checkout --detach 0f2e1a8c0f95aa486aa88f0abae347ea16e4b809 # Copy each selected skill directory from .hotskills/cavalry-collective-visual-stack into .claude/skills/<skill-name>/
11GitHub stars
0stars in 7 days
8skills in this repository
1commit in 30 days

Heat

1.2
  • Star growth, last 7 daysNot available
  • Star growth, last 24 hoursNot available
  • Rank movement, last 7 daysNot available
  • Commits, last 30 daysNot available
  • Accounts asking about it through MCP, last 7 daysNot available
  • Hot votes this weekNot available

Heat never changes the order by stars, and sponsorship never touches it. How heat works

Stars over time

Oct 25, 2026Oct 25, 202611

30-day change not yet available: not enough history.

Individual skills in this repository

  • go plugins/vstack/experimental/go
  • phase-build plugins/vstack/experimental/phase-build
  • phase-preview plugins/vstack/experimental/phase-preview
  • spec plugins/vstack/experimental/spec
  • start plugins/vstack/experimental/start
  • review plugins/vstack/skills/review
  • user-story-map plugins/vstack/skills/user-story-map
  • wireframe plugins/vstack/skills/wireframe

How it works

go

When your agent uses it

Compatibility entry for Visual Stack's former /vstack:go command. Runs the wireframe and UI review tool, now called review. Use only when the user invokes /vstack:go.

What it loads into context

Frontmatter

45 tokens

Always available to the agent

SKILL.md

144 tokens

When the skill is activated

Reference documents

8,999 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

    Files

    • ../../../../.claude-plugin/marketplace.jsonasset1,712 bytes
    • ../../.claude-plugin/plugin.jsonasset1,201 bytes
    • SKILL.mdcore654 bytes
    • ../../hooks/hooks.jsonasset324 bytes
    • ../../hooks/hooks.jsonasset324 bytes
    • ../../skills/review/SKILL.mddoc37,169 bytes
    Read SKILL.md
    
    Visual Stack is the wireframe and UI review tool. This legacy entry no longer inspects pipeline state
    or routes to other workflow stages.
    
    Read `../../skills/review/SKILL.md` completely, load the host adapter it requires, and follow that workflow
    for the user's request. Treat this as a direct invocation of the review skill. If the request does
    not yet name a screen or running UI, ask only for the minimum information that the review skill
    cannot infer.
    View the complete source on GitHub

    Skills included

    • go
    • phase-build
    • phase-preview
    • spec
    • start
    • review
    • user-story-map
    • wireframe

    Repository facts

    License
    MIT
    Created
    Jul 27, 2026
    Last pushed
    Oct 15, 2026
    Forks
    0
    Open issues
    0
    Project activity
    Active

    Before you install

    Network or broad shell

    Automated signals, not a guarantee

    Checked Nov 6, 2026

    Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

    Show 58 notes
    • plugins/vstack/hooks/hooks.json:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-build/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-preview/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-preview/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-preview/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-preview/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/phase-preview/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    • plugins/vstack/experimental/spec/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
    Show all 212 signals by file

    .claude-plugin/marketplace.json

    • Network accessline 4
      "name": "Cavalry Collective",     "email": "adam@cavalry.sg",     "url": "https://cavalry.sg"
    • Network accessline 5
      "email": "adam@cavalry.sg",     "url": "https://cavalry.sg"   },
    • Network accessline 6
      "url": "https://cavalry.sg"
    • Network accessline 16
      "name": "Cavalry Collective",         "email": "adam@cavalry.sg",         "url": "https://cavalry.sg"
    • Network accessline 17
      "email": "adam@cavalry.sg",         "url": "https://cavalry.sg"       },
    • Network accessline 18
      "url": "https://cavalry.sg"
    • Network accessline 19
      },       "homepage": "https://www.cavalry.sg/visual-stack",       "repository": "https://github.com/Cavalry-Collective/visual-stack",
    • Network accessline 20
      "homepage": "https://www.cavalry.sg/visual-stack",
    • Network accessline 21
      "repository": "https://github.com/Cavalry-Collective/visual-stack",

    plugins/vstack/.claude-plugin/plugin.json

    • Network accessline 7
      "name": "Cavalry Collective",     "email": "adam@cavalry.sg",     "url": "https://cavalry.sg"
    • Network accessline 8
      "email": "adam@cavalry.sg",     "url": "https://cavalry.sg"   },
    • Network accessline 9
      "url": "https://cavalry.sg"
    • Network accessline 10
      },   "homepage": "https://www.cavalry.sg/visual-stack",   "repository": "https://github.com/Cavalry-Collective/visual-stack",
    • Network accessline 11
      "homepage": "https://www.cavalry.sg/visual-stack",
    • Network accessline 12
      "repository": "https://github.com/Cavalry-Collective/visual-stack",

    plugins/vstack/experimental/phase-build/assets/build-board.html

    • Network accessline 389
      <!-- The repo, not the marketing page: someone clicking the mark inside the          tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_bla
    • Network accessline 390
      tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"        title="Visual Stack">
    • Network accessline 391
      <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"
    • Network accessline 687
      if (opts.poll) {       const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 688
      const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }         catch { say(false) }
    • Network accessline 689
      try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 809
      if (info.dismiss) {         try {           fetch(info.dismiss, {
    • Network accessline 810
      try {           fetch(info.dismiss, {             method: 'POST',
    • Network accessline 811
      fetch(info.dismiss, {
    • Network accessline 1220
      const body = { ...doc, ...(extra || {}) };   try {     const r = await fetch(BRIDGE.save, {
    • Network accessline 1221
      try {     const r = await fetch(BRIDGE.save, {       method: 'POST',
    • Network accessline 1222
      const r = await fetch(BRIDGE.save, {
    • Network accessline 1248
      $('#reset').addEventListener('click', async () => {   if (BRIDGE) {     try { doc = await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json() } catch {}
    • Network accessline 1249
      if (BRIDGE) {     try { doc = await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json() } catch {}   } else {
    • Network accessline 1250
      try { doc = await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json() } catch {}
    • Network accessline 1280
      if (BRIDGE) VSShell.setLink(false, null, BRIDGE.watching); else VSShell.hideLink();   if (BRIDGE) {     try { doc = await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json() }
    • Network accessline 1281
      if (BRIDGE) {     try { doc = await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json() }     catch { doc = JSON.parse($('#fallback').textContent); }
    • Network accessline 1282
      try { doc = await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json() }

    plugins/vstack/experimental/phase-preview/assets/check-subtraction.mjs

    • Executable scriptline 1
      #!/usr/bin/env node

    plugins/vstack/experimental/phase-preview/assets/phase-view.mjs

    • Executable scriptline 1
      #!/usr/bin/env node

    plugins/vstack/experimental/spec/assets/spec-tree.html

    • Network accessline 507
      <!-- The repo, not the marketing page: someone clicking the mark inside the          tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_bla
    • Network accessline 508
      tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"        title="Visual Stack">
    • Network accessline 509
      <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"
    • Network accessline 916
      if (opts.poll) {       const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 917
      const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }         catch { say(false) }
    • Network accessline 918
      try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 1038
      if (info.dismiss) {         try {           fetch(info.dismiss, {
    • Network accessline 1039
      try {           fetch(info.dismiss, {             method: 'POST',
    • Network accessline 1040
      fetch(info.dismiss, {
    • Network accessline 1314
      if (!BRIDGE) return;   try {     const idx = await (await fetch(`${BRIDGE.history}?t=${BRIDGE.token}`)).json();
    • Network accessline 1315
      try {     const idx = await (await fetch(`${BRIDGE.history}?t=${BRIDGE.token}`)).json();     if (!Array.isArray(idx) || !idx.length) return;
    • Network accessline 1316
      const idx = await (await fetch(`${BRIDGE.history}?t=${BRIDGE.token}`)).json();
    • Network accessline 1686
      if (!v.json && BRIDGE) {       try {         v.json = JSON.stringify(await (await fetch(`${BRIDGE.history}/${n}?t=${BRIDGE.token}`)).json());
    • Network accessline 1687
      try {         v.json = JSON.stringify(await (await fetch(`${BRIDGE.history}/${n}?t=${BRIDGE.token}`)).json());         v.fetched = true;
    • Network accessline 1688
      v.json = JSON.stringify(await (await fetch(`${BRIDGE.history}/${n}?t=${BRIDGE.token}`)).json());
    • Network accessline 1732
      $('#send').disabled = true;   try {     const r = await fetch(BRIDGE.save, {
    • Network accessline 1733
      try {     const r = await fetch(BRIDGE.save, {       method: 'POST',
    • Network accessline 1734
      const r = await fetch(BRIDGE.save, {
    • Network accessline 1751
      if (BRIDGE) {     try {       doc = migrate(await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json());
    • Network accessline 1752
      try {       doc = migrate(await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json());     } catch { doc = migrate(JSON.parse($('#fallback').textContent)); }
    • Network accessline 1753
      doc = migrate(await (await fetch(`${BRIDGE.doc}?t=${BRIDGE.token}`)).json());

    plugins/vstack/experimental/start/SKILL.md

    • Network accessline 39
      Start it with **`run_in_background: true`**, then tell the user to open **http://localhost:7799/**.
    • Network accessline 110
      git clone --depth 1 https://github.com/Cavalry-Collective/vstack-template-base.git <name>
    • Dangerous shell operationline 111
      rm -rf <name>/.git && git -C <name> init && git -C <name> add -A
    • Dangerous shell operationline 122
      for p in $(jq -r '.deleting.packs[]'  .vstack/choice.json); do rm -rf "stacks/$p"; done
    • Dangerous shell operationline 123
      for a in $(jq -r '.deleting.addons[]' .vstack/choice.json); do rm -rf "add-ons/$a"; done

    plugins/vstack/experimental/start/assets/chooser-server.mjs

    • Executable scriptline 1
      #!/usr/bin/env node
    • Network accessline 170
      const t = setTimeout(() => ctrl.abort(), 3500)     try {       const r = await fetch(`https://api.github.com/repos/${TEMPLATE_REPO}/contents/${dir}`, {
    • Network accessline 171
      try {       const r = await fetch(`https://api.github.com/repos/${TEMPLATE_REPO}/contents/${dir}`, {         headers: { 'User-Agent': 'vstack-start', 'Accept': 'application/vnd.github+json' },
    • Network accessline 172
      const r = await fetch(`https://api.github.com/repos/${TEMPLATE_REPO}/contents/${dir}`, {
    • Network accessline 233
      const server = http.createServer((req, res) => {   const url = new URL(req.url, 'http://127.0.0.1')
    • Network accessline 234
      const url = new URL(req.url, 'http://127.0.0.1')
    • Network accessline 320
      console.log(`setup form for ${inventory.project} — mode ${MODE}, inventory ${source}`)   if (MODE !== 'existing') console.log(`  ${inventory.packs.length} pack(s) · ${inventory.addons.length} add-on(s)`)   console.log(`  open http://localho
    • Network accessline 321
      if (MODE !== 'existing') console.log(`  ${inventory.packs.length} pack(s) · ${inventory.addons.length} add-on(s)`)   console.log(`  open http://localhost:${PORT}/`) })
    • Network accessline 322
      console.log(`  open http://localhost:${PORT}/`)

    plugins/vstack/experimental/start/assets/chooser.html

    • Network accessline 436
      <!-- The repo, not the marketing page: someone clicking the mark inside the          tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_bla
    • Network accessline 437
      tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"        title="Visual Stack">
    • Network accessline 438
      <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"
    • Network accessline 788
      if (opts.poll) {       const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 789
      const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }         catch { say(false) }
    • Network accessline 790
      try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 910
      if (info.dismiss) {         try {           fetch(info.dismiss, {
    • Network accessline 911
      try {           fetch(info.dismiss, {             method: 'POST',
    • Network accessline 912
      fetch(info.dismiss, {
    • Network accessline 1562
      for (let attempt = 0; attempt < 3; attempt++) {     try {       const r = await fetch('/choose', {
    • Network accessline 1563
      try {       const r = await fetch('/choose', {         method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 1564
      const r = await fetch('/choose', {

    plugins/vstack/skills/review/SKILL.md

    • Network accessline 112
      The server opens the workspace in the browser itself, as soon as it is up. Say it is open and name the URL — **http://localhost:7788/** — so a machine that
    • Network accessline 112
      The server opens the workspace in the browser itself, as soon as it is up. Say it is open and name the URL — **http://localhost:7788/** — so a machine that
    • Network accessline 112
      The server opens the workspace in the browser itself, as soon as it is up. Say it is open and name the URL — **http://localhost:7788/** — so a machine that
    • Network accessline 113
      it is open and name the URL — **http://localhost:7788/** — so a machine that
    • Network accessline 113
      it is open and name the URL — **http://localhost:7788/** — so a machine that
    • Network accessline 113
      it is open and name the URL — **http://localhost:7788/** — so a machine that
    • Network accessline 393
      node "$SKILL/assets/review-server.mjs" serve \   --app http://localhost:5173 --name lora-ui --port 7788    # a dev server
    • Network accessline 393
      node "$SKILL/assets/review-server.mjs" serve \   --app http://localhost:5173 --name lora-ui --port 7788    # a dev server
    • Network accessline 393
      node "$SKILL/assets/review-server.mjs" serve \   --app http://localhost:5173 --name lora-ui --port 7788    # a dev server
    • Network accessline 394
      --app http://localhost:5173 --name lora-ui --port 7788    # a dev server
    • Network accessline 394
      --app http://localhost:5173 --name lora-ui --port 7788    # a dev server
    • Network accessline 394
      --app http://localhost:5173 --name lora-ui --port 7788    # a dev server
    • Network accessline 395
      node "$SKILL/assets/review-server.mjs" serve    --app https://example.com --name marketing --port 7788    # a site on the internet
    • Network accessline 395
      node "$SKILL/assets/review-server.mjs" serve    --app https://example.com --name marketing --port 7788    # a site on the internet
    • Network accessline 395
      node "$SKILL/assets/review-server.mjs" serve    --app https://example.com --name marketing --port 7788    # a site on the internet
    • Network accessline 396
      --app https://example.com --name marketing --port 7788    # a site on the internet
    • Network accessline 396
      --app https://example.com --name marketing --port 7788    # a site on the internet
    • Network accessline 396
      --app https://example.com --name marketing --port 7788    # a site on the internet
    • Network accessline 399
      The server reverse-proxies the app, so the workspace and the app share an origin — which is the only reason a comment can attach to an element rather than to a coordinate. The workspace moves to **http://localhost:7788/__review/**; every
    • Network accessline 399
      The server reverse-proxies the app, so the workspace and the app share an origin — which is the only reason a comment can attach to an element rather than to a coordinate. The workspace moves to **http://localhost:7788/__review/**; every
    • Network accessline 399
      The server reverse-proxies the app, so the workspace and the app share an origin — which is the only reason a comment can attach to an element rather than to a coordinate. The workspace moves to **http://localhost:7788/__review/**; every
    • Network accessline 400
      — which is the only reason a comment can attach to an element rather than to a coordinate. The workspace moves to **http://localhost:7788/__review/**; every other path belongs to the app. Sockets are proxied too, so hot reload keeps
    • Network accessline 400
      — which is the only reason a comment can attach to an element rather than to a coordinate. The workspace moves to **http://localhost:7788/__review/**; every other path belongs to the app. Sockets are proxied too, so hot reload keeps
    • Network accessline 400
      — which is the only reason a comment can attach to an element rather than to a coordinate. The workspace moves to **http://localhost:7788/__review/**; every other path belongs to the app. Sockets are proxied too, so hot reload keeps
    • Network accessline 401
      coordinate. The workspace moves to **http://localhost:7788/__review/**; every
    • Network accessline 401
      coordinate. The workspace moves to **http://localhost:7788/__review/**; every
    • Network accessline 401
      coordinate. The workspace moves to **http://localhost:7788/__review/**; every
    • Network accessline 462
      node "$SKILL/assets/review-server.mjs" serve --app https://example.com --name marketing --port 7788
    • Network accessline 462
      node "$SKILL/assets/review-server.mjs" serve --app https://example.com --name marketing --port 7788
    • Network accessline 462
      node "$SKILL/assets/review-server.mjs" serve --app https://example.com --name marketing --port 7788

    plugins/vstack/skills/review/assets/bundle-artifact.mjs

    • Executable scriptline 1
      #!/usr/bin/env node

    plugins/vstack/skills/review/assets/harvest-reference.js

    • Executable scriptline 1
      Executable file

    plugins/vstack/skills/review/assets/review-server.mjs

    • Executable scriptline 1
      #!/usr/bin/env node
    • Network accessline 146
      function targetURL (raw) {   let s = String(raw).trim()   if (/^:\d+$/.test(s)) s = 'http://localhost' + s
    • Network accessline 147
      let s = String(raw).trim()   if (/^:\d+$/.test(s)) s = 'http://localhost' + s   if (!/^https?:\/\//i.test(s)) s = 'http://' + s
    • Network accessline 148
      if (/^:\d+$/.test(s)) s = 'http://localhost' + s
    • Network accessline 1691
      A public site needs more than a dev server does. It writes its own origin into    its markup in absolute form — one click on `https://site.com/pricing` and the
    • Network accessline 1692
      its markup in absolute form — one click on `https://site.com/pricing` and the
    • Network accessline 1828
      async function handle (req, res) {   const url = new URL(req.url, 'http://localhost')
    • Network accessline 1829
      const url = new URL(req.url, 'http://localhost')
    • Network accessline 2160
      throw e   })   const url = `http://localhost:${port}${BASE}/`
    • Network accessline 2162
      const url = `http://localhost:${port}${BASE}/`

    plugins/vstack/skills/review/assets/workspace.html

    • Network accessline 1030
      <!-- The repo, not the marketing page: someone clicking the mark inside the          tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_bla
    • Network accessline 1031
      tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"        title="Visual Stack">
    • Network accessline 1032
      <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"
    • Network accessline 1502
      if (opts.poll) {       const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 1503
      const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }         catch { say(false) }
    • Network accessline 1504
      try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 1624
      if (info.dismiss) {         try {           fetch(info.dismiss, {
    • Network accessline 1625
      try {           fetch(info.dismiss, {             method: 'POST',
    • Network accessline 1626
      fetch(info.dismiss, {
    • Network accessline 2222
      let data = inline;   if (!data) {     try { data = await (await fetch(API + '/project')).json() }
    • Network accessline 2223
      if (!data) {     try { data = await (await fetch(API + '/project')).json() }     catch {
    • Network accessline 2224
      try { data = await (await fetch(API + '/project')).json() }
    • Network accessline 2322
      // The server keeps what this tab is not allowed to change: a comment       // already sent keeps its words, and only the thread grows on it.       await fetch(API + '/comments', {
    • Network accessline 2323
      // already sent keeps its words, and only the thread grows on it.       await fetch(API + '/comments', {         method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 2324
      await fetch(API + '/comments', {
    • Network accessline 2354
      async function onReloadEvent () {   let data;   try { data = await (await fetch(API + '/project')).json() } catch { return }
    • Network accessline 2355
      let data;   try { data = await (await fetch(API + '/project')).json() } catch { return }   // The link can land on its own, without the page or the review moving.
    • Network accessline 2356
      try { data = await (await fetch(API + '/project')).json() } catch { return }
    • Network accessline 2508
      again.disabled = true;   try {     const response = await fetch(API + '/comments/requeue', { method: 'POST' });
    • Network accessline 2509
      try {     const response = await fetch(API + '/comments/requeue', { method: 'POST' });     // The agent came back while the button was on screen. It holds them after
    • Network accessline 2510
      const response = await fetch(API + '/comments/requeue', { method: 'POST' });
    • Network accessline 3814
      if (S.runtime === 'artifact') return true;   try {     const response = await fetch(API + '/comments/dismiss', {
    • Network accessline 3815
      try {     const response = await fetch(API + '/comments/dismiss', {       method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 3816
      const response = await fetch(API + '/comments/dismiss', {
    • Network accessline 4000
      render();   try {     const response = await fetch(API + '/comments/delegate', {
    • Network accessline 4001
      try {     const response = await fetch(API + '/comments/delegate', {       method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 4002
      const response = await fetch(API + '/comments/delegate', {
    • Network accessline 4060
      if (S.runtime === 'artifact') return;   try {     const response = await fetch(API + '/comments/unreply', {
    • Network accessline 4061
      try {     const response = await fetch(API + '/comments/unreply', {       method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 4062
      const response = await fetch(API + '/comments/unreply', {
    • Network accessline 5008
      renderReset(); renderResetDialog();   try {     const response = await fetch(API + '/reset', { method: 'POST' });
    • Network accessline 5009
      try {     const response = await fetch(API + '/reset', { method: 'POST' });     if (response.status === 404) throw new Error('old');
    • Network accessline 5010
      const response = await fetch(API + '/reset', { method: 'POST' });
    • Network accessline 5066
      renderHistoryButton();   try {     const res = await fetch(API + '/history/clear', { method: 'POST' });
    • Network accessline 5067
      try {     const res = await fetch(API + '/history/clear', { method: 'POST' });     const type = res.headers.get('content-type') || '';
    • Network accessline 5068
      const res = await fetch(API + '/history/clear', { method: 'POST' });
    • Network accessline 5349
      whenever each of them was written. */     for (const a of going2) a.sentAt = at;     const response = await fetch(API + '/comments', {
    • Network accessline 5350
      for (const a of going2) a.sentAt = at;     const response = await fetch(API + '/comments', {       method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 5351
      const response = await fetch(API + '/comments', {
    • Network accessline 5458
      S.share.pending = true; renderShare();   try {     await fetch(API + '/share', {
    • Network accessline 5459
      try {     await fetch(API + '/share', {       method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 5460
      await fetch(API + '/share', {
    • Network accessline 5474
      if (S.runtime === 'artifact') { showDone(); return }   try {     const response = await fetch(API + '/approve', {
    • Network accessline 5475
      try {     const response = await fetch(API + '/approve', {       method: 'POST', headers: { 'Content-Type': 'application/json' },
    • Network accessline 5476
      const response = await fetch(API + '/approve', {

    plugins/vstack/skills/review/hosts/claude.md

    • Network accessline 54
      Tell the user **http://localhost:7788/**.

    plugins/vstack/skills/review/hosts/codex.md

    • Network accessline 45
      Tell the user **http://localhost:7788/** (or `/__review/` for live `--app`).

    plugins/vstack/skills/review/hosts/grok.md

    • Network accessline 52
      Tell the user **http://localhost:7788/** (or `/__review/` for live `--app`).

    plugins/vstack/skills/review/references/workflow.md

    • Network accessline 76
      # hand back a public URL when Host capabilities.share is artifact node "$SKILL/assets/review-server.mjs" share --file "$FILE" --url "https://example.com/…"
    • Network accessline 77
      node "$SKILL/assets/review-server.mjs" share --file "$FILE" --url "https://example.com/…"
    • Network accessline 89
      # proxy the app and serve the workspace at /__review/ (run_in_background: true) node "$SKILL/assets/review-server.mjs" serve --app http://localhost:5173 --name lora-ui --port 7788
    • Network accessline 90
      node "$SKILL/assets/review-server.mjs" serve --app http://localhost:5173 --name lora-ui --port 7788

    plugins/vstack/skills/review/tests/design-tokens.mjs

    • Executable scriptline 1
      Executable file

    plugins/vstack/skills/review/tests/host-profiles.mjs

    • Executable scriptline 1
      #!/usr/bin/env node

    plugins/vstack/skills/review/tests/review-lifecycle.mjs

    • Executable scriptline 1
      #!/usr/bin/env node
    • Network accessline 16
      const store = path.join(temp, '.vstack', 'local', 'review', 'page') const port = 18000 + (process.pid % 1000) const origin = `http://127.0.0.1:${port}`
    • Network accessline 18
      const origin = `http://127.0.0.1:${port}`
    • Network accessline 24
      async function request (pathname, options) {   const response = await fetch(origin + pathname, options)
    • Network accessline 25
      const response = await fetch(origin + pathname, options)
    • Network accessline 53
      const workspace = await fetch(origin + '/')

    plugins/vstack/skills/review/tests/round-gate.mjs

    • Executable scriptline 1
      #!/usr/bin/env node
    • Network accessline 21
      const page = path.join(temp, 'page.html') const port = 19000 + (process.pid % 1000) const origin = `http://127.0.0.1:${port}`
    • Network accessline 22
      const port = 19000 + (process.pid % 1000) const origin = `http://127.0.0.1:${port}` let server = null
    • Network accessline 23
      const origin = `http://127.0.0.1:${port}`
    • Network accessline 40
      const post = (pathname, body) => fetch(origin + pathname, {
    • Network accessline 52
      async function waitForServer () {   for (let attempt = 0; attempt < 60; attempt++) {     try { if ((await fetch(origin + '/api/project')).ok) return } catch {}
    • Network accessline 53
      for (let attempt = 0; attempt < 60; attempt++) {     try { if ((await fetch(origin + '/api/project')).ok) return } catch {}     await new Promise(resolve => setTimeout(resolve, 100))
    • Network accessline 54
      try { if ((await fetch(origin + '/api/project')).ok) return } catch {}

    plugins/vstack/skills/review/tests/update-check.mjs

    • Executable scriptline 1
      #!/usr/bin/env node

    plugins/vstack/skills/review/tests/workdir.mjs

    • Executable scriptline 1
      #!/usr/bin/env node

    plugins/vstack/skills/user-story-map/assets/story-map-template.html

    • Network accessline 468
      <!-- The repo, not the marketing page: someone clicking the mark inside the          tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_bla
    • Network accessline 469
      tool wants the source, the issues, or the install command. -->     <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"        title="Visual Stack">
    • Network accessline 470
      <a class="vslink" href="https://github.com/Cavalry-Collective/visual-stack" target="_blank" rel="noopener"
    • Network accessline 803
      if (opts.poll) {       const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 804
      const tick = async () => {         try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }         catch { say(false) }
    • Network accessline 805
      try { const r = await fetch(opts.poll, { cache: 'no-store' }); say(r.ok) }
    • Network accessline 925
      if (info.dismiss) {         try {           fetch(info.dismiss, {
    • Network accessline 926
      try {           fetch(info.dismiss, {             method: 'POST',
    • Network accessline 927
      fetch(info.dismiss, {
    • Network accessline 1651
      [Credential-related source omitted]
    • Network accessline 1652
      [Credential-related source omitted]
    • Network accessline 1653
      [Credential-related source omitted]
    • Network accessline 1662
      [Credential-related source omitted]
    • Network accessline 1663
      [Credential-related source omitted]
    • Network accessline 1664
      [Credential-related source omitted]
    • Network accessline 1697
      if(BRIDGE){       try{         const r = await fetch(BRIDGE.doc+"?t="+encodeURIComponent(BRIDGE.token));
    • Network accessline 1698
      try{         const r = await fetch(BRIDGE.doc+"?t="+encodeURIComponent(BRIDGE.token));         const o = await r.json();
    • Network accessline 1699
      const r = await fetch(BRIDGE.doc+"?t="+encodeURIComponent(BRIDGE.token));

    How the signals fit together

    Facts from a static read of the files at the pinned commit. They describe what the code does, not why.

    Some files could not be read; the facts below still hold.

    Declared and executed: 1 fact
    Signal confidence: 83 facts

    and 33 more

    Works with

    Agent compatibility, from the files in this repository
    AgentStatusEvidenceInstall to
    Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
    CodexCompatibleStandard SKILL.md plugins/vstack/experimental/go/SKILL.md.agents/skills/<skill-name>/
    CursorCompatibleStandard SKILL.md plugins/vstack/experimental/go/SKILL.md.cursor/skills/<skill-name>/
    Gemini CLICompatibleStandard SKILL.md plugins/vstack/experimental/go/SKILL.md.gemini/skills/<skill-name>/
    GitHub CopilotCompatibleStandard SKILL.md plugins/vstack/experimental/go/SKILL.md.github/skills/<skill-name>/
    OpenCodeCompatibleStandard SKILL.md plugins/vstack/experimental/go/SKILL.md.opencode/skills/<skill-name>/
    • Native The repository ships a manifest, folder or frontmatter field for this agent.
    • Compatible A standard SKILL.md that this agent can read.
    • Unknown No evidence either way.

    Derived automatically from paths, manifests and frontmatter. Not tested on each agent.