Independent technology for modern publishing, memberships, subscriptions and newsletters.
This report summarizes scanner evidence for TryGhost/Ghost, a TypeScript project with 55,644 GitHub stars. SynthScan examined 1,275,122 lines of code across 7786 source files, recording 1075 pattern matches distributed across 12 syntactic categories. The legacy adjusted pattern signal is 1.0 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 767 finding(s).
Are imports declared and package/API names verified? 308 finding(s).
Are wrappers, guards, and repeated structures necessary? 528 finding(s).
Which changes need focused human review? 1075 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1075 distinct pattern matches across 12 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ls/configs/oxlint/rules/no-unsafe-reset-environment.ts | 36 | function getDestructuredFixtureNames( | CODE |
| LOW | tools/configs/oxlint/rules/max-api-complexity.ts | 14 | function getAPIVersionAndEndpointName(filename: string) { | CODE |
| LOW | tools/configs/oxlint/rules/max-api-lines.ts | 14 | function getAPIVersionAndEndpointName(filename: string) { | CODE |
| LOW | tools/scripts/ci/check-app-version-bump.ts | 38 | function readVersionFromPackageJson(packageJsonContent: string, sourceLabel: string): string { | CODE |
| LOW | tools/scripts/ci/check-internal-packages.ts | 114 | function usesStandardConfigFactory(config: string, moduleName: string, factoryName: string) { | CODE |
| LOW | tools/scripts/release/publish-packages.ts | 66 | async function assertCommitOnPublishBranch() { | CODE |
| LOW | tools/scripts/lib/pnpm.ts | 233 | export async function findPackagesNeedingChangeset( | CODE |
| LOW | tools/scripts/lib/package-template.ts | 13 | export function applyPackageTemplateTokens( | CODE |
| LOW | tools/gx/multi-sub-scenarios.ts | 214 | async function deleteExistingScenarioMembers() { | CODE |
| LOW | …ig-lexical/test/unit/utils/generateEditorState.test.ts | 129 | function testGenerateNodesFromHTML(html, callback) { | CODE |
| LOW | koenig/koenig-lexical/test/utils/e2e.ts | 463 | export async function expectUnchangedScrollPosition(page, wrapper) { | CODE |
| LOW | koenig/koenig-lexical/test/e2e/floating-toolbar.test.ts | 89 | async function expectToolbarCenteredOnSelection() { | CODE |
| LOW | …oenig-lexical/src/plugins/ReplacementStringsPlugin.tsx | 6 | function replacementStringTransform(node) { | CODE |
| LOW | …nig/koenig-lexical/src/plugins/DragDropPastePlugin.tsx | 49 | async function getListOfAcceptableMimeTypes(editor, uploadFileTypes) { | CODE |
| LOW | koenig/koenig-lexical/src/utils/image-card-widths.ts | 6 | export function getAllowedImageCardWidths(configuredWidths?: unknown): readonly ImageCardWidth[] { | CODE |
| LOW | koenig/koenig-lexical/src/utils/visibility.ts | 74 | export function serializeOptionsToVisibility(options, existingVisibility) { | CODE |
| LOW | …/koenig-lexical/src/utils/draggable/draggable-utils.ts | 42 | export function getParentScrollableElement(element) { | CODE |
| LOW | …/koenig-lexical/src/utils/draggable/draggable-utils.ts | 64 | export function getDocumentScrollingElement() { | CODE |
| LOW | …ical/src/components/ui/LinkActionToolbarWithSearch.tsx | 13 | export function LinkActionToolbarWithSearch({anchorElem, href, onClose, ...props}) { | CODE |
| LOW | …nig/koenig-lexical/src/components/ui/SettingsPanel.tsx | 205 | export function MultiSelectDropdownSetting({label, description, placeholder = '', items, availableItems, onChange, dataT | CODE |
| LOW | …ical/src/components/ui/KeyboardSelectionWithGroups.tsx | 19 | export function KeyboardSelectionWithGroups({groups, getItem, getGroup, onSelect, onEnterWithoutSelection, defaultSelect | CODE |
| LOW | koenig/koenig-lexical/src/hooks/useSearchLinks.ts | 34 | function convertSearchResultsToListOptions(results, {noResultOptions, type} = {}) { | CODE |
| LOW | …g/koenig-lexical/src/hooks/useTypeaheadTriggerMatch.ts | 6 | export default function useBasicTypeaheadTriggerMatch(trigger,{minLength = 1, maxLength = 75}) { | CODE |
| LOW | …koenig-lexical/src/hooks/useSettingsPanelReposition.ts | 118 | function keepWithinSpacingOnResize(panelElem, {x, y, origin, lastSpacing}) { | CODE |
| LOW | …koenig-lexical/src/hooks/useSettingsPanelReposition.ts | 122 | export default function useSettingsPanelReposition({positionToRef} = {}, cardWidth) { | CODE |
| LOW | koenig/koenig-lexical/src/hooks/useKoenigTextEntity.ts | 19 | function registerExtendedTextEntity(editor, getMatch, targetNode, createNode, nodeType) { | CODE |
| LOW⚡ | koenig/kg-simplemde/debug/simplemde.js | 4899 | function maybeUpdateRectForZooming(measure, rect) { | CODE |
| LOW⚡ | koenig/kg-simplemde/debug/simplemde.js | 4909 | function clearLineMeasurementCacheFor(lineView) { | CODE |
| LOW⚡ | koenig/kg-simplemde/debug/simplemde.js | 4918 | function clearLineMeasurementCache(cm) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 2134 | function incrementRemainingMarkdownListNumbers(cm, pos) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 3895 | function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 4152 | function defaultSpecialCharPlaceholder(ch) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 4723 | function updateExternalMeasurement(cm, line) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 6632 | function maybeUpdateLineNumberWidth(cm) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 7264 | function selectionEventCanBeMerged(doc, origin, prev, sel) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 7465 | function setSelectionReplaceHistory(doc, sel, options) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 7793 | function makeChangeSingleDocInEditor(cm, change, spans) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 8153 | function adjustScrollWhenAboveVisible(cm, line, diff) { | CODE |
| LOW | …t-nodes/test/renderers/call-to-action-renderer.test.ts | 35 | function testButtonSkipOnMissingData(target: string, layout: string, {missing = [] as string[]} = {}) { | CODE |
| LOW | …g/kg-default-nodes/src/nodes/gallery/gallery-parser.ts | 5 | function readGalleryImageAttributesFromElement(element: HTMLImageElement, imgNum: number) { | CODE |
| LOW | …es/src/nodes/horizontalrule/horizontalrule-renderer.ts | 7 | function horizontalRuleFrontendTemplate() { | CODE |
| LOW | …es/src/nodes/horizontalrule/horizontalrule-renderer.ts | 11 | function horizontalRuleEmailTemplate() { | CODE |
| LOW | …nodes/src/nodes/header/renderers/v2/header-renderer.ts | 121 | function generateMSOSplitHeaderImage(nodeData: HeaderV2NodeData) { | CODE |
| LOW | …nodes/src/nodes/header/renderers/v2/header-renderer.ts | 147 | function generateMSOContentWrapper(nodeData: HeaderV2NodeData) { | CODE |
| LOW | …nodes/src/nodes/header/renderers/v2/header-renderer.ts | 173 | function generateMSOContentClosing(nodeData: HeaderV2NodeData) { | CODE |
| LOW | …-nodes/src/utils/build-clean-basic-html-for-element.ts | 3 | export function buildCleanBasicHtmlForElement(domNode: Element) { | CODE |
| LOW | …enig/kg-default-nodes/src/utils/replacement-strings.ts | 31 | export function removeCodeWrappersFromHelpers(html: string, document: Document) { | CODE |
| LOW | koenig/kg-default-nodes/src/utils/visibility.ts | 85 | export function migrateOldVisibilityFormat(visibility: Visibility) { | CODE |
| LOW | …-nodes/src/utils/read-image-attributes-from-element.ts | 1 | export function readImageAttributesFromElement(element: HTMLImageElement) { | CODE |
| LOW | koenig/kg-default-transforms/src/default-transforms.ts | 21 | export function registerDefaultTransforms(editor: LexicalEditor) { | CODE |
| LOW | …ault-transforms/src/transforms/remove-at-link-nodes.ts | 9 | export function removeAtLinkNodesTransform(node: AtLinkNode) { | CODE |
| LOW | …ault-transforms/src/transforms/remove-at-link-nodes.ts | 29 | export function registerRemoveAtLinkNodesTransform(editor: LexicalEditor) { | CODE |
| LOW | …-default-transforms/src/transforms/merge-list-nodes.ts | 21 | export function registerMergeListNodesTransform(editor: LexicalEditor) { | CODE |
| LOW | koenig/kg-default-cards/src/ambient.d.ts | 51 | export function markdownAbsoluteToRelative( | CODE |
| LOW | koenig/kg-default-cards/src/ambient.d.ts | 56 | export function markdownRelativeToAbsolute( | CODE |
| LOW | koenig/kg-converters/src/lexical-to-mobiledoc.ts | 139 | function getOrSetMarkupIndex(markup: string, mobiledoc: MobiledocDocument): number { | CODE |
| LOW | koenig/kg-converters/src/lexical-to-mobiledoc.ts | 150 | function getOrSetAtomIndex(atom: MobiledocAtom, mobiledoc: MobiledocDocument): number { | CODE |
| LOW | koenig/kg-converters/src/mobiledoc-to-lexical.ts | 210 | function convertMarkupSectionToLexical( | CODE |
| LOW | koenig/kg-converters/src/mobiledoc-to-lexical.ts | 226 | function populateLexicalNodeWithMarkers( | CODE |
| LOW | koenig/kg-converters/src/mobiledoc-to-lexical.ts | 368 | function convertMarkupTagsToLexicalFormatBitmask(tags: MobiledocMarkup[]): number { | CODE |
| 468 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tools/scripts/test/resolve-base-tag.test.ts | 22 | 'git config user.email "test@test.com"', | CODE |
| LOW | tools/scripts/test/resolve-base-tag.test.ts | 139 | 'git config user.email "test@test.com"', | CODE |
| LOW | …al/test/e2e/cards/bookmark-card-without-search.test.ts | 30 | description: 'lorem ipsum dolor amet lorem ipsum dolor amet', | CODE |
| LOW | …al/test/e2e/cards/bookmark-card-without-search.test.ts | 53 | <div>lorem ipsum dolor amet lorem ipsum dolor amet</div> | CODE |
| LOW | …al/test/e2e/cards/bookmark-card-without-search.test.ts | 103 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL to add bookmark content...'); | CODE |
| LOW | …al/test/e2e/cards/bookmark-card-without-search.test.ts | 167 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL to add bookmark content...'); | CODE |
| LOW | …al/test/e2e/cards/bookmark-card-without-search.test.ts | 187 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL to add bookmark content...'); | CODE |
| LOW | …al/test/e2e/cards/bookmark-card-without-search.test.ts | 209 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL to add bookmark content...'); | CODE |
| LOW | koenig/koenig-lexical/test/e2e/cards/embed-card.test.ts | 242 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL to add embedded content...'); | CODE |
| LOW | koenig/koenig-lexical/test/e2e/cards/embed-card.test.ts | 304 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL to add embedded content...'); | CODE |
| LOW | koenig/koenig-lexical/test/e2e/cards/embed-card.test.ts | 330 | await expect(urlInput).toHaveAttribute('placeholder', 'Paste URL to add embedded content...'); | CODE |
| LOW | koenig/koenig-lexical/test/e2e/cards/embed-card.test.ts | 354 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL to add embedded content...'); | CODE |
| LOW | …xical/test/e2e/cards/bookmark-card-with-search.test.ts | 36 | description: 'lorem ipsum dolor amet lorem ipsum dolor amet', | CODE |
| LOW | …xical/test/e2e/cards/bookmark-card-with-search.test.ts | 59 | <div>lorem ipsum dolor amet lorem ipsum dolor amet</div> | CODE |
| LOW | …xical/test/e2e/cards/bookmark-card-with-search.test.ts | 109 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL or search posts and pages...'); | CODE |
| LOW | …xical/test/e2e/cards/bookmark-card-with-search.test.ts | 173 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL or search posts and pages...'); | CODE |
| LOW | …xical/test/e2e/cards/bookmark-card-with-search.test.ts | 193 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL or search posts and pages...'); | CODE |
| LOW | …xical/test/e2e/cards/bookmark-card-with-search.test.ts | 215 | await expect(urlInput).toHaveAttribute('placeholder','Paste URL or search posts and pages...'); | CODE |
| LOW | …enig/koenig-lexical/test/e2e/cards/button-card.test.ts | 96 | await expect(buttonTextInput).toHaveAttribute('placeholder','Add button text'); | CODE |
| LOW | …enig/koenig-lexical/test/e2e/cards/button-card.test.ts | 98 | await expect(buttonUrlInput).toHaveAttribute('placeholder','https://yoursite.com/#/portal/signup/'); | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 2016 | CodeMirror.defineOption("placeholder", "", function(cm, val, old) { | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 2047 | var placeHolder = cm.getOption("placeholder") | CODE |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 16366 | placeholder: options.placeholder || el.getAttribute("placeholder") || "", | CODE |
| LOW | koenig/kg-simplemde/src/js/simplemde.js | 1563 | placeholder: options.placeholder || el.getAttribute('placeholder') || '', | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 46 | const atLinkNode = $createAtLinkSearchNode('test', 'placeholder'); | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 48 | expect(atLinkNode.getPlaceholder()!).toBe('placeholder'); | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 52 | const atLinkSearch = $createAtLinkSearchNode('test', 'placeholder'); | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 57 | expect(atLinkSearchClone.getPlaceholder()!).toBe('placeholder'); | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 61 | const atLinkSearch = $createAtLinkSearchNode('test', 'placeholder'); | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 66 | placeholder: 'placeholder', | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 75 | const atLinkSearch = AtLinkSearchNode.importJSON({text: 'test', placeholder: 'placeholder'} as ReturnType<AtLink | CODE |
| LOW⚡ | …nig/kg-default-nodes/test/nodes/at-link-search.test.ts | 77 | expect(atLinkSearch.getPlaceholder()!).toBe('placeholder'); | CODE |
| LOW | koenig/kg-lexical-html-renderer/test/render.test.ts | 89 | input: `{"root":{"children":[{"children":[{"detail":0,"format":0,"mode":"normal","style":"","text":"Testing Befo | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 400 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 421 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 434 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 447 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 463 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 482 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 501 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 512 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 529 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 539 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 557 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 586 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 609 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 629 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 648 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 707 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 728 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 753 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 782 | to: 'user@example.com', | CODE |
| LOW | ghost/test/unit/server/lib/mail/ghost-mailer.test.js | 802 | to: 'user@example.com', | CODE |
| LOW | …st/test/unit/server/lib/mailgun/mailgun-client.test.js | 1216 | sender: 'john@example.org', | CODE |
| LOW | …st/test/unit/server/lib/mailgun/mailgun-client.test.js | 1237 | from: 'john@example.org', | CODE |
| LOW | …st/test/unit/server/lib/mailgun/mailgun-client.test.js | 1282 | sender: 'john@example.org', | CODE |
| LOW | …st/test/unit/server/lib/mailgun/mailgun-client.test.js | 1310 | from: 'john@example.org', | CODE |
| LOW⚡ | …/server/data/importer/importers/revue-importer.test.js | 186 | 'id,description,sent_at,subject,preheader\n123456,"<p>Hello World!</p>",2022-12-01 01:01:30 UTC,Lorem Ipsum Do | CODE |
| LOW⚡ | …/server/data/importer/importers/revue-importer.test.js | 186 | 'id,description,sent_at,subject,preheader\n123456,"<p>Hello World!</p>",2022-12-01 01:01:30 UTC,Lorem Ipsum Do | CODE |
| LOW⚡ | …/server/data/importer/importers/revue-importer.test.js | 193 | 'Lorem Ipsum Dolor Sit Amet Consectetur Adipiscing Elit Mauris Convallis Et Metus Eu Blandit Lorem Ipsum Dol | CODE |
| 234 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | compose.dev.yaml | 81 | volumes: | COMMENT |
| LOW | pnpm-workspace.yaml | 301 | # only ever call `load`. See patchedDependencies for the matching slim import. | COMMENT |
| LOW | pnpm-workspace.yaml | 461 | # The 8.x Elasticsearch client eagerly requires apache-arrow for two ES|QL | COMMENT |
| LOW | pnpm-workspace.yaml | 481 | # - mensch parses input like `a{b}` (or a `{placeholder}` in a style | COMMENT |
| LOW | tools/scripts/ci/nx-set-shas.ts | 1 | // Resolves NX_BASE / NX_HEAD — the commit window `nx affected` and the CI path | COMMENT |
| LOW | tools/scripts/release/build-publish-matrix.ts | 1 | // Builds the matrix for the continuous publish job, filtered to the manifest | COMMENT |
| LOW | tools/scripts/release/publish-packages.ts | 141 | } | COMMENT |
| LOW | tools/scripts/release/compare-published.ts | 1 | // Decides whether a continuous package has anything new to publish by | COMMENT |
| LOW | tools/scripts/release/next-version.ts | 1 | // Computes the version the continuous publish job should publish next for a | COMMENT |
| LOW | tools/scripts/lib/publish-manifest.ts | 1 | // The continuous publish lane: packages that CI publishes to npm whenever a | COMMENT |
| LOW | docker/tinybird-local-slim/cleanup.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | docker/stripe/with-stripe.sh | 1 | #!/bin/bash | COMMENT |
| LOW | docker/stripe/entrypoint.sh | 1 | #!/bin/sh | COMMENT |
| LOW | koenig/kg-unsplash-selector/src/vite-env.d.ts | 1 | /// <reference types="vite/client" /> | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 21 | }; | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 41 | // id: '46', | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 61 | // } | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 81 | // id: '1237072960952750081', | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 101 | // entities: { | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 121 | // ], | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 141 | // public_metrics: { | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 161 | // display_url: 'ghost.org' | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 181 | // { | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 201 | // }, | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 221 | // protected: false, | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 241 | // }, | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 261 | // entities: { | COMMENT |
| LOW | koenig/koenig-lexical/demo/utils/fetchEmbed.ts | 281 | // listed_count: 11 | COMMENT |
| LOW | koenig/koenig-lexical/test/e2e/selection.test.ts | 101 | }); | COMMENT |
| LOW | koenig/koenig-lexical/test/e2e/selection.test.ts | 121 | // await page.keyboard.press('a'); | COMMENT |
| LOW | …nig/koenig-lexical/test/e2e/cards/gallery-card.test.ts | 381 | await expect(captionEditor).toContainText('Caption'); | COMMENT |
| LOW | …g/koenig-lexical/src/nodes/TransistorNodeComponent.tsx | 41 | event.stopPropagation(); | COMMENT |
| LOW | …g/koenig-lexical/src/plugins/KoenigBehaviourPlugin.tsx | 241 | // If a non-historic, non-history-merge update arrives with the | COMMENT |
| LOW | …nig-lexical/src/components/ui/cards/TransistorCard.tsx | 1 | import PropTypes from 'prop-types'; | COMMENT |
| LOW | …nig-lexical/src/components/ui/cards/TransistorCard.tsx | 21 | // const [backgroundColorPickerExpanded, setBackgroundColorPickerExpanded] = useState(false); | COMMENT |
| LOW | …nig-lexical/src/components/ui/cards/TransistorCard.tsx | 41 | // value={accentColor || '#000000'} | COMMENT |
| LOW | …nig-lexical/src/components/ui/cards/TransistorCard.tsx | 61 | // {title: 'White', hex: '#FFFFFF'}, | COMMENT |
| LOW | …nig-lexical/src/components/ui/cards/TransistorCard.tsx | 121 | // visibilityOptions: PropTypes.array, | COMMENT |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 2721 | // + (ES): European Number Separator | COMMENT |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 5001 | // on a bidi boundary. | COMMENT |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 6801 | // the scroll effect that the first few mouse wheel events have, | COMMENT |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 7921 | return line | COMMENT |
| LOW | koenig/kg-simplemde/debug/simplemde.js | 8181 | // Created with markText and setBookmark methods. A TextMarker is a | COMMENT |
| LOW | koenig/kg-default-nodes/src/utils/visibility.ts | 61 | // {showOnWeb: true/false, showOnEmail: true/false, segment: 'status:free,status:-free'} | COMMENT |
| LOW | koenig/kg-default-transforms/src/transforms/denest.ts | 21 | // - etc. | COMMENT |
| LOW | koenig/kg-default-cards/test/cards/callout.test.ts | 41 | // payload: { | COMMENT |
| LOW | .claude/hooks/nvm-path.sh | 1 | #!/usr/bin/env bash | COMMENT |
| LOW | .devcontainer/compose.devcontainer.yaml | 1 | services: | COMMENT |
| LOW | .devcontainer/devcontainer.json | 1 | { | COMMENT |
| LOW | .devcontainer/devcontainer.json | 21 | // environments where untrusted code runs in the container. | COMMENT |
| LOW | ghost/vitest.config.db.ts | 1 | import path from 'node:path'; | COMMENT |
| LOW | ghost/vitest.config.db.ts | 21 | // OWN copy of process.env — only `SHARE_ENV` shares it. So a worker's writes | COMMENT |
| LOW | ghost/vitest.config.db.ts | 121 | ); | COMMENT |
| LOW | ghost/vitest.config.db.ts | 221 | // project intermittently wedged in CI: every file reported a | COMMENT |
| LOW | ghost/tsconfig.json | 1 | { | COMMENT |
| LOW | ghost/tsconfig.json | 21 | // "noLib": true, /* Disable including any library files, including the default l | COMMENT |
| LOW | ghost/tsconfig.json | 41 | "resolveJsonModule": true /* Enable importing .json files. */, | COMMENT |
| LOW | ghost/tsconfig.json | 61 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference so | COMMENT |
| LOW | ghost/tsconfig.json | 81 | "strict": true /* Enable all strict type-checking options. */, | COMMENT |
| LOW | ghost/vitest.config.ts | 1 | import path from 'node:path'; | COMMENT |
| 102 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | koenig/kg-simplemde/debug/simplemde.js | 11224 | return this.cm.display.wrapper.ownerDocument.getSelection() | CODE |
| CRITICAL | …/test/unit/server/services/tinybird-sync/index.test.ts | 165 | dependencies.logging.info.mock.calls.map((call) => call[0].system), | CODE |
| CRITICAL | ghost/test/e2e-api/admin/members.test.js | 72 | assertObjectMatches(models.Base.Model.prototype.serialize.call(subscription), asserts); | CODE |
| CRITICAL | ghost/test/e2e-api/members/webhooks.test.js | 88 | const serialized = models.Base.Model.prototype.serialize.call(subscription); | CODE |
| CRITICAL | ghost/test/e2e-api/members/webhooks.test.js | 4193 | assertObjectMatches(models.Base.Model.prototype.serialize.call(stored), { | CODE |
| CRITICAL | …src/global-search/use-global-search.component.test.tsx | 113 | hook.result.current.search.results.map((group) => group.heading); | CODE |
| CRITICAL | …rc/editor/use-post-link-suggestions.component.test.tsx | 73 | hook.result.current.search.results.find(({ heading }) => heading === 'Staff')?.items ?? []; | CODE |
| CRITICAL | …c/editor/publish/use-publish-inputs.component.test.tsx | 199 | expect(hook.result.current.site.newsletters.map(({ slug }) => slug)).toEqual(['first', 'last']); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | ghost/core/boot.js | 704 | // Step 0 - Load config and logging - fundamental required components | COMMENT |
| LOW | ghost/core/boot.js | 738 | // Step 1 - require more fundamental components | COMMENT |
| LOW | ghost/core/boot.js | 749 | // Step 2 - Start server with minimal app in global maintenance mode | COMMENT |
| LOW | ghost/core/boot.js | 772 | // Step 3 - Get the DB ready | COMMENT |
| LOW | ghost/core/boot.js | 780 | // Step 4 - Load Ghost with all its services | COMMENT |
| LOW⚡ | ghost/core/boot.js | 810 | // Step 5 - Mount the full Ghost app onto the minimal root app & disable maintenance mode | COMMENT |
| LOW⚡ | ghost/core/boot.js | 816 | // Step 6 - We are technically done here - let everyone know! | COMMENT |
| LOW⚡ | ghost/core/boot.js | 825 | // Step 7 - Init our background services, we don't wait for this to finish | COMMENT |
| LOW | ghost/core/server/data/importer/import-manager.js | 438 | // Step 1: Handle converting the file to usable data | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 582 | // Step 1: Load the content to import | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 585 | // Step 2: Let the importers pre-process the data | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 588 | // Step 3: Actually do the import | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 592 | // Step 4: Report on the import | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 601 | // Step 5: Cleanup the files this import owns | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 605 | // Step 6: Send email | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 303 | // Step 1: Resolve all providerId -> emailId mappings | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 321 | // Step 2: Build list of (email, emailId) pairs to lookup | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 338 | // Step 3: Batch query all recipients with OR conditions | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 355 | // Step 4: Build cache map keyed by "email:emailId" | COMMENT |
| LOW⚡ | …st/core/server/services/stats/content-stats-service.js | 62 | // Step 1: Get raw data from Tinybird | COMMENT |
| LOW⚡ | …st/core/server/services/stats/content-stats-service.js | 69 | // Step 2: Enrich the data with titles | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 26 | ## Step 1: Check if Component Already Exists | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 34 | ## Step 2: Fetch ShadCN Documentation | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 51 | ## Step 3: Install the Component | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 85 | ## Step 4: Verify Component Installation | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 94 | ## Step 5: Create Storybook Stories | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 186 | ## Step 6: Lint and Fix Stories | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 210 | ## Step 7: Export Component | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 220 | ## Step 8: Run Tests | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 236 | ## Step 9: Visual Verification with Puppeteer | COMMENT |
| LOW | apps/shade/.claude/commands/shadcn-add.md | 280 | ## Step 10: Summary Report | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tools/gx/benchmark-recipient-preparation.ts | 57 | print({ phase: 'database', ...server[0] }); | CODE |
| HIGH | tools/gx/benchmark-recipient-preparation.ts | 143 | print({ phase: 'seed', members: offset + 1000, elapsed_ms: Date.now() - started }); | CODE |
| HIGH | tools/gx/benchmark-recipient-preparation.ts | 200 | print({ | CODE |
| HIGH | tools/gx/benchmark-recipient-preparation.ts | 242 | print({ error: error instanceof Error ? error.stack : String(error) }); | CODE |
| HIGH | e2e/helpers/playwright/fixture.ts | 344 | print('resolved by Ghost', serverHosts); | CODE |
| HIGH | e2e/helpers/playwright/fixture.ts | 345 | print('requested by the browser', browserHosts); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …ost/core/frontend/web/middleware/handle-image-sizes.js | 93 | // CASE: When formatting, we need to check if the imageTransform package supports this specific format | COMMENT |
| LOW | …ost/core/frontend/web/middleware/handle-image-sizes.js | 100 | // CASE: when transforming is supported, we need to check if it is desired | COMMENT |
| LOW | ghost/core/frontend/helpers/comments.js | 15 | * We need to check if comments enabled, because the theme might not be using the other available helpers to check | COMMENT |
| LOW | ghost/core/server/data/importer/import-manager.js | 438 | // Step 1: Handle converting the file to usable data | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 582 | // Step 1: Load the content to import | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 585 | // Step 2: Let the importers pre-process the data | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 588 | // Step 3: Actually do the import | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 592 | // Step 4: Report on the import | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 601 | // Step 5: Cleanup the files this import owns | COMMENT |
| LOW⚡ | ghost/core/server/data/importer/import-manager.js | 605 | // Step 6: Send email | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 303 | // Step 1: Resolve all providerId -> emailId mappings | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 321 | // Step 2: Build list of (email, emailId) pairs to lookup | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 338 | // Step 3: Batch query all recipients with OR conditions | COMMENT |
| LOW | …server/services/email-service/email-event-processor.js | 355 | // Step 4: Build cache map keyed by "email:emailId" | COMMENT |
| LOW⚡ | …st/core/server/services/stats/content-stats-service.js | 62 | // Step 1: Get raw data from Tinybird | COMMENT |
| LOW⚡ | …st/core/server/services/stats/content-stats-service.js | 69 | // Step 2: Enrich the data with titles | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .agents/skills/shade-shadcn-install/SKILL.md | 8 | # Shade — ShadCN install guardrails | COMMENT |
| MEDIUM | …st/core/server/services/notifications/notifications.js | 44 | // The check can be removed/moved to write operations once we have the guardrails on that | COMMENT |
| MEDIUM | .github/workflows/renovate.yml | 85 | # - prConcurrentLimit/branchConcurrentLimit are useful guardrails, but | COMMENT |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 31 | - Configuration: https://github.com/github/gh-aw/blob/v0.49.3/.github/aw/github-agentic-workflows.md | CODE |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 54 | **Prompt file**: https://github.com/github/gh-aw/blob/v0.49.3/.github/aw/create-agentic-workflow.md | CODE |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 66 | **Prompt file**: https://github.com/github/gh-aw/blob/v0.49.3/.github/aw/update-agentic-workflow.md | CODE |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 78 | **Prompt file**: https://github.com/github/gh-aw/blob/v0.49.3/.github/aw/debug-agentic-workflow.md | CODE |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 90 | **Prompt file**: https://github.com/github/gh-aw/blob/v0.49.3/.github/aw/upgrade-agentic-workflows.md | CODE |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 102 | **Prompt file**: https://github.com/github/gh-aw/blob/v0.49.3/.github/aw/create-shared-agentic-workflow.md | CODE |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 134 | # Initialize repository for agentic workflows | COMMENT |
| MEDIUM | .github/agents/agentic-workflows.agent.md | 162 | - Always reference the instructions file at https://github.com/github/gh-aw/blob/v0.49.3/.github/aw/github-agentic-workf | CODE |
| MEDIUM | apps/admin/eslint.config.js | 58 | // Boundary guardrails. Product code must reach react-router and the Admin | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker/tb-cli/entrypoint.sh | 19 | # Check if workspace ID is valid | COMMENT |
| LOW | docker/tb-cli/entrypoint.sh | 28 | # Check if workspace token is valid | COMMENT |
| LOW | docker/tb-cli/entrypoint.sh | 61 | # Check if admin token is valid | COMMENT |
| LOW | docker/tb-cli/entrypoint.sh | 73 | # Check if tracker token is valid | COMMENT |
| LOW | docker/stripe/entrypoint.sh | 33 | # Check if STRIPE_SECRET_KEY is set | COMMENT |
| LOW | docker/stripe/entrypoint.sh | 52 | # Check if we got a timeout | COMMENT |
| LOW | docker/stripe/entrypoint.sh | 59 | # Check if we got a valid secret (should start with "whsec_") | COMMENT |
| LOW⚡ | …t/core/server/data/tinybird/scripts/configure-ghost.sh | 15 | # Check if workspace ID is valid | COMMENT |
| LOW⚡ | …t/core/server/data/tinybird/scripts/configure-ghost.sh | 25 | # Check if workspace token is valid | COMMENT |
| LOW⚡ | …t/core/server/data/tinybird/scripts/configure-ghost.sh | 35 | # Check if admin token is valid | COMMENT |
| LOW | …t/core/server/data/tinybird/scripts/configure-ghost.sh | 46 | # Check if tracker token is valid | COMMENT |
| LOW | .github/workflows/deploy-to-staging.yml | 65 | # Check if Docker build job specifically succeeded (paginate — CI has 30+ jobs) | COMMENT |
| LOW | .github/hooks/commit-msg.bash | 32 | # Check if second line is blank | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/tinybird-local-slim/cleanup.sh | 23 | # server). Editing the shipped config in-place keeps this robust to upstream | COMMENT |
| MEDIUM | docker/tb-cli/entrypoint.sh | 47 | # Find admin token by looking for ADMIN scope (more robust than name matching) | COMMENT |
| MEDIUM | .github/workflows/e2e-runner-image.yml | 7 | # push, and it shares no layers with the Ghost build (no buildx-cache synergy). | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | docker/analytics/entrypoint.sh | 28 | # This file is created by the `tb-cli` service and mounted into the Analytics service container | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …dmin/test-utils/acceptance/public/mockServiceWorker.js | 121 | async function handleRequest(event, requestId, requestInterceptedAt) { | CODE |