diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ea70d3..01302a2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,17 @@
All notable changes to FixMap are documented here.
+## 0.7.0 - 2026-07-22
+
+### Added
+
+- Added bounded, explainable definition-site ranking for distinctive task identifiers and exact code or literal fragments, including truncated literals from issue excerpts.
+- Added focused regressions for exact literal extraction, generic-identifier noise, and definition-site ranking.
+
+### Changed
+
+- Improved the frozen six-repository evaluation from 50% / 83% / 83% top-1/3/5 to 67% / 100% / 100%. The unchanged Zod #5944 case now ranks its fixing `regexes.ts` file first.
+
## 0.6.2 - 2026-07-22
### Security
diff --git a/README.md b/README.md
index 777f527..2ba72ce 100644
--- a/README.md
+++ b/README.md
@@ -151,7 +151,7 @@ jobs:
with:
fetch-depth: 0
- id: fixmap
- uses: aryamthecodebreaker/FixMap@v0.6.2
+ uses: aryamthecodebreaker/FixMap@v0.7.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
```
@@ -189,7 +189,7 @@ npm run evaluate
The current suite covers Action failures, invalid diffs, authentication, the web demo, workspace test routing, and contributor documentation. The cases and full ranked results are visible in [`benchmarks/`](benchmarks).
-A separate cross-repository evaluation runs FixMap against six real, already-fixed issues in permissively licensed repositories (Express, Axios, debug, ky, Zod, Pino) pinned to exact commits, and reports honest top-1/3/5 hit rates — currently 50% / 83% / 83%. The dataset, methodology, ranked outputs, and remaining Zod miss live in [`benchmarks/external/`](benchmarks/external); a scheduled workflow reruns it weekly.
+A separate cross-repository evaluation runs FixMap against six real, already-fixed issues in permissively licensed repositories (Express, Axios, debug, ky, Zod, Pino) pinned to exact commits, and reports honest top-1/3/5 hit rates — currently 67% / 100% / 100%. The frozen dataset, methodology, and every ranked output live in [`benchmarks/external/`](benchmarks/external); a scheduled workflow reruns it weekly.
## Repository layout
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx
index 85968f7..dc678e8 100644
--- a/apps/web/app/page.tsx
+++ b/apps/web/app/page.tsx
@@ -64,7 +64,7 @@ export default function HomePage() {
Explore the GitHub repo ↗
Open the video
-
Original product film · 1280×720 · sound on · current release v0.6.2
+ Original product film · 1280×720 · sound on · current release v0.7.0
= MAX_EXACT_FRAGMENTS) {
+ break;
+ }
+ }
+ }
+ return [...fragments];
+}
+function extractIdentifiers(text) {
+ const identifiers = /* @__PURE__ */ new Set();
+ for (const match of text.matchAll(IDENTIFIER_PATTERN)) {
+ const identifier = match[0];
+ if (isDistinctiveIdentifier(identifier)) {
+ addIdentifier(identifiers, identifier);
+ }
+ }
+ for (const quoted of scanQuotedFragments(text)) {
+ if (quoted.delimiter !== "`") {
+ continue;
+ }
+ const fragment = quoted.value.trim();
+ if (!/^[$A-Za-z_][$A-Za-z0-9_]*$/.test(fragment.trim())) {
+ continue;
+ }
+ if (!isDistinctiveIdentifier(fragment) && fragment.length < 8) {
+ continue;
+ }
+ for (const match of fragment.matchAll(IDENTIFIER_PATTERN)) {
+ addIdentifier(identifiers, match[0]);
+ }
+ }
+ return identifiers;
+}
+function addIdentifier(identifiers, identifier) {
+ if (identifiers.size >= MAX_IDENTIFIERS || STOP_WORDS.has(identifier.toLowerCase())) {
+ return;
+ }
+ identifiers.add(identifier);
+}
+function isDistinctiveIdentifier(identifier) {
+ return /[0-9_$]/.test(identifier) || /[a-z][A-Z]/.test(identifier);
+}
+function isDistinctiveFragment(fragment) {
+ if (fragment.length < 6 || fragment.length > 96 || /\s/.test(fragment)) {
+ return false;
+ }
+ const punctuationCount = [...fragment].filter((character) => /[^A-Za-z0-9_$]/.test(character)).length;
+ return punctuationCount >= 2 && /[A-Za-z0-9]/.test(fragment);
+}
+function scanQuotedFragments(text) {
+ const fragments = [];
+ for (const line of text.split(/\r?\n/)) {
+ let cursor = 0;
+ while (cursor < line.length) {
+ const delimiter = line[cursor];
+ if (delimiter !== '"' && delimiter !== "'" && delimiter !== "`") {
+ cursor += 1;
+ continue;
+ }
+ let end = cursor + 1;
+ while (end < line.length) {
+ if (line[end] === delimiter && !isEscaped(line, end)) {
+ break;
+ }
+ end += 1;
+ }
+ fragments.push({ delimiter, value: line.slice(cursor + 1, end) });
+ cursor = end < line.length ? end + 1 : line.length;
+ }
+ }
+ return fragments;
+}
+function isEscaped(text, index) {
+ let backslashes = 0;
+ for (let cursor = index - 1; cursor >= 0 && text[cursor] === "\\"; cursor -= 1) {
+ backslashes += 1;
+ }
+ return backslashes % 2 === 1;
+}
function extractFileMentions(text) {
const mentions = /* @__PURE__ */ new Set();
for (const match of text.matchAll(FILE_MENTION_PATTERN)) {
@@ -345,6 +435,9 @@ var MAX_PROXIMITY_SEEDS = 5;
var IMPORT_PROXIMITY_BOOSTS = { 1: 4, 2: 2 };
var EXAMPLE_CODE_PENALTY = 2;
var TYPE_DECLARATION_PENALTY = 4;
+var DEFINITION_IDENTIFIER_BOOST = 4;
+var DEFINITION_LITERAL_BOOST = 8;
+var MAX_DEFINITION_IDENTIFIERS = 2;
function rankContextFiles(repo, input, limit = 8) {
const signals = extractTaskSignals({
issueText: input.issueText ?? "",
@@ -356,6 +449,7 @@ function rankContextFiles(repo, input, limit = 8) {
const candidates = repo.files.filter((file) => mentionedPaths.has(file.path) || file.isSource && !file.isTest && !LOCKFILES.has(file.path.split("/").pop() ?? "") && (!file.path.startsWith("benchmarks/") || taskTargetsEvaluation));
const contentTokensByPath = new Map(candidates.map((file) => [file.path, tokenizeText(file.textSample)]));
const commonTokens = findCommonTokens(contentTokensByPath);
+ const definitionSignals = buildDefinitionSignals(signals.identifiers);
const taskTargetsDocumentation = hasAny(signals.tokens, ["docs", "documentation", "readme", "guide", "copy"]);
const taskTargetsConfiguration = hasAny(signals.tokens, ["config", "configuration", "workflow", "action", "ci", "yaml"]);
const taskTargetsDeployment = hasAny(signals.tokens, DEPLOYMENT_TERMS);
@@ -386,6 +480,16 @@ function rankContextFiles(repo, input, limit = 8) {
score += Math.min(contentOverlap.length, 8) * 2;
reasons.push(`content matches task terms: ${contentOverlap.slice(0, 8).join(", ")}`);
}
+ const definedIdentifiers = findDefinedIdentifiers(file.textSample, definitionSignals).slice(0, MAX_DEFINITION_IDENTIFIERS);
+ if (definedIdentifiers.length > 0) {
+ score += definedIdentifiers.length * DEFINITION_IDENTIFIER_BOOST;
+ reasons.push(`defines task identifiers: ${definedIdentifiers.join(", ")}`);
+ }
+ const definitionFragment = signals.exactFragments.find((fragment) => hasExactFragmentAtDefinition(file.textSample, fragment, definedIdentifiers));
+ if (definitionFragment) {
+ score += DEFINITION_LITERAL_BOOST;
+ reasons.push(`exact task literal at definition: ${previewFragment(definitionFragment)}`);
+ }
if (isNearbyChangedFile(file.path, repo.changedFiles)) {
score += 2;
reasons.push("near changed file");
@@ -512,6 +616,34 @@ function isAuxiliaryCodePath(path) {
function isTypeDeclarationPath(path) {
return /\.d\.(?:ts|mts|cts)$/i.test(path);
}
+function buildDefinitionSignals(identifiers) {
+ return [...identifiers].sort((a, b) => a.localeCompare(b)).map((identifier) => ({
+ identifier,
+ pattern: new RegExp(`\\b(?:export\\s+)?(?:async\\s+)?(?:const|let|var|function|class|interface|type|enum|def|fn|struct|trait)\\s+${escapeRegExp(identifier)}\\b`)
+ }));
+}
+function findDefinedIdentifiers(text, signals) {
+ return signals.filter((signal) => signal.pattern.test(text)).map((signal) => signal.identifier);
+}
+function hasExactFragmentAtDefinition(text, fragment, definedIdentifiers) {
+ let index = text.indexOf(fragment);
+ while (index !== -1) {
+ const prefix = text.slice(Math.max(0, index - 240), index);
+ const namesNearby = definedIdentifiers.some((identifier) => prefix.includes(identifier));
+ const assignmentNearby = /\b(?:const|let|var)\s+[$A-Za-z_][$A-Za-z0-9_]*(?:\s*:[^=\r\n]+)?\s*=\s*[/("'`]?\s*$/.test(prefix);
+ if (namesNearby || assignmentNearby) {
+ return true;
+ }
+ index = text.indexOf(fragment, index + fragment.length);
+ }
+ return false;
+}
+function previewFragment(fragment) {
+ return fragment.length <= 40 ? fragment : `${fragment.slice(0, 37)}...`;
+}
+function escapeRegExp(value) {
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+}
function findCommonTokens(contentTokensByPath) {
const fileCount = contentTokensByPath.size;
if (fileCount < 4) {
diff --git a/packages/action/package.json b/packages/action/package.json
index e6eba9e..053a0ca 100644
--- a/packages/action/package.json
+++ b/packages/action/package.json
@@ -1,6 +1,6 @@
{
"name": "@fixmap/action",
- "version": "0.6.2",
+ "version": "0.7.0",
"description": "GitHub Action wrapper for FixMap pull request reports.",
"private": true,
"license": "MIT",
@@ -10,6 +10,6 @@
"typecheck": "tsc -p tsconfig.json --noEmit"
},
"dependencies": {
- "@aryam/fixmap-core": "0.6.2"
+ "@aryam/fixmap-core": "0.7.0"
}
}
diff --git a/packages/cli/package.json b/packages/cli/package.json
index ad04733..097190d 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@aryam/fixmap",
- "version": "0.6.2",
+ "version": "0.7.0",
"mcpName": "io.github.aryamthecodebreaker/fixmap",
"description": "Local-first CLI and MCP server mapping GitHub issue URLs, tasks, and diffs to ranked files, tests, and risks.",
"license": "MIT",
@@ -40,7 +40,7 @@
"typecheck": "tsc -p tsconfig.json --noEmit"
},
"dependencies": {
- "@aryam/fixmap-core": "0.6.2",
+ "@aryam/fixmap-core": "0.7.0",
"@modelcontextprotocol/sdk": "1.29.0"
},
"engines": {
diff --git a/packages/core/package.json b/packages/core/package.json
index 1dec406..5125c34 100644
--- a/packages/core/package.json
+++ b/packages/core/package.json
@@ -1,6 +1,6 @@
{
"name": "@aryam/fixmap-core",
- "version": "0.6.2",
+ "version": "0.7.0",
"description": "Deterministic local-first repository scanner, context ranker, and report renderer for coding agents.",
"license": "MIT",
"repository": {
diff --git a/packages/core/src/rank.ts b/packages/core/src/rank.ts
index 5d04438..97e73c0 100644
--- a/packages/core/src/rank.ts
+++ b/packages/core/src/rank.ts
@@ -19,8 +19,12 @@ const MAX_PROXIMITY_SEEDS = 5;
const IMPORT_PROXIMITY_BOOSTS: Record = { 1: 4, 2: 2 };
const EXAMPLE_CODE_PENALTY = 2;
const TYPE_DECLARATION_PENALTY = 4;
+const DEFINITION_IDENTIFIER_BOOST = 4;
+const DEFINITION_LITERAL_BOOST = 8;
+const MAX_DEFINITION_IDENTIFIERS = 2;
type ScoredFile = { path: string; score: number; isChanged: boolean; reasons: string[] };
+type DefinitionSignal = { identifier: string; pattern: RegExp };
export function rankContextFiles(
repo: RepoMap,
@@ -44,6 +48,7 @@ export function rankContextFiles(
);
const contentTokensByPath = new Map(candidates.map((file) => [file.path, tokenizeText(file.textSample)]));
const commonTokens = findCommonTokens(contentTokensByPath);
+ const definitionSignals = buildDefinitionSignals(signals.identifiers);
const taskTargetsDocumentation = hasAny(signals.tokens, ["docs", "documentation", "readme", "guide", "copy"]);
const taskTargetsConfiguration = hasAny(signals.tokens, ["config", "configuration", "workflow", "action", "ci", "yaml"]);
const taskTargetsDeployment = hasAny(signals.tokens, DEPLOYMENT_TERMS);
@@ -84,6 +89,21 @@ export function rankContextFiles(
reasons.push(`content matches task terms: ${contentOverlap.slice(0, 8).join(", ")}`);
}
+ const definedIdentifiers = findDefinedIdentifiers(file.textSample, definitionSignals)
+ .slice(0, MAX_DEFINITION_IDENTIFIERS);
+ if (definedIdentifiers.length > 0) {
+ score += definedIdentifiers.length * DEFINITION_IDENTIFIER_BOOST;
+ reasons.push(`defines task identifiers: ${definedIdentifiers.join(", ")}`);
+ }
+
+ const definitionFragment = signals.exactFragments.find((fragment) =>
+ hasExactFragmentAtDefinition(file.textSample, fragment, definedIdentifiers)
+ );
+ if (definitionFragment) {
+ score += DEFINITION_LITERAL_BOOST;
+ reasons.push(`exact task literal at definition: ${previewFragment(definitionFragment)}`);
+ }
+
if (isNearbyChangedFile(file.path, repo.changedFiles)) {
score += 2;
reasons.push("near changed file");
@@ -253,6 +273,45 @@ function isTypeDeclarationPath(path: string): boolean {
return /\.d\.(?:ts|mts|cts)$/i.test(path);
}
+function buildDefinitionSignals(identifiers: Set): DefinitionSignal[] {
+ return [...identifiers]
+ .sort((a, b) => a.localeCompare(b))
+ .map((identifier) => ({
+ identifier,
+ pattern: new RegExp(
+ `\\b(?:export\\s+)?(?:async\\s+)?(?:const|let|var|function|class|interface|type|enum|def|fn|struct|trait)\\s+${escapeRegExp(identifier)}\\b`
+ )
+ }));
+}
+
+function findDefinedIdentifiers(text: string, signals: DefinitionSignal[]): string[] {
+ return signals.filter((signal) => signal.pattern.test(text)).map((signal) => signal.identifier);
+}
+
+function hasExactFragmentAtDefinition(text: string, fragment: string, definedIdentifiers: string[]): boolean {
+ let index = text.indexOf(fragment);
+ while (index !== -1) {
+ const prefix = text.slice(Math.max(0, index - 240), index);
+ const namesNearby = definedIdentifiers.some((identifier) =>
+ prefix.includes(identifier)
+ );
+ const assignmentNearby = /\b(?:const|let|var)\s+[$A-Za-z_][$A-Za-z0-9_]*(?:\s*:[^=\r\n]+)?\s*=\s*[/("'`]?\s*$/.test(prefix);
+ if (namesNearby || assignmentNearby) {
+ return true;
+ }
+ index = text.indexOf(fragment, index + fragment.length);
+ }
+ return false;
+}
+
+function previewFragment(fragment: string): string {
+ return fragment.length <= 40 ? fragment : `${fragment.slice(0, 37)}...`;
+}
+
+function escapeRegExp(value: string): string {
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
+}
+
function findCommonTokens(contentTokensByPath: Map>): Set {
const fileCount = contentTokensByPath.size;
if (fileCount < 4) {
diff --git a/packages/core/src/signals.ts b/packages/core/src/signals.ts
index 67bf34e..7f532df 100644
--- a/packages/core/src/signals.ts
+++ b/packages/core/src/signals.ts
@@ -137,11 +137,16 @@ const STOP_WORDS = new Set([
]);
const FILE_MENTION_PATTERN = /[A-Za-z0-9_@$][A-Za-z0-9_.$/\\-]*\.[A-Za-z][A-Za-z0-9]*/g;
+const IDENTIFIER_PATTERN = /[A-Za-z_$][A-Za-z0-9_$]{4,}/g;
+const MAX_EXACT_FRAGMENTS = 8;
+const MAX_IDENTIFIERS = 24;
export type TaskSignals = {
tokens: Set;
changedFiles: Set;
fileMentions: Set;
+ exactFragments: string[];
+ identifiers: Set;
};
export function extractTaskSignals(input: {
@@ -149,15 +154,118 @@ export function extractTaskSignals(input: {
diffText?: string | undefined;
changedFiles?: string[];
}): TaskSignals {
- const tokens = tokenizeText([input.issueText ?? "", extractDiffContentLines(input.diffText ?? "")].join("\n"));
+ const taskText = [input.issueText ?? "", extractDiffContentLines(input.diffText ?? "")].join("\n");
+ const tokens = tokenizeText(taskText);
return {
tokens,
changedFiles: new Set(input.changedFiles ?? []),
- fileMentions: extractFileMentions(input.issueText ?? "")
+ fileMentions: extractFileMentions(input.issueText ?? ""),
+ exactFragments: extractExactFragments(taskText),
+ identifiers: extractIdentifiers(taskText)
};
}
+export function extractExactFragments(text: string): string[] {
+ const fragments = new Set();
+
+ for (const quoted of scanQuotedFragments(text)) {
+ const fragment = quoted.value.trim();
+ if (isDistinctiveFragment(fragment)) {
+ fragments.add(fragment);
+ if (fragments.size >= MAX_EXACT_FRAGMENTS) {
+ break;
+ }
+ }
+ }
+
+ return [...fragments];
+}
+
+export function extractIdentifiers(text: string): Set {
+ const identifiers = new Set();
+
+ for (const match of text.matchAll(IDENTIFIER_PATTERN)) {
+ const identifier = match[0];
+ if (isDistinctiveIdentifier(identifier)) {
+ addIdentifier(identifiers, identifier);
+ }
+ }
+
+ for (const quoted of scanQuotedFragments(text)) {
+ if (quoted.delimiter !== "`") {
+ continue;
+ }
+ const fragment = quoted.value.trim();
+ if (!/^[$A-Za-z_][$A-Za-z0-9_]*$/.test(fragment.trim())) {
+ continue;
+ }
+ if (!isDistinctiveIdentifier(fragment) && fragment.length < 8) {
+ continue;
+ }
+ for (const match of fragment.matchAll(IDENTIFIER_PATTERN)) {
+ addIdentifier(identifiers, match[0]);
+ }
+ }
+
+ return identifiers;
+}
+
+function addIdentifier(identifiers: Set, identifier: string): void {
+ if (identifiers.size >= MAX_IDENTIFIERS || STOP_WORDS.has(identifier.toLowerCase())) {
+ return;
+ }
+ identifiers.add(identifier);
+}
+
+function isDistinctiveIdentifier(identifier: string): boolean {
+ return /[0-9_$]/.test(identifier) || /[a-z][A-Z]/.test(identifier);
+}
+
+function isDistinctiveFragment(fragment: string): boolean {
+ if (fragment.length < 6 || fragment.length > 96 || /\s/.test(fragment)) {
+ return false;
+ }
+ const punctuationCount = [...fragment].filter((character) => /[^A-Za-z0-9_$]/.test(character)).length;
+ return punctuationCount >= 2 && /[A-Za-z0-9]/.test(fragment);
+}
+
+function scanQuotedFragments(text: string): Array<{ delimiter: string; value: string }> {
+ const fragments: Array<{ delimiter: string; value: string }> = [];
+
+ for (const line of text.split(/\r?\n/)) {
+ let cursor = 0;
+ while (cursor < line.length) {
+ const delimiter = line[cursor];
+ if (delimiter !== '"' && delimiter !== "'" && delimiter !== "`") {
+ cursor += 1;
+ continue;
+ }
+
+ let end = cursor + 1;
+ while (end < line.length) {
+ if (line[end] === delimiter && !isEscaped(line, end)) {
+ break;
+ }
+ end += 1;
+ }
+
+ fragments.push({ delimiter, value: line.slice(cursor + 1, end) });
+ cursor = end < line.length ? end + 1 : line.length;
+ }
+ }
+
+ return fragments;
+}
+
+function isEscaped(text: string, index: number): boolean {
+ let backslashes = 0;
+ for (let cursor = index - 1; cursor >= 0 && text[cursor] === "\\"; cursor -= 1) {
+ backslashes += 1;
+ }
+ return backslashes % 2 === 1;
+}
+
export function extractFileMentions(text: string): Set {
const mentions = new Set();
diff --git a/packages/core/test/rank.test.ts b/packages/core/test/rank.test.ts
index d351d59..07d2ba9 100644
--- a/packages/core/test/rank.test.ts
+++ b/packages/core/test/rank.test.ts
@@ -49,6 +49,45 @@ describe("rankContextFiles", () => {
expect(ranked[0]?.reasons.some((reason) => reason.startsWith("content matches task terms"))).toBe(true);
});
+ it("boosts an exact literal at the definition of a task identifier", () => {
+ const repo: RepoMap = {
+ root: "/repo",
+ packageScripts: [],
+ changedFiles: [],
+ diffText: "",
+ packageManager: "npm",
+ diagnostics: [],
+ files: [
+ {
+ path: "src/schema-consumer.ts",
+ extension: ".ts",
+ sizeBytes: 100,
+ isSource: true,
+ isTest: false,
+ kind: "code",
+ textSample: "export function toJsonSchema() { return { format: 'cidrv6', pattern: cidrPattern }; }"
+ },
+ {
+ path: "src/regexes.ts",
+ extension: ".ts",
+ sizeBytes: 100,
+ isSource: true,
+ isTest: false,
+ kind: "code",
+ textSample: "export const cidrv6: RegExp =\n /^(([0-9a-fA-F]{1,4}:){7})$/;"
+ }
+ ]
+ };
+
+ const ranked = rankContextFiles(repo, {
+ issueText: 'cidrv6 JSON schema emits the wrong pattern: "^(([0-9a-fA-F]{1"'
+ });
+
+ expect(ranked[0]?.path).toBe("src/regexes.ts");
+ expect(ranked[0]?.reasons).toContain("defines task identifiers: cidrv6");
+ expect(ranked[0]?.reasons.some((reason) => reason.startsWith("exact task literal at definition"))).toBe(true);
+ });
+
it("ignores tokens that appear in most files in the repo", () => {
const boilerplate = "import { widget } from 'widget';";
const repo: RepoMap = {
diff --git a/packages/core/test/signals.test.ts b/packages/core/test/signals.test.ts
index 3a6234f..5bd670c 100644
--- a/packages/core/test/signals.test.ts
+++ b/packages/core/test/signals.test.ts
@@ -55,4 +55,24 @@ describe("extractTaskSignals", () => {
expect(signals.tokens.has("doe")).toBe(false);
expect(signals.tokens.has("but")).toBe(false);
});
+
+ it("keeps bounded code-shaped identifiers and an unterminated exact literal", () => {
+ const signals = extractTaskSignals({
+ issueText: 'cidrv6 fails after safeParse(); ignore generic `level`\n// "pattern": "^(([0-9a-fA-F]{1'
+ });
+
+ expect(signals.identifiers).toContain("cidrv6");
+ expect(signals.identifiers).toContain("safeParse");
+ expect(signals.identifiers).not.toContain("level");
+ expect(signals.exactFragments).toContain("^(([0-9a-fA-F]{1");
+ });
+
+ it("caps definition signals for large task descriptions", () => {
+ const identifiers = Array.from({ length: 40 }, (_, index) => `signalName${index}`).join(" ");
+ const fragments = Array.from({ length: 20 }, (_, index) => `"^literal-${index}$"`).join(" ");
+ const signals = extractTaskSignals({ issueText: `${identifiers}\n${fragments}` });
+
+ expect(signals.identifiers.size).toBe(24);
+ expect(signals.exactFragments).toHaveLength(8);
+ });
});
diff --git a/server.json b/server.json
index 3e84230..f0cfc82 100644
--- a/server.json
+++ b/server.json
@@ -6,12 +6,12 @@
"url": "https://github.com/aryamthecodebreaker/FixMap",
"source": "github"
},
- "version": "0.6.2",
+ "version": "0.7.0",
"packages": [
{
"registryType": "npm",
"identifier": "@aryam/fixmap",
- "version": "0.6.2",
+ "version": "0.7.0",
"transport": {
"type": "stdio"
},