opencode-swarm 7.119.0 → 7.120.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.
Files changed (74) hide show
  1. package/dist/cli/{config-doctor-p73yfdz0.js → config-doctor-404c8mf8.js} +3 -3
  2. package/dist/cli/config-fingerprint-v22xh5a2.js +10 -0
  3. package/dist/cli/{core-gf1t2jmn.js → core-xnwasfpc.js} +1 -1
  4. package/dist/cli/curation-policy-re2kaysb.js +25 -0
  5. package/dist/cli/{curator-5xfkejsq.js → curator-852s9p0s.js} +30 -23
  6. package/dist/cli/{curator-drift-nn71xfz6.js → curator-drift-6b2fjsgr.js} +3 -2
  7. package/dist/cli/curator-llm-factory-5gnvggd7.js +50 -0
  8. package/dist/cli/{evidence-summary-service-cy3k37je.js → evidence-summary-service-jtx5q3r6.js} +9 -7
  9. package/dist/cli/{gate-evidence-j2m4cd85.js → gate-evidence-tbpezk28.js} +5 -5
  10. package/dist/cli/guardrail-explain-wadbhh06.js +51 -0
  11. package/dist/cli/{guardrail-log-qjqgg7pz.js → guardrail-log-dhpp0kmn.js} +4 -4
  12. package/dist/cli/{hive-promoter-03m8pwg6.js → hive-promoter-7fn55bgw.js} +30 -23
  13. package/dist/cli/index-0e1v02hq.js +343 -0
  14. package/dist/cli/{index-jbdgpqpj.js → index-0k4r8111.js} +28 -10
  15. package/dist/cli/index-0mbmfmt0.js +349 -0
  16. package/dist/cli/{index-7pspktns.js → index-1smvzr78.js} +2 -2
  17. package/dist/cli/{index-5bcrp3bc.js → index-22e127jw.js} +3 -3
  18. package/dist/cli/{index-pjhfe7c3.js → index-3366gs26.js} +43 -7
  19. package/dist/cli/{index-wpgv6hht.js → index-3jvqw5hy.js} +13 -26
  20. package/dist/cli/{index-bfwt3abw.js → index-4rhcth7a.js} +1 -1
  21. package/dist/cli/{index-n6fa2hhk.js → index-51gg9947.js} +1 -1
  22. package/dist/cli/index-69ms9ny1.js +261 -0
  23. package/dist/cli/{index-42cx6g2h.js → index-76kvm9z5.js} +1 -1
  24. package/dist/cli/{index-r2ysfdet.js → index-78b192v7.js} +7 -7
  25. package/dist/cli/{index-vwvkpg0d.js → index-816rkp4y.js} +3 -92
  26. package/dist/cli/index-89s4mhmw.js +6 -0
  27. package/dist/cli/index-9xpgytj9.js +386 -0
  28. package/dist/cli/index-ae75rja9.js +26 -0
  29. package/dist/cli/{index-mr3pnc4h.js → index-bndd885n.js} +1926 -2005
  30. package/dist/cli/index-fndvr7fr.js +135 -0
  31. package/dist/cli/index-gnp9x6se.js +93 -0
  32. package/dist/cli/{index-0pfqcjp6.js → index-h07wn84h.js} +1 -1
  33. package/dist/cli/{index-p45sshb5.js → index-j5xv8zbp.js} +17 -352
  34. package/dist/cli/{index-g2wrs7jy.js → index-kyvg2cmp.js} +1 -1
  35. package/dist/cli/{index-5hze8ztj.js → index-nhgw7de8.js} +7 -5
  36. package/dist/cli/{index-abjjn4yh.js → index-qg11yf8q.js} +4 -4
  37. package/dist/cli/index-rtry5xyf.js +27 -0
  38. package/dist/cli/{index-qx5z58a7.js → index-rywkdacj.js} +93 -11
  39. package/dist/cli/{index-pdk1n8yh.js → index-tftv9xh9.js} +44 -2
  40. package/dist/cli/{index-11q1t6g0.js → index-vqcgmy4y.js} +1 -1
  41. package/dist/cli/{index-05ee8pws.js → index-w64n2y0f.js} +32 -25
  42. package/dist/cli/{index-q4kgsvdd.js → index-wtn8wf7h.js} +1 -1
  43. package/dist/cli/{index-bcg89pt8.js → index-zvae4m8g.js} +1 -1
  44. package/dist/cli/index.js +30 -23
  45. package/dist/cli/{knowledge-escalator-gt1q632m.js → knowledge-escalator-0ejqs8c9.js} +9 -8
  46. package/dist/cli/{knowledge-events-0bjdtdsb.js → knowledge-events-wx9e37ba.js} +6 -5
  47. package/dist/cli/knowledge-link-sy85fw3w.js +37 -0
  48. package/dist/cli/{knowledge-store-fm2300xf.js → knowledge-store-rnajx33a.js} +17 -6
  49. package/dist/cli/{knowledge-validator-91kx3eqv.js → knowledge-validator-1f4mkzmc.js} +11 -7
  50. package/dist/cli/{pending-delegations-9cn17983.js → pending-delegations-0z3znsec.js} +5 -5
  51. package/dist/cli/{pr-subscriptions-8a6jwek2.js → pr-subscriptions-x653151h.js} +4 -4
  52. package/dist/cli/scan-cursor-qapm0sxj.js +25 -0
  53. package/dist/cli/{schema-7c484wjz.js → schema-vwxpsk6j.js} +2 -2
  54. package/dist/cli/{scope-persistence-fm0gzhnk.js → scope-persistence-mfr36yc9.js} +2 -2
  55. package/dist/cli/{skill-generator-3f8dqjj2.js → skill-generator-tkv7s12g.js} +12 -9
  56. package/dist/config/schema.d.ts +8 -8
  57. package/dist/hooks/curator-postmortem.d.ts +6 -4
  58. package/dist/hooks/curator.d.ts +5 -1
  59. package/dist/hooks/hive-promoter.d.ts +3 -1
  60. package/dist/hooks/knowledge-store.d.ts +54 -1
  61. package/dist/hooks/knowledge-types.d.ts +107 -2
  62. package/dist/hooks/knowledge-validator.d.ts +25 -4
  63. package/dist/index.js +387 -384
  64. package/dist/knowledge/curation-policy.d.ts +125 -0
  65. package/dist/knowledge/family-manifest.d.ts +30 -2
  66. package/dist/knowledge/family-migration.d.ts +16 -4
  67. package/dist/knowledge/scan-cursor.d.ts +107 -0
  68. package/dist/knowledge/worktree-identity.d.ts +39 -0
  69. package/dist/memory/schema.d.ts +1 -1
  70. package/dist/services/knowledge-diagnostics.d.ts +29 -0
  71. package/package.json +1 -1
  72. package/dist/cli/curator-llm-factory-rwwnmdvk.js +0 -43
  73. package/dist/cli/guardrail-explain-kacpc2zm.js +0 -44
  74. /package/dist/cli/{index-vvk2g744.js → index-7g4c7s5r.js} +0 -0
@@ -0,0 +1,261 @@
1
+ // @bun
2
+ import {
3
+ cohortConfigFingerprint
4
+ } from "./index-rtry5xyf.js";
5
+ import {
6
+ readKnowledgeEvents
7
+ } from "./index-nhgw7de8.js";
8
+ import {
9
+ isLinked,
10
+ readLinkPointer,
11
+ resolveKnowledgeStoreDir,
12
+ resolveLinkDir
13
+ } from "./index-3jvqw5hy.js";
14
+
15
+ // src/knowledge/curation-policy.ts
16
+ import { appendFile, mkdir as mkdir2, readFile as readFile2 } from "fs/promises";
17
+ import * as path2 from "path";
18
+
19
+ // src/knowledge/worktree-identity.ts
20
+ import { randomUUID } from "crypto";
21
+ import { existsSync } from "fs";
22
+ import { mkdir, readFile, writeFile } from "fs/promises";
23
+ import * as path from "path";
24
+ var WORKTREE_ID_FILENAME = "worktree-id.json";
25
+ var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
26
+ function readValidatedId(raw) {
27
+ const parsed = JSON.parse(raw);
28
+ if (parsed && typeof parsed.worktree_id === "string" && UUID_RE.test(parsed.worktree_id)) {
29
+ return parsed.worktree_id;
30
+ }
31
+ return;
32
+ }
33
+ var _internals = {
34
+ readFile,
35
+ writeFile,
36
+ existsSync,
37
+ mkdir,
38
+ randomUUID
39
+ };
40
+ async function resolveWorktreeId(directory) {
41
+ const dir = path.normalize(path.resolve(directory, ".swarm"));
42
+ const idPath = path.join(dir, WORKTREE_ID_FILENAME);
43
+ let repairInvalidFile = false;
44
+ try {
45
+ if (_internals.existsSync(idPath)) {
46
+ const raw = await _internals.readFile(idPath, "utf-8");
47
+ const validated = readValidatedId(raw);
48
+ if (validated !== undefined) {
49
+ return validated;
50
+ }
51
+ repairInvalidFile = true;
52
+ }
53
+ } catch {}
54
+ const newId = _internals.randomUUID();
55
+ try {
56
+ await _internals.mkdir(dir, { recursive: true });
57
+ const record = {
58
+ worktree_id: newId,
59
+ created_at: new Date().toISOString()
60
+ };
61
+ const payload = `${JSON.stringify(record, null, 2)}
62
+ `;
63
+ if (repairInvalidFile) {
64
+ await _internals.writeFile(idPath, payload, {
65
+ encoding: "utf-8",
66
+ flag: "w"
67
+ });
68
+ } else {
69
+ try {
70
+ await _internals.writeFile(idPath, payload, {
71
+ encoding: "utf-8",
72
+ flag: "wx"
73
+ });
74
+ } catch (err) {
75
+ if (err?.code === "EEXIST" || _internals.existsSync(idPath)) {
76
+ const raw = await _internals.readFile(idPath, "utf-8");
77
+ const validated = readValidatedId(raw);
78
+ if (validated !== undefined) {
79
+ return validated;
80
+ }
81
+ }
82
+ throw err;
83
+ }
84
+ }
85
+ } catch {}
86
+ return newId;
87
+ }
88
+
89
+ // src/knowledge/curation-policy.ts
90
+ var DEFAULT_QUORUM = { minCohortEvidence: 3 };
91
+ async function authorizeCuration(input, context, quorum = DEFAULT_QUORUM) {
92
+ const { directory, action, entryId } = input;
93
+ const proposal = {
94
+ entryId,
95
+ action,
96
+ reason: input.reason,
97
+ evidenceScope: input.evidenceScope,
98
+ proposedAt: new Date().toISOString(),
99
+ status: "pending"
100
+ };
101
+ const persistProposal = (p) => {
102
+ queueMicrotask(async () => {
103
+ try {
104
+ const storeDir = _internals2.resolveKnowledgeStoreDir(directory);
105
+ await mkdir2(storeDir, { recursive: true });
106
+ await appendFile(path2.join(storeDir, "curation-proposals.jsonl"), `${JSON.stringify(p)}
107
+ `, "utf-8");
108
+ } catch {}
109
+ });
110
+ };
111
+ const linked = _internals2.isLinked(directory);
112
+ if (linked) {
113
+ const currentFp = _internals2.cohortConfigFingerprint(buildConfigFingerprintInput(context.config));
114
+ const cohortFp = await _internals2.readCohortConfigFingerprint(directory);
115
+ if (cohortFp !== null && currentFp !== cohortFp) {
116
+ persistProposal(proposal);
117
+ return {
118
+ authorized: false,
119
+ basis: "config-mismatch",
120
+ detail: `Cohort config fingerprint mismatch: this worktree (${currentFp}) differs ` + `from the cohort (${cohortFp}). Cohort members will curate with different ` + `semantics. Align knowledge config across linked worktrees before destructive ` + `curation.`,
121
+ proposal
122
+ };
123
+ }
124
+ }
125
+ const entry = context.entry;
126
+ if (!entry) {
127
+ persistProposal(proposal);
128
+ return {
129
+ authorized: false,
130
+ basis: "entry-not-found",
131
+ detail: `Entry ${entryId} not found in the store.`,
132
+ proposal
133
+ };
134
+ }
135
+ if (input.override?.actor === "manual-override" && input.override.reason) {
136
+ return {
137
+ authorized: true,
138
+ basis: "override",
139
+ detail: `Operator override: ${input.override.reason}`,
140
+ expectedRevision: entry.revision,
141
+ expectedContentHash: entry.content_hash
142
+ };
143
+ }
144
+ if (!linked) {
145
+ return {
146
+ authorized: true,
147
+ basis: "config-skipped-unlinked",
148
+ detail: `Worktree is not cohort-linked; local curation is permitted ` + `(no cross-worktree safety concern).`,
149
+ expectedRevision: entry.revision,
150
+ expectedContentHash: entry.content_hash
151
+ };
152
+ }
153
+ if (entry.producer == null) {
154
+ persistProposal(proposal);
155
+ return {
156
+ authorized: false,
157
+ basis: "protected-unknown-owner",
158
+ detail: `Entry ${entryId} has no producer provenance (legacy). Destructive ` + `action is protected by default; recorded as a proposal. An audited ` + `override is required to force it.`,
159
+ proposal
160
+ };
161
+ }
162
+ const actorWorktreeId = input.actorWorktreeId ?? await _internals2.resolveWorktreeId(directory);
163
+ if (entry.producer.worktree_id === actorWorktreeId) {
164
+ return {
165
+ authorized: true,
166
+ basis: "owner",
167
+ detail: `Acting worktree is the proven producer of entry ${entryId}; ` + `owner-scoped ${input.evidenceScope} evidence authorized.`,
168
+ expectedRevision: entry.revision,
169
+ expectedContentHash: entry.content_hash
170
+ };
171
+ }
172
+ if (input.evidenceScope === "local-session") {
173
+ persistProposal(proposal);
174
+ return {
175
+ authorized: false,
176
+ basis: "not-owner-local-evidence",
177
+ detail: `Entry ${entryId} is owned by worktree ${entry.producer.worktree_id}; ` + `the acting worktree (${actorWorktreeId}) has only local-session ` + `evidence. Absence of local evidence is not negative evidence; ` + `recorded as a proposal. Use cohort-wide evidence or an override.`,
178
+ proposal
179
+ };
180
+ }
181
+ if (input.evidenceScope === "cohort-wide") {
182
+ const events = await _internals2.readKnowledgeEvents(directory);
183
+ const NEGATIVE_EVENT_TYPES = new Set(["violated", "contradicted"]);
184
+ const entryEvents = events.filter((e) => ("type" in e) && NEGATIVE_EVENT_TYPES.has(e.type ?? "") && ("knowledge_id" in e) && e.knowledge_id === entryId);
185
+ const cohortEvidence = entryEvents.length;
186
+ if (cohortEvidence >= quorum.minCohortEvidence) {
187
+ return {
188
+ authorized: true,
189
+ basis: "quorum",
190
+ detail: `Cohort quorum met for entry ${entryId}: ${cohortEvidence} ` + `cohort-wide evidence events (\u2265 ${quorum.minCohortEvidence} required).`,
191
+ expectedRevision: entry.revision,
192
+ expectedContentHash: entry.content_hash
193
+ };
194
+ }
195
+ persistProposal(proposal);
196
+ return {
197
+ authorized: false,
198
+ basis: "quorum-insufficient",
199
+ detail: `Cohort quorum NOT met for entry ${entryId}: ${cohortEvidence} ` + `cohort-wide evidence events (< ${quorum.minCohortEvidence} required).`,
200
+ proposal
201
+ };
202
+ }
203
+ persistProposal(proposal);
204
+ return {
205
+ authorized: false,
206
+ basis: "not-owner-local-evidence",
207
+ detail: `Entry ${entryId} is owned by worktree ${entry.producer.worktree_id}; ` + `the acting worktree (${actorWorktreeId}) is not the producer and ` + `has not supplied cohort-wide quorum evidence.`,
208
+ proposal
209
+ };
210
+ }
211
+ function buildConfigFingerprintInput(config) {
212
+ return {
213
+ dedup_threshold: config.dedup_threshold,
214
+ scope_filter: config.scope_filter,
215
+ validation_enabled: config.validation_enabled,
216
+ evergreen_confidence: config.evergreen_confidence,
217
+ evergreen_utility: config.evergreen_utility,
218
+ low_utility_threshold: config.low_utility_threshold,
219
+ default_max_phases: config.default_max_phases,
220
+ todo_max_phases: config.todo_max_phases,
221
+ confidence_floor_action: config.confidence_floor_action,
222
+ contradiction_threshold_action: config.contradiction_threshold_action,
223
+ contradiction_quarantine_threshold: config.contradiction_quarantine_threshold,
224
+ schema_version: config.schema_version,
225
+ swarm_max_entries: config.swarm_max_entries,
226
+ retrieval: {
227
+ mmr_lambda: config.retrieval?.mmr_lambda,
228
+ cold_start_bonus: config.retrieval?.cold_start_bonus,
229
+ synonym_min_cooccurrence: config.retrieval?.synonym_min_cooccurrence
230
+ }
231
+ };
232
+ }
233
+ async function readCohortConfigFingerprint(directory) {
234
+ if (!_internals2.isLinked(directory))
235
+ return null;
236
+ const pointer = _internals2.readLinkPointer(directory);
237
+ if (!pointer?.linkId)
238
+ return null;
239
+ const linkDir = _internals2.resolveLinkDir(pointer.linkId);
240
+ const cohortConfigPath = path2.join(linkDir, "cohort-config.json");
241
+ try {
242
+ const raw = await _internals2.readFile(cohortConfigPath, "utf-8");
243
+ const parsed = JSON.parse(raw);
244
+ return typeof parsed.fingerprint === "string" ? parsed.fingerprint : null;
245
+ } catch {
246
+ return null;
247
+ }
248
+ }
249
+ var _internals2 = {
250
+ resolveWorktreeId,
251
+ readKnowledgeEvents,
252
+ cohortConfigFingerprint,
253
+ readCohortConfigFingerprint,
254
+ readFile: readFile2,
255
+ isLinked,
256
+ readLinkPointer,
257
+ resolveLinkDir,
258
+ resolveKnowledgeStoreDir
259
+ };
260
+
261
+ export { authorizeCuration, buildConfigFingerprintInput, readCohortConfigFingerprint, _internals2 as _internals };
@@ -4,7 +4,7 @@ import {
4
4
  } from "./index-q2rrv0cy.js";
5
5
  import {
6
6
  require_proper_lockfile
7
- } from "./index-vvk2g744.js";
7
+ } from "./index-7g4c7s5r.js";
8
8
  import {
9
9
  __toESM
10
10
  } from "./index-a76rekgs.js";
@@ -2,21 +2,21 @@
2
2
  import {
3
3
  ALLOWED_SKILL_PATH_PREFIXES,
4
4
  validateSkillPath
5
- } from "./index-pjhfe7c3.js";
6
- import {
7
- effectiveRetrievalOutcomes,
8
- readKnowledgeCounterRollups
9
- } from "./index-5hze8ztj.js";
5
+ } from "./index-3366gs26.js";
10
6
  import {
11
7
  computeOutcomeSignal,
12
8
  readKnowledge,
13
9
  resolveHiveKnowledgePath,
14
10
  resolveSwarmKnowledgePath,
15
11
  transactKnowledge
16
- } from "./index-qx5z58a7.js";
12
+ } from "./index-rywkdacj.js";
13
+ import {
14
+ effectiveRetrievalOutcomes,
15
+ readKnowledgeCounterRollups
16
+ } from "./index-nhgw7de8.js";
17
17
  import {
18
18
  isActiveStatus
19
- } from "./index-bfwt3abw.js";
19
+ } from "./index-4rhcth7a.js";
20
20
  import {
21
21
  advisoryWarn
22
22
  } from "./index-ye3fndsw.js";
@@ -1,104 +1,15 @@
1
1
  // @bun
2
+ import {
3
+ validateSpecContent
4
+ } from "./index-gnp9x6se.js";
2
5
  import {
3
6
  advisoryWarn
4
7
  } from "./index-ye3fndsw.js";
5
- import {
6
- exports_external
7
- } from "./index-293f68mj.js";
8
8
 
9
9
  // src/sdd/effective-spec.ts
10
10
  import { createHash } from "crypto";
11
11
  import * as fs from "fs";
12
12
  import * as path from "path";
13
-
14
- // src/config/spec-schema.ts
15
- var ObligationSchema = exports_external.enum(["MUST", "SHALL", "SHOULD", "MAY"]);
16
- var SpecRequirementSchema = exports_external.object({
17
- id: exports_external.string().regex(/^FR-(?!000)\d{3}$/, "Requirement ID must match FR-### pattern (e.g., FR-001)"),
18
- obligation: ObligationSchema,
19
- text: exports_external.string().min(1)
20
- });
21
- var SpecScenarioSchema = exports_external.object({
22
- name: exports_external.string().min(1),
23
- given: exports_external.array(exports_external.string()).optional().default([]),
24
- when: exports_external.array(exports_external.string()).min(1, 'Scenario must have at least one "when" clause'),
25
- thenClauses: exports_external.array(exports_external.string()).min(1, 'Scenario must have at least one "then" clause')
26
- });
27
- var SpecSectionSchema = exports_external.object({
28
- name: exports_external.string().min(1),
29
- requirements: exports_external.array(SpecRequirementSchema).default([])
30
- });
31
- var SwarmSpecSchema = exports_external.object({
32
- title: exports_external.string().min(1),
33
- purpose: exports_external.string().min(1),
34
- sections: exports_external.array(SpecSectionSchema).min(1, "Spec must have at least one section")
35
- });
36
- var SpecDeltaSchema = exports_external.object({
37
- added: exports_external.array(SpecRequirementSchema).default([]),
38
- modified: exports_external.array(SpecRequirementSchema).default([]),
39
- removed: exports_external.array(SpecRequirementSchema).default([])
40
- });
41
- var DeltaSpecSchema = exports_external.union([
42
- SwarmSpecSchema,
43
- SpecDeltaSchema
44
- ]);
45
- var FENCED_BLOCK_PATTERN = /```[\s\S]*?```/g;
46
- var INLINE_CODE_PATTERN = /`[^`]*`/g;
47
- var FR_ID_PATTERN = /\bFR-\d{3}\b/g;
48
- var OBLIGATION_PATTERN = /\b(MUST|SHALL|SHOULD|MAY)\b/g;
49
- var SECTION_HEADER_PATTERN = /^##\s+.+$/gm;
50
- function stripCodeBlocks(content) {
51
- return content.replace(FENCED_BLOCK_PATTERN, "").replace(INLINE_CODE_PATTERN, "");
52
- }
53
- function getLineNumber(content, position) {
54
- const prefix = content.substring(0, position);
55
- return (prefix.match(/\n/g) || []).length + 1;
56
- }
57
- function validateSpecContent(content) {
58
- const issues = [];
59
- if (!content || content.trim().length === 0) {
60
- return { valid: false, issues: [{ line: 1, message: "Content is empty" }] };
61
- }
62
- const strippedContent = stripCodeBlocks(content);
63
- const frMatches = strippedContent.match(FR_ID_PATTERN);
64
- if (!frMatches || frMatches.length === 0) {
65
- issues.push({
66
- line: 1,
67
- message: "No FR-### requirement IDs found in spec content"
68
- });
69
- }
70
- const obligationMatches = strippedContent.match(OBLIGATION_PATTERN);
71
- if (!obligationMatches || obligationMatches.length === 0) {
72
- issues.push({
73
- line: 1,
74
- message: "No obligation keywords (MUST, SHALL, SHOULD, MAY) found in spec content"
75
- });
76
- }
77
- const sectionMatches = strippedContent.match(SECTION_HEADER_PATTERN);
78
- if (!sectionMatches || sectionMatches.length === 0) {
79
- issues.push({
80
- line: 1,
81
- message: "No section headers (## Section Name) found in spec content"
82
- });
83
- }
84
- const idMatches = strippedContent.matchAll(/\bFR-(\d{3})\b/g);
85
- for (const idMatch of idMatches) {
86
- const num = parseInt(idMatch[1], 10);
87
- if (num === 0) {
88
- const pos = idMatch.index;
89
- issues.push({
90
- line: getLineNumber(strippedContent, pos),
91
- message: `Invalid FR-ID "${idMatch[0]}" \u2014 number must be 001-999`
92
- });
93
- }
94
- }
95
- return {
96
- valid: issues.length === 0,
97
- issues
98
- };
99
- }
100
-
101
- // src/sdd/effective-spec.ts
102
13
  var SWARM_SPEC_REL = path.join(".swarm", "spec.md");
103
14
  var OPENSPEC_ROOT = "openspec";
104
15
  var SPECKIT_MARKER = ".specify";
@@ -0,0 +1,6 @@
1
+ // @bun
2
+ import {
3
+ require_proper_lockfile
4
+ } from "./index-7g4c7s5r.js";
5
+ import"./index-a76rekgs.js";
6
+ export default require_proper_lockfile();