github TypeScript re-analysis due

zeitlines/zeitlines

github

Generic, self-hostable timeline and roadmap viewer

maintainer
zeitlines
license
MIT
first seen
2026-08-09
last seen
2026-09-04
releases · 30d
0
short id

Drift inferred · capture-to-capture

No drift recorded — single capability capture; advisories appear once its surface changes.

capabilities 33 tools
transport stdio · http counts 33 tools · 0 res · 0 prompts permission surface via code analysis

tools

  • add_feature
  • add_group
  • add_highlight
  • add_item
  • add_tier
  • create_saved_view
  • delete_feature
  • delete_group
  • delete_highlight
  • delete_item
  • delete_saved_view
  • delete_tier
  • describe_view_dimensions
  • disable_plugin
  • enable_plugin
  • get_timeline
  • install_plugin
  • list_plugins
  • list_saved_views
  • list_timelines
  • plugin_data_list
  • plugin_data_write
  • replace_timeline
  • set_plugin_installed
  • set_pricing
  • set_tier_value
  • uninstall_plugin
  • update_feature
  • update_group
  • update_highlight
  • update_item
  • update_saved_view
  • update_tier
skills & danger signals github-tarball
prompt-surface shipped agent-instruction files + hidden-content / dangerous-code findings — quoted from the analyzed source

analyzed commit adc30e4 · analyzer v33 · 1w ago

skills & prompt files 7

code evidence vHEAD · github-tarball
evidence-backed findings quoted directly from the published source artifact — not inferred

code files: 356

