opencode-swarm 7.101.0 → 7.102.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.opencode/skills/execute/SKILL.md +1 -0
- package/.opencode/skills/running-tests/SKILL.md +1 -0
- package/.opencode/skills/writing-tests/SKILL.md +1 -0
- package/dist/cli/{guardrail-explain-ma84cj3s.js → guardrail-explain-ea9ja7x8.js} +2 -2
- package/dist/cli/{index-mz3j0me8.js → index-2r26qngd.js} +2 -2
- package/dist/cli/{index-rmh6nqbp.js → index-3v3rq2tq.js} +4 -4
- package/dist/cli/{index-wc8g49dp.js → index-72893pwd.js} +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/index.js +324 -6
- package/dist/lang/symbol-graph.d.ts +2 -0
- package/dist/lang/symbol-visibility.d.ts +38 -0
- package/package.json +1 -1
|
@@ -54,6 +54,7 @@ All other gates: failure → return to coder. No self-fixes. No workarounds.
|
|
|
54
54
|
→ REQUIRED: Print "sast-baseline: [WRITTEN — N fingerprints | MERGED — N fingerprints | SKIPPED — gate disabled | ERROR — details]"
|
|
55
55
|
→ Subsequent `pre_check_batch` calls with `phase: <N>` will automatically diff against this baseline — only NEW findings (not in baseline) drive the fail verdict.
|
|
56
56
|
5b. the active swarm's coder agent - Implement (if designer scaffold produced, include it as INPUT).
|
|
57
|
+
5b-bis. **CODER OUTPUT VERIFICATION**: After the coder reports completion, do NOT accept the self-report alone. Run `diff` (step 5c) and inspect at least one of the modified files yourself to confirm the change exists. The coder may report DONE without having produced any diff. A 30-second read of the changed file(s) catches this failure mode. This is NOT a separate explorer dispatch — the existing `diff` tool at step 5c is the verification mechanism; the key discipline is checking that `diff` returns actual changes before proceeding, rather than forwarding the coder's self-report to the next gate.
|
|
57
58
|
5c. Run `diff` tool. If `hasContractChanges` → the active swarm's explorer agent integration analysis. If COMPATIBILITY SIGNALS=INCOMPATIBLE or MIGRATION_SURFACE=yes → coder retry. If COMPATIBILITY SIGNALS=COMPATIBLE and MIGRATION_SURFACE=no → proceed.
|
|
58
59
|
→ REQUIRED: Print "diff: [PASS | CONTRACT CHANGE — details]"
|
|
59
60
|
5d. Run `syntax_check` tool. SYNTACTIC ERRORS → return to coder. NO ERRORS → proceed to placeholder_scan.
|
|
@@ -137,6 +137,7 @@ Get-Content "$env:TEMP\test_out.txt" | Select-Object -Last 50
|
|
|
137
137
|
- `Select-String -Last N` — invalid parameter, use `Select-Object -Last N`
|
|
138
138
|
- `2>&1 2>&1` — duplicate redirection, causes parse error; use `2>&1` once
|
|
139
139
|
- `&&` — not supported in PowerShell 5.1; use `; if ($?) { cmd2 }` instead
|
|
140
|
+
- `bun test --exec bash` — fails on Windows hosts with ENOENT (bash is not available in standard PowerShell). Use `bun test` directly or a PowerShell-based loop instead.
|
|
140
141
|
- After `bun install --frozen-lockfile --force`, non-elevated Windows shells can hit `EPERM` while reading refreshed `node_modules` entries. Treat that as a host permission/access issue: rerun the same focused Bun command with approved/elevated access before diagnosing it as a code or test failure.
|
|
141
142
|
|
|
142
143
|
---
|
|
@@ -736,6 +736,7 @@ The `--timeout 120000` flag sets per-test timeout to 120 seconds. Individual tes
|
|
|
736
736
|
3. Verify no `process.cwd()` usage — use the `directory` parameter from `createSwarmTool` or hook constructor
|
|
737
737
|
4. Verify no hardcoded paths (`/tmp/...`, `C:\...`) — use `os.tmpdir()` + `path.join()`
|
|
738
738
|
5. Verify mocks are restored in `afterEach` if using `spyOn` or `mock.module`
|
|
739
|
+
6. Run `bunx @biomejs/biome@2.3.14 check --write <touched-test-files>` to auto-format only the files you created or modified. Formatting issues are a common first-pass failure — scoping the command to touched files avoids accidental workspace-wide rewrites.
|
|
739
740
|
|
|
740
741
|
## Known Pre-existing Test Failures
|
|
741
742
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
handleGuardrailExplain
|
|
4
|
-
} from "./index-
|
|
5
|
-
import"./index-
|
|
4
|
+
} from "./index-72893pwd.js";
|
|
5
|
+
import"./index-3v3rq2tq.js";
|
|
6
6
|
import"./index-pj3a5fbt.js";
|
|
7
7
|
import"./index-ydgy7vg5.js";
|
|
8
8
|
import"./index-vwyjkzgs.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
handleGuardrailExplain
|
|
4
|
-
} from "./index-
|
|
4
|
+
} from "./index-72893pwd.js";
|
|
5
5
|
import {
|
|
6
6
|
handleGuardrailLog
|
|
7
7
|
} from "./index-5bstvpct.js";
|
|
@@ -79,7 +79,7 @@ import {
|
|
|
79
79
|
handleWriteRetroCommand,
|
|
80
80
|
normalizeSwarmCommandInput,
|
|
81
81
|
resolveCommand
|
|
82
|
-
} from "./index-
|
|
82
|
+
} from "./index-3v3rq2tq.js";
|
|
83
83
|
import"./index-pj3a5fbt.js";
|
|
84
84
|
import"./index-ydgy7vg5.js";
|
|
85
85
|
import"./index-vwyjkzgs.js";
|
|
@@ -912,7 +912,7 @@ var init_executor = __esm(() => {
|
|
|
912
912
|
// package.json
|
|
913
913
|
var package_default = {
|
|
914
914
|
name: "opencode-swarm",
|
|
915
|
-
version: "7.
|
|
915
|
+
version: "7.102.0",
|
|
916
916
|
description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
|
|
917
917
|
main: "dist/index.js",
|
|
918
918
|
types: "dist/index.d.ts",
|
|
@@ -33362,7 +33362,7 @@ function buildDetailedHelp(commandName, entry) {
|
|
|
33362
33362
|
async function handleHelpCommand(ctx) {
|
|
33363
33363
|
const targetCommand = ctx.args.join(" ");
|
|
33364
33364
|
if (!targetCommand) {
|
|
33365
|
-
const { buildHelpText } = await import("./index-
|
|
33365
|
+
const { buildHelpText } = await import("./index-2r26qngd.js");
|
|
33366
33366
|
return buildHelpText();
|
|
33367
33367
|
}
|
|
33368
33368
|
const tokens = targetCommand.split(/\s+/);
|
|
@@ -33371,7 +33371,7 @@ async function handleHelpCommand(ctx) {
|
|
|
33371
33371
|
return _internals47.buildDetailedHelp(resolved.key, resolved.entry);
|
|
33372
33372
|
}
|
|
33373
33373
|
const similar = _internals47.findSimilarCommands(targetCommand);
|
|
33374
|
-
const { buildHelpText: fullHelp } = await import("./index-
|
|
33374
|
+
const { buildHelpText: fullHelp } = await import("./index-2r26qngd.js");
|
|
33375
33375
|
if (similar.length > 0) {
|
|
33376
33376
|
return `Command '/swarm ${targetCommand}' not found.
|
|
33377
33377
|
|
|
@@ -33504,7 +33504,7 @@ var COMMAND_REGISTRY = {
|
|
|
33504
33504
|
},
|
|
33505
33505
|
"guardrail explain": {
|
|
33506
33506
|
handler: async (ctx) => {
|
|
33507
|
-
const { handleGuardrailExplain } = await import("./guardrail-explain-
|
|
33507
|
+
const { handleGuardrailExplain } = await import("./guardrail-explain-ea9ja7x8.js");
|
|
33508
33508
|
return handleGuardrailExplain(ctx.directory, ctx.args);
|
|
33509
33509
|
},
|
|
33510
33510
|
description: "Dry-run: show what the guardrails would do to a command or write target (executes nothing)",
|
package/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -69,7 +69,7 @@ var package_default;
|
|
|
69
69
|
var init_package = __esm(() => {
|
|
70
70
|
package_default = {
|
|
71
71
|
name: "opencode-swarm",
|
|
72
|
-
version: "7.
|
|
72
|
+
version: "7.102.0",
|
|
73
73
|
description: "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
|
|
74
74
|
main: "dist/index.js",
|
|
75
75
|
types: "dist/index.d.ts",
|
|
@@ -115819,6 +115819,308 @@ import * as fsPromises5 from "node:fs/promises";
|
|
|
115819
115819
|
import * as os20 from "node:os";
|
|
115820
115820
|
import * as path137 from "node:path";
|
|
115821
115821
|
|
|
115822
|
+
// src/lang/symbol-visibility.ts
|
|
115823
|
+
var PUBLIC_INFO = {
|
|
115824
|
+
exported: true,
|
|
115825
|
+
visibility: "public",
|
|
115826
|
+
exportedReason: "top_level_public",
|
|
115827
|
+
apiSurfaceKind: "public"
|
|
115828
|
+
};
|
|
115829
|
+
var PRIVATE_INFO = {
|
|
115830
|
+
exported: false,
|
|
115831
|
+
visibility: "private",
|
|
115832
|
+
exportedReason: "unknown",
|
|
115833
|
+
apiSurfaceKind: "private"
|
|
115834
|
+
};
|
|
115835
|
+
function collectCommonJsExports(source) {
|
|
115836
|
+
const sanitized = maskCommentsAndStrings(source);
|
|
115837
|
+
const exportsByLocal = new Map;
|
|
115838
|
+
const add2 = (localName, exportedName, sourceIndex) => {
|
|
115839
|
+
if (!isIdentifier(localName) || !isIdentifier(exportedName))
|
|
115840
|
+
return;
|
|
115841
|
+
const existing = exportsByLocal.get(localName);
|
|
115842
|
+
if (existing && existing.sourceIndex <= sourceIndex)
|
|
115843
|
+
return;
|
|
115844
|
+
exportsByLocal.set(localName, {
|
|
115845
|
+
localName,
|
|
115846
|
+
exportedName,
|
|
115847
|
+
exportedReason: "explicit_export",
|
|
115848
|
+
sourceIndex
|
|
115849
|
+
});
|
|
115850
|
+
};
|
|
115851
|
+
for (const match of sanitized.matchAll(/\bmodule\s*\.\s*exports\s*=\s*([A-Za-z_$][\w$]*)\b/g)) {
|
|
115852
|
+
add2(match[1], match[1], match.index ?? 0);
|
|
115853
|
+
}
|
|
115854
|
+
for (const match of sanitized.matchAll(/\bmodule\s*\.\s*exports\s*=\s*\{([^}]*)\}/g)) {
|
|
115855
|
+
const body = match[1];
|
|
115856
|
+
const baseIndex = match.index ?? 0;
|
|
115857
|
+
for (const part of body.split(",")) {
|
|
115858
|
+
const entry = part.trim();
|
|
115859
|
+
if (!entry)
|
|
115860
|
+
continue;
|
|
115861
|
+
const alias = entry.match(/^([A-Za-z_$][\w$]*)\s*:\s*([A-Za-z_$][\w$]*)$/);
|
|
115862
|
+
if (alias) {
|
|
115863
|
+
add2(alias[2], alias[1], baseIndex + match[0].indexOf(part));
|
|
115864
|
+
continue;
|
|
115865
|
+
}
|
|
115866
|
+
const shorthand = entry.match(/^([A-Za-z_$][\w$]*)$/);
|
|
115867
|
+
if (shorthand) {
|
|
115868
|
+
add2(shorthand[1], shorthand[1], baseIndex + match[0].indexOf(part));
|
|
115869
|
+
}
|
|
115870
|
+
}
|
|
115871
|
+
}
|
|
115872
|
+
for (const match of sanitized.matchAll(/\b(?:module\s*\.\s*exports|exports)\s*\.\s*([A-Za-z_$][\w$]*)\s*=\s*([A-Za-z_$][\w$]*)\b/g)) {
|
|
115873
|
+
add2(match[2], match[1], match.index ?? 0);
|
|
115874
|
+
}
|
|
115875
|
+
return exportsByLocal;
|
|
115876
|
+
}
|
|
115877
|
+
function collectPythonAllNames(source) {
|
|
115878
|
+
const match = source.match(/__all__\s*=\s*([[({])([\s\S]*?)[\])}]/);
|
|
115879
|
+
if (!match)
|
|
115880
|
+
return null;
|
|
115881
|
+
const body = match[2].trim();
|
|
115882
|
+
if (!body)
|
|
115883
|
+
return new Set;
|
|
115884
|
+
const names = new Set;
|
|
115885
|
+
for (const part of body.split(",")) {
|
|
115886
|
+
const trimmed = part.trim();
|
|
115887
|
+
if (!trimmed)
|
|
115888
|
+
continue;
|
|
115889
|
+
const stringMatch = trimmed.match(/^['"]([^'"]+)['"]$/);
|
|
115890
|
+
if (!stringMatch)
|
|
115891
|
+
return null;
|
|
115892
|
+
names.add(stringMatch[1]);
|
|
115893
|
+
}
|
|
115894
|
+
return names;
|
|
115895
|
+
}
|
|
115896
|
+
function getSymbolVisibilityInfo(ctx) {
|
|
115897
|
+
if (hasPrivateContainer(ctx.defNode))
|
|
115898
|
+
return { ...PRIVATE_INFO };
|
|
115899
|
+
if (ctx.explicitExported || ctx.commonJsExport) {
|
|
115900
|
+
return {
|
|
115901
|
+
exported: true,
|
|
115902
|
+
visibility: "public",
|
|
115903
|
+
exportedReason: "explicit_export",
|
|
115904
|
+
apiSurfaceKind: "export"
|
|
115905
|
+
};
|
|
115906
|
+
}
|
|
115907
|
+
const ownVisibility = visibilityFromText(ctx.grammarId, ctx.defNode.text);
|
|
115908
|
+
if (ctx.kind === "method") {
|
|
115909
|
+
return {
|
|
115910
|
+
exported: false,
|
|
115911
|
+
visibility: ownVisibility,
|
|
115912
|
+
exportedReason: ownVisibility === "unknown" ? "unknown" : "modifier",
|
|
115913
|
+
apiSurfaceKind: ownVisibility === "private" ? "private" : "public"
|
|
115914
|
+
};
|
|
115915
|
+
}
|
|
115916
|
+
if (!ctx.isTopLevel && isMemberLikeNode(ctx.defNode)) {
|
|
115917
|
+
return {
|
|
115918
|
+
exported: false,
|
|
115919
|
+
visibility: ownVisibility === "unknown" ? "public" : ownVisibility,
|
|
115920
|
+
exportedReason: ownVisibility === "unknown" ? "module_public" : "modifier",
|
|
115921
|
+
apiSurfaceKind: ownVisibility === "private" ? "private" : "public"
|
|
115922
|
+
};
|
|
115923
|
+
}
|
|
115924
|
+
if (!ctx.isTopLevel)
|
|
115925
|
+
return { ...PRIVATE_INFO };
|
|
115926
|
+
switch (ctx.grammarId) {
|
|
115927
|
+
case "typescript":
|
|
115928
|
+
case "javascript":
|
|
115929
|
+
case "tsx":
|
|
115930
|
+
return { ...PRIVATE_INFO };
|
|
115931
|
+
case "python":
|
|
115932
|
+
return pythonVisibility(ctx);
|
|
115933
|
+
case "rust":
|
|
115934
|
+
return rustVisibility(ctx);
|
|
115935
|
+
case "go":
|
|
115936
|
+
return isUppercasePublic(ctx.localName) ? {
|
|
115937
|
+
...PUBLIC_INFO,
|
|
115938
|
+
exportedReason: "naming_convention"
|
|
115939
|
+
} : { ...PRIVATE_INFO };
|
|
115940
|
+
case "java":
|
|
115941
|
+
case "kotlin":
|
|
115942
|
+
case "csharp":
|
|
115943
|
+
case "swift":
|
|
115944
|
+
case "php":
|
|
115945
|
+
return modifierLanguageVisibility(ctx);
|
|
115946
|
+
case "cpp":
|
|
115947
|
+
return cppVisibility(ctx);
|
|
115948
|
+
case "dart":
|
|
115949
|
+
return ctx.localName.startsWith("_") ? { ...PRIVATE_INFO } : { ...PUBLIC_INFO, exportedReason: "naming_convention" };
|
|
115950
|
+
case "ruby":
|
|
115951
|
+
return ctx.localName.startsWith("_") ? { ...PRIVATE_INFO } : { ...PUBLIC_INFO, exportedReason: "module_public" };
|
|
115952
|
+
default:
|
|
115953
|
+
return {
|
|
115954
|
+
exported: false,
|
|
115955
|
+
visibility: "unknown",
|
|
115956
|
+
exportedReason: "unknown",
|
|
115957
|
+
apiSurfaceKind: "unknown"
|
|
115958
|
+
};
|
|
115959
|
+
}
|
|
115960
|
+
}
|
|
115961
|
+
function pythonVisibility(ctx) {
|
|
115962
|
+
if (ctx.pythonAllNames) {
|
|
115963
|
+
return ctx.pythonAllNames.has(ctx.localName) ? {
|
|
115964
|
+
exported: true,
|
|
115965
|
+
visibility: "public",
|
|
115966
|
+
exportedReason: "module_public",
|
|
115967
|
+
apiSurfaceKind: "public"
|
|
115968
|
+
} : { ...PRIVATE_INFO };
|
|
115969
|
+
}
|
|
115970
|
+
return ctx.localName.startsWith("_") ? { ...PRIVATE_INFO } : { ...PUBLIC_INFO, exportedReason: "naming_convention" };
|
|
115971
|
+
}
|
|
115972
|
+
function rustVisibility(ctx) {
|
|
115973
|
+
const text = ctx.defNode.text.trimStart();
|
|
115974
|
+
if (!/^pub\b|^pub\s*\(/.test(text))
|
|
115975
|
+
return { ...PRIVATE_INFO };
|
|
115976
|
+
const internal = /^pub\s*\(\s*(crate|super|in\b)/.test(text);
|
|
115977
|
+
return {
|
|
115978
|
+
exported: true,
|
|
115979
|
+
visibility: internal ? "internal" : "public",
|
|
115980
|
+
exportedReason: "modifier",
|
|
115981
|
+
apiSurfaceKind: "public"
|
|
115982
|
+
};
|
|
115983
|
+
}
|
|
115984
|
+
function modifierLanguageVisibility(ctx) {
|
|
115985
|
+
if (ctx.grammarId === "php" && ctx.localName.startsWith("_")) {
|
|
115986
|
+
return { ...PRIVATE_INFO };
|
|
115987
|
+
}
|
|
115988
|
+
const visibility = visibilityFromText(ctx.grammarId, ctx.defNode.text);
|
|
115989
|
+
if (visibility === "private")
|
|
115990
|
+
return { ...PRIVATE_INFO };
|
|
115991
|
+
if (visibility === "unknown") {
|
|
115992
|
+
const defaultVisibility = ctx.grammarId === "java" ? "package" : defaultModuleVisibility(ctx.grammarId);
|
|
115993
|
+
return {
|
|
115994
|
+
exported: true,
|
|
115995
|
+
visibility: defaultVisibility,
|
|
115996
|
+
exportedReason: "module_public",
|
|
115997
|
+
apiSurfaceKind: "public"
|
|
115998
|
+
};
|
|
115999
|
+
}
|
|
116000
|
+
return {
|
|
116001
|
+
exported: true,
|
|
116002
|
+
visibility,
|
|
116003
|
+
exportedReason: "modifier",
|
|
116004
|
+
apiSurfaceKind: "public"
|
|
116005
|
+
};
|
|
116006
|
+
}
|
|
116007
|
+
function cppVisibility(ctx) {
|
|
116008
|
+
const text = ctx.defNode.text.trimStart();
|
|
116009
|
+
if (/^static\b/.test(text) || ctx.localName.startsWith("_")) {
|
|
116010
|
+
return { ...PRIVATE_INFO };
|
|
116011
|
+
}
|
|
116012
|
+
return {
|
|
116013
|
+
exported: true,
|
|
116014
|
+
visibility: "public",
|
|
116015
|
+
exportedReason: "namespace_public",
|
|
116016
|
+
apiSurfaceKind: "public"
|
|
116017
|
+
};
|
|
116018
|
+
}
|
|
116019
|
+
function visibilityFromText(grammarId, text) {
|
|
116020
|
+
const normalized = declarationPrefix(text).trimStart();
|
|
116021
|
+
if (/\b(private|fileprivate)\b/.test(normalized))
|
|
116022
|
+
return "private";
|
|
116023
|
+
if (/\bprotected\b/.test(normalized))
|
|
116024
|
+
return "protected";
|
|
116025
|
+
if (/\binternal\b/.test(normalized))
|
|
116026
|
+
return "internal";
|
|
116027
|
+
if (/\b(public|open)\b/.test(normalized))
|
|
116028
|
+
return "public";
|
|
116029
|
+
if (grammarId === "rust" && /^pub\s*\(\s*(crate|super|in\b)/.test(normalized)) {
|
|
116030
|
+
return "internal";
|
|
116031
|
+
}
|
|
116032
|
+
if (grammarId === "rust" && /^pub\b|^pub\s*\(/.test(normalized)) {
|
|
116033
|
+
return "public";
|
|
116034
|
+
}
|
|
116035
|
+
return "unknown";
|
|
116036
|
+
}
|
|
116037
|
+
function declarationPrefix(text) {
|
|
116038
|
+
const bodyStart = text.search(/[{\n]/);
|
|
116039
|
+
return bodyStart === -1 ? text : text.slice(0, bodyStart);
|
|
116040
|
+
}
|
|
116041
|
+
function defaultModuleVisibility(grammarId) {
|
|
116042
|
+
switch (grammarId) {
|
|
116043
|
+
case "kotlin":
|
|
116044
|
+
case "swift":
|
|
116045
|
+
case "csharp":
|
|
116046
|
+
return "internal";
|
|
116047
|
+
case "php":
|
|
116048
|
+
return "public";
|
|
116049
|
+
default:
|
|
116050
|
+
return "public";
|
|
116051
|
+
}
|
|
116052
|
+
}
|
|
116053
|
+
function hasPrivateContainer(node) {
|
|
116054
|
+
let current = node.parent;
|
|
116055
|
+
while (current) {
|
|
116056
|
+
if (isContainerNode(current) && visibilityFromText("", current.text) === "private") {
|
|
116057
|
+
return true;
|
|
116058
|
+
}
|
|
116059
|
+
current = current.parent;
|
|
116060
|
+
}
|
|
116061
|
+
return false;
|
|
116062
|
+
}
|
|
116063
|
+
function isContainerNode(node) {
|
|
116064
|
+
return /(?:class|struct|interface|object|protocol|namespace|module)/.test(node.type);
|
|
116065
|
+
}
|
|
116066
|
+
function isMemberLikeNode(node) {
|
|
116067
|
+
return /(?:method|function)_declaration|function_definition/.test(node.type);
|
|
116068
|
+
}
|
|
116069
|
+
function isUppercasePublic(name) {
|
|
116070
|
+
return /^[A-Z]/.test(name);
|
|
116071
|
+
}
|
|
116072
|
+
function isIdentifier(value) {
|
|
116073
|
+
return /^[A-Za-z_$][\w$]*$/.test(value);
|
|
116074
|
+
}
|
|
116075
|
+
function maskCommentsAndStrings(source) {
|
|
116076
|
+
const chars = [...source];
|
|
116077
|
+
let i = 0;
|
|
116078
|
+
while (i < chars.length) {
|
|
116079
|
+
const ch = chars[i];
|
|
116080
|
+
const next = chars[i + 1];
|
|
116081
|
+
if (ch === "/" && next === "/") {
|
|
116082
|
+
chars[i++] = " ";
|
|
116083
|
+
chars[i++] = " ";
|
|
116084
|
+
while (i < chars.length && chars[i] !== `
|
|
116085
|
+
`)
|
|
116086
|
+
chars[i++] = " ";
|
|
116087
|
+
continue;
|
|
116088
|
+
}
|
|
116089
|
+
if (ch === "/" && next === "*") {
|
|
116090
|
+
chars[i++] = " ";
|
|
116091
|
+
chars[i++] = " ";
|
|
116092
|
+
while (i < chars.length) {
|
|
116093
|
+
const end = chars[i] === "*" && chars[i + 1] === "/";
|
|
116094
|
+
chars[i++] = " ";
|
|
116095
|
+
if (end) {
|
|
116096
|
+
chars[i++] = " ";
|
|
116097
|
+
break;
|
|
116098
|
+
}
|
|
116099
|
+
}
|
|
116100
|
+
continue;
|
|
116101
|
+
}
|
|
116102
|
+
if (ch === '"' || ch === "'" || ch === "`") {
|
|
116103
|
+
const quote = ch;
|
|
116104
|
+
chars[i++] = " ";
|
|
116105
|
+
while (i < chars.length) {
|
|
116106
|
+
if (chars[i] === "\\") {
|
|
116107
|
+
chars[i++] = " ";
|
|
116108
|
+
if (i < chars.length)
|
|
116109
|
+
chars[i++] = " ";
|
|
116110
|
+
continue;
|
|
116111
|
+
}
|
|
116112
|
+
const done = chars[i] === quote;
|
|
116113
|
+
chars[i++] = " ";
|
|
116114
|
+
if (done)
|
|
116115
|
+
break;
|
|
116116
|
+
}
|
|
116117
|
+
continue;
|
|
116118
|
+
}
|
|
116119
|
+
i++;
|
|
116120
|
+
}
|
|
116121
|
+
return chars.join("");
|
|
116122
|
+
}
|
|
116123
|
+
|
|
115822
116124
|
// src/lang/symbol-graph.ts
|
|
115823
116125
|
var _QueryCtor = null;
|
|
115824
116126
|
var AST_TIMEOUT_MS = 500;
|
|
@@ -116198,6 +116500,8 @@ function buildFacts(tree, qs, grammarId) {
|
|
|
116198
116500
|
if (cap)
|
|
116199
116501
|
exportNodes.push(asTs(cap.node));
|
|
116200
116502
|
}
|
|
116503
|
+
const commonJsExports = isEsMGrammar(grammarId) ? collectCommonJsExports(root.text) : new Map;
|
|
116504
|
+
const pythonAllNames = grammarId === "python" ? collectPythonAllNames(root.text) : null;
|
|
116201
116505
|
const defs = [];
|
|
116202
116506
|
const defNodes = [];
|
|
116203
116507
|
const defNameKeys = new Set;
|
|
@@ -116208,10 +116512,11 @@ function buildFacts(tree, qs, grammarId) {
|
|
|
116208
116512
|
continue;
|
|
116209
116513
|
const kindKey = defCap.name.replace(/\.def$/, "");
|
|
116210
116514
|
const kind = CAPTURE_KIND[kindKey] ?? "function";
|
|
116211
|
-
|
|
116212
|
-
|
|
116515
|
+
const originalDefNode = asTs(defCap.node);
|
|
116516
|
+
let defNode = originalDefNode;
|
|
116517
|
+
const explicitExported = exportNodes.some((en) => isNodeInside(en, defNode));
|
|
116213
116518
|
let isDefaultExport = false;
|
|
116214
|
-
if (
|
|
116519
|
+
if (explicitExported && isEsMGrammar(grammarId)) {
|
|
116215
116520
|
isDefaultExport = exportNodes.some((en) => isNodeInside(en, defNode) && isDefaultExportStatement(en));
|
|
116216
116521
|
}
|
|
116217
116522
|
if (grammarId === "dart" && defNode.type === "function_signature") {
|
|
@@ -116230,11 +116535,24 @@ function buildFacts(tree, qs, grammarId) {
|
|
|
116230
116535
|
for (const nc of nameCaps) {
|
|
116231
116536
|
const nameNode = asTs(nc.node);
|
|
116232
116537
|
const localName = nameNode.text;
|
|
116233
|
-
const
|
|
116538
|
+
const commonJsExport = commonJsExports.get(localName);
|
|
116539
|
+
const visibilityInfo = getSymbolVisibilityInfo({
|
|
116540
|
+
grammarId,
|
|
116541
|
+
localName,
|
|
116542
|
+
kind,
|
|
116543
|
+
defNode: originalDefNode,
|
|
116544
|
+
rootNode: root,
|
|
116545
|
+
isTopLevel: isTopLevelDef(originalDefNode, root),
|
|
116546
|
+
explicitExported,
|
|
116547
|
+
commonJsExport,
|
|
116548
|
+
pythonAllNames
|
|
116549
|
+
});
|
|
116550
|
+
const exportedName = isDefaultExport ? "default" : commonJsExport?.exportedName ?? localName;
|
|
116234
116551
|
defs.push({
|
|
116235
116552
|
name: exportedName,
|
|
116236
116553
|
kind,
|
|
116237
|
-
exported,
|
|
116554
|
+
exported: visibilityInfo.exported,
|
|
116555
|
+
visibilityInfo,
|
|
116238
116556
|
startLine: defNode.startPosition.row + 1,
|
|
116239
116557
|
endLine: defNode.endPosition.row + 1
|
|
116240
116558
|
});
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import { type SymbolVisibilityInfo } from './symbol-visibility';
|
|
1
2
|
export interface FileSymbolFacts {
|
|
2
3
|
defs: Array<{
|
|
3
4
|
name: string;
|
|
4
5
|
kind: 'function' | 'class' | 'const' | 'type' | 'interface' | 'enum' | 'method';
|
|
5
6
|
exported: boolean;
|
|
7
|
+
visibilityInfo?: SymbolVisibilityInfo;
|
|
6
8
|
startLine: number;
|
|
7
9
|
endLine: number;
|
|
8
10
|
}>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const SYMBOL_VISIBILITY_VALUES: readonly ["public", "internal", "protected", "private", "package", "unknown"];
|
|
2
|
+
export type SymbolVisibility = (typeof SYMBOL_VISIBILITY_VALUES)[number];
|
|
3
|
+
export declare const SYMBOL_EXPORTED_REASON_VALUES: readonly ["explicit_export", "top_level_public", "naming_convention", "modifier", "header_declaration", "namespace_public", "module_public", "unknown"];
|
|
4
|
+
export type SymbolExportedReason = (typeof SYMBOL_EXPORTED_REASON_VALUES)[number];
|
|
5
|
+
export declare const SYMBOL_API_SURFACE_KIND_VALUES: readonly ["export", "public", "entrypoint", "test", "private", "unknown"];
|
|
6
|
+
export type SymbolApiSurfaceKind = (typeof SYMBOL_API_SURFACE_KIND_VALUES)[number];
|
|
7
|
+
export interface SymbolVisibilityInfo {
|
|
8
|
+
exported: boolean;
|
|
9
|
+
visibility: SymbolVisibility;
|
|
10
|
+
exportedReason: SymbolExportedReason;
|
|
11
|
+
apiSurfaceKind: SymbolApiSurfaceKind;
|
|
12
|
+
}
|
|
13
|
+
export interface SymbolVisibilityNode {
|
|
14
|
+
type: string;
|
|
15
|
+
text: string;
|
|
16
|
+
parent: SymbolVisibilityNode | null;
|
|
17
|
+
children: Array<SymbolVisibilityNode | null>;
|
|
18
|
+
}
|
|
19
|
+
export interface CommonJsExportInfo {
|
|
20
|
+
localName: string;
|
|
21
|
+
exportedName: string;
|
|
22
|
+
exportedReason: 'explicit_export';
|
|
23
|
+
sourceIndex: number;
|
|
24
|
+
}
|
|
25
|
+
export interface SymbolVisibilityContext {
|
|
26
|
+
grammarId: string;
|
|
27
|
+
localName: string;
|
|
28
|
+
kind: 'function' | 'class' | 'const' | 'type' | 'interface' | 'enum' | 'method';
|
|
29
|
+
defNode: SymbolVisibilityNode;
|
|
30
|
+
rootNode: SymbolVisibilityNode;
|
|
31
|
+
isTopLevel: boolean;
|
|
32
|
+
explicitExported: boolean;
|
|
33
|
+
commonJsExport?: CommonJsExportInfo;
|
|
34
|
+
pythonAllNames?: Set<string> | null;
|
|
35
|
+
}
|
|
36
|
+
export declare function collectCommonJsExports(source: string): Map<string, CommonJsExportInfo>;
|
|
37
|
+
export declare function collectPythonAllNames(source: string): Set<string> | null;
|
|
38
|
+
export declare function getSymbolVisibilityInfo(ctx: SymbolVisibilityContext): SymbolVisibilityInfo;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opencode-swarm",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.102.0",
|
|
4
4
|
"description": "Architect-centric agentic swarm plugin for OpenCode - hub-and-spoke orchestration with SME consultation, code generation, and QA review",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|