Generic, self-hostable timeline and roadmap viewer
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
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
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
- skill zeitlines-zeitlines-adc30e4/.claude/skills/new-plugin/SKILL.md
- agent-rules zeitlines-zeitlines-adc30e4/AGENTS.md
- agent-rules zeitlines-zeitlines-adc30e4/CLAUDE.md
- agent-rules zeitlines-zeitlines-adc30e4/src/plugins/_template/AGENTS.md
- agent-rules zeitlines-zeitlines-adc30e4/src/plugins/lifecycle/AGENTS.md
- agent-rules zeitlines-zeitlines-adc30e4/src/plugins/product-roadmap/AGENTS.md
- agent-rules zeitlines-zeitlines-adc30e4/src/plugins/sprints/AGENTS.md
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);