filesystem 30

  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/build-data.ts :1 import { readdir, readFile, writeFile, mkdir, stat } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/ci/check-plugin-isolation.mjs :39 import { readdirSync, readFileSync, statSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/ci/check-ui-text.mjs :33 import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/ci/edge-imports.test.ts :23 import { readFile, readdir } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/ci/edge-routes.test.ts :13 import { readFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/env.ts :24 import { readFileSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/import.ts :7 import { readFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/migrate.ts :29 import { readFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/pending.test.ts :12 import { readFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/pending.ts :8 import { readdir, readFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/plugin-store-product-roadmap.test.ts :18 import { mkdtemp, mkdir, writeFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/test-database.ts :16 import { readFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/db/timeline-columns.test.ts :3 import { readFileSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/design-system/build-tokens.ts :23 import { readFileSync, writeFileSync, mkdirSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/export-view.ts :1 import { readFile, writeFile, mkdir } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/local/file-repo.test.ts :2 import { mkdtemp, mkdir, readFile, writeFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/local/file-repo.ts :17 import { existsSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/local/scan.test.ts :2 import { mkdir, mkdtemp, writeFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/local/scan.ts :15 import { readdir, readFile, stat } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/node-hooks/css-hooks.mjs :26 import { readFile } from 'node:fs/promises';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/plugins/catalogue.ts :20 import { existsSync, readFileSync, writeFileSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/plugins/install-vendored.ts :19 import { existsSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/plugins/preview.ts :33 import { existsSync, mkdtempSync, renameSync, rmSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/plugins/vendored.ts :22 import { existsSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/schema/build.ts :19 import { readdirSync, readFileSync, writeFileSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/schema/openapi.ts :18 import { readFileSync, writeFileSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/scripts/serve.ts :24 import { createReadStream } from 'node:fs';
  • fs zeitlines-zeitlines-adc30e4/src/plugins/product-roadmap/export.ts :32 import { writeFileSync, mkdirSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/src/plugins/sprints/burndown.test.ts :16 import { readFileSync } from 'node:fs';
  • fs (weak) zeitlines-zeitlines-adc30e4/vite.config.ts :3 import { readFile } from 'node:fs/promises';

shell / exec 2

  • shell (weak) zeitlines-zeitlines-adc30e4/scripts/db/migrate.ts :30 import { execFileSync } from 'node:child_process';
  • shell (weak) zeitlines-zeitlines-adc30e4/scripts/plugins/preview.ts :32 import { execFileSync } from 'node:child_process';

network 22

  • net zeitlines-zeitlines-adc30e4/netlify/edge-functions/auth.ts :87 // A fetch() from the loaded SPA (an /api/* call) can't follow a 302 to
  • net zeitlines-zeitlines-adc30e4/netlify/edge-functions/jira-api.ts :52 const upstream = await fetch(buildPickerUrl(baseUrl, query), {
  • net zeitlines-zeitlines-adc30e4/netlify/edge-functions/mcp-oauth.ts :166 const tokenRes = await fetch(GOOGLE_TOKEN, {
  • net (weak) zeitlines-zeitlines-adc30e4/scripts/db/http.test.ts :69 // the SPA and returns 200 with HTML, so a build-time fetch().json() would fail
  • net (weak) zeitlines-zeitlines-adc30e4/scripts/db/retired-pricing-route.ts :15 // `fetch(...).json()` fails on a JSON parse error that says nothing about what
  • net (weak) zeitlines-zeitlines-adc30e4/scripts/mcp/server.ts :53 const res = await fetch(`${BASE_URL}${path}`, {
  • net (weak) zeitlines-zeitlines-adc30e4/scripts/node-http.ts :10 import type { IncomingMessage, ServerResponse } from 'node:http';
  • net (weak) zeitlines-zeitlines-adc30e4/scripts/plugins/preview.ts :121 const res = await fetch(url, { method: 'GET' });
  • net (weak) zeitlines-zeitlines-adc30e4/scripts/serve.ts :23 import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';
  • net zeitlines-zeitlines-adc30e4/src/accountSection.ts :49 const res = await fetch('/api/preferences');
  • net zeitlines-zeitlines-adc30e4/src/editor.ts :70 await fetch(`/api/source/${sourceId}/saved-view`, {
  • net zeitlines-zeitlines-adc30e4/src/jira.ts :78 const res = await fetch(`/api/jira/search?q=${encodeURIComponent(q)}`, {
  • net zeitlines-zeitlines-adc30e4/src/main.ts :129 const res = await fetch('/api/preferences');
  • net zeitlines-zeitlines-adc30e4/src/memberAdmin.ts :88 const res = await fetch('/api/members', {
  • net zeitlines-zeitlines-adc30e4/src/pluginHost/dataApi.ts :37 const send = ctx.fetch ?? ((...args: Parameters<typeof fetch>) => fetch(...args));
  • net zeitlines-zeitlines-adc30e4/src/pluginHost/loader.ts :83 const res = await fetch(url);
  • net zeitlines-zeitlines-adc30e4/src/pluginPanel.ts :32 const res = await fetch('/api/plugins');
  • net zeitlines-zeitlines-adc30e4/src/plugins/product-roadmap/export.ts :57 const res = await fetch(`${BASE_URL}/api/source/${encodeId(id)}`, {
  • net zeitlines-zeitlines-adc30e4/src/realtime.ts :140 const res = await fetch(`/api/source/${timelineId}/watermark`);
  • net zeitlines-zeitlines-adc30e4/src/settingsArea.ts :86 const res = await fetch(path);
  • net zeitlines-zeitlines-adc30e4/src/users.ts :54 const res = await fetch('/api/users');
  • net (weak) zeitlines-zeitlines-adc30e4/vite.config.ts :113 const upstream = await fetch(buildPickerUrl(creds.baseUrl, query), {

secrets 2

  • secrets zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :35 const secret = process.env.AUTH_SECRET;
  • secrets zeitlines-zeitlines-adc30e4/src/plugins/product-roadmap/export.ts :47 const API_TOKEN = process.env.MCP_API_TOKEN ?? '';

tool registrations 33

  • list_timelines zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :109
  • get_timeline zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :112
  • add_item zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :115
  • update_item zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :121
  • delete_item zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :142
  • add_group zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :145
  • update_group zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :148
  • delete_group zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :166
  • describe_view_dimensions zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :192
  • list_saved_views zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :199
  • create_saved_view zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :205
  • update_saved_view zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :211
  • delete_saved_view zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :219
  • replace_timeline zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :227
  • set_pricing zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :233
  • list_plugins zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :256
  • enable_plugin zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :263
  • disable_plugin zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :272
  • install_plugin zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :280
  • set_plugin_installed zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :295
  • uninstall_plugin zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :302
  • plugin_data_list zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :328
  • plugin_data_write zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :338
  • add_feature zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :400
  • update_feature zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :407
  • delete_feature zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :415
  • add_tier zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :421
  • update_tier zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :428
  • delete_tier zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :436
  • set_tier_value zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :442
  • add_highlight zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :450
  • update_highlight zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :456
  • delete_highlight zeitlines-zeitlines-adc30e4/netlify/functions/mcp.ts :463

declared dependencies 21

  • @modelcontextprotocol/sdk@^1.12.0
  • @supabase/supabase-js@^2.110.0
  • marked@^14.1.0
  • postgres@^3.4.9
  • tsx@^4.19.0
  • turndown@^7.2.4
  • umzug@^3.8.3
  • vis-data@^7.1.9
  • vis-timeline@^7.7.3
  • ws@^8.21.0
  • zod@^3.23.8
  • @types/node@^22.0.0
  • @types/turndown@^5.0.6
  • ajv@^8.20.0
  • ajv-formats@^3.0.1
  • chokidar@^3.6.0
  • concurrently@^9.0.0
  • gray-matter@^4.0.3
  • ts-json-schema-generator@^2.9.0
  • typescript@^5.5.0
  • vite@^5.4.0

clipboard 1

  • navigator.clipboard zeitlines-zeitlines-adc30e4/src/memberAdmin.ts :283 await navigator.clipboard.writeText(field.value);