Make Every Team AI Native
This report summarizes scanner evidence for Tencent/teamai-cli, a TypeScript project with 5,314 GitHub stars. SynthScan examined 329,385 lines of code across 965 source files, recording 1302 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 9.1 (Moderate 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.
Can maintainers explain intent, assumptions, and trade-offs? 486 finding(s).
Are imports declared and package/API names verified? 9 finding(s).
Are wrappers, guards, and repeated structures necessary? 1041 finding(s).
Which changes need focused human review? 1302 finding(s).
Run additional scans to build a history of the legacy pattern signal. Score changes are not a measure of AI adoption or code quality.
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 1302 distinct pattern matches across 11 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 |
|---|---|---|---|---|
| MEDIUM | examples/ci/coding-ci-mr-extract.yaml | 21 | # ── MR 触发规则(必须在 YAML 中声明,UI 配置无效)──────────── | COMMENT |
| MEDIUM | examples/ci/coding-ci-mr-extract.yaml | 31 | # ── 密钥与环境变量 ──────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/ci/coding-ci-mr-extract.yaml | 44 | # ── 流水线阶段 ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | examples/ci/coding-ci-mr-extract.yaml | 47 | # ── MR 创建/更新时:提炼知识并以 comment 形式展示 ────────── | COMMENT |
| MEDIUM | examples/ci/coding-ci-mr-extract.yaml | 76 | # ── MR 合入后:将知识写入团队知识仓库 ───────────────────── | COMMENT |
| MEDIUM | examples/ci/github-actions-mr-extract.yml | 26 | # ── PR 创建/更新时:提炼知识并以 comment 形式展示 ────────── | COMMENT |
| MEDIUM | examples/ci/github-actions-mr-extract.yml | 53 | # ── PR 合入后:将知识写入团队仓库 ───────────────────────── | COMMENT |
| MEDIUM | src/git-hook.ts | 352 | // ─── Recorded failures ───────────────────────────────── | COMMENT |
| MEDIUM | src/push.ts | 1351 | // ── Handle --skill parameter: filter to a single specific skill ────── | COMMENT |
| MEDIUM | src/push.ts | 1539 | // ── Step 0: Cross-check against still-open push PRs ──────────────── | COMMENT |
| MEDIUM | src/push.ts | 1678 | // ── Step 1: Display ALL scanned items with numbers ───────────────── | COMMENT |
| MEDIUM | src/push.ts | 1712 | // ── Step 2: Dry run resolves placement, then exits ────────────── | COMMENT |
| MEDIUM | src/push.ts | 1729 | // ── Step 3: Item selection (replaces old Y/n confirmation) ───────── | COMMENT |
| MEDIUM | src/push.ts | 1745 | // ── Step 3b: Split the selection into per-PR groups ──────────────── | COMMENT |
| MEDIUM | src/push.ts | 1767 | // ── Step 5: Push each group — one branch/PR per group ────────────── | COMMENT |
| MEDIUM | src/clone.ts | 12 | // ─── Types ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/clone.ts | 34 | // ─── Helpers ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/clone.ts | 224 | // ─── Public API ───────────────────────────────────────── | COMMENT |
| MEDIUM | src/mcp-git-exclude.ts | 17 | // ─── Project MCP configs and git ───────────────────────────── | COMMENT |
| MEDIUM | src/status.ts | 303 | // ── Repo section ──────────────────────────────────── | COMMENT |
| MEDIUM | src/status.ts | 310 | // ── Local agent section (skills only) ─────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 9 | // ─── MR Hint data flow ────────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 35 | // ─── Types ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 57 | // ─── Cache helpers ─────────────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 114 | // ─── Git remote detection ──────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 138 | // ─── Remote URL parsing ────────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 188 | // ─── MR listing ───────────────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 326 | // ── Primary: gh CLI ────────────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 356 | // ── Fallback: GitHub REST API ──────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 360 | // ─── Hint message builder ──────────────────────────────── | COMMENT |
| MEDIUM | src/mr-hint.ts | 389 | // ─── Main entry point ──────────────────────────────────── | COMMENT |
| MEDIUM | src/cache-cmd.ts | 7 | // ─── Types ─────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/cache-cmd.ts | 18 | // ─── Helpers ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/cache-cmd.ts | 57 | // ─── Command ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/instruction-targets.ts | 750 | // ─── Planning file contents ──────────────────────────── | COMMENT |
| MEDIUM | src/skill-content.ts | 10 | // ─── CLI-served skill content ──────────────────────────── | COMMENT |
| MEDIUM | src/source.ts | 49 | // ─── Source repo management ────────────────────────────── | COMMENT |
| MEDIUM | src/source.ts | 348 | // ─── Commands ──────────────────────────────────────────── | COMMENT |
| MEDIUM | src/source.ts | 705 | // ─── Pull sources ──────────────────────────────────────── | COMMENT |
| MEDIUM | src/source.ts | 1099 | // ─── Helpers ───────────────────────────────────────────── | COMMENT |
| MEDIUM | src/git-exclude-delivered.ts | 150 | // ─── Every live checkout's list ─────────────────────────────── | COMMENT |
| MEDIUM | src/git-exclude-delivered.ts | 258 | // ─── Sync ───────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 43 | // ─── Event collection data flow ───────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 57 | // ─── STDIN parsing ────────────────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 69 | // ─── Transcript reading ───────────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 1390 | // ─── JSONL persistence ────────────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 1513 | // ─── Events file lock (#804) ──────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 1513 | // ─── Events file lock (#804) ──────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 1784 | // ─── Session state rebuild ────────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 2182 | // ─── JSONL compaction ─────────────────────────────────── | COMMENT |
| MEDIUM | src/dashboard-collector.ts | 2359 | // ─── CLI entry point ──────────────────────────────────── | COMMENT |
| MEDIUM | src/pid-monitor.ts | 6 | // ─── Process tree helpers ────────────────────────────── | COMMENT |
| MEDIUM | src/save-session.ts | 94 | // ── Team push (opt-in) ───────────────────────────────── | COMMENT |
| MEDIUM | src/viz.ts | 32 | // ─── Public option / data types ────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/viz.ts | 114 | // ─── Internal types ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/viz.ts | 141 | // ─── Path resolution ────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/viz.ts | 247 | // ─── Vote aggregation ───────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/viz.ts | 298 | // ─── Index loading ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/viz.ts | 338 | // ─── Aggregation helpers ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | src/viz.ts | 392 | // ─── Core build function ────────────────────────────────────────────────────── | COMMENT |
| 745 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/git-hook.ts | 348 | export function clearGitHookRepositoryEnv(env: NodeJS.ProcessEnv = process.env): void { | CODE |
| LOW | src/push.ts | 45 | export async function filterExistingTopLevelPaths( | CODE |
| LOW | src/push.ts | 243 | async function warnKeptCopiesTheTeamChanged( | CODE |
| LOW | src/push.ts | 473 | function reuseRecordedDestinations(groups: PushGroup[]): void { | CODE |
| LOW | src/update-policy.ts | 10 | export function resolveEffectiveUpdatePolicy( | CODE |
| LOW | src/mcp-git-exclude.ts | 56 | export function carriesLocalAgentCredential(entry: unknown): boolean { | CODE |
| LOW | src/mr-hint.ts | 278 | async function listGitHubMergedMRsViaREST( | CODE |
| LOW | src/instruction-targets.ts | 308 | export function deliversInstructionsByHook(tool: string, scope: Scope): boolean { | CODE |
| LOW | src/instruction-targets.ts | 326 | export async function nativeProjectInstructions(tool: string, projectRoot: string): Promise<string> { | CODE |
| LOW | src/instruction-targets.ts | 417 | export async function instructionHookChannelInstallable(tool: string): Promise<boolean> { | CODE |
| LOW | src/instruction-targets.ts | 437 | export async function instructionChannelProblems(teamConfig: TeamaiConfig, localConfig: LocalConfig): Promise<string[]> | CODE |
| LOW | src/instruction-targets.ts | 491 | export function unreadableRulesFileMessage(tool: string, unreadable: NonNullable<UserRulesFile['unreadable']>): string { | CODE |
| LOW | src/instruction-targets.ts | 572 | export async function isInstructionToolInstalled(tool: string, paths: ToolPaths, localConfig: LocalConfig): Promise<bool | CODE |
| LOW | src/instruction-targets.ts | 596 | export async function resolveInstructionTargets( | CODE |
| LOW | src/instruction-targets.ts | 742 | async function recordOpencodeContextEntry(localConfig: LocalConfig, ref: { config: string; entry: string }, added: boole | CODE |
| LOW | src/claude-hook-host.ts | 47 | export function claudeHookRunsInAnotherHost(tool: string, env: NodeJS.ProcessEnv = process.env): boolean { | CODE |
| LOW | src/skill-content.ts | 352 | async function collectSupplementaryFiles(skillDir: string): Promise<Array<{ relativePath: string; content: string }>> { | CODE |
| LOW | src/doctor.ts | 628 | async function buildTrackedHookIndexCheck(localConfig: LocalConfig): Promise<Check[]> { | CODE |
| LOW | src/transcript-parser.ts | 223 | function extractRecalledDocIdsFromComment(text: string, out: Set<string>): void { | CODE |
| LOW | src/transcript-parser.ts | 234 | function extractRecalledDocIdsFromValue( | CODE |
| LOW | src/source.ts | 160 | async function resolveSourcePhysicalPath(target: string): Promise<string> { | CODE |
| LOW | src/source.ts | 182 | async function resolveSourceCopyDestination(target: string): Promise<{ path: string; replacesSymlink: boolean }> { | CODE |
| LOW | src/source.ts | 1268 | async function assertSourceSkillRootIsNotSymlink(target: string): Promise<void> { | CODE |
| LOW | src/source.ts | 1278 | async function assertSourceDestinationsUnchanged(manifest: SourceInstallManifest, baseDir: string): Promise<void> { | CODE |
| LOW | src/source.ts | 1553 | export async function getSourcePushQuarantineNames(localConfig: LocalConfig): Promise<Set<string>> { | CODE |
| LOW | src/git-exclude-delivered.ts | 251 | export function describeUnreadableGitExcludeSetting(localConfig: LocalConfig): string { | CODE |
| LOW | src/git-exclude-delivered.ts | 336 | export async function reportDeliveredGitExclude(localConfig: LocalConfig, paths: Iterable<string>): Promise<GitExcludeRe | CODE |
| LOW | src/dashboard-collector.ts | 447 | function parseCodexCumulativeUsage(entry: { type?: string; payload?: unknown }): CodexTokenSnapshot | null { | CODE |
| LOW | src/dashboard-collector.ts | 488 | async function readLatestCodexUsageFromTail(transcriptPath: string): Promise<CodexTokenSnapshot | null> { | CODE |
| LOW | src/dashboard-collector.ts | 604 | async function readLatestCopilotUsageFromTail( | CODE |
| LOW | src/dashboard-collector.ts | 651 | async function waitForCopilotShutdownUsage( | CODE |
| LOW | src/dashboard-collector.ts | 677 | async function findCopilotRunMarkerAfter( | CODE |
| LOW | src/dashboard-collector.ts | 791 | export function resolveCopilotUsageTranscript( | CODE |
| LOW | src/dashboard-collector.ts | 2172 | export function aggregateSessionInterventions( | CODE |
| LOW | src/hermes-hooks.ts | 56 | export function foreignInstructionsPlugin(): string { | CODE |
| LOW | src/init.ts | 896 | export function buildProjectScopeGitignore(): string { | CODE |
| LOW | src/init.ts | 932 | export function migrateSelfModeGitignoreContent(content: string): { changed: boolean; content: string } { | CODE |
| LOW | src/projects.ts | 207 | export function resolveProjectResourceNamespaces(input: { | CODE |
| LOW | src/projects.ts | 244 | export async function resolveActiveLearningsNamespaces( | CODE |
| LOW | src/manifest-schema.ts | 138 | export function assertSafeFallbackNamespaces(ids: string[], source: string): string[] { | CODE |
| LOW | src/manifest-schema.ts | 252 | export function assertNoCaseAliasedNamespaces(entries: Iterable<NamespaceEntry>, kind: string): void { | CODE |
| LOW | src/contribute.ts | 54 | export async function rebuildIndexAfterContribute(localConfig: LocalConfig): Promise<void> { | CODE |
| LOW | src/teamai-only-files.ts | 79 | export async function describeNoLongerTeamaiOnly(file: string, projectRoot: string): Promise<string> { | CODE |
| LOW | src/teamai-only-files.ts | 108 | async function opencodeInstructionEntries( | CODE |
| LOW | src/teamai-only-files.ts | 175 | async function judgeOpencodeInstructions(teamConfig: TeamaiConfig, localConfig: LocalConfig): Promise<{ file: string; te | CODE |
| LOW | src/namespaced-entries.ts | 587 | export function reportUndeliveredEntryNotices(resolution: Pick<EntryResolution<unknown>, 'notices'>): void { | CODE |
| LOW | src/stats.ts | 198 | function mergeDashboardAndReported( | CODE |
| LOW | src/doctor-git-exclude.ts | 136 | export async function buildDeliveredGitExcludeChecks(ctx: DoctorContext): Promise<Check[]> { | CODE |
| LOW | src/doctor-git-exclude.ts | 213 | export async function buildLocalAgentGitExcludeChecks(): Promise<Check[]> { | CODE |
| LOW | src/doctor-git-exclude.ts | 225 | export async function localAgentGitExcludeNotes(): Promise<string[]> { | CODE |
| LOW | src/uninstall.ts | 305 | function instructionBlocksWrittenBy(tool: string): string[] { | CODE |
| LOW | src/uninstall.ts | 1551 | async function removePlannedGitExcludeBlocks(plan: RemovalPlan, heldMcp: ReadonlySet<string>, incomplete: boolean): Prom | CODE |
| LOW | src/uninstall.ts | 1666 | async function removeHomeLocalScopeMcpServers(): Promise<string[]> { | CODE |
| LOW | src/uninstall.ts | 1695 | async function removeHomeGitExcludeBlocks(blocks: HomeGitExcludeBlocks): Promise<void> { | CODE |
| LOW | src/mcp-reconcile.ts | 131 | function describeRemovedServerPreview(target: McpTarget, name: string): string { | CODE |
| LOW | src/mcp-reconcile.ts | 599 | export async function unrecordedUnmappedMcpDefaults( | CODE |
| LOW | src/mcp-reconcile.ts | 1053 | async function shadowedBareCopilotServer(target: McpTarget): Promise<string | undefined> { | CODE |
| LOW | src/mcp-reconcile.ts | 1245 | export async function judgeTeamaiOnlyMcpConfigs( | CODE |
| LOW | src/mcp-reconcile.ts | 1544 | export async function earlierMappedMcpFileEvidence( | CODE |
| LOW | src/mcp-reconcile.ts | 1867 | async function protectResolvedMcpConfigs( | CODE |
| 174 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | examples/ci/coding-ci-mr-extract.yaml | 1 | # TeamAI MR Knowledge Extract — 智研 / Coding CI(TGit / 工蜂) | COMMENT |
| LOW | .github/workflows/code-erosion.yml | 1 | name: Code Erosion | COMMENT |
| LOW | .github/workflows/codex-review-on-assign.yml | 1 | name: Codex Review on Assign | COMMENT |
| LOW | .github/workflows/codex-review-on-assign.yml | 21 | # authorized this PR — either the current assigner, or an existing assignee. | COMMENT |
| LOW | .github/workflows/codex-review-on-assign.yml | 241 | core.setOutput('prompt-file', promptPath); | COMMENT |
| LOW | .github/ast-grep-rules/ts-verbosity.yml | 1 | # TypeScript verbosity rules for the code-erosion CI layer. | COMMENT |
| LOW | src/push.ts | 801 | COMMENT | |
| LOW | src/push.ts | 841 | // hands pushCore a config whose localPath is the worktree's .teamai. | COMMENT |
| LOW | src/push.ts | 941 | options: GlobalOptions & { all?: boolean; role?: string; project?: string; branch?: string }, | COMMENT |
| LOW | src/push.ts | 1081 | for (const reason of brokenCatalogs) log.error(`Cannot push with an invalid model catalog: ${reason}`); | COMMENT |
| LOW | src/push.ts | 1221 | log.warn( | COMMENT |
| LOW | src/push.ts | 1301 | } | COMMENT |
| LOW | src/push.ts | 1801 | // pushRepoBranch(), which resets and cleans the clone. Re-apply the | COMMENT |
| LOW | src/mr-hint.ts | 1 | import { spawnSync } from 'node:child_process'; | COMMENT |
| LOW | src/skill-content.ts | 1 | import fs from 'node:fs'; | COMMENT |
| LOW | src/migrate.ts | 201 | // adopting (renaming) it FIRST is what keeps the "partition already built" | COMMENT |
| LOW | src/hooks-cmd.ts | 141 | // build's file and always reported missing. | COMMENT |
| LOW | src/transcript-parser.ts | 61 | const readerToolUseIds = new Set<string>(); | COMMENT |
| LOW | src/dashboard-collector.ts | 41 | import { estimateClaudeRequest } from './model-pricing.js'; | COMMENT |
| LOW | src/dashboard-collector.ts | 1221 | // machine-level events file mixes sessions from every team. Do this before | COMMENT |
| LOW | src/dashboard-collector.ts | 1781 | }); | COMMENT |
| LOW | src/init.ts | 1341 | } catch (e) { | COMMENT |
| LOW | src/init.ts | 2141 | const reloadedTeamConfig = await loadTeamConfig(localPath); | COMMENT |
| LOW | src/codebase-extract.ts | 801 | // not routed through import's cache-dir redirection), it lands straight in | COMMENT |
| LOW | src/manifest-schema.ts | 21 | // is a name no admin typed on purpose, and it renders as something other than | COMMENT |
| LOW | src/contribute.ts | 81 | docsDir: (await pathExists(docsRepoDir)) ? docsRepoDir : undefined, | COMMENT |
| LOW | src/votes-judge.ts | 1 | // -*- coding: utf-8 -*- | COMMENT |
| LOW | src/stats.ts | 241 | // Dashboard metrics follow the same scope rules `pull` reports with, so what | COMMENT |
| LOW | src/uninstall.ts | 2001 | if (await reconcileOpencodeInstructions(config, entry, false, 'team instructions')) log.success(`Removed "${entry} | COMMENT |
| LOW | src/uninstall.ts | 2421 | // Project scope: the managed-mcp manifests are PER-WORKTREE under the | COMMENT |
| LOW | src/mcp-reconcile.ts | 81 | trackResolvedMcpFiles, | COMMENT |
| LOW | src/commands-reference.ts | 1 | import type { Command, Option } from 'commander'; | COMMENT |
| LOW | src/hook-dispatch-cli.ts | 241 | // The provider rejects an empty CurrentDirectory with ReturnValue 21, and a | COMMENT |
| LOW | src/builtin-skills.ts | 21 | // copied to local AI tool skill directories. The workflow | COMMENT |
| LOW | src/hook-handlers.ts | 101 | COMMENT | |
| LOW | src/hook-handlers.ts | 621 | ); | COMMENT |
| LOW | src/hook-handlers.ts | 721 | COMMENT | |
| LOW | src/dashboard.ts | 101 | watchDebounce = setTimeout(() => void pushSessions(), 200); | COMMENT |
| LOW | src/graph-aggregate.ts | 41 | // Once merged, that tag travels with the node/edge forever — | COMMENT |
| LOW | src/graph-aggregate.ts | 61 | // identity as one already pushed here in an earlier | COMMENT |
| LOW | src/graph-aggregate.ts | 221 | // withheld would also discard a DIFFERENT, fully-allowed pair that | COMMENT |
| LOW | src/graph-aggregate.ts | 261 | const raw = JSON.parse(await fs.readFile(graphPath, 'utf8')); | COMMENT |
| LOW | src/graph-aggregate.ts | 321 | // A slug both sets claim needs its global metadata restored to the | COMMENT |
| LOW | src/coauthor-reconcile.ts | 21 | // | COMMENT |
| LOW | src/coauthor-reconcile.ts | 41 | // Claude family settings.json attribution.{commit,pr} deterministic | COMMENT |
| LOW | src/usage-tracker.ts | 41 | } | COMMENT |
| LOW | src/usage-tracker.ts | 61 | // ▼ | COMMENT |
| LOW | src/types.ts | 281 | // │ │ | COMMENT |
| LOW | src/types.ts | 461 | // ~/.qoder-cn instead of ~/.qoder, so it needs its own entry rather than | COMMENT |
| LOW | src/types.ts | 501 | }, | COMMENT |
| LOW | src/types.ts | 521 | // Trae CN (domestic.trae.cn) shares every project path with the | COMMENT |
| LOW | src/types.ts | 541 | // Markdown (the CLI also reads <project>/.zcode/agents/ per workspace). | COMMENT |
| LOW | src/types.ts | 1481 | // Claude Code session | COMMENT |
| LOW | src/types.ts | 1921 | /** Phase 2: git commit is neutral (no bonus, no penalty) */ | COMMENT |
| LOW | src/todowrite-hint.ts | 1 | import path from 'node:path'; | COMMENT |
| LOW | src/code-knowledge-recall.ts | 521 | } | COMMENT |
| LOW | src/remove.ts | 141 | const allNames = new Set([...teamItems.map(qualified), ...localItems.map((i) => i.name)]); | COMMENT |
| LOW | src/session-owners.ts | 41 | export function snapshotPathIn(dataHome: string, name: ReportedSnapshotName): string { | COMMENT |
| LOW | src/contribute-check.ts | 21 | CONTRIBUTE_INTERRUPT_WEIGHT, | COMMENT |
| LOW | src/contribute-check.ts | 41 | // │ | COMMENT |
| 65 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skill-data/wiki/references/agents/graph-rag-agent.md | 22 | ### Step 1: Relationship extraction | COMMENT |
| LOW | skill-data/wiki/references/agents/graph-rag-agent.md | 55 | ### Step 2: Generate graph documents one by one | COMMENT |
| LOW | skill-data/wiki/references/agents/graph-rag-agent.md | 261 | ### Step 3: Generate the graph directory README | COMMENT |
| LOW | skill-data/wiki/references/agents/graph-rag-agent.md | 293 | ### Step 4: Return summary | COMMENT |
| LOW⚡ | skill-data/wiki/references/agents/kb-doc-generator.md | 27 | ### Step 0: Load the methodology | COMMENT |
| LOW⚡ | skill-data/wiki/references/agents/kb-doc-generator.md | 31 | ### Step 1: Checkpoint check | COMMENT |
| LOW⚡ | skill-data/wiki/references/agents/kb-doc-generator.md | 37 | ### Step 2: Dispatch strategy decision | COMMENT |
| LOW | skill-data/wiki/references/agents/kb-doc-generator.md | 238 | ### Step 3: Self-check (accuracy verification + interface reconciliation) | COMMENT |
| LOW | skill-data/wiki/references/agents/kb-doc-generator.md | 281 | ### Step 4: Return summary | COMMENT |
| LOW | skill-data/wiki/references/phases/k3-ai-native.md | 5 | ### Step 1: Inject AI-Native elements | COMMENT |
| LOW | skill-data/wiki/references/phases/k3-ai-native.md | 17 | ### Step 2: Graph RAG graph document set | COMMENT |
| LOW | skill-data/wiki/references/phases/k3-ai-native.md | 46 | ### Step 3: Cross-document consistency check | COMMENT |
| LOW⚡ | …-data/wiki/references/phases/k1-reverse-engineering.md | 5 | ### Step 1: Optionally run the scan script (recommended) | COMMENT |
| LOW⚡ | …-data/wiki/references/phases/k1-reverse-engineering.md | 12 | ### Step 2: Key file extraction | COMMENT |
| LOW⚡ | …-data/wiki/references/phases/k1-reverse-engineering.md | 19 | ### Step 3: Architecture reverse-engineering (see phase1-reverse-engineering.md for details) | COMMENT |
| LOW⚡ | …-data/wiki/references/phases/k1-reverse-engineering.md | 25 | ### Step 4: Generate the architecture analysis report | COMMENT |
| LOW | …-data/wiki/references/phases/k1-reverse-engineering.md | 56 | ### Step 5: Interface inventory scan (run separately per check type) | COMMENT |
| LOW | skill-data/wiki/references/phases/k4-quality.md | 5 | ### Step 1: Automated validation | COMMENT |
| LOW | skill-data/wiki/references/phases/k4-quality.md | 22 | ### Step 2: Accuracy audit | COMMENT |
| LOW⚡ | skill-data/wiki/references/phases/k4-quality.md | 45 | ### Step 3: RAG retrieval spot check | COMMENT |
| LOW⚡ | skill-data/wiki/references/phases/k4-quality.md | 49 | ### Step 4: AI end-to-end validation (E2E Validation) | COMMENT |
| LOW | skill-data/wiki/references/phases/k4-quality.md | 138 | ### Step 5: Generate the quality report | COMMENT |
| LOW⚡ | src/init.ts | 763 | // Step 5: inject hooks (built-in dispatch incl. the reporter) via the same | COMMENT |
| LOW⚡ | src/init.ts | 768 | // Step 6: also initialize local-agent config so the new hook-dispatch --stdin | COMMENT |
| LOW | src/init.ts | 610 | // Step 0: scope (same rules as git init — default project) | COMMENT |
| LOW | src/init.ts | 661 | // Step 1: API key. Persist --token when given (one command sets endpoint+key), | COMMENT |
| LOW | src/init.ts | 673 | // Step 2: write a minimal local teamai.yaml stub (default toolPaths) to drive | COMMENT |
| LOW | src/init.ts | 688 | // Step 4: save local config (kind: http; only the URL is stored, never the key) | COMMENT |
| LOW | src/init.ts | 1128 | // Step 0: single-repo mode is always project scope, rooted at the business repo. | COMMENT |
| LOW | src/init.ts | 1181 | // Step 1: derive provider + remote from the business repo's origin. | COMMENT |
| LOW | src/init.ts | 1210 | // Step 2: authenticate (needed to push reports + open knowledge PRs). | COMMENT |
| LOW | src/init.ts | 1223 | // Step 3: build the .teamai/ knowledge skeleton on the active tree (committed to main). | COMMENT |
| LOW | src/init.ts | 1271 | // Step 4: assemble local config (kind: self). dataHome points at the partition | COMMENT |
| LOW | src/init.ts | 1315 | // Step 5: write local config (into the partition via dataHome) + single-repo | COMMENT |
| LOW | src/init.ts | 1409 | // Step 6: register member on the reports orphan branch (never touches main / active tree). | COMMENT |
| LOW | src/init.ts | 1532 | // Step 0: Resolve scope (default project; only explicit --scope user → ~/ ) | COMMENT |
| LOW | src/init.ts | 1592 | // Step 1: Get repo input (positional or --repo alias; prompt if neither) | COMMENT |
| LOW | src/init.ts | 1632 | // Step 2: Ensure provider tools are installed and authenticate | COMMENT |
| LOW | src/init.ts | 1652 | // Step 3: Clone or link repo | COMMENT |
| LOW | src/init.ts | 1844 | // Step 4: Load team config | COMMENT |
| LOW | src/init.ts | 1949 | // Step 5: member roster on the teamai-reports orphan branch (never the | COMMENT |
| LOW | src/init.ts | 2039 | // Step 6: Save local config | COMMENT |
| LOW | src/init.ts | 2140 | // Step 7: Inject built-in + team hooks into AI tools | COMMENT |
| LOW | src/init.ts | 2182 | // Step 8: deliver the team's resources now. Rules and MCP are read once at | COMMENT |
| LOW | src/enrich-with-ai.ts | 210 | // Step 1: AI enrichment per module (parallel) | COMMENT |
| LOW | src/enrich-with-ai.ts | 233 | // Step 2: Repo-level domain classification (single call) | COMMENT |
| LOW | src/enrich-with-ai.ts | 258 | // Step 3: Build manifest V2 | COMMENT |
| LOW⚡ | src/pull.ts | 2090 | // Step 5: Auto-report usage data — handled centrally in pull() to avoid | COMMENT |
| LOW⚡ | src/pull.ts | 2094 | // Step 6: Show skill recommendations | COMMENT |
| LOW | src/pull.ts | 1164 | // Step 1: refresh team repo (git pull, or HTTP /repo materialization) | COMMENT |
| LOW | src/pull.ts | 1588 | // Step 2: Sync each resource type | COMMENT |
| LOW | src/pull.ts | 1834 | // Step 3: Clean up tombstoned resources | COMMENT |
| LOW | src/pull.ts | 1959 | // Step 4: Deploy CLI built-in skills | COMMENT |
| LOW⚡ | src/__tests__/distilly-roundtrip.test.ts | 35 | // Step 1: the exact deploy call pullSingleSource() makes. | COMMENT |
| LOW⚡ | src/__tests__/distilly-roundtrip.test.ts | 38 | // Step 2: the exact validation call the push path makes on skills. | COMMENT |
| LOW⚡ | src/__tests__/pull-tombstone.test.ts | 709 | // Step 1: Pull as hai role — should get common + hai skills | COMMENT |
| LOW⚡ | src/__tests__/pull-tombstone.test.ts | 716 | // Step 2: Switch to pm role (simulate what `roles set pm` does) | COMMENT |
| LOW | src/__tests__/pull-tombstone.test.ts | 728 | // Step 3: Pull as pm role — should get common + pm, remove hai-only | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 649 | // Step 1: Uninstall everything | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 654 | // Step 2: Verify cleanup — config.yaml should not exist | COMMENT |
| 7 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/init.ts | 763 | // Step 5: inject hooks (built-in dispatch incl. the reporter) via the same | COMMENT |
| LOW⚡ | src/init.ts | 768 | // Step 6: also initialize local-agent config so the new hook-dispatch --stdin | COMMENT |
| LOW | src/init.ts | 610 | // Step 0: scope (same rules as git init — default project) | COMMENT |
| LOW | src/init.ts | 661 | // Step 1: API key. Persist --token when given (one command sets endpoint+key), | COMMENT |
| LOW | src/init.ts | 673 | // Step 2: write a minimal local teamai.yaml stub (default toolPaths) to drive | COMMENT |
| LOW | src/init.ts | 688 | // Step 4: save local config (kind: http; only the URL is stored, never the key) | COMMENT |
| LOW | src/init.ts | 1128 | // Step 0: single-repo mode is always project scope, rooted at the business repo. | COMMENT |
| LOW | src/init.ts | 1181 | // Step 1: derive provider + remote from the business repo's origin. | COMMENT |
| LOW | src/init.ts | 1210 | // Step 2: authenticate (needed to push reports + open knowledge PRs). | COMMENT |
| LOW | src/init.ts | 1223 | // Step 3: build the .teamai/ knowledge skeleton on the active tree (committed to main). | COMMENT |
| LOW | src/init.ts | 1271 | // Step 4: assemble local config (kind: self). dataHome points at the partition | COMMENT |
| LOW | src/init.ts | 1315 | // Step 5: write local config (into the partition via dataHome) + single-repo | COMMENT |
| LOW | src/init.ts | 1409 | // Step 6: register member on the reports orphan branch (never touches main / active tree). | COMMENT |
| LOW | src/init.ts | 1532 | // Step 0: Resolve scope (default project; only explicit --scope user → ~/ ) | COMMENT |
| LOW | src/init.ts | 1592 | // Step 1: Get repo input (positional or --repo alias; prompt if neither) | COMMENT |
| LOW | src/init.ts | 1632 | // Step 2: Ensure provider tools are installed and authenticate | COMMENT |
| LOW | src/init.ts | 1652 | // Step 3: Clone or link repo | COMMENT |
| LOW | src/init.ts | 1844 | // Step 4: Load team config | COMMENT |
| LOW | src/init.ts | 1949 | // Step 5: member roster on the teamai-reports orphan branch (never the | COMMENT |
| LOW | src/init.ts | 2039 | // Step 6: Save local config | COMMENT |
| LOW | src/init.ts | 2140 | // Step 7: Inject built-in + team hooks into AI tools | COMMENT |
| LOW | src/init.ts | 2182 | // Step 8: deliver the team's resources now. Rules and MCP are read once at | COMMENT |
| LOW | src/enrich-with-ai.ts | 210 | // Step 1: AI enrichment per module (parallel) | COMMENT |
| LOW | src/enrich-with-ai.ts | 233 | // Step 2: Repo-level domain classification (single call) | COMMENT |
| LOW | src/enrich-with-ai.ts | 258 | // Step 3: Build manifest V2 | COMMENT |
| LOW⚡ | src/pull.ts | 2090 | // Step 5: Auto-report usage data — handled centrally in pull() to avoid | COMMENT |
| LOW⚡ | src/pull.ts | 2094 | // Step 6: Show skill recommendations | COMMENT |
| LOW | src/pull.ts | 1164 | // Step 1: refresh team repo (git pull, or HTTP /repo materialization) | COMMENT |
| LOW | src/pull.ts | 1588 | // Step 2: Sync each resource type | COMMENT |
| LOW | src/pull.ts | 1834 | // Step 3: Clean up tombstoned resources | COMMENT |
| LOW | src/pull.ts | 1959 | // Step 4: Deploy CLI built-in skills | COMMENT |
| LOW⚡ | src/__tests__/distilly-roundtrip.test.ts | 35 | // Step 1: the exact deploy call pullSingleSource() makes. | COMMENT |
| LOW⚡ | src/__tests__/distilly-roundtrip.test.ts | 38 | // Step 2: the exact validation call the push path makes on skills. | COMMENT |
| LOW⚡ | src/__tests__/pull-tombstone.test.ts | 709 | // Step 1: Pull as hai role — should get common + hai skills | COMMENT |
| LOW⚡ | src/__tests__/pull-tombstone.test.ts | 716 | // Step 2: Switch to pm role (simulate what `roles set pm` does) | COMMENT |
| LOW | src/__tests__/pull-tombstone.test.ts | 728 | // Step 3: Pull as pm role — should get common + pm, remove hai-only | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 649 | // Step 1: Uninstall everything | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 654 | // Step 2: Verify cleanup — config.yaml should not exist | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 658 | // Step 3: Restore for subsequent tests (uninstall removed the clone) | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 671 | // Step 1: Check if the test repo has a roles manifest | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 678 | // Step 2: Parse available role ids from the output | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 706 | // Step 4: Switch to role B and pull | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 715 | // Step 5: Verify skill count changed (different roles → different skill sets) | COMMENT |
| LOW⚡ | src/__tests__/e2e/e2e.test.ts | 721 | // Step 6: Restore to role A for subsequent tests | COMMENT |
| LOW | src/__tests__/e2e/e2e.test.ts | 693 | // Step 3: Set role A and pull | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …a/wiki/references/methodology/phase2-document-types.md | 213 | ## Type-9: Graph Document Set (Graph RAG) | COMMENT |
| MEDIUM | …ill-data/wiki/references/methodology/phase4-quality.md | 27 | ## RAG Retrieval Test Cases | COMMENT |
| MEDIUM | …ill-data/wiki/references/methodology/phase4-quality.md | 164 | ### Phase 3b Checklist: Graph Document Set (Graph RAG) | COMMENT |
| MEDIUM | …a/wiki/references/methodology/phase3-ai-enhancement.md | 114 | # Graph Document Set (Graph RAG) | COMMENT |
| MEDIUM | skill-data/wiki/references/agents/graph-rag-agent.md | 1 | # Graph RAG Agent | COMMENT |
| MEDIUM | skill-data/wiki/references/agents/graph-rag-agent.md | 265 | # {project_name} Graph Document Set (Graph RAG) | COMMENT |
| MEDIUM | …ill-data/wiki/references/templates/project-overview.md | 122 | ### Graph document set (Graph RAG) | COMMENT |
| MEDIUM | skill-data/wiki/references/phases/k3-ai-native.md | 17 | ### Step 2: Graph RAG graph document set | COMMENT |
| MEDIUM⚡ | skill-data/wiki/references/phases/k4-quality.md | 45 | ### Step 3: RAG retrieval spot check | COMMENT |
| MEDIUM | skill-data/wiki/references/phases/k4-quality.md | 167 | ## RAG Retrieval Spot Check | COMMENT |
| MEDIUM | src/__tests__/copilot-adapter.test.ts | 189 | await fse.writeFile(expectedPath(), native.replace('# Guardrails', '# Updated guardrails')); | CODE |
| MEDIUM | src/__tests__/copilot-adapter.test.ts | 199 | expect(pushed).toContain('# Updated guardrails'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/__tests__/reports-branch-readonly.test.ts | 130 | const orphanAdds = mocks.repoGit.raw.mock.calls.filter(([args]) => (args as string[]).includes('--orphan')); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/__tests__/generic-git-provider.test.ts | 113 | expect(normalizeGitIdentity('Jane Doe')).toBe('Jane-Doe'); | CODE |
| LOW | src/__tests__/iwiki-review-apply.test.ts | 106 | token: 'fake-token', | CODE |
| LOW | src/__tests__/iwiki-review-apply.test.ts | 133 | token: 'fake-token', | CODE |
| LOW⚡ | src/__tests__/gh-org.test.ts | 17 | getGitHubToken: vi.fn().mockReturnValue('fake-token-xyz'), | CODE |
| LOW⚡ | src/__tests__/gh-org.test.ts | 46 | vi.mocked(getGitHubToken).mockReturnValue('fake-token-xyz'); | CODE |
| LOW⚡ | src/__tests__/gh-org.test.ts | 50 | vi.mocked(getGitHubToken).mockReturnValue('fake-token-xyz'); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | skill-data/wiki/scripts/scan_repo.py | 214 | print(f"Error: {repo_path} is not a valid directory", file=sys.stderr) | CODE |
| MEDIUM | skill-data/wiki/scripts/validate_kb.py | 139 | print(f"Error: {kb_dir} is not a valid directory", file=sys.stderr) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skill-data/wiki/scripts/scan_repo.py | 93 | CODE | |
| LOW | skill-data/wiki/scripts/scan_repo.py | 143 | CODE | |
| LOW | skill-data/wiki/scripts/validate_kb.py | 131 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | skill-data/wiki/scripts/validate_kb.py | 22 | CODE | |
| LOW | .github/scripts/erosion-summary.py | 13 | CODE |