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
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,5 @@ bin/* text eol=lf
# The committed diagram-render bundle is hash-pinned (BUILD_INFO sha256);
# a CRLF rewrite on Windows checkout would break the drift test and change
# the content-addressed staged filename.
lib/diagram-render/dist/*.html text eol=lf
lib/diagram-render/dist/*.html text eol=lf whitespace=-trailing-space
lib/diagram-render/dist/*.json text eol=lf
4 changes: 4 additions & 0 deletions .github/workflows/actionlint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ on: [push, pull_request]
permissions:
contents: read

concurrency:
group: actionlint-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
actionlint:
runs-on: ubicloud-standard-8
Expand Down
4 changes: 4 additions & 0 deletions .github/workflows/ci-image.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ on:
# Manual trigger
workflow_dispatch:

concurrency:
group: ci-image
cancel-in-progress: false

@cubic-dev-ai cubic-dev-ai Bot Jul 21, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: Queued image builds can still be silently canceled when three pushes/manual rebuilds overlap: cancel-in-progress: false protects the running build, but GitHub replaces the single pending run by default. Adding queue: max preserves the intended serialized builds and their per-SHA image tags.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/ci-image.yml, line 21:

<comment>Queued image builds can still be silently canceled when three pushes/manual rebuilds overlap: `cancel-in-progress: false` protects the running build, but GitHub replaces the single pending run by default. Adding `queue: max` preserves the intended serialized builds and their per-SHA image tags.</comment>

<file context>
@@ -16,6 +16,10 @@ on:
 
+concurrency:
+  group: ci-image
+  cancel-in-progress: false
+
 jobs:
</file context>
Fix with cubic


jobs:
build:
runs-on: ubicloud-standard-8
Expand Down
21 changes: 21 additions & 0 deletions .github/workflows/dependency-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Dependency Review

on:
pull_request:
branches: [main]

permissions:
contents: read

concurrency:
group: dependency-review-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
dependency-review:
runs-on: ubuntu-24.04
steps:
- name: Review dependency changes
uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4.9.0
with:
fail-on-severity: high
26 changes: 26 additions & 0 deletions .github/workflows/osv-scanner.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: OSV Scanner

on:
schedule:
- cron: '23 7 * * 1'
workflow_dispatch:

permissions:
contents: read

concurrency:
group: osv-scanner
cancel-in-progress: true

jobs:
scan:
permissions:
actions: read
contents: read
security-events: write
uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@3adb4b14a2b0623876d18d863a498b785fb3752d # v2.3.8
with:
scan-args: |-
--include-git-root
--recursive
./
4 changes: 4 additions & 0 deletions .github/workflows/quality-gate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ on:
permissions:
contents: read

concurrency:
group: quality-gate-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
quality:
runs-on: ubuntu-24.04
Expand Down
46 changes: 46 additions & 0 deletions .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: OpenSSF Scorecard

on:
branch_protection_rule:
schedule:
- cron: '41 7 * * 1'
push:
branches: [main]

permissions:
contents: read

concurrency:
group: scorecard-${{ github.ref }}
cancel-in-progress: true

jobs:
analysis:
runs-on: ubuntu-24.04

@cubic-dev-ai cubic-dev-ai Bot Jul 21, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: A stalled checkout, Scorecard scan, or upload can hold this scheduled runner until the platform limit because analysis has no job timeout. A bounded timeout-minutes would align this external-action workflow with the repository's other direct CI jobs.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/scorecard.yml, line 19:

<comment>A stalled checkout, Scorecard scan, or upload can hold this scheduled runner until the platform limit because `analysis` has no job timeout. A bounded `timeout-minutes` would align this external-action workflow with the repository's other direct CI jobs.</comment>

<file context>
@@ -0,0 +1,46 @@
+
+jobs:
+  analysis:
+    runs-on: ubuntu-24.04
+    permissions:
+      contents: read
</file context>
Suggested change
runs-on: ubuntu-24.04
runs-on: ubuntu-24.04
timeout-minutes: 30
Fix with cubic

permissions:
contents: read
security-events: write
steps:
- name: Checkout repository
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
with:
persist-credentials: false

- name: Run Scorecard analysis
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
publish_results: false

- name: Upload Scorecard results to code scanning
uses: github/codeql-action/upload-sarif@85b88275909735f5bc23196090e03d2eb148b3de # v3.32.4
with:
sarif_file: results.sarif

- name: Upload Scorecard results artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4

@cubic-dev-ai cubic-dev-ai Bot Jul 21, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: A code-scanning upload failure also discards the downloadable results.sarif artifact because the later artifact step only runs after prior success. Adding an explicit failure-safe condition preserves the raw Scorecard output for diagnosis.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .github/workflows/scorecard.yml, line 42:

<comment>A code-scanning upload failure also discards the downloadable `results.sarif` artifact because the later artifact step only runs after prior success. Adding an explicit failure-safe condition preserves the raw Scorecard output for diagnosis.</comment>

<file context>
@@ -0,0 +1,46 @@
+          sarif_file: results.sarif
+
+      - name: Upload Scorecard results artifact
+        uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4
+        with:
+          name: scorecard-results
</file context>
Fix with cubic

with:
name: scorecard-results
path: results.sarif
retention-days: 5
4 changes: 4 additions & 0 deletions .github/workflows/skill-docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ on: [push, pull_request]
permissions:
contents: read

concurrency:
group: skill-docs-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
check-freshness:
runs-on: ubicloud-standard-8
Expand Down
15 changes: 15 additions & 0 deletions .osv-scanner.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# OSV-Scanner configuration.
# Direct/transitive dependency versions are pinned to their fixed releases via
# the `overrides` block in package.json; this file only records advisories we
# have assessed as not-reachable or not-fixable without disproportionate risk.

[[IgnoredVulns]]
id = "GHSA-frvp-7c67-39w9"
# @hono/node-server 1.19.x. Reachable only through @modelcontextprotocol/sdk,
# which is an unused transitive dependency (no source file imports it) and never
# starts a Hono HTTP server, so the advisory's request path is not exercised.
# The only fix is @hono/node-server 2.0.5, a major bump the MCP SDK pins against
# (^1.19.9); forcing it via override risks breaking the SDK at runtime for a
# vulnerability we do not expose. Re-evaluate if the MCP SDK becomes a direct,
# server-hosting dependency.
reason = "Unreachable transitive (unused @modelcontextprotocol/sdk); fix requires a risky major override on a pinned peer dep."

@cubic-dev-ai cubic-dev-ai Bot Jul 21, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3: The permanent security exception records the dependency relationship incorrectly: @hono/node-server is a regular MCP SDK dependency constrained by ^1.19.9, not a pinned peer dependency. Keeping the rationale precise will make later advisory reassessment less error-prone.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At .osv-scanner.toml, line 15:

<comment>The permanent security exception records the dependency relationship incorrectly: `@hono/node-server` is a regular MCP SDK dependency constrained by `^1.19.9`, not a pinned peer dependency. Keeping the rationale precise will make later advisory reassessment less error-prone.</comment>

<file context>
@@ -0,0 +1,15 @@
+# (^1.19.9); forcing it via override risks breaking the SDK at runtime for a
+# vulnerability we do not expose. Re-evaluate if the MCP SDK becomes a direct,
+# server-hosting dependency.
+reason = "Unreachable transitive (unused @modelcontextprotocol/sdk); fix requires a risky major override on a pinned peer dep."
</file context>
Fix with cubic

8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -611,8 +611,12 @@ Data is stored in [Supabase](https://supabase.com) (open source Firebase alterna

## Troubleshooting

For GStack 2, first run `gstack doctor` (or `gstack doctor --json`) when the
optional runtime is installed. For skill discovery problems, use the standard
For GStack 2, run `gstack doctor --capability browser|design|diagram|pdf|ios`
(optionally `--json`) for a focused, non-mutating readiness result. It reports
Comment on lines +614 to +615

@cubic-dev-ai cubic-dev-ai Bot Jul 21, 2026

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2: This troubleshooting command fails when pasted: the shell interprets each | as a pipeline, and canonical skill-only installs do not provide the gstack executable. Retaining the optional-runtime qualifier and showing one concrete capability with substitutions would make the instruction runnable.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At README.md, line 614:

<comment>This troubleshooting command fails when pasted: the shell interprets each `|` as a pipeline, and canonical skill-only installs do not provide the `gstack` executable. Retaining the optional-runtime qualifier and showing one concrete capability with substitutions would make the instruction runnable.</comment>

<file context>
@@ -611,8 +611,12 @@ Data is stored in [Supabase](https://supabase.com) (open source Firebase alterna
 
-For GStack 2, first run `gstack doctor` (or `gstack doctor --json`) when the
-optional runtime is installed. For skill discovery problems, use the standard
+For GStack 2, run `gstack doctor --capability browser|design|diagram|pdf|ios`
+(optionally `--json`) for a focused, non-mutating readiness result. It reports
+pure-judgment availability, platform support, preview consent, install consent,
</file context>
Suggested change
For GStack 2, run `gstack doctor --capability browser|design|diagram|pdf|ios`
(optionally `--json`) for a focused, non-mutating readiness result. It reports
For GStack 2, when the optional runtime is installed, run
`gstack doctor --capability browser` (substitute `design`, `diagram`, `pdf`, or
`ios`; optionally add `--json`) for a focused, non-mutating readiness result. It reports
Fix with cubic

pure-judgment availability, platform support, preview consent, install consent,
and runtime readiness separately; see
[`docs/gstack-2/CAPABILITY-READINESS.md`](docs/gstack-2/CAPABILITY-READINESS.md).
For skill discovery problems, use the standard
installer's list and reinstall commands; do not manually copy host paths. The
entries below apply to legacy 1.x installations.

Expand Down
12 changes: 8 additions & 4 deletions browse/test/data-platform.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,14 @@ describe('validateTempPath', () => {
expect(() => validateTempPath('/tmp/nonexistent-file-12345.jpg')).toThrow(/not found/i);
});

it('rejects paths in cwd', () => {
// Create a real file in cwd to test the path check (not the existence check)
const cwdFile = path.join(process.cwd(), 'package.json');
expect(() => validateTempPath(cwdFile)).toThrow(/temp directory/i);
it('rejects a temp-directory symlink that resolves outside temp', () => {
const link = path.join(TEMP_DIR, `test-temp-link-${Date.now()}`);
fs.symlinkSync('/etc/passwd', link);
try {
expect(() => validateTempPath(link)).toThrow(/temp directory/i);
} finally {
fs.unlinkSync(link);
}
});

it('rejects absolute paths outside safe dirs', () => {
Expand Down
Loading
Loading