@iq-context/core 0.1.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/dist/capture.d.ts +5 -0
- package/dist/capture.js +138 -0
- package/dist/capture.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +85 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +1 -0
- package/dist/discovery.js +18 -0
- package/dist/discovery.js.map +1 -0
- package/dist/doctor.d.ts +2 -0
- package/dist/doctor.js +166 -0
- package/dist/doctor.js.map +1 -0
- package/dist/find.d.ts +2 -0
- package/dist/find.js +137 -0
- package/dist/find.js.map +1 -0
- package/dist/go.d.ts +2 -0
- package/dist/go.js +31 -0
- package/dist/go.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +13 -0
- package/dist/init.js +481 -0
- package/dist/init.js.map +1 -0
- package/dist/persistence.d.ts +6 -0
- package/dist/persistence.js +32 -0
- package/dist/persistence.js.map +1 -0
- package/dist/save.d.ts +2 -0
- package/dist/save.js +61 -0
- package/dist/save.js.map +1 -0
- package/dist/staleness.d.ts +9 -0
- package/dist/staleness.js +272 -0
- package/dist/staleness.js.map +1 -0
- package/dist/state.d.ts +18 -0
- package/dist/state.js +176 -0
- package/dist/state.js.map +1 -0
- package/dist/status.d.ts +2 -0
- package/dist/status.js +18 -0
- package/dist/status.js.map +1 -0
- package/dist/trackedArtifacts.d.ts +12 -0
- package/dist/trackedArtifacts.js +138 -0
- package/dist/trackedArtifacts.js.map +1 -0
- package/dist/types.d.ts +276 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workstream.d.ts +28 -0
- package/dist/workstream.js +119 -0
- package/dist/workstream.js.map +1 -0
- package/dist/wrap.d.ts +2 -0
- package/dist/wrap.js +257 -0
- package/dist/wrap.js.map +1 -0
- package/package.json +20 -0
package/dist/go.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { listRecentCaptures } from "./capture.js";
|
|
2
|
+
import { loadProjectConfig } from "./config.js";
|
|
3
|
+
import { loadResumeState, loadWorkstreamState, resolveProjectRoot, resolveTargetWorkstream, updateFocusAfterGo, } from "./state.js";
|
|
4
|
+
import { refreshStaleness } from "./staleness.js";
|
|
5
|
+
import { resolveTrackedArtifacts } from "./trackedArtifacts.js";
|
|
6
|
+
export function buildGoBriefing(options) {
|
|
7
|
+
const projectRoot = resolveProjectRoot(options.startDir, options.projectRoot);
|
|
8
|
+
const config = loadProjectConfig(projectRoot);
|
|
9
|
+
const workstreamId = resolveTargetWorkstream(projectRoot, options.workstreamId);
|
|
10
|
+
const workstreamState = loadWorkstreamState(projectRoot, workstreamId);
|
|
11
|
+
const resumeState = loadResumeState(projectRoot, workstreamId);
|
|
12
|
+
const recentCaptures = listRecentCaptures(projectRoot, workstreamId);
|
|
13
|
+
const trackedArtifacts = resolveTrackedArtifacts(projectRoot, config.tracked_artifacts);
|
|
14
|
+
updateFocusAfterGo(projectRoot, workstreamState, resumeState);
|
|
15
|
+
const staleResult = refreshStaleness(projectRoot, workstreamId, trackedArtifacts);
|
|
16
|
+
return {
|
|
17
|
+
projectRoot,
|
|
18
|
+
mode: options.mode ?? config.default_briefing_mode,
|
|
19
|
+
projectState: staleResult.projectState,
|
|
20
|
+
workstreamState,
|
|
21
|
+
resumeState,
|
|
22
|
+
trackedArtifacts: {
|
|
23
|
+
configuredPatterns: [...config.tracked_artifacts],
|
|
24
|
+
resolvedPaths: trackedArtifacts.map((artifact) => artifact.relativePath),
|
|
25
|
+
},
|
|
26
|
+
recentCaptures,
|
|
27
|
+
warnings: [...staleResult.staleness.warnings, ...staleResult.staleness.mismatchFlags],
|
|
28
|
+
staleness: staleResult.staleness,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=go.js.map
|
package/dist/go.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../src/go.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,MAAM,UAAU,eAAe,CAAC,OAAkB;IAChD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,uBAAuB,CAAC,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,mBAAmB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvE,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,kBAAkB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAExF,kBAAkB,CAAC,WAAW,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAElF,OAAO;QACL,WAAW;QACX,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,qBAAqB;QAClD,YAAY,EAAE,WAAW,CAAC,YAAY;QACtC,eAAe;QACf,WAAW;QACX,gBAAgB,EAAE;YAChB,kBAAkB,EAAE,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC;YACjD,aAAa,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;SACzE;QACD,cAAc;QACd,QAAQ,EAAE,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC;QACrF,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { discoverProjectRoot } from "./discovery.js";
|
|
2
|
+
export { captureMaterial, getCaptureLogPath, listProjectAndWorkstreamCaptures, listRecentCaptures } from "./capture.js";
|
|
3
|
+
export { runDoctor } from "./doctor.js";
|
|
4
|
+
export { findInProject } from "./find.js";
|
|
5
|
+
export { buildGoBriefing } from "./go.js";
|
|
6
|
+
export { loadProjectConfig, parseProjectConfigFile } from "./config.js";
|
|
7
|
+
export { isWriteConflictError, WriteConflictError } from "./persistence.js";
|
|
8
|
+
export type { ProjectConfig } from "./config.js";
|
|
9
|
+
export { initProject } from "./init.js";
|
|
10
|
+
export { saveProgress } from "./save.js";
|
|
11
|
+
export { getStatus } from "./status.js";
|
|
12
|
+
export { resolveTrackedArtifacts } from "./trackedArtifacts.js";
|
|
13
|
+
export type { ResolvedTrackedArtifact } from "./trackedArtifacts.js";
|
|
14
|
+
export { completeWorkstream, createWorkstream, listWorkstreams, reopenWorkstream, switchWorkstream, } from "./workstream.js";
|
|
15
|
+
export { wrapProgress } from "./wrap.js";
|
|
16
|
+
export type { BriefingMode, CaptureEntry, CaptureInputSource, CaptureKind, CaptureOptions, CapturePromotion, CaptureResult, CaptureScope, DurableArtifactKind, DoctorCheck, DoctorOptions, DoctorResult, FindMatch, FindOptions, FindResult, FindScope, FindSourceKind, FocusState, GoOptions, GoResult, InitOptions, InitResult, ProjectState, ResumeState, SaveOptions, SaveResult, StalenessLevel, StalenessReport, StalenessWarning, StatusOptions, StatusResult, TrackedArtifactBriefing, WorkstreamState, WorkstreamActionResult, WorkstreamListItem, WorkstreamListResult, WorkstreamMode, WrapOptions, WrapResult, } from "./types.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { discoverProjectRoot } from "./discovery.js";
|
|
2
|
+
export { captureMaterial, getCaptureLogPath, listProjectAndWorkstreamCaptures, listRecentCaptures } from "./capture.js";
|
|
3
|
+
export { runDoctor } from "./doctor.js";
|
|
4
|
+
export { findInProject } from "./find.js";
|
|
5
|
+
export { buildGoBriefing } from "./go.js";
|
|
6
|
+
export { loadProjectConfig, parseProjectConfigFile } from "./config.js";
|
|
7
|
+
export { isWriteConflictError, WriteConflictError } from "./persistence.js";
|
|
8
|
+
export { initProject } from "./init.js";
|
|
9
|
+
export { saveProgress } from "./save.js";
|
|
10
|
+
export { getStatus } from "./status.js";
|
|
11
|
+
export { resolveTrackedArtifacts } from "./trackedArtifacts.js";
|
|
12
|
+
export { completeWorkstream, createWorkstream, listWorkstreams, reopenWorkstream, switchWorkstream, } from "./workstream.js";
|
|
13
|
+
export { wrapProgress } from "./wrap.js";
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,gCAAgC,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACxH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/init.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BriefingMode, InitOptions, InitResult } from "./types.js";
|
|
2
|
+
export declare function initProject(options: InitOptions): InitResult;
|
|
3
|
+
export declare function detectTrackedArtifacts(projectRoot: string): string[];
|
|
4
|
+
export declare function createWorkstreamScaffold(options: {
|
|
5
|
+
projectRoot: string;
|
|
6
|
+
workstreamId: string;
|
|
7
|
+
briefingMode?: BriefingMode;
|
|
8
|
+
title?: string;
|
|
9
|
+
objective?: string;
|
|
10
|
+
}): {
|
|
11
|
+
created: string[];
|
|
12
|
+
existing: string[];
|
|
13
|
+
};
|
package/dist/init.js
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { execFileSync } from "node:child_process";
|
|
4
|
+
import { parseProjectConfigFile } from "./config.js";
|
|
5
|
+
import { writeTextFileAtomic } from "./persistence.js";
|
|
6
|
+
const IQ_CONTEXT_DIR = ".iq-context";
|
|
7
|
+
const AGENT_INSTRUCTIONS_START = "<!-- iq-context:agent-instructions:start -->";
|
|
8
|
+
const AGENT_INSTRUCTIONS_END = "<!-- iq-context:agent-instructions:end -->";
|
|
9
|
+
export function initProject(options) {
|
|
10
|
+
const projectRoot = path.resolve(options.projectRoot);
|
|
11
|
+
const timestamp = new Date().toISOString();
|
|
12
|
+
const detectedIdentity = detectProjectIdentity(projectRoot);
|
|
13
|
+
const detectedTrackedArtifacts = detectTrackedArtifacts(projectRoot);
|
|
14
|
+
const warnings = [];
|
|
15
|
+
const existingConfig = readExistingProjectConfig(projectRoot, options.force ? warnings : null);
|
|
16
|
+
const defaultWorkstream = resolveDefaultWorkstream(options, existingConfig);
|
|
17
|
+
const briefingMode = resolveBriefingMode(options, existingConfig);
|
|
18
|
+
const identity = existingConfig
|
|
19
|
+
? {
|
|
20
|
+
...detectedIdentity,
|
|
21
|
+
projectId: existingConfig.project_id,
|
|
22
|
+
projectName: existingConfig.project_name,
|
|
23
|
+
projectObjective: `Build and maintain continuity for ${existingConfig.project_name}.`,
|
|
24
|
+
}
|
|
25
|
+
: detectedIdentity;
|
|
26
|
+
const trackedArtifacts = existingConfig?.tracked_artifacts ?? detectedTrackedArtifacts;
|
|
27
|
+
const created = [];
|
|
28
|
+
const existing = [];
|
|
29
|
+
const refreshed = [];
|
|
30
|
+
ensureDirectory(projectRoot, path.join(IQ_CONTEXT_DIR), created, existing);
|
|
31
|
+
ensureDirectory(projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams"), created, existing);
|
|
32
|
+
ensureDirectory(projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams", defaultWorkstream), created, existing);
|
|
33
|
+
ensureDirectory(projectRoot, path.join(IQ_CONTEXT_DIR, "logs"), created, existing);
|
|
34
|
+
ensureDirectory(projectRoot, path.join("docs", "sessions"), created, existing);
|
|
35
|
+
ensureDirectory(projectRoot, path.join("docs", "decisions"), created, existing);
|
|
36
|
+
ensureDirectory(projectRoot, path.join("docs", "discoveries"), created, existing);
|
|
37
|
+
ensureDirectory(projectRoot, path.join("docs", "assumptions"), created, existing);
|
|
38
|
+
writeOrRefreshAgentInstructions(projectRoot, path.join(IQ_CONTEXT_DIR, "AGENT-INSTRUCTIONS.md"), defaultWorkstream, existingConfig?.default_workstream ?? defaultWorkstream, created, existing, refreshed, warnings);
|
|
39
|
+
writeTextFileWithForce(projectRoot, path.join(IQ_CONTEXT_DIR, "config.yaml"), renderConfigYaml(identity, trackedArtifacts, defaultWorkstream, briefingMode), options.force, created, existing, refreshed);
|
|
40
|
+
writeProjectStateFile(projectRoot, path.join(IQ_CONTEXT_DIR, "project-state.json"), {
|
|
41
|
+
version: 1,
|
|
42
|
+
project_id: identity.projectId,
|
|
43
|
+
project_name: identity.projectName,
|
|
44
|
+
objective: identity.projectObjective,
|
|
45
|
+
default_briefing_mode: briefingMode,
|
|
46
|
+
tracked_artifacts: trackedArtifacts,
|
|
47
|
+
global_assumptions: [],
|
|
48
|
+
stale_warnings: [],
|
|
49
|
+
workstreams: [defaultWorkstream],
|
|
50
|
+
created_at: timestamp,
|
|
51
|
+
updated_at: timestamp,
|
|
52
|
+
}, options, created, existing, refreshed);
|
|
53
|
+
writeJsonFileIfMissing(projectRoot, path.join(IQ_CONTEXT_DIR, "focus-state.json"), {
|
|
54
|
+
version: 1,
|
|
55
|
+
current_workstream_id: defaultWorkstream,
|
|
56
|
+
current_environment_id: "local-default",
|
|
57
|
+
current_branch: identity.branch,
|
|
58
|
+
resume_from: `Start with iq-context go for the ${defaultWorkstream} workstream.`,
|
|
59
|
+
last_command: "init",
|
|
60
|
+
last_saved_at: timestamp,
|
|
61
|
+
last_wrapped_at: null,
|
|
62
|
+
stale: false,
|
|
63
|
+
mismatch_flags: [],
|
|
64
|
+
updated_at: timestamp,
|
|
65
|
+
}, created, existing);
|
|
66
|
+
writeTextFileIfMissing(projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams", "current.txt"), `${defaultWorkstream}\n`, created, existing);
|
|
67
|
+
createWorkstreamFiles(projectRoot, defaultWorkstream, identity, titleizeIdentifier(defaultWorkstream), `Start the ${defaultWorkstream} workstream for ${identity.projectName}.`, timestamp, "New workstream scaffolded by iq-context init.", "Project scaffold created; first session has not started yet.", `Run iq-context go${defaultWorkstream === "default" ? "" : ` --workstream ${defaultWorkstream}`}.`, created, existing);
|
|
68
|
+
writeTextFileIfMissing(projectRoot, path.join(IQ_CONTEXT_DIR, "logs", "query-log.jsonl"), "", created, existing);
|
|
69
|
+
writeTextFileIfMissing(projectRoot, path.join("docs", "sessions", "README.md"), [
|
|
70
|
+
"# Sessions",
|
|
71
|
+
"",
|
|
72
|
+
"This directory is reserved for durable wrapped session outputs produced by `iq-context`.",
|
|
73
|
+
].join("\n"), created, existing);
|
|
74
|
+
writeTextFileIfMissing(projectRoot, path.join("docs", "decisions", "README.md"), [
|
|
75
|
+
"# Decisions Artifacts",
|
|
76
|
+
"",
|
|
77
|
+
"This directory is reserved for durable decision artifacts that should remain visible across workstreams and sessions.",
|
|
78
|
+
].join("\n"), created, existing);
|
|
79
|
+
writeTextFileIfMissing(projectRoot, path.join("docs", "discoveries", "README.md"), [
|
|
80
|
+
"# Discoveries",
|
|
81
|
+
"",
|
|
82
|
+
"This directory is reserved for durable discoveries that become worth preserving outside a single session log.",
|
|
83
|
+
].join("\n"), created, existing);
|
|
84
|
+
writeTextFileIfMissing(projectRoot, path.join("docs", "assumptions", "README.md"), [
|
|
85
|
+
"# Assumptions",
|
|
86
|
+
"",
|
|
87
|
+
"This directory is reserved for tracked assumptions whose status may later be validated, invalidated, or marked stale.",
|
|
88
|
+
].join("\n"), created, existing);
|
|
89
|
+
return {
|
|
90
|
+
projectRoot,
|
|
91
|
+
defaultWorkstream,
|
|
92
|
+
created,
|
|
93
|
+
existing,
|
|
94
|
+
refreshed,
|
|
95
|
+
warnings,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function detectProjectIdentity(projectRoot) {
|
|
99
|
+
const directoryName = path.basename(projectRoot);
|
|
100
|
+
const packageJsonPath = path.join(projectRoot, "package.json");
|
|
101
|
+
let projectId = slugify(directoryName);
|
|
102
|
+
let projectName = titleizeIdentifier(directoryName);
|
|
103
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
104
|
+
try {
|
|
105
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));
|
|
106
|
+
if (packageJson.name) {
|
|
107
|
+
projectId = slugify(packageJson.name);
|
|
108
|
+
projectName = titleizeIdentifier(packageJson.name);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Preserve the directory-based fallback if package.json is malformed.
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return {
|
|
116
|
+
projectId,
|
|
117
|
+
projectName,
|
|
118
|
+
projectObjective: `Build and maintain continuity for ${projectName}.`,
|
|
119
|
+
branch: detectGitBranch(projectRoot),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
function readExistingProjectConfig(projectRoot, warnings) {
|
|
123
|
+
const configPath = path.join(projectRoot, IQ_CONTEXT_DIR, "config.yaml");
|
|
124
|
+
if (!fs.existsSync(configPath) || !fs.statSync(configPath).isFile()) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
return parseProjectConfigFile(configPath);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (warnings) {
|
|
132
|
+
warnings.push(`Existing config is invalid; regenerating from detected project defaults. ${error instanceof Error ? error.message : String(error)}`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
throw new Error(`Existing config is invalid: ${error instanceof Error ? error.message : String(error)} ` +
|
|
136
|
+
"Run iq-context doctor to inspect the issue, or rerun init with --force to regenerate scaffold defaults.");
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function resolveDefaultWorkstream(options, existingConfig) {
|
|
142
|
+
if (options.defaultWorkstream) {
|
|
143
|
+
return options.defaultWorkstream;
|
|
144
|
+
}
|
|
145
|
+
return existingConfig?.default_workstream ?? "default";
|
|
146
|
+
}
|
|
147
|
+
function resolveBriefingMode(options, existingConfig) {
|
|
148
|
+
if (options.briefingMode) {
|
|
149
|
+
return options.briefingMode;
|
|
150
|
+
}
|
|
151
|
+
return existingConfig?.default_briefing_mode ?? "standard";
|
|
152
|
+
}
|
|
153
|
+
export function detectTrackedArtifacts(projectRoot) {
|
|
154
|
+
const trackedArtifacts = [];
|
|
155
|
+
if (fs.existsSync(path.join(projectRoot, "README.md"))) {
|
|
156
|
+
trackedArtifacts.push("README.md");
|
|
157
|
+
}
|
|
158
|
+
if (hasTrackableDocs(projectRoot)) {
|
|
159
|
+
trackedArtifacts.push("docs/**/*.md");
|
|
160
|
+
}
|
|
161
|
+
if (isMeetingIngestProject(projectRoot)) {
|
|
162
|
+
// These are glob-style path patterns where `*` matches within one path segment;
|
|
163
|
+
// raw transcript folders under `_inbox/` and `_processed/` are intentionally excluded.
|
|
164
|
+
trackedArtifacts.push("_local/project-context/meetings/*.md", "_local/project-context/meetings/_derived/**/*.md", "_local/project-context/meetings/_signals/*.jsonl", "_local/project-context/meetings/_ledger.jsonl");
|
|
165
|
+
}
|
|
166
|
+
if (trackedArtifacts.length === 0) {
|
|
167
|
+
trackedArtifacts.push("**/*.md");
|
|
168
|
+
}
|
|
169
|
+
return trackedArtifacts;
|
|
170
|
+
}
|
|
171
|
+
function isMeetingIngestProject(projectRoot) {
|
|
172
|
+
return fs.existsSync(path.join(projectRoot, "_local", "project-context", "meetings", "meeting-ingest.toml"))
|
|
173
|
+
|| (fs.existsSync(path.join(projectRoot, "_local", "project-context", "meetings"))
|
|
174
|
+
&& fs.existsSync(path.join(projectRoot, "docs", "artifact-contract.md")));
|
|
175
|
+
}
|
|
176
|
+
function hasTrackableDocs(projectRoot) {
|
|
177
|
+
const docsPath = path.join(projectRoot, "docs");
|
|
178
|
+
if (!fs.existsSync(docsPath) || !fs.statSync(docsPath).isDirectory()) {
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
const reservedArtifactDirs = new Set([
|
|
182
|
+
"sessions",
|
|
183
|
+
"decisions",
|
|
184
|
+
"discoveries",
|
|
185
|
+
"assumptions",
|
|
186
|
+
]);
|
|
187
|
+
for (const markdownPath of listMarkdownFiles(docsPath)) {
|
|
188
|
+
const [topLevelDir] = path.relative(docsPath, markdownPath).split(path.sep);
|
|
189
|
+
if (!reservedArtifactDirs.has(topLevelDir)) {
|
|
190
|
+
return true;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
function listMarkdownFiles(directoryPath) {
|
|
196
|
+
const markdownFiles = [];
|
|
197
|
+
for (const entry of fs.readdirSync(directoryPath, { withFileTypes: true })) {
|
|
198
|
+
const entryPath = path.join(directoryPath, entry.name);
|
|
199
|
+
// Dirent keeps symlinked directories out of recursion, which avoids loops.
|
|
200
|
+
if (entry.isDirectory()) {
|
|
201
|
+
markdownFiles.push(...listMarkdownFiles(entryPath));
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
205
|
+
markdownFiles.push(entryPath);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return markdownFiles;
|
|
209
|
+
}
|
|
210
|
+
function detectGitBranch(projectRoot) {
|
|
211
|
+
try {
|
|
212
|
+
const branch = execFileSync("git", ["branch", "--show-current"], {
|
|
213
|
+
cwd: projectRoot,
|
|
214
|
+
encoding: "utf8",
|
|
215
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
216
|
+
}).trim();
|
|
217
|
+
return branch.length > 0 ? branch : null;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function renderConfigYaml(identity, trackedArtifacts, defaultWorkstream, briefingMode) {
|
|
224
|
+
const trackedArtifactLines = trackedArtifacts.map((artifact) => ` - ${artifact}`).join("\n");
|
|
225
|
+
return [
|
|
226
|
+
"version: 1",
|
|
227
|
+
`project_id: ${identity.projectId}`,
|
|
228
|
+
`project_name: ${identity.projectName}`,
|
|
229
|
+
`default_briefing_mode: ${briefingMode}`,
|
|
230
|
+
`default_workstream: ${defaultWorkstream}`,
|
|
231
|
+
"tracked_artifacts:",
|
|
232
|
+
trackedArtifactLines,
|
|
233
|
+
"durable_artifact_dirs:",
|
|
234
|
+
" sessions: docs/sessions",
|
|
235
|
+
" decisions: docs/decisions",
|
|
236
|
+
" discoveries: docs/discoveries",
|
|
237
|
+
" assumptions: docs/assumptions",
|
|
238
|
+
"state_paths:",
|
|
239
|
+
" project: .iq-context/project-state.json",
|
|
240
|
+
" focus: .iq-context/focus-state.json",
|
|
241
|
+
" workstreams: .iq-context/workstreams",
|
|
242
|
+
" logs: .iq-context/logs",
|
|
243
|
+
"",
|
|
244
|
+
].join("\n");
|
|
245
|
+
}
|
|
246
|
+
function renderAgentInstructions(defaultWorkstream) {
|
|
247
|
+
return [
|
|
248
|
+
AGENT_INSTRUCTIONS_START,
|
|
249
|
+
renderLegacyAgentInstructions(defaultWorkstream).trimEnd(),
|
|
250
|
+
AGENT_INSTRUCTIONS_END,
|
|
251
|
+
].join("\n");
|
|
252
|
+
}
|
|
253
|
+
function renderLegacyAgentInstructions(defaultWorkstream) {
|
|
254
|
+
const workstreamSuffix = defaultWorkstream === "default" ? "" : ` --workstream ${defaultWorkstream}`;
|
|
255
|
+
return [
|
|
256
|
+
"# iQ Context Agent Instructions",
|
|
257
|
+
"",
|
|
258
|
+
"Use these instructions when working in this repository through Codex, Claude Code, Supacode, or another agentic coding environment.",
|
|
259
|
+
"",
|
|
260
|
+
"## Session Protocol",
|
|
261
|
+
"",
|
|
262
|
+
`- Start each session with \`iq-context go${workstreamSuffix}\` from the project root.`,
|
|
263
|
+
"- During work, checkpoint meaningful progress with `iq-context save --summary \"...\" --file <path> --next \"...\"`.",
|
|
264
|
+
"- Capture loose notes or references with `iq-context capture \"...\"`.",
|
|
265
|
+
"- Before ending a session, run `iq-context wrap --summary \"...\" --next \"...\"`.",
|
|
266
|
+
"- Use `iq-context status` when current state or staleness is unclear.",
|
|
267
|
+
"- Use `iq-context find \"...\"` to retrieve prior context with provenance.",
|
|
268
|
+
"",
|
|
269
|
+
"## Shortcuts (optional)",
|
|
270
|
+
"",
|
|
271
|
+
"- If the iq-context agent shortcuts are installed on this machine (`iq-context agents install`), the session protocol is also available as `/iq-go`, `/iq-save`, `/iq-cap`, `/iq-wrap`, `/iq-status`, and `/iq-find` in Claude Code, and as `$iq-go`, `$iq-save`, `$iq-cap`, `$iq-wrap`, `$iq-status`, and `$iq-find` in Codex.",
|
|
272
|
+
"- The raw `iq-context` CLI commands above are always the canonical fallback.",
|
|
273
|
+
"",
|
|
274
|
+
"## State Safety",
|
|
275
|
+
"",
|
|
276
|
+
"- Treat `.iq-context/` JSON files as tool-owned state.",
|
|
277
|
+
"- Do not hand-edit `.iq-context/**/*.json` unless the user explicitly asks for manual repair.",
|
|
278
|
+
"- Prefer `iq-context save`, `iq-context capture`, `iq-context wrap`, and `iq-context workstream` commands over direct state edits.",
|
|
279
|
+
"- Keep host-specific notes in host bindings or captures rather than changing core state shape.",
|
|
280
|
+
"",
|
|
281
|
+
].join("\n");
|
|
282
|
+
}
|
|
283
|
+
function writeOrRefreshAgentInstructions(projectRoot, relativePath, defaultWorkstream, legacyWorkstream, created, existing, refreshed, warnings) {
|
|
284
|
+
const absolutePath = path.join(projectRoot, relativePath);
|
|
285
|
+
const managedBlock = renderAgentInstructions(defaultWorkstream);
|
|
286
|
+
if (!fs.existsSync(absolutePath)) {
|
|
287
|
+
writeTextFileAtomic(absolutePath, `${managedBlock}\n`);
|
|
288
|
+
created.push(relativePath);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const current = fs.readFileSync(absolutePath, "utf8");
|
|
292
|
+
const startMarker = findMarkerLine(current, AGENT_INSTRUCTIONS_START);
|
|
293
|
+
const endMarker = findMarkerLine(current, AGENT_INSTRUCTIONS_END, startMarker?.end);
|
|
294
|
+
if (startMarker && endMarker) {
|
|
295
|
+
const suffix = current.slice(endMarker.end);
|
|
296
|
+
const next = `${current.slice(0, startMarker.start)}${managedBlock}${suffix || "\n"}`;
|
|
297
|
+
if (next === current) {
|
|
298
|
+
existing.push(relativePath);
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
writeTextFileAtomic(absolutePath, next);
|
|
302
|
+
refreshed.push(relativePath);
|
|
303
|
+
}
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const unmatchedEndMarker = endMarker ?? findMarkerLine(current, AGENT_INSTRUCTIONS_END);
|
|
307
|
+
if (startMarker || unmatchedEndMarker) {
|
|
308
|
+
existing.push(relativePath);
|
|
309
|
+
warnings.push(`Preserved ${relativePath} because its managed markers are incomplete.`);
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const legacyContent = renderLegacyAgentInstructions(legacyWorkstream);
|
|
313
|
+
if (current.startsWith(legacyContent)) {
|
|
314
|
+
const next = `${managedBlock}\n${current.slice(legacyContent.length)}`;
|
|
315
|
+
writeTextFileAtomic(absolutePath, next);
|
|
316
|
+
refreshed.push(relativePath);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
existing.push(relativePath);
|
|
320
|
+
warnings.push(`Preserved modified ${relativePath}; automatic refresh requires the managed marker block.`);
|
|
321
|
+
}
|
|
322
|
+
function findMarkerLine(content, marker, fromIndex = 0) {
|
|
323
|
+
const expression = new RegExp(`^${escapeRegExp(marker)}\\r?$`, "gm");
|
|
324
|
+
expression.lastIndex = fromIndex;
|
|
325
|
+
const match = expression.exec(content);
|
|
326
|
+
return match ? { start: match.index, end: match.index + match[0].length } : null;
|
|
327
|
+
}
|
|
328
|
+
function escapeRegExp(value) {
|
|
329
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
330
|
+
}
|
|
331
|
+
function ensureDirectory(projectRoot, relativePath, created, existing) {
|
|
332
|
+
const absolutePath = path.join(projectRoot, relativePath);
|
|
333
|
+
if (fs.existsSync(absolutePath)) {
|
|
334
|
+
existing.push(relativePath);
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
fs.mkdirSync(absolutePath, { recursive: true });
|
|
338
|
+
created.push(relativePath);
|
|
339
|
+
}
|
|
340
|
+
function writeJsonFileIfMissing(projectRoot, relativePath, value, created, existing) {
|
|
341
|
+
const content = `${JSON.stringify(value, null, 2)}\n`;
|
|
342
|
+
writeTextFileIfMissing(projectRoot, relativePath, content, created, existing);
|
|
343
|
+
}
|
|
344
|
+
function writeProjectStateFile(projectRoot, relativePath, defaultState, options, created, existing, refreshed) {
|
|
345
|
+
const absolutePath = path.join(projectRoot, relativePath);
|
|
346
|
+
if (!fs.existsSync(absolutePath)) {
|
|
347
|
+
writeTextFileAtomic(absolutePath, `${JSON.stringify(defaultState, null, 2)}\n`);
|
|
348
|
+
created.push(relativePath);
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
351
|
+
if (!options.force) {
|
|
352
|
+
existing.push(relativePath);
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
let nextState = defaultState;
|
|
356
|
+
try {
|
|
357
|
+
const currentState = JSON.parse(fs.readFileSync(absolutePath, "utf8"));
|
|
358
|
+
const defaultWorkstream = defaultState.workstreams[0] ?? options.defaultWorkstream ?? "default";
|
|
359
|
+
nextState = {
|
|
360
|
+
...currentState,
|
|
361
|
+
project_id: defaultState.project_id || currentState.project_id,
|
|
362
|
+
project_name: defaultState.project_name || currentState.project_name,
|
|
363
|
+
default_briefing_mode: defaultState.default_briefing_mode,
|
|
364
|
+
tracked_artifacts: defaultState.tracked_artifacts,
|
|
365
|
+
workstreams: uniqueValues([...currentState.workstreams, defaultWorkstream]),
|
|
366
|
+
updated_at: defaultState.updated_at,
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
nextState = defaultState;
|
|
371
|
+
}
|
|
372
|
+
writeTextFileAtomic(absolutePath, `${JSON.stringify(nextState, null, 2)}\n`);
|
|
373
|
+
refreshed.push(relativePath);
|
|
374
|
+
}
|
|
375
|
+
function writeTextFileIfMissing(projectRoot, relativePath, content, created, existing) {
|
|
376
|
+
const absolutePath = path.join(projectRoot, relativePath);
|
|
377
|
+
if (fs.existsSync(absolutePath)) {
|
|
378
|
+
existing.push(relativePath);
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
writeTextFileAtomic(absolutePath, content);
|
|
382
|
+
created.push(relativePath);
|
|
383
|
+
}
|
|
384
|
+
function writeTextFileWithForce(projectRoot, relativePath, content, force, created, existing, refreshed) {
|
|
385
|
+
const absolutePath = path.join(projectRoot, relativePath);
|
|
386
|
+
if (fs.existsSync(absolutePath)) {
|
|
387
|
+
if (force) {
|
|
388
|
+
writeTextFileAtomic(absolutePath, content);
|
|
389
|
+
refreshed.push(relativePath);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
existing.push(relativePath);
|
|
393
|
+
}
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
writeTextFileAtomic(absolutePath, content);
|
|
397
|
+
created.push(relativePath);
|
|
398
|
+
}
|
|
399
|
+
function uniqueValues(values) {
|
|
400
|
+
return Array.from(new Set(values));
|
|
401
|
+
}
|
|
402
|
+
function slugify(value) {
|
|
403
|
+
return value
|
|
404
|
+
.trim()
|
|
405
|
+
.toLowerCase()
|
|
406
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
407
|
+
.replace(/^-+|-+$/g, "")
|
|
408
|
+
|| "project";
|
|
409
|
+
}
|
|
410
|
+
function titleizeIdentifier(value) {
|
|
411
|
+
return value
|
|
412
|
+
.replace(/^@/, "")
|
|
413
|
+
.replace(/[\/_-]+/g, " ")
|
|
414
|
+
.trim()
|
|
415
|
+
.split(/\s+/)
|
|
416
|
+
.filter(Boolean)
|
|
417
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
418
|
+
.join(" ")
|
|
419
|
+
|| "Default";
|
|
420
|
+
}
|
|
421
|
+
export function createWorkstreamScaffold(options) {
|
|
422
|
+
const timestamp = new Date().toISOString();
|
|
423
|
+
const identity = detectProjectIdentity(options.projectRoot);
|
|
424
|
+
const created = [];
|
|
425
|
+
const existing = [];
|
|
426
|
+
const workstreamTitle = options.title ?? titleizeIdentifier(options.workstreamId);
|
|
427
|
+
const workstreamObjective = options.objective
|
|
428
|
+
?? `Start the ${options.workstreamId} workstream for ${identity.projectName}.`;
|
|
429
|
+
ensureDirectory(options.projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams"), created, existing);
|
|
430
|
+
ensureDirectory(options.projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams", options.workstreamId), created, existing);
|
|
431
|
+
createWorkstreamFiles(options.projectRoot, options.workstreamId, identity, workstreamTitle, workstreamObjective, timestamp, "New workstream scaffolded by iq-context.", "Workstream scaffold created; focused work has not started yet.", `Run iq-context go${options.workstreamId === "default" ? "" : ` --workstream ${options.workstreamId}`}.`, created, existing);
|
|
432
|
+
return { created, existing };
|
|
433
|
+
}
|
|
434
|
+
function createWorkstreamFiles(projectRoot, workstreamId, identity, workstreamTitle, workstreamObjective, timestamp, statusSummary, pausedReason, resumeFrom, created, existing) {
|
|
435
|
+
writeJsonFileIfMissing(projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams", workstreamId, "state.json"), {
|
|
436
|
+
version: 1,
|
|
437
|
+
workstream_id: workstreamId,
|
|
438
|
+
title: workstreamTitle,
|
|
439
|
+
objective: workstreamObjective,
|
|
440
|
+
lifecycle_status: "active",
|
|
441
|
+
mode: "design",
|
|
442
|
+
status_summary: statusSummary,
|
|
443
|
+
active_plan: null,
|
|
444
|
+
active_task: null,
|
|
445
|
+
active_files: [],
|
|
446
|
+
active_artifacts: [],
|
|
447
|
+
blockers: [],
|
|
448
|
+
open_questions: [],
|
|
449
|
+
next_actions: [
|
|
450
|
+
"Run iq-context go",
|
|
451
|
+
"Refine the workstream objective",
|
|
452
|
+
"Start using save and wrap as they become available",
|
|
453
|
+
],
|
|
454
|
+
assumptions: [],
|
|
455
|
+
continuation_hint: "Use iq-context go to start a focused session from this scaffold.",
|
|
456
|
+
branch: identity.branch,
|
|
457
|
+
worktree: null,
|
|
458
|
+
environment_id: "local-default",
|
|
459
|
+
last_saved_at: timestamp,
|
|
460
|
+
last_wrapped_at: null,
|
|
461
|
+
completed_at: null,
|
|
462
|
+
created_at: timestamp,
|
|
463
|
+
updated_at: timestamp,
|
|
464
|
+
}, created, existing);
|
|
465
|
+
writeJsonFileIfMissing(projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams", workstreamId, "resume-state.json"), {
|
|
466
|
+
version: 1,
|
|
467
|
+
plan_path: null,
|
|
468
|
+
completed_waves: [],
|
|
469
|
+
next_wave: null,
|
|
470
|
+
completed_tasks: [],
|
|
471
|
+
remaining_tasks: [
|
|
472
|
+
"Run iq-context go",
|
|
473
|
+
"Clarify current objective",
|
|
474
|
+
],
|
|
475
|
+
paused_reason: pausedReason,
|
|
476
|
+
resume_from: resumeFrom,
|
|
477
|
+
updated_at: timestamp,
|
|
478
|
+
}, created, existing);
|
|
479
|
+
writeJsonFileIfMissing(projectRoot, path.join(IQ_CONTEXT_DIR, "workstreams", workstreamId, "host-bindings.json"), { bindings: [] }, created, existing);
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=init.js.map
|
package/dist/init.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare class WriteConflictError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare function writeJsonFileAtomic(filePath: string, value: unknown): void;
|
|
5
|
+
export declare function writeTextFileAtomic(filePath: string, content: string): void;
|
|
6
|
+
export declare function isWriteConflictError(error: unknown): boolean;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
export class WriteConflictError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "WriteConflictError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function writeJsonFileAtomic(filePath, value) {
|
|
10
|
+
writeTextFileAtomic(filePath, `${JSON.stringify(value, null, 2)}\n`);
|
|
11
|
+
}
|
|
12
|
+
export function writeTextFileAtomic(filePath, content) {
|
|
13
|
+
if (fs.existsSync(filePath) && !fs.statSync(filePath).isFile()) {
|
|
14
|
+
throw new WriteConflictError(`Write conflict: target path is not a regular file: ${filePath}`);
|
|
15
|
+
}
|
|
16
|
+
const directory = path.dirname(filePath);
|
|
17
|
+
fs.mkdirSync(directory, { recursive: true });
|
|
18
|
+
const tempDirectory = fs.mkdtempSync(path.join(directory, `.${path.basename(filePath)}-${process.pid}-`));
|
|
19
|
+
const tempPath = path.join(tempDirectory, "write.tmp");
|
|
20
|
+
try {
|
|
21
|
+
fs.writeFileSync(tempPath, content, "utf8");
|
|
22
|
+
fs.renameSync(tempPath, filePath);
|
|
23
|
+
}
|
|
24
|
+
finally {
|
|
25
|
+
fs.rmSync(tempDirectory, { recursive: true, force: true });
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function isWriteConflictError(error) {
|
|
29
|
+
return error instanceof WriteConflictError
|
|
30
|
+
|| (error instanceof Error && error.name === "WriteConflictError");
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=persistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,KAAc;IAClE,mBAAmB,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAe;IACnE,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,kBAAkB,CAAC,sDAAsD,QAAQ,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,aAAa,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAC1G,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5C,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,KAAK,YAAY,kBAAkB;WACrC,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB,CAAC,CAAC;AACvE,CAAC"}
|