All notable changes to GuardLink CLI will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Risk Topology graph removed from the dashboard Diagrams page. The force-directed D3 view (
generateTopologyData, theRisk Topologytab, and its client-side renderer/inspector) grew unreadably dense on large codebases — a hairball that obscured more than it showed. The three Mermaid views (Threat Graph, Data Flow, Attack Surface) remain, and the Threat Graph still auto-filters to high/critical with an All severities toggle.generateTopologyDataand theDiagramTopology*types are gone fromsrc/dashboard/diagrams.js. - Pentest Findings page removed from the dashboard. The sidebar entry, the findings/templates page, and the finding + template detail drawers are gone;
generateDashboardHTMLno longer takes apentestDataargument and the dashboard no longer embeds raw scan JSON. Pentest ingestion itself is unchanged — CXG scan results in.guardlink/pentest-findings/still flow intoguardlink threat-report/ AI analyses as<pentest_findings>context, and evidence redaction still applies at load time.
guardlink --versionnow reports the correct version. The CLI hardcoded its version string (.version('1.4.3')) independently ofpackage.json, so bumping and publishing did not update what--versionprinted — the published 1.4.4 still reported 1.4.3. The version is now read frompackage.jsonat runtime, so it can never drift again. Added a regression test that fails if a hardcoded version literal is reintroduced. (The 1.4.4 crash fix itself was unaffected — only the reported version string was wrong.)
init/syncno longer crash on agent-file path-type conflicts. When a project already contained an agent-tool config whose type differed from what GuardLink expected — most commonly an older single-file.cursor/rules(a file) where GuardLink writes the newer.cursor/rules/directory layout —guardlink initthrew a rawENOTDIRand aborted before creating anything. The mirror case (an agent path such asCLAUDE.mdexisting as a directory) threwEISDIR. Both are now detected: initialization completes normally —.guardlink/and all non-conflicting agent files are created, and the conflicting path is left untouched rather than clobbered. Applies to bothinitandsync. Added regression tests covering both conflict directions, idempotency, and the clean-repo path.
- Groundwork for merging GuardLink into a legacy single-file
.cursor/rules(rather than skipping it) is present but not yet wired into agent detection/selection; it will be enabled in a follow-up once the picker recognizes the legacy layout.
-
Multi-hop
@flowschains —@flows A -> B -> C -> Dis now valid syntax for chains of any length, expanding into N-1 pairwise flows that share the same mechanism, description, and source location. Single-hop syntax (A -> B) unchanged. Downstream consumers (DFD, sequence diagram, MCP queries, SARIF) still see the pairwise shape — multi-hop is purely a parser-side expansion. -
Quoted asset and threat refs in relationships —
ASSET_REFandTHREAT_REFnow accept double-quoted strings as a third alternative alongside#idandDotted.Path. Example:@flows User -> "/rest/user/login" -> "SQLite db"parses cleanly. Same syntax works in@exposes,@confirmed,@boundary,@audit, and other relationship verbs. Definition annotations (@asset,@threat,@control) remain strict — declarations stay on#idand dotted paths. -
Opt-in pentest evidence redaction (
guardlink config set redact-evidence true) — surgical redaction for teams whose compliance posture requires no cleartext credentials at rest. When enabled, JWT signatures are stripped (header + payload preserved as proof of exploit),Authorization: Basic/Digest/NTLMvalues are fully redacted, credential field values in JSON / query-strings / cookies are masked (field names preserved). Default OFF; OSS users running against test targets see full evidence. Dashboard shows a banner when redaction is active. Full operational guide:docs/handling-evidence.md. -
@confirmedannotation — New verb for verified exploitable findings. Distinct from@exposes(theoretical) and@accepts(governance). Syntax:@confirmed #threat on Asset [severity] cwe:CWE-NNN -- "evidence". A@confirmedannotation means the threat has been proven exploitable through pentest, automated CXG scan with reproducible evidence, or manual reproduction — not a false positive. Full pipeline: parser, model assembly, dangling-ref validation, SARIFerror-level export, CLIstatusoutput, dashboard emphasis, LLM report inclusion, MCPguardlink_lookup "confirmed". -
@featureannotation — New metadata verb to tag files/code with a named product feature. Syntax:@feature "Feature Name" -- "description". Association is file-level: all annotations in a file with@feature "X"are considered part of that feature. Enables feature-scoped filtering across all output modes. -
Feature filtering (
--featureflag) —guardlink status,guardlink report, andguardlink dashboardall gain--feature <names>(comma-separated). Filters all output — assets, threats, exposures, flows — to files tagged with the named feature(s). Dashboard gets a live feature filter dropdown in the header with a dismissible banner. TUI gains/feature [name]command to list features or drill into one. -
guardlink translate [prompt]— New command that translates GuardLink threat model findings into CERT-X-GEN (CXG) pentest templates (generation only, no execution). Supports all agent backends:--claude-code,--codex,--gemini,--cursor,--windsurf,--clipboard. Reads CXG reference docs and skeleton templates fromGUARDLINK_CXG_ROOTenv or configured default path. -
guardlink ask <query>— New command that answers natural-language questions about the threat model and codebase context, launching an AI agent with full model serialization as context. -
Pentest integration — GuardLink now loads CXG scan results from
.guardlink/pentest-findings/(JSON) and template metadata from.guardlink/cxg-templates/. New interfaces:PentestFinding,PentestScanResult,PentestTemplate,PentestData. Findings are injected as a<pentest_findings>block into AI threat reports,guardlink threat-report, and the dashboard. Dashboard gains a dedicated Pentest Findings sidebar section with scan summary tables and per-finding detail drawers. -
Expanded threat model report (
guardlink report) —generateReport()now produces 10 structured sections (was: Executive Summary + tables):- Application Overview (auto-populated from
.guardlink/prompt.mdif present) - Scope of This Threat Model
- Architecture (Mermaid DFD)
- Key Flows & Sequence (new Mermaid sequence diagram from
@flows) - Data Inventory
- Roles & Access
- Dependencies
- Secrets, Keys & Credential Management
- Logging, Monitoring & Audit
- AI/ML System Details (conditional — emitted only when AI-related threats are detected)
Report header now includes GuardLink version and git commit/branch from metadata. Confirmed exploitable findings appear as a row in the Executive Summary table.
- Application Overview (auto-populated from
-
Sequence diagram (
src/report/sequence.ts) — New MermaidsequenceDiagramgenerator built from@flowsannotations, showing step-by-step participant interactions. Used in the Key Flows & Sequence report section. -
.guardlink/prompt.md—guardlink initandguardlink syncnow create this skeleton file. AI annotation agents fill it in with a security-focused project overview (what the app does, components, trust boundaries, data sensitivity, deployment).guardlink reportreads it and injects the content as the Application Overview section. -
SARIF: confirmed exploitable rule — New
guardlink/confirmed-exploitableSARIF rule emittingerror-level results for@confirmedannotations. These appear alongside unmitigated exposures in GitHub Advanced Security. -
MCP
guardlink_lookupqueries — Two new query types:"confirmed"returns all@confirmedverified findings;"features"returns all@feature-tagged feature names with their associated files. -
LLM prompt improvements —
buildUserMessage()accepts pentest findings context. AI prompts now distinguish pentest-confirmable threats from governance/design gaps, and teach agents when to use@confirmedvs@exposesvs@audit.
guardlink status— Now prints@confirmedfindings with a red badge below the exposure list. Accepts--featurefor filtered output.guardlink report— Accepts--featurefor scoped reports. Reads.guardlink/prompt.mdfor Application Overview.guardlink dashboard— Accepts--feature. Risk score formula now accounts for confirmed finding count. Feature filter dropdown in header.guardlink threat-report— Pentest findings from.guardlink/pentest-findings/are automatically included in AI analysis context. AI prompted to emit a dedicated "Pentest Results" section when findings are present./galTUI command — Documents@featuretagging with examples.- SARIF export —
@confirmedfindings now appear aserror-level entries under the new rule;@exposesseverity mapping unchanged. - MCP server — Status tool description updated to reflect confirmed count.
guardlink_lookupextended withconfirmedandfeaturesqueries.
guardlink reportno longer prints "Fix errors above before generating report" when diagnostics contain errors — the message was misleading because the report generated anyway. Per-annotation parse errors don't block report generation; affected annotations are skipped while the rest of the model still renders. Behavior now matchesdashboard,sarif, andthreat-report.- MCP
guardlink_lookupresolver agrees with itself across query types —asset #loginpreviously returnedcount: 0when an identifier was referenced (e.g. via@confirmed) but never declared indefinitions.ts, even thoughthreats for #login,unmitigated, andconfirmedall returned the joined record. Bare#idqueries had the same problem — they returnedno_matchfor identifiers other queries happily resolved. BothlookupAsset()andlookupFuzzy()now fall back to the annotation graph (exposures, confirmed, mitigations, acceptances, audits, flows, boundaries) and synthesize stub records markeddeclared: falsewith areferenced_in: [...]audit trail. Consumers can distinguish synthesized stubs from real declarations. - MCP
guardlink_lookupno_match hint no longer mangles its quotes — the hint contained literal double-quote characters that got escaped twice through the MCP transport (content wrap + JSON-RPC envelope), rendering as\\\"asset <n>\\\"in clients that print the raw response. Hint now uses backticks around examples so it survives bothJSON.stringifypasses intact. - Pentest template card titles in the dashboard now show the actual template id (e.g.
login-sqli-network) instead of fragments likegeore. The previous loader regex/id[:\s]*["']?([a-z0-9_-]+)["']?/imatched the substring "id" inside words likebridgeandguide. - Pentest template card severity is no longer hardcoded to
medium— the loader's severity regex required a colon between the field name and the value, missing Python templates that useseverity = "critical"(equals separator). Both regexes now anchor on a complete field name with optional surrounding quotes (for JSON"id": "x"form) and accept:or=as the separator before a quoted value. guardlink statusrow labels — renamed the file-counting rows fromAnnotated/Not annotatedtoFiles annotated/Files unannotated, removing the visual collision with theAnnotationsrow directly below. The count of files-with-annotations is no longer easily misread as the total annotation count.- Pentest finding confidence renders defensively across CXG output shapes — the dashboard previously hardcoded
${f.confidence}%, assuming integer percentage. CXG has emitted confidence as integers, severity-style strings ("high"), and missing values across versions; the inline rendering producedhigh%,undefined%, and even[object Object]%. NewformatConfidence()helper handles every case, clamps integers to[0, 100], and never throws. The dashboard still shows50%for every finding today because CXG itself hardcodes that — a CXG-side fix lands separately; GuardLink will display the correct value when it does. - Topology dedupes undeclared refs across kinds — an undeclared identifier like
#login-sqlireferenced as both an asset (by@exposes) and a threat (by@confirmed) previously synthesized two separate nodes in different clusters of the force-directed dashboard graph. The alias resolver now does cross-kind dedup before synthesizing; declared assets/threats/controls always take priority. Newdeclared: booleanfield on topology nodes lets downstream consumers distinguish synthesized stubs from real declarations. - Multi-hop
@flowsannotations are no longer rejected —@flows User -> /api -> DBpreviously failed withMalformed @flows annotation: could not parse argumentsbecause the regex required exactly twoASSET_REFcaptures separated by a single arrow. See Added section for the new multi-hop syntax. - URL-style and whitespace-containing refs work in
@flowsand other relationships —/rest/user/login,"SQLite db","Auth Service"now parse where they didn't before. TheASSET_REFregex previously accepted only#idandDotted.Pathforms. See Added section for quoted-ref syntax. .guardlink/prompt.mdauto-migrates for v1.4.x projects on firstguardlink report— projects upgraded from earlier versions didn't have the new file (sinceguardlink initshort-circuits when.guardlink/exists), causing reports to silently fall back to a boilerplate Application Overview. Now created automatically on first report with a one-line stderr nudge so the user discovers the feature. Existing user content is never overwritten; the operation is idempotent. NewensurePromptMd()helper insrc/init/migrate.ts.
- Generated samples moved to
docs/examples/—threat-dashboard.html,threat-model.md, andguardlink-pentest.{html,json,sarif}were previously committed at the repo root, where everyguardlink dashboard .run from the project root rewrote them and produced churn in unrelated PRs. They now live underdocs/examples/(with aREADME.mddocumenting how to regenerate them deliberately) and the root paths are git-ignored. fataldiagnostic tier reserved —ParseDiagnostic.levelextended from'error' | 'warning'to'error' | 'warning' | 'fatal'with detailed JSDoc explaining tier semantics. No code path currently emits a fatal; this is a non-breaking type widening so v1.6 can introduce the first emission site (for unrecoverable conditions like schema version mismatch or unparseable definitions) without a coordinated cross-file change. NewdiagnosticIcon()helper insrc/parser/format.tscentralizes the level → icon mapping (✗✗/✗/⚠); CLI and TUI printers use it consistently. ATODO(fatal-tier)note insrc/types/index.tsenumerates the 11 audit sites that need updating before the first emission lands.- Test coverage — new test files:
tests/lookup.test.ts(14 tests across the MCP query DSL with regression guards for the resolver bugs),tests/pentest-loader.test.ts(10 tests covering JSON/Python/YAML conventions for template metadata extraction),tests/format.test.ts(9 tests for confidence rendering across number/string/missing inputs),tests/migrate.test.ts(5 tests for prompt.md migration outcomes including idempotence),tests/diagnostics.test.ts(7 tests covering the fatal-tier vocabulary and icon mapping),tests/redact.test.ts(27 tests for surgical evidence redaction including JWT split-redact, Authorization header variants, JSON / query-string / cookie credential patterns, object-key inspection, and safety properties), plus extensions totests/parser.test.ts(+19 tests for multi-hop chains and quoted refs) andtests/dashboard.test.ts(+4 tests for cross-kind topology dedup). Suite total: 72 → 167.
- CLI:
guardlink annotate --mode external— generate annotations as standalone.galfiles under.guardlink/annotations/that mirror the source tree, instead of as inline comments in source files. Source files remain unchanged. Useful for vendored code, audit-controlled repositories, and projects where modifying source files is politically expensive. Contributed by @jordi-murgo in #6. - CLI:
guardlink annotate --stdout— print the annotation prompt to stdout instead of launching an agent or copying to the clipboard. Useful for piping into custom harnesses and CI pipelines. Contributed by @jordi-murgo in #6. - Parser:
@source file:<path> line:<n> [symbol:<name>]directive — anchors annotations in a.galfile to a logical source-code location. The directive produces no annotation itself; it sets the location for subsequent annotations until the next@sourceor end of file. - Types:
SourceLocation.origin_fileandSourceLocation.origin_line— physical location of an annotation (the.galfile path), preserved alongside the logical location (file/line) for dashboards, reports, and SARIF to surface provenance where useful while defaulting to the logical source location for developer-facing output.
guardlink init --mode external: contains GuardLink's entire footprint inside.guardlink/— noCLAUDE.md/AGENTS.md/.cursor/rules/files at the project root, no.mcp.jsonat the root, nodocs/GUARDLINK_REFERENCE.md. The reference doc and MCP config template are placed inside.guardlink/instead.- Review writeback:
@acceptsand@auditannotations generated viaguardlink revieware written to the annotation's physical location (the.galfile in external mode) rather than the logical source location, preserving external mode's "source files untouched" property through governance workflows. - Review writeback: comment-style detection now correctly handles HTML (
<!-- ... -->) and CSS (/* ... */) files. Previously these fell back to JavaScript-style//comments, producing invalid markup. Contributed by @jordi-murgo in #6. - Review exposure IDs: composite
writeFile:writeLine:logicalFile:logicalLine:asset:threatscheme replaces the previousfile:linescheme. Prevents two@exposesannotations at the same source location from colliding on the MCP review identifier. Contributed by @jordi-murgo in #6. - Review insertion: TypeScript and Python decorators starting with
@are no longer mistaken for GuardLink annotations when walking the "coupled block" during writeback. Contributed by @jordi-murgo in #6. - Parser
**/*.galdiscovery is now case-insensitive. Contributed by @jordi-murgo in #6.
- Agent prompts: wrap the external-mode example annotation block in
@shield:begin/@shield:endto preventguardlink validatefrom parsing the JavaScript string literals insidesrc/agents/prompts.tsas real annotations (resolved four parse errors in the CI dogfood step after #6 merged). - Documentation: correct
--mode inline|galreferences to--mode inline|externalinREADME.md(two occurrences),docs/GUARDLINK_REFERENCE.md(three occurrences including the TUI/annotateslash-command help text). The flag value shipped asexternal; the docs referenced the prototype namegal. - Documentation: document
--stdoutflag on the AI-agent flags cheat-sheet indocs/GUARDLINK_REFERENCE.md. - Documentation: add
@sourceconvention note to the standalone.galfiles section indocs/GUARDLINK_REFERENCE.md— annotations placed before the first@sourcedirective fall back to the.galfile's own physical location, which is rarely what users want.
- Version: bump from
1.4.1-galdevelopment tag (landed via #6) to1.4.2acrosspackage.json,package-lock.json,src/cli/index.ts, andsrc/mcp/server.ts. - Lockfiles: remove committed
bun.lock(landed via #6). This project standardizes on npm;package-lock.jsonis canonical. Addedbun.lock,yarn.lock, andpnpm-lock.yamlto.gitignoreso contributors using alternate package managers locally do not accidentally commit a second lockfile.
- GAL reference (
/gal,guardlink gal): Fixed all syntax examples to match the actual parser — descriptions now correctly show-- "quoted text"format instead of the non-functional: textformat; severity now shows bracket notation[high]/[P0]instead ofseverity:high;@flowsnow shows->arrow syntax instead ofto;@validatesnow showsforpreposition instead ofon;@ownsnow includes the requiredforpreposition;@mitigatesnow documentsusingas the primary keyword (withwithas v1 compat) - GAL reference: Added missing documentation for external references (
cwe:CWE-89,owasp:A03:2021,capec:CAPEC-66,attack:T1190) on@threatand@exposesannotations - GAL reference: Added missing
@boundaryalternate syntaxes (@boundary between A and B,@boundary A | B) and(#id)support - GAL reference: Added missing standalone
@shieldsingle-line marker (was only documenting@shield:begin/endblocks) - TUI
/help: Added missing/unannotatedcommand to the help output (was registered and functional but not listed) - CLI version: Fixed
guardlink --versionreporting1.1.0instead of the actual package version
- GAL reference: Added new "External References" section explaining
cwe:,owasp:,capec:,attack:ref syntax - GAL reference: Updated Tips section with description format, severity format, and
@flows ->syntax reminders - Annotations: Changed
@commentto@auditon agent-launcher timeout note for better governance visibility - Annotations: Added
@auditto MCP suggest module, added workspace-related controls to definitions
- Workspace: Multi-repo workspace support — link N service repos into a unified threat model with cross-repo tag resolution, weekly diff tracking, and merged dashboards
- Workspace:
guardlink link-project <repos...> --workspace <name> --registry <url>— scaffold workspace.yaml in each repo, auto-detect repo names from git/package.json/Cargo.toml, inject cross-repo context into agent instruction files - Workspace:
guardlink link-project --add <repo> --from <existing>— add a repo to an existing workspace with sibling auto-discovery - Workspace:
guardlink link-project --remove <name> --from <existing>— remove a repo from workspace, update all siblings found on disk - Workspace:
guardlink merge <files...>— merge N per-repo report JSONs into a unified MergedReport with tag registry, cross-repo reference resolution, stale/schema warnings, and aggregated stats - Workspace:
--diff-against <prev.json>flag on merge for week-over-week risk tracking (assets/threats/mitigations/exposures added/removed, risk trend, unresolved ref changes) - Workspace:
-o <file>dashboard HTML output +--json <file>merged JSON output +--summary-onlytext mode - CLI:
guardlink report --format json— JSON report output with metadata (repo, workspace, commit SHA, schema version) - TUI:
/workspace— show workspace config, sibling repos, registries - TUI:
/link— link repos with--add/--removesupport - TUI:
/merge— merge reports with--json,--diff-against,-oflags - MCP:
guardlink_workspace_infotool — returns workspace name, this_repo identity, sibling tag prefixes, and cross-repo annotation rules for agents - Parser: External reference detection — scans relationship annotations for tags with dot-prefix matching sibling repo names from workspace.yaml, populates
ThreatModel.external_refs - Types:
ExternalRefinterface,ThreatModel.external_refsfield,ReportMetadatawith repo/workspace/commit_sha/schema_version - CI:
examples/ci/per-repo-report.yml— per-repo workflow: validate on PRs (diff + SARIF + PR comment), generate + upload report JSON on push to main - CI:
examples/ci/workspace-merge.yml— weekly workspace merge workflow: download all repo artifacts, merge, dashboard, weekly diff, optional GitHub Pages + Slack - Docs:
docs/WORKSPACE.md— multi-repo setup guide, workspace.yaml spec, cross-repo annotation rules, merge behavior, CI integration, weekly workflow
- MCP: Server version bumped to 1.4.0
- Review:
guardlink review— interactive governance workflow for unmitigated exposures across CLI, TUI (/review), and MCP (guardlink_review_list+guardlink_review_accept). Users walk through exposures sorted by severity and choose: accept (writes@accepts+@audit), remediate (writes@auditwith planned-fix note), or skip. Mandatory justification prevents rubber-stamping; timestamped audit trail for compliance. - CLI:
guardlink clear— remove all annotations from source files to start fresh, with--dry-runpreview and--include-definitionsoption - CLI:
guardlink unannotated— list source files with no annotations, showing coverage ratio - CLI:
guardlink sync— standalone command to sync agent instruction files with current threat model (previously only available via MCP/TUI) - TUI:
/review,/clear,/sync,/unannotatedcommands - MCP:
guardlink_review_list,guardlink_review_accept,guardlink_unannotated,guardlink_clear,guardlink_synctools - Dashboard: File Coverage section on Code & Annotations page with progress bar and collapsible unannotated file list
- Parser:
annotated_filesandunannotated_filesfields added to ThreatModel - Templates: Sync guidance in workflow section for all 7 agent instruction formats
- Templates: Tightened negative guardrail — agents prohibited from writing
@accepts(human-only viaguardlink review) - Auto-sync:
statusandvalidatecommands now auto-sync agent instruction files after parsing
- Parser:
@shield:begin/@shield:endblocks now properly exclude content from the threat model. Previously, example annotations inside shielded blocks were parsed as real annotations, causing duplicate ID errors and dangling reference warnings. - Init: Picker "All of the above" now uses a numbered option instead of
ashortcut for consistency
- MCP: Server version bumped to 1.3.0
- LLM: Multi-provider support — Anthropic, OpenAI (Responses API), Google Gemini, DeepSeek (reasoning), Ollama, and OpenRouter
- LLM: Tool-call system with CVE lookup (NVD), finding validation, and codebase search for grounded threat analysis
- LLM: Extended thinking / reasoning token support for DeepSeek and Anthropic models
- Analyze: Project context builder — automatically assembles architecture summary, data flows, and unmitigated exposures for LLM context
- Analyze: Code snippet extractor — injects relevant source around annotations into threat reports
- CLI:
threat-reportnow accepts custom freeform prompts in addition to framework names - CLI:
--provider,--model,--api-key,--web-searchflags for threat report generation - CLI: Inline agent execution mode in launcher
- TUI: Model catalog with provider selection (Anthropic, OpenAI, Google, DeepSeek, Ollama, OpenRouter)
- TUI: Custom prompt input for threat reports alongside framework presets
- TUI: Inline agent execution from TUI sessions
- TUI: Restored
/exposures,/show,/scancommands for exposure browsing and coverage scanning - Dashboard: Collapsible sidebar with SVG navigation icons and localStorage state persistence
- Dashboard: Exposure computation helpers (
computeExposures) - Docs: Updated GUARDLINK_REFERENCE.md and SPEC.md with new capabilities
- Validation: Additional parser diagnostics
- LLM: Anthropic model IDs now use aliases (
claude-sonnet-4-6,claude-opus-4-6) instead of invalid snapshot dates - Dashboard: Mermaid diagram render trigger restored on first Diagrams tab visit
- TUI: CLI artifact cleaning (
cleanCliArtifacts) for stripping agent-specific output formatting - CI: OIDC trusted publishing preserved across merges (npm ≥11.5.1, no
registry-urloverride)
- CLI:
threat-reportsignature changed from[framework] [dir]to[prompt...] -d <dir>— directory is now a flag, prompt accepts freeform text - Prompts: Reframed annotations as developer hypotheses to validate rather than mandates, improving LLM annotation quality
- Util: Removed empty
src/util/ansi.tsplaceholder (functionality already insrc/tui/format.ts)
- Validation: Shared
findDanglingRefsandfindUnmitigatedExposureswith consistent#id/bare-name normalization across CLI, TUI, and MCP - Validation: Expanded dangling ref checks to cover
@flows,@boundary,@audit,@owns,@handles,@assumesannotations - Diagrams: Threat graph now renders
@transfers,@validates, trust boundaries, data classifications, ownership, and CWE references - Diagrams: Heuristic icons for assets (👤 user, 🖥️ service, 🗄️ database) and flow mechanisms (🔐 TLS, 🌐 HTTP, 📨 queue)
- Prompts: Flow-first threat modeling methodology with architecture mapping, trust boundary identification, and coupled annotation style guide
- Prompts: Agent context now includes existing data flows and unmitigated exposures for smarter annotation
- Model: Two-step
/modelconfiguration — CLI Agents (Claude Code, Codex, Gemini) or API providers - Tests: Dashboard diagram generation tests (label sanitization, severity resolution, transfers, validations)
- Tests: Parser regression tests (
@flowsvia + description,@shieldvs@shield:begindisambiguation) - Tests: Validation unit tests (dangling refs, unmitigated exposure matching with ref normalization)
- README: Manual installation instructions (build from source + npm link)
- Parser:
@flowsregex no longer swallows description whenviamechanism is present - Parser:
@shieldno longer incorrectly matches@shield:beginand@shield:end - Validation:
#idand bare-name refs now compare correctly (e.g.,#sqlimatchessqliin mitigations)
- TUI:
/scancommand — redundant with/statuscoverage display; AI-driven annotation replaces manual symbol discovery - TUI:
/exposuresand/showcommands — exposure data remains accessible via/validate, MCPguardlink_status, andguardlink://unmitigatedresource - Dependencies: Removed accidental
buildpackage (unused)
Initial public release of GuardLink.
- Parser: 16 annotation types, 25+ comment styles, v1 backward compatibility
- Parser: External reference support (cwe, capec, owasp), severity levels
- Analyzer: Coverage statistics, dangling ref detection, duplicate ID detection
- Analyzer: SARIF 2.1.0 export for GitHub/GitLab Security tab
- Analyzer: Suggestion engine with 14 patterns for common security scenarios
- Diff: Threat model comparison between git refs, change classification
- Report: Markdown report with executive summary and Mermaid DFD diagram
- Report: Compact diagram mode for high-exposure codebases
- Init: Project initialization with multi-agent support (Claude Code, Cursor, Windsurf, Cline, Codex, GitHub Copilot)
- Init: Behavioral directive injection for automatic annotation by AI agents
- MCP: 12 tools (parse, validate, status, suggest, lookup, threat_report, threat_reports, annotate, report, dashboard, sarif, diff) and 3 resources
- CLI: 12 commands (init, parse, status, validate, report, diff, sarif, mcp, threat-report, annotate, dashboard, scan)
- TUI: Interactive terminal interface with command palette, autocomplete, and inline help
- Dashboard: HTML threat model dashboard with exposure explorer, file tree, and threat report viewer
- Agents: Unified agent launcher (Claude Code, Cursor, Windsurf, Cline, Codex, Gemini CLI) with config resolution chain
- Threat Reports: AI-powered threat analysis using STRIDE, DREAD, PASTA, and other frameworks
- CI: --strict flag on validate, --fail-on-new on diff for CI gates