Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ jobs:
- name: Compile
run: npm run compile

- name: Verify VSIX contents
run: npm run verify:package

- name: Unit tests
run: npm run test:unit

Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ jobs:
- name: Unit tests
run: npm run test:unit

- name: Verify VSIX contents
run: npm run verify:package

- name: Package extension
id: package
run: |
Expand Down
6 changes: 6 additions & 0 deletions .vscodeignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
azure-pipelines.yml
src/**
webview-ui/**
scripts/**
dist/test/**
docs/**
node_modules/**
Expand All @@ -21,6 +22,11 @@ node_modules/**
*.vsix
.cursor/**
agent-transcripts/**
.claude/**
.impeccable/**
.kilo/**
.productfeeling/**
.redteam/**
design-qa.md
onboarding-design-qa/**
graphforge-quickstart/**
32 changes: 32 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Changelog

All notable changes to the GraphForge VS Code extension are documented here.

## 0.1.2

### Added

- Saved geospatial and temporal visualization artifacts, including arced airport routes.
- First-class AntV G6, G2, and L7 renderer options alongside Cytoscape, Sigma, and Plotly.
- Renderer-specific loading and lifecycle status for graph, chart, map, and timeline views.
- A Python/Jupyter air-routes analysis that uses the same sample data as the extension.
- Package-content verification before VSIX packaging.

### Changed

- Restored Cytoscape and Plotly as the default graph and chart renderers.
- Replaced the startup mode chooser with an artifact-backed path from environment to saved views.
- Start Projects, Ontology, and Knowledge sections collapsed.
- Kept all sample visualizations explicit and reopenable from project artifacts.

### Fixed

- Reopening saved visualizations now follows the same renderer-ready lifecycle as the E2E path.
- Existing quickstart projects repair newly added sample artifacts without replacing user results.
- Release packages exclude private review, agent, and local-workspace material.

## 0.1.1

### Changed

- Initial Marketplace and Open VSX release of GraphForge for VS Code.
25 changes: 17 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ Publisher: **CurateLabsAI** (`CurateLabsAI.graphforge`).
| **Projects** | Activity-bar explorer for folders with a valid `FORMAT` marker |
| **Ontology** | Mode badge + entity/relation tree; Ontology Viewer webview with a helpful exploratory empty state, **Load Ontology…**, and an Advanced section (open `ontology.json`, explain mode) |
| **Knowledge** | Inspect and create assertions: list/empty states, **Create Assertion…** (minimal fields), **Show Assertion** / **Show on Graph**, plus Advanced attach-evidence / assess-confidence / record-status commands |
| **Result Graph** | AntV G6 Canvas by default, with retained Cytoscape and Sigma adapters; explicit artifact-owned layout, styling, interactions, and optional time configuration |
| **Charts, maps, and timelines** | AntV G2 analytical/temporal charts and L7 geospatial views from saved project artifacts; retained Plotly figure and v1 artifact compatibility |
| **Result Graph** | Cytoscape Canvas by default, with optional AntV G6 and Sigma adapters; explicit artifact-owned layout, styling, interactions, and optional time configuration |
| **Charts, maps, and timelines** | Plotly analytical charts by default; optional AntV G2 charts, G2 timelines, and L7 geospatial views from saved project artifacts |
| **Results** | Interactive table in the bottom Panel; expandable nested JSON and row/cell selection linked to matching Result Graph nodes/edges |
| **Python notebooks** | A VS Code Jupyter path over the same air-routes sample: pandas inspection, native GraphForge bulk construction and PageRank, Plotly output, and saved `results/` / `visualizations/` artifacts |
| **Modules** | One Module Bay for default, non-removable Query/Visualize/Import modules, future GraphForge-catalog modules, and advanced side-loads |

## Requirements
Expand Down Expand Up @@ -51,6 +52,12 @@ The extension can run Cypher and analyst verbs through either engine binding:
- **Node (`@curatelabs/graphforge`)** — the default. Fast, in-process, no subprocess.
- **Python (`graphforge` on PyPI)** — a first-class alternative for analysts already living in
a Python/notebook workflow, or when a native Node binding isn't available for your platform.
In the air-routes sample, choose **Open Python notebook** to run the same dataset through
pandas, PyArrow, GraphForge, and Plotly while publishing normal project artifacts.

The command bridge preserves runtime parity, but the primary Python experience is
analyst-authored scripts and notebooks in the selected environment. GraphForge opens and
indexes those project files; it does not turn Python work into hidden extension state.

Which one is used is controlled by `graphforge.runtime` (`auto` | `node` | `python`, default
`auto`). In `auto`, **Node is the global default** — except when the workspace looks like a
Expand Down Expand Up @@ -173,10 +180,10 @@ Run **GraphForge: Check Environment** any time to see where things stand — a 3
- **Visualization artifacts** — `Create Project Visualization` (`graphforge.createProjectVisualization`) creates a complete v2 graph, chart, geospatial, or temporal artifact from explicit bindings; `Save Project Visualization` and `Open Saved Visualization` return the saved `path` and `spec` (plus panel status when opened)

Get Started's **Hub / Query / Visualize** pages are an editor over durable
project files: `queries/*.cypher`, `results/*`, `visualizations/*.gfviz.json`,
and `mutations/*.cypher`. New visualizations use the strict
project files: `queries/*.cypher`, `notebooks/*.ipynb`, `results/*`,
`visualizations/*.gfviz.json`, and `mutations/*.cypher`. New visualizations use the strict
`graphforge.visualization/v2` contract; existing v1 Cytoscape/Sigma/Plotly files
remain readable and are not rewritten on open. The G6/G2 settings are creation
remain readable and are not rewritten on open. The graph/chart renderer settings are creation
templates only: the resolved renderer, backend, layout, bindings, filters,
coordinates, time settings, and presentation are saved into the artifact and
remain authoritative when global defaults change. Missing or unsupported
Expand All @@ -186,9 +193,11 @@ renderer substitution, or layout fallback.
G2/L7/temporal panels expose the filtered rows in an accessible companion table.
Material viewport or temporal-range changes become visibly dirty and require an
explicit **Save**; **Revert** restores the committed artifact. The air-routes
sample copies its queries, results, and v1/v2 visualization specs into this
layout and generates its seed mutation there before execution; its bindings are
project files rather than extension constants.
sample copies its source data, query, notebook, supporting result, and v1/v2
visualization specs into this layout and generates its seed mutation there
before execution. The notebook writes PageRank output under `results/` and an
extension-readable Plotly spec under `visualizations/`; its work is project
state rather than hidden extension state.

Selecting a Results cell that contains a node/edge identity (including airport-style codes)
highlights that element in an open Result Graph. Selecting a metric cell or whole row falls back
Expand Down
41 changes: 41 additions & 0 deletions design-qa.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Get Started design QA

## Comparison evidence

- Source visual truth: `/Users/davidspencer/.codex/generated_images/019fc2ef-c3e0-7982-b174-c1c5478b3f11/exec-1b80fd0c-5fd4-46ef-97ba-af375ef3b8b8.png`
- Earlier AntV comparison capture: `onboarding-design-qa/implementation-e2e-g6.jpeg`
- Source pixels: 779 x 2018. Implementation capture: 1229 x 768 at the live VS Code Extension Development Host viewport.
- Density normalization: the implementation's GraphForge activity-bar column is approximately 296 CSS pixels wide; the source is a high-density single-column concept. Comparison therefore uses the source column against the implementation's left sidebar, not the unrelated editor, Results panel, or Chat surfaces in the full-host screenshot.
- Tested state: completed quickstart path with the durable query result restored. The current quickstart E2E opens the default saved v2 Cytoscape artifact and waits for its terminal readiness contract; the earlier image remains evidence of the explicit G6 path. The source depicts Environment as current; the different state is intentional and verifies that the same persistent spine survives completion.
Comment on lines +5 to +9

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Remove the developer-local absolute path.

The committed report includes /Users/davidspencer/.... This exposes a local username and makes the evidence non-portable. Use a repository-relative asset path or a redacted reference.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@design-qa.md` around lines 5 - 9, Remove the developer-local absolute path
from the “Source visual truth” entry in the design QA report and replace it with
a repository-relative asset path or redacted reference. Preserve the existing
evidence description and all other comparison details unchanged.


## Mandatory comparison passes

| Surface | Evidence and result |
| --- | --- |
| Typography | Uses the VS Code font tokens at a compact sidebar scale. Heading, step title, detail, and artifact-path hierarchy remain distinct and readable at the live 296 px column width. No clipped or overlapping text was observed. |
| Spacing and layout | The implementation preserves the selected concept's centered hero, vertical five-node spine, one numbered marker per step, attached descriptions, and in-context primary action. It intentionally compresses vertical gaps to keep the entire path and the three closed supporting sections visible in a normal-height workbench. |
| Viewport resilience | Verified in the real narrow VS Code primary sidebar. Long project and artifact paths wrap within the column. Buttons remain inside the view, and Projects, Ontology, and Knowledge remain collapsed. |
| Colors and tokens | Accent, foreground, muted copy, border, button, error, and focus colors use VS Code theme tokens. Completed nodes use the GraphForge accent; current state uses the accent ring. No design-only hardcoded dark surface was introduced. |
| Image and icon fidelity | The real packaged `media/graphforge.svg` is used. Existing VS Code title-action icons remain native. No custom CSS art, inline SVG substitute, fake artifact icon, or decorative blob was added. |
| Copy and content | Replaced invented time estimates and the nonexistent `.graphforge/env.json` with truthful live progress, the selected runtime, the actual `FORMAT` marker, and real project artifact paths. |
| States and interactions | Verified Project current, Query current, query completion, saved result restoration, completed path, and saved visualization reopening through a terminal readiness wait. Missing visualization sources render a disabled `Needs result` control with an explanation. Every command now produces inline working/success/error status instead of appearing inert. |
| Accessibility | Uses an ordered list, `aria-current="step"`, screen-reader-only status labels, a polite live journey status, a polite command status, semantic buttons, disabled state, theme contrast tokens, and the packaged logo as intentionally decorative. |

## Findings and fixes

1. **P1, behavior:** the quickstart advertised `visualizations/airports-map.gfviz.json` before its referenced `results/query-result.json` existed. Clicking Open returned an artifact error and looked inert. Fixed by selecting only a resolvable result/visualization pair for journey progress and disabling unresolved visualization rows with explicit source-result copy.
2. **P1, artifact visibility:** scanning hid `results/query-result.json` whenever another named result existed. This removed the real routes result from Result History and prevented the journey from recognizing it after the query completed. Fixed by listing every valid durable result.
3. **P2, feedback:** Get Started fire-and-forgot commands and did not surface structured command outcomes inside the view. Fixed with an inline live action status that reports working, success, and error states.
4. **P1, E2E parity:** the journey chose the first matching artifact alphabetically and returned before renderer readiness, while the E2E deliberately opens the saved v2 Result Graph and waits for `renderReady` or `renderFailed`. Fixed by preferring the saved v2 graph for the configured renderer, passing the E2E readiness options, and treating a terminal renderer failure as an inline action error.
5. **P1, Cytoscape readiness:** renderer, options, and graph protocol messages each rebuilt the dense graph while opening a saved artifact. Fixed by applying those messages as one render snapshot so one open produces one layout and one terminal lifecycle.

## Post-fix verification

- The sample initially stops at Query and names `queries/templates/routes-overview.cypher`.
- Running it produced and displayed `results/query-result.json` with 7,430 rows and 10 columns.
- The completed journey names `visualizations/routes-network-default.gfviz.json`.
- **Open saved visualization** and the E2E both open **US routes network — Cytoscape**, wait for the same terminal lifecycle, and report ready only after the 579-node / 7,430-edge graph completes its render path.
- The live Extension Host log set was checked for `ERROR`, `Unhandled`, and `renderFailed`; no matches were present after the verified path.
- Unit/type checks passed after the fixes; full repository and packaging gates are recorded in the task handoff.

final result: passed
Loading