@basou/core 0.33.0 → 0.34.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/index.d.ts CHANGED
@@ -1747,6 +1747,167 @@ declare function replayEvents(sessionDir: string, options?: ReplayOptions): Asyn
1747
1747
  */
1748
1748
  declare function readAllEvents(sessionDir: string, options?: ReplayOptions): Promise<Event[]>;
1749
1749
 
1750
+ /**
1751
+ * Project roster drift (the "saddle" model). A project's repos are DECLARED
1752
+ * once in the manifest's `repos` list; the capture config (`source_roots`) must
1753
+ * cover every declared repo. This computes the drift between the two so
1754
+ * `basou project check` can surface a declared repo that is NOT being captured
1755
+ * — the class of bug where a companion repo was wired into the workspace but
1756
+ * never added to `source_roots`, so its work silently fell out of capture.
1757
+ *
1758
+ * Pure: it compares declared relative paths against captured relative paths and
1759
+ * performs no filesystem or git I/O. Paths are compared as declared (both lists
1760
+ * use the same machine-portable relative-path form), not resolved on disk.
1761
+ */
1762
+ type RepoVisibility = "public" | "private" | "future-public";
1763
+ /**
1764
+ * The audience-driven language axis. Independent of visibility: a private repo
1765
+ * can publish English content, a public repo can carry bilingual docs. `en` /
1766
+ * `ja` for a single audience, `en+ja` when both are served.
1767
+ */
1768
+ type RepoLanguage = "en" | "ja" | "en+ja";
1769
+ /** A published surface a repo emits: a deployed website or a package registry. */
1770
+ type PublishKind = "web" | "npm";
1771
+ /**
1772
+ * Where a repo's agent instruction files live (the instruction-source axis),
1773
+ * independent of visibility / language / publishes. `hub` is basou's native,
1774
+ * generated hub-and-spoke topology (canonical in the anchor, gitignored symlinks
1775
+ * in each repo); `self` is the additive opt-in where the canonical AGENTS.md is a
1776
+ * regular committed file in the repo itself and basou stays hands-off about its
1777
+ * content. See {@link instructionMode} for the default (absent => `hub`).
1778
+ */
1779
+ type RepoInstructions = "hub" | "self";
1780
+ /**
1781
+ * One published surface. Its visibility and language are INDEPENDENT of the
1782
+ * source repo's: a private repo commonly publishes a public website. Both are
1783
+ * optional so a surface can be declared
1784
+ * before those facts are pinned down (mirroring how `adopt` leaves repo
1785
+ * visibility unset for the operator to fill in).
1786
+ */
1787
+ type PublishTarget = {
1788
+ kind: PublishKind;
1789
+ visibility?: RepoVisibility | undefined;
1790
+ language?: RepoLanguage | undefined;
1791
+ };
1792
+ type RepoEntry = {
1793
+ /** Path relative to the manifest repo root (e.g. ".", "../takuhon"). */
1794
+ path: string;
1795
+ visibility?: RepoVisibility | undefined;
1796
+ /** Source language (commits/comments/code, read by contributors). Independent of visibility. */
1797
+ language?: RepoLanguage | undefined;
1798
+ /** Published surfaces this repo emits (opt-in; absent for a repo that publishes nothing). */
1799
+ publishes?: PublishTarget[] | undefined;
1800
+ /**
1801
+ * Instruction-source mode. Absent => `hub` (basou's native generated topology),
1802
+ * so an existing roster's behavior is unchanged. `self` opts the repo out of
1803
+ * generation: its AGENTS.md is a hand-authored committed file and basou stays
1804
+ * hands-off. Resolve the effective mode with {@link instructionMode}.
1805
+ */
1806
+ instructions?: RepoInstructions | undefined;
1807
+ };
1808
+ /**
1809
+ * The effective instruction-source mode for a repo: the declared `instructions`,
1810
+ * defaulting to `hub` when absent. The default is the single guarantee that an
1811
+ * existing roster (which has no `instructions` field) keeps basou's current
1812
+ * hub-and-spoke behavior byte-for-byte — every generator branches on this, never
1813
+ * on the raw optional field, so "absent => hub" is decided in exactly one place.
1814
+ */
1815
+ declare function instructionMode(entry: {
1816
+ instructions?: RepoInstructions | undefined;
1817
+ }): RepoInstructions;
1818
+ type RosterDriftSummary = {
1819
+ declaredCount: number;
1820
+ capturedCount: number;
1821
+ /** Declared in `repos` but absent from `source_roots`: a capture gap. */
1822
+ gaps: RepoEntry[];
1823
+ /** In `source_roots` but not declared in `repos` (e.g. a workspace view, or a stray). */
1824
+ extra: string[];
1825
+ /** Declared paths that are also captured. */
1826
+ matched: string[];
1827
+ /** True when there is no capture gap (every declared repo is covered). */
1828
+ ok: boolean;
1829
+ };
1830
+ /**
1831
+ * Compute the {@link RosterDriftSummary} for a project. A declared repo missing
1832
+ * from the captured set is a `gap` (the surfaced suspicion); a captured path not
1833
+ * in the declared set is `extra` (commonly the workspace view, which is a
1834
+ * capture source but not itself a project repo). With no declared roster, there
1835
+ * are no gaps (nothing to check against) and every captured path is `extra`.
1836
+ */
1837
+ declare function summarizeRosterDrift(input: {
1838
+ repos?: RepoEntry[];
1839
+ sourceRoots?: string[];
1840
+ }): RosterDriftSummary;
1841
+ type SourceRootsReconcile = {
1842
+ /**
1843
+ * The reconciled `source_roots`: the existing entries verbatim, then every
1844
+ * declared repo path that was missing (normalized, in roster order). Existing
1845
+ * order and form are preserved so the manifest diff is minimal and reversible.
1846
+ */
1847
+ next: string[];
1848
+ /** Declared repo paths (normalized) that were appended because `source_roots` did not cover them. */
1849
+ added: string[];
1850
+ /** True when `source_roots` already covers every declared repo (`next` equals the current list). */
1851
+ unchanged: boolean;
1852
+ };
1853
+ /**
1854
+ * Derive the `source_roots` a project's declared repo roster requires. The
1855
+ * roster (`repos`) is the single source of truth for which repos belong to the
1856
+ * project; this is the actuator behind `basou project sync`, computing the
1857
+ * additive reconciliation so every declared repo is captured.
1858
+ *
1859
+ * ADDITIVE ONLY: it appends declared paths that are missing and never removes
1860
+ * an existing entry. A captured-but-undeclared path (commonly the generated
1861
+ * workspace view — a legitimate capture source that is not itself a project
1862
+ * repo) is preserved; pruning strays is deferred to the slice that generates
1863
+ * the view (so basou knows which extras it owns). Existing entries are kept
1864
+ * byte-identical; only appended paths are normalized.
1865
+ *
1866
+ * Pure: no filesystem or git I/O. Paths are compared in the same normalized
1867
+ * form as {@link summarizeRosterDrift}, so a trailing-slash variant of an
1868
+ * already-captured repo is not re-appended.
1869
+ */
1870
+ declare function reconcileSourceRoots(input: {
1871
+ repos?: RepoEntry[];
1872
+ sourceRoots?: string[];
1873
+ }): SourceRootsReconcile;
1874
+ /**
1875
+ * On-disk classification of a source-root candidate during adoption: a git repo
1876
+ * root (→ becomes a roster entry), a resolved-but-non-repo directory (the
1877
+ * generated workspace view, `/tmp`, a scratch dir → excluded), or a path that
1878
+ * could not be resolved on disk (→ excluded).
1879
+ */
1880
+ type AdoptCandidateKind = "repo" | "non-repo" | "unresolved";
1881
+ type AdoptCandidate = {
1882
+ /** Source-root path as declared (relative to the manifest root). */
1883
+ path: string;
1884
+ /** On-disk classification; the filesystem probing that produces it is the caller's job. */
1885
+ kind: AdoptCandidateKind;
1886
+ };
1887
+ type RosterAdoptionPlan = {
1888
+ /** Proposed `repos` entries: the candidates that are git repos (visibility left unset for the operator). */
1889
+ repos: RepoEntry[];
1890
+ /** Candidates excluded from the roster, with why (a non-repo directory, or an unresolvable path). */
1891
+ excluded: {
1892
+ path: string;
1893
+ kind: Exclude<AdoptCandidateKind, "repo">;
1894
+ }[];
1895
+ };
1896
+ /**
1897
+ * Plan a `repos` roster from classified source-root candidates (the actuator
1898
+ * behind `basou project adopt`). Pure: it partitions already-classified
1899
+ * candidates — the realpath / `.git` filesystem probing that produces each
1900
+ * `kind` is the caller's job, so this stays testable without disk I/O.
1901
+ *
1902
+ * A git repo becomes a roster entry (path only; visibility is left unset because
1903
+ * it is a human judgment, kept independent of the other axes). A non-repo
1904
+ * (commonly the generated workspace view) or an unresolvable path is excluded and
1905
+ * reported, so the operator sees what was dropped and why before editing. Repo
1906
+ * paths are deduped by normalized form, preserving the first declared form and
1907
+ * order.
1908
+ */
1909
+ declare function planRosterAdoption(candidates: AdoptCandidate[]): RosterAdoptionPlan;
1910
+
1750
1911
  /**
1751
1912
  * The language of the GENERATED-VIEW chrome (headings, labels, verdict prose)
1752
1913
  * in handoff.md / orientation.md / decisions.md / report output.
@@ -1788,9 +1949,11 @@ declare function resolveViewLanguageFromPaths(paths: BasouPaths): Promise<ViewLa
1788
1949
  * Parameterized lines are functions so the two languages can order their
1789
1950
  * parts naturally.
1790
1951
  *
1791
- * This module is the SINGLE home for generated-view Japanese (the E-5
1792
- * language-lint allowlist points here, not at the renderers), so "user data
1793
- * language" and "tool chrome language" can never blur together again.
1952
+ * This module is the SINGLE home for generated Japanese the view chrome here
1953
+ * and the instruction-file content in {@link PresetStrings} (the E-5
1954
+ * language-lint allowlist points here, not at the renderers/generators), so
1955
+ * "user data language" and "tool-generated content language" can never blur
1956
+ * together again.
1794
1957
  */
1795
1958
  type ViewStrings = {
1796
1959
  /** Localized relative age for prose lines, e.g. "3日4時間前" / "3d 4h ago". */
@@ -1881,6 +2044,111 @@ type ViewStrings = {
1881
2044
  };
1882
2045
  /** Look up the string table for a resolved view language. */
1883
2046
  declare function viewStrings(language: ViewLanguage): ViewStrings;
2047
+ /**
2048
+ * Resolve a GENERATED INSTRUCTION-FILE's content language from the target
2049
+ * repo's declared `language`. Unlike the views (workspace-level artifacts that
2050
+ * follow the anchor), a preset block lives inside one repo's instruction file,
2051
+ * so its audience is that repo's declared audience: `ja` renders Japanese
2052
+ * (byte-identical to the pre-i18n output), `en` / `en+ja` / undeclared render
2053
+ * English (one content language per generated block; en is the shared floor).
2054
+ */
2055
+ declare function resolveRepoContentLanguage(language: RepoLanguage | undefined): ViewLanguage;
2056
+ /**
2057
+ * Resolve the content language of a WORKSPACE-LEVEL instruction artifact (the
2058
+ * view's AGENTS.md block, the anchor's starter) from an already-gathered
2059
+ * roster: the entry flagged `anchor` speaks for the workspace, mirroring the
2060
+ * views' anchor-language rule. No anchor entry (or no declared language)
2061
+ * resolves to English. When more than one entry carries the flag, the first
2062
+ * wins (declared order).
2063
+ *
2064
+ * Note the anchor is identified by the CALLER-SET flag, not by this module:
2065
+ * {@link resolveViewLanguage} keys on the manifest path being `.`, while the
2066
+ * instruction-file callers flag the anchor by resolved-path identity. For a
2067
+ * conventional manifest (anchor declared as `.`) the two agree; a roster that
2068
+ * reaches the anchor only through an aliased path is where they can diverge,
2069
+ * and the caller's flag is authoritative for the instruction files.
2070
+ */
2071
+ declare function resolveAnchorContentLanguage(repos: ReadonlyArray<{
2072
+ anchor?: boolean | undefined;
2073
+ language?: RepoLanguage | undefined;
2074
+ }>): ViewLanguage;
2075
+ /**
2076
+ * Every localized string the instruction-file generators emit: the per-repo
2077
+ * preset block, the workspace view's block, and the anchor's starter. Lives in
2078
+ * this module for the same reason as {@link ViewStrings}: it is the SINGLE
2079
+ * home for generated Japanese, so the language-lint E-5 allowlist stays one
2080
+ * file and "generated content language" is always a declaration-driven table
2081
+ * lookup, never a hardcode.
2082
+ */
2083
+ type PresetStrings = {
2084
+ repoBlock: {
2085
+ heading: string;
2086
+ intro: string;
2087
+ /** Source git-visibility, rendered with the consequence the agent must respect. */
2088
+ visibilityLabel: (v: RepoVisibility | undefined) => string;
2089
+ /**
2090
+ * Source language (commits/comments/code), rendered with the audience it
2091
+ * serves. Invariant note: the table itself is SELECTED by this same field
2092
+ * (ja -> JA table, everything else -> EN), so the JA table's en / en+ja /
2093
+ * unset branches and the EN table's ja branch are unreachable from
2094
+ * renderPresetBlock — they exist for table completeness (and the
2095
+ * both-language sweep test), not because a render can emit them.
2096
+ */
2097
+ sourceLanguageLabel: (l: RepoLanguage | undefined) => string;
2098
+ /** Published-surface kind. */
2099
+ publishKindLabel: (k: PublishTarget["kind"]) => string;
2100
+ /** A published surface's visibility (independent of the source repo's). */
2101
+ publishVisibilityLabel: (v: RepoVisibility | undefined) => string;
2102
+ /** A published surface's content language (read by end users; may differ from source). */
2103
+ contentLanguageLabel: (l: RepoLanguage | undefined) => string;
2104
+ /** "ソース可視性" — the source-visibility line label. */
2105
+ sourceVisibilityLabel: string;
2106
+ /** "ソース言語" — the source-language line label. */
2107
+ sourceLanguageLineLabel: string;
2108
+ /** "- 配信物: なし" — no published surfaces. */
2109
+ publishesNone: string;
2110
+ /** "- 配信物:" — the published-surfaces list header. */
2111
+ publishesHeader: string;
2112
+ };
2113
+ viewBlock: {
2114
+ heading: string;
2115
+ intro: string;
2116
+ selfNote: (viewName: string) => string;
2117
+ aggregates: (repoCount: number) => string;
2118
+ reposHeading: string;
2119
+ tableHeader: string;
2120
+ /** Instruction-file ownership labels: who writes the repo's AGENTS.md. */
2121
+ instructionsAnchor: string;
2122
+ instructionsSelf: string;
2123
+ instructionsHub: string;
2124
+ /** "未設定" — the short table cell for an undeclared visibility / language. */
2125
+ unsetShort: string;
2126
+ commitHeading: string;
2127
+ commitBody: string;
2128
+ conventionsHeading: string;
2129
+ conventionsBody: string;
2130
+ principlesHeading: string;
2131
+ principleStateless: string;
2132
+ principleNoFiles: string;
2133
+ };
2134
+ anchorStarter: {
2135
+ identityLine: (title: string) => string;
2136
+ starterNote: string;
2137
+ basicsHeading: string;
2138
+ basicsTodo: string;
2139
+ commitHeading: string;
2140
+ commitPlanning: string;
2141
+ commitImplementation: string;
2142
+ commitView: string;
2143
+ conventionsHeading: string;
2144
+ conventionsBody: string;
2145
+ viewPointerLine: (viewName: string) => string;
2146
+ policyHeading: string;
2147
+ policyTodo: string[];
2148
+ };
2149
+ };
2150
+ /** Look up the instruction-file string table for a resolved content language. */
2151
+ declare function presetStrings(language: ViewLanguage): PresetStrings;
1884
2152
 
1885
2153
  /** Session lifecycle states. */
1886
2154
  declare const SessionStatusSchema: z.ZodEnum<{
@@ -4025,12 +4293,20 @@ declare function renderOrientation(input: OrientationRendererInput): Promise<Ori
4025
4293
  * the output is a function of the manifest snapshot at seed time. It embeds no
4026
4294
  * operator-specific string beyond the declared repo names / project name.
4027
4295
  */
4296
+
4028
4297
  /** One roster repo referenced by the anchor starter's per-repo pointers. */
4029
4298
  type AnchorStarterRepo = {
4030
4299
  /** The repo's display name (its on-disk basename). */
4031
4300
  name: string;
4032
4301
  /** True when this repo IS the anchor (the planning master itself; excluded from the pointers). */
4033
4302
  anchor?: boolean | undefined;
4303
+ /**
4304
+ * The repo's declared `language`. Only the ANCHOR entry's value participates:
4305
+ * the starter is the anchor's own file, so its content language follows the
4306
+ * anchor's declared audience (`ja` renders the pre-i18n Japanese bytes;
4307
+ * anything else renders English).
4308
+ */
4309
+ language?: RepoLanguage | undefined;
4034
4310
  };
4035
4311
  /** The declared fields the anchor starter is rendered from. */
4036
4312
  type AnchorStarterInput = {
@@ -4049,171 +4325,13 @@ type AnchorStarterInput = {
4049
4325
  * declaration; everything basou cannot know (product facts, phase, secrets,
4050
4326
  * language policy) is left as an explicit `<!-- TODO -->` for the operator. The
4051
4327
  * live roster is NOT snapshotted here — the file points at the workspace view's
4052
- * generated AGENTS.md for it. Returns the file content WITH a trailing newline.
4328
+ * generated AGENTS.md for it. The content language follows the ANCHOR entry's
4329
+ * declared `language` (a ja anchor renders byte-identical to the pre-i18n
4330
+ * output; anything else renders English). Returns the file content WITH a
4331
+ * trailing newline.
4053
4332
  */
4054
4333
  declare function renderAnchorStarter(input: AnchorStarterInput): string;
4055
4334
 
4056
- /**
4057
- * Project roster drift (the "saddle" model). A project's repos are DECLARED
4058
- * once in the manifest's `repos` list; the capture config (`source_roots`) must
4059
- * cover every declared repo. This computes the drift between the two so
4060
- * `basou project check` can surface a declared repo that is NOT being captured
4061
- * — the class of bug where a companion repo was wired into the workspace but
4062
- * never added to `source_roots`, so its work silently fell out of capture.
4063
- *
4064
- * Pure: it compares declared relative paths against captured relative paths and
4065
- * performs no filesystem or git I/O. Paths are compared as declared (both lists
4066
- * use the same machine-portable relative-path form), not resolved on disk.
4067
- */
4068
- type RepoVisibility = "public" | "private" | "future-public";
4069
- /**
4070
- * The audience-driven language axis. Independent of visibility: a private repo
4071
- * can publish English content, a public repo can carry bilingual docs. `en` /
4072
- * `ja` for a single audience, `en+ja` when both are served.
4073
- */
4074
- type RepoLanguage = "en" | "ja" | "en+ja";
4075
- /** A published surface a repo emits: a deployed website or a package registry. */
4076
- type PublishKind = "web" | "npm";
4077
- /**
4078
- * Where a repo's agent instruction files live (the instruction-source axis),
4079
- * independent of visibility / language / publishes. `hub` is basou's native,
4080
- * generated hub-and-spoke topology (canonical in the anchor, gitignored symlinks
4081
- * in each repo); `self` is the additive opt-in where the canonical AGENTS.md is a
4082
- * regular committed file in the repo itself and basou stays hands-off about its
4083
- * content. See {@link instructionMode} for the default (absent => `hub`).
4084
- */
4085
- type RepoInstructions = "hub" | "self";
4086
- /**
4087
- * One published surface. Its visibility and language are INDEPENDENT of the
4088
- * source repo's: a private repo commonly publishes a public website. Both are
4089
- * optional so a surface can be declared
4090
- * before those facts are pinned down (mirroring how `adopt` leaves repo
4091
- * visibility unset for the operator to fill in).
4092
- */
4093
- type PublishTarget = {
4094
- kind: PublishKind;
4095
- visibility?: RepoVisibility | undefined;
4096
- language?: RepoLanguage | undefined;
4097
- };
4098
- type RepoEntry = {
4099
- /** Path relative to the manifest repo root (e.g. ".", "../takuhon"). */
4100
- path: string;
4101
- visibility?: RepoVisibility | undefined;
4102
- /** Source language (commits/comments/code, read by contributors). Independent of visibility. */
4103
- language?: RepoLanguage | undefined;
4104
- /** Published surfaces this repo emits (opt-in; absent for a repo that publishes nothing). */
4105
- publishes?: PublishTarget[] | undefined;
4106
- /**
4107
- * Instruction-source mode. Absent => `hub` (basou's native generated topology),
4108
- * so an existing roster's behavior is unchanged. `self` opts the repo out of
4109
- * generation: its AGENTS.md is a hand-authored committed file and basou stays
4110
- * hands-off. Resolve the effective mode with {@link instructionMode}.
4111
- */
4112
- instructions?: RepoInstructions | undefined;
4113
- };
4114
- /**
4115
- * The effective instruction-source mode for a repo: the declared `instructions`,
4116
- * defaulting to `hub` when absent. The default is the single guarantee that an
4117
- * existing roster (which has no `instructions` field) keeps basou's current
4118
- * hub-and-spoke behavior byte-for-byte — every generator branches on this, never
4119
- * on the raw optional field, so "absent => hub" is decided in exactly one place.
4120
- */
4121
- declare function instructionMode(entry: {
4122
- instructions?: RepoInstructions | undefined;
4123
- }): RepoInstructions;
4124
- type RosterDriftSummary = {
4125
- declaredCount: number;
4126
- capturedCount: number;
4127
- /** Declared in `repos` but absent from `source_roots`: a capture gap. */
4128
- gaps: RepoEntry[];
4129
- /** In `source_roots` but not declared in `repos` (e.g. a workspace view, or a stray). */
4130
- extra: string[];
4131
- /** Declared paths that are also captured. */
4132
- matched: string[];
4133
- /** True when there is no capture gap (every declared repo is covered). */
4134
- ok: boolean;
4135
- };
4136
- /**
4137
- * Compute the {@link RosterDriftSummary} for a project. A declared repo missing
4138
- * from the captured set is a `gap` (the surfaced suspicion); a captured path not
4139
- * in the declared set is `extra` (commonly the workspace view, which is a
4140
- * capture source but not itself a project repo). With no declared roster, there
4141
- * are no gaps (nothing to check against) and every captured path is `extra`.
4142
- */
4143
- declare function summarizeRosterDrift(input: {
4144
- repos?: RepoEntry[];
4145
- sourceRoots?: string[];
4146
- }): RosterDriftSummary;
4147
- type SourceRootsReconcile = {
4148
- /**
4149
- * The reconciled `source_roots`: the existing entries verbatim, then every
4150
- * declared repo path that was missing (normalized, in roster order). Existing
4151
- * order and form are preserved so the manifest diff is minimal and reversible.
4152
- */
4153
- next: string[];
4154
- /** Declared repo paths (normalized) that were appended because `source_roots` did not cover them. */
4155
- added: string[];
4156
- /** True when `source_roots` already covers every declared repo (`next` equals the current list). */
4157
- unchanged: boolean;
4158
- };
4159
- /**
4160
- * Derive the `source_roots` a project's declared repo roster requires. The
4161
- * roster (`repos`) is the single source of truth for which repos belong to the
4162
- * project; this is the actuator behind `basou project sync`, computing the
4163
- * additive reconciliation so every declared repo is captured.
4164
- *
4165
- * ADDITIVE ONLY: it appends declared paths that are missing and never removes
4166
- * an existing entry. A captured-but-undeclared path (commonly the generated
4167
- * workspace view — a legitimate capture source that is not itself a project
4168
- * repo) is preserved; pruning strays is deferred to the slice that generates
4169
- * the view (so basou knows which extras it owns). Existing entries are kept
4170
- * byte-identical; only appended paths are normalized.
4171
- *
4172
- * Pure: no filesystem or git I/O. Paths are compared in the same normalized
4173
- * form as {@link summarizeRosterDrift}, so a trailing-slash variant of an
4174
- * already-captured repo is not re-appended.
4175
- */
4176
- declare function reconcileSourceRoots(input: {
4177
- repos?: RepoEntry[];
4178
- sourceRoots?: string[];
4179
- }): SourceRootsReconcile;
4180
- /**
4181
- * On-disk classification of a source-root candidate during adoption: a git repo
4182
- * root (→ becomes a roster entry), a resolved-but-non-repo directory (the
4183
- * generated workspace view, `/tmp`, a scratch dir → excluded), or a path that
4184
- * could not be resolved on disk (→ excluded).
4185
- */
4186
- type AdoptCandidateKind = "repo" | "non-repo" | "unresolved";
4187
- type AdoptCandidate = {
4188
- /** Source-root path as declared (relative to the manifest root). */
4189
- path: string;
4190
- /** On-disk classification; the filesystem probing that produces it is the caller's job. */
4191
- kind: AdoptCandidateKind;
4192
- };
4193
- type RosterAdoptionPlan = {
4194
- /** Proposed `repos` entries: the candidates that are git repos (visibility left unset for the operator). */
4195
- repos: RepoEntry[];
4196
- /** Candidates excluded from the roster, with why (a non-repo directory, or an unresolvable path). */
4197
- excluded: {
4198
- path: string;
4199
- kind: Exclude<AdoptCandidateKind, "repo">;
4200
- }[];
4201
- };
4202
- /**
4203
- * Plan a `repos` roster from classified source-root candidates (the actuator
4204
- * behind `basou project adopt`). Pure: it partitions already-classified
4205
- * candidates — the realpath / `.git` filesystem probing that produces each
4206
- * `kind` is the caller's job, so this stays testable without disk I/O.
4207
- *
4208
- * A git repo becomes a roster entry (path only; visibility is left unset because
4209
- * it is a human judgment, kept independent of the other axes). A non-repo
4210
- * (commonly the generated workspace view) or an unresolvable path is excluded and
4211
- * reported, so the operator sees what was dropped and why before editing. Repo
4212
- * paths are deduped by normalized form, preserving the first declared form and
4213
- * order.
4214
- */
4215
- declare function planRosterAdoption(candidates: AdoptCandidate[]): RosterAdoptionPlan;
4216
-
4217
4335
  /**
4218
4336
  * Archive (fold) a repo out of a project's declared roster — the inverse of
4219
4337
  * `adopt` + `sync`, and the first PRUNING step in the saddle model (every prior
@@ -4379,7 +4497,7 @@ type PresetRepo = {
4379
4497
  };
4380
4498
  /**
4381
4499
  * Whether a repo has anything to render. A repo with no visibility, no language,
4382
- * and no published surface yields an all-"未設定" block that helps no one, so it
4500
+ * and no published surface yields an all-"unset" block that helps no one, so it
4383
4501
  * is reported as `undeclared` rather than generated.
4384
4502
  */
4385
4503
  declare function isRenderable(repo: PresetRepo): boolean;
@@ -4388,9 +4506,12 @@ declare function isRenderable(repo: PresetRepo): boolean;
4388
4506
  * BASOU:GENERATED markers in a canonical). Deterministic and OSS-generic: it
4389
4507
  * derives entirely from the declared fields, embedding no operator-specific
4390
4508
  * names, so re-running on an unchanged manifest produces byte-identical output
4391
- * (the basis for drift detection). The published surfaces are listed in their
4392
- * declared order. Returns the block WITHOUT a trailing newline; the marker
4393
- * writer adds the surrounding structure.
4509
+ * (the basis for drift detection). The block's content language follows the
4510
+ * repo's own declared `language` (its audience): `ja` renders the Japanese
4511
+ * strings byte-identical to the pre-i18n output; `en` / `en+ja` / undeclared
4512
+ * render English. The published surfaces are listed in their declared order.
4513
+ * Returns the block WITHOUT a trailing newline; the marker writer adds the
4514
+ * surrounding structure.
4394
4515
  */
4395
4516
  declare function renderPresetBlock(repo: PresetRepo): string;
4396
4517
  /** One repo aggregated by the view, rendered with its short visibility / language. */
@@ -4429,10 +4550,12 @@ type ViewPresetInput = {
4429
4550
  * {@link renderPresetBlock} it is deterministic and OSS-generic: it derives
4430
4551
  * entirely from the declared roster (repo names come from the manifest, no
4431
4552
  * operator-specific string is embedded), so re-running on an unchanged manifest
4432
- * produces byte-identical output. The repos are listed in the order supplied.
4433
- * An empty roster still renders cleanly (a header-only table, empty lists).
4434
- * Returns the block WITHOUT a trailing newline; the marker writer adds the
4435
- * surrounding structure.
4553
+ * produces byte-identical output. The view is a workspace-level artifact, so
4554
+ * its content language follows the ANCHOR entry's declared language (mirroring
4555
+ * the generated views' rule); a `ja` anchor renders byte-identical to the
4556
+ * pre-i18n output. The repos are listed in the order supplied. An empty roster
4557
+ * still renders cleanly (a header-only table, empty lists). Returns the block
4558
+ * WITHOUT a trailing newline; the marker writer adds the surrounding structure.
4436
4559
  */
4437
4560
  declare function renderViewPresetBlock(input: ViewPresetInput): string;
4438
4561
  /**
@@ -6590,4 +6713,4 @@ declare function overwriteYamlFile(filePath: string, value: unknown): Promise<vo
6590
6713
  */
6591
6714
  declare const BASOU_CORE_VERSION = "0.1.0";
6592
6715
 
6593
- export { ACTIVE_GAP_CAP_MS, AGENT_INFRA_DIRS, type ActiveTimeBasis, type AdapterOutputEvent, type AdoptCandidate, type AdoptCandidateKind, type AnchorStarterInput, type AnchorStarterRepo, type AppendBasouGitignoreOptions, type AppendBasouGitignoreResult, type AppendEventToExistingInput, type AppendEventToExistingResult, type Approval, type ApprovalApprovedEvent, type ApprovalExpiredEvent, ApprovalIdSchema, type ApprovalLocation, type ApprovalRejectedEvent, type ApprovalRequestedEvent, ApprovalSchema, type ApprovalStatus, ApprovalStatusSchema, type ArchivePlan, type ArchiveTaskInput, type ArchiveTaskResult, type AttachTaskInput, type AttachUpdateTaskStatusInput, type AttachableStatus, BASOU_CORE_VERSION, type BasouPaths, type BuildStopHookCommandOptions, type BulkChainResult, CLAUDE_IMPORT_SOURCE, CODEX_IMPORT_SOURCE, type CaptureMode, type ChainBreakReason, type ChainTailState, type ChainVerdict, type ChainVerdictStatus, type ChainedEvents, ChildProcessRunner, type CitedReview, type ClaudeSettings, type ClaudeTranscriptRecord, type ClaudeTranscriptToPayloadOptions, type CodexCommandLookup, type CodexRolloutRecord, type CodexRolloutToPayloadOptions, type CommandExecutedEvent, type CommandLookup, type CreateAdHocSessionInput, type CreateAdHocSessionResult, type CreateAdHocTaskInput, type CreateManifestInput, type CreateTaskInput, type CreateTaskResult, DEFAULT_STOP_HOOK_MIN_EDITS, type DayWorkStats, DecisionIdSchema, type DecisionRecordedEvent, type DecisionsRendererInput, type DecisionsRendererResult, type DeleteTaskInput, type DeleteTaskResult, type DiffResult, type EditTaskInput, type EditTaskResult, type Event, EventIdSchema, EventSchema, EventSourceSchema, type ExistingViewLink, FailedToFinalizeError, type FederatedRoot, type FileChange, type FileChangeStatus, type FileChangedEvent, GENERATED_END, GENERATED_START, type GitSnapshot, type GitSnapshotEvent, type GitignorePlanSummary, type HandoffRendererInput, type HandoffRendererResult, ID_PREFIXES, type IdPrefix, type ImportSessionOptions, type ImportSessionResult, type IncompleteWiring, type InstructionFileFact, type InstructionSymlinkFact, type InstructionSymlinkState, IsoTimestampSchema, JSON_SCHEMA_VERSION, type JsonSchemaArtifact, type LoadFederatedOptions, type LoadSessionEntriesOptions, type LoadTaskEntriesOptions, type LoadedApproval, type LockHandle, type LockScope, type Manifest, ManifestSchema, type MarkerSection, type Markers, type MeasureAvailability, type MissingCanonical, type NoteAddedEvent, ORIENTATION_END, ORIENTATION_START, type OrientationRendererInput, type OrientationRendererResult, type OrientationSummary, PROTOCOL_END, PROTOCOL_START, type PrefixedId, type PresetAction, type PresetCollision, type PresetMarkerConflict, type PresetMarkerKind, type PresetPlanSummary, type PresetRepo, type ProcessRunner, type PublishKind, type PublishTarget, REVIEW_RECORD_NO_INPUT_HINT, type RechainOptions, type RechainResult, type ReconcileAllResult, type ReconcileAllTasksInput, type ReconcileAllTasksOptions, type ReconcileFailure, type ReconcileResult, type ReconcileTaskInput, type RefreshLinkageInput, type RefreshLinkageResult, type ReimportOptions, type ReimportResult, type RenamePlan, type ReplayOptions, type ReplayWarning, type RepoEntry, type RepoGitignoreFacts, type RepoGitignorePlan, type RepoInstructions, type RepoLanguage, type RepoPresetFacts, type RepoPresetPlan, type RepoSymlinkFacts, type RepoSymlinkPlan, type RepoVisibility, type RepoWiringFacts, type ReportApprovalItem, type ReportData, type ReportDecisionItem, type ReportRendererInput, type ReportRendererResult, type ReportSessionItem, type ReportTaskItem, type RetrofitAction, type RetrofitAgentsState, type RetrofitFacts, type RetrofitPlan, type RetrofitReason, type ReviewBlocked, type ReviewFinding, type ReviewGapRepoSummary, type ReviewGapUnit, type ReviewGapVerdict, type ReviewGapsInput, type ReviewGapsSummary, type ReviewGateResult, type ReviewGateSilentReason, type ReviewRecordBlockedInput, type ReviewRecordFindingInput, type ReviewRecordInput, type ReviewRecordedEvent, type RiskLevel, RiskLevelSchema, type RosterAdoptionPlan, type RosterDriftSummary, type RunOptions, type RunResult, STOP_HOOK_TIMEOUT_SECONDS, STUCK_THRESHOLD_MS, type SanitizePathOptions, type SanitizeRelatedFilesResult, SchemaVersionSchema, type Session, type SessionEndedEvent, type SessionEntry, SessionIdSchema, type SessionImportPayload, SessionImportPayloadSchema, type SessionInnerImportInput, SessionInnerImportSchema, type SessionIntegrity, SessionIntegritySchema, type SessionMetrics, SessionMetricsSchema, SessionSchema, type SessionSkipReason, type SessionSourceKind, SessionSourceKindSchema, type SessionStartedEvent, type SessionStatus, type SessionStatusChangedEvent, SessionStatusSchema, type SessionWorkStats, type SourceRootScope, type SourceRootsReconcile, type SourceWorkStats, type StatusCount, StatusSchema, type StatusSnapshot, type StopHookEvaluation, type StopHookEvaluationInput, type StopHookRemoval, type StopHookSilentReason, type StopHookUpsert, type SuspectReason, type SymlinkCollision, type SymlinkConflict, type SymlinkPlanSummary, type Task, type TaskArchivedEvent, type TaskCreatedEvent, type TaskDeletedEvent, type TaskDocument, TaskIdSchema, type TaskLinkageRefreshedEvent, type TaskReconciledEvent, TaskSchema, type TaskSkipReason, type TaskStatus, type TaskStatusChangedEvent, type TaskStatusCount, TaskStatusSchema, TaskWriteAfterEventError, type TaskWriteAfterEventPhase, type TokenTotals, type UpdateAdHocTaskStatusInput, type UpdateTaskStatusInput, type UpdateTaskStatusResult, type ViewCollision, type ViewConflict, type ViewLanguage, type ViewLinkState, type ViewPresetInput, type ViewPresetRepo, type ViewRepoFact, type ViewStrayUnknown, type ViewStrings, type ViewWiringFacts, type WiringCollision, type WiringConflict, type WiringDriftSummary, type WiringRisk, type WiringSummary, type WorkStatsInput, type WorkStatsResult, type WorkStatsTotals, WorkspaceIdSchema, type WorkspaceViewPlan, type WriteEventsBulkOptions, type WriteTaskFileMode, acquireLock, appendBasouGitignore, appendChainedEvent, appendChainedEventLocked, appendEvent, appendEventToExistingSession, archiveTask, assertBasouRootSafe, basouPaths, buildJsonSchemas, buildReviewRecordLabel, buildReviewRecordedEvent, buildStatusSnapshot, buildStopHookCommand, chainEvents, chainRawJsonLines, classifyFilesBySourceRoot, classifyRetrofit, classifySuspect, claudeCodeAdapterMetadata, claudeTranscriptToImportPayload, codexAdapterMetadata, codexRolloutToImportPayload, computeWorkStats, createAdHocSessionWithEvent, createManifest, createTaskWithEvent, deleteTask, editTask, ensureBasouDirectory, enumerateApprovals, enumerateArchivedTaskIds, enumerateSessionDirs, enumerateTaskIds, evaluateStopHook, finalizeSessionYaml, findBasouStopHookCommand, findErrorCode, findReviewGaps, formatDurationMs, genesisHash, getDiff, getSnapshot, importSessionFromJson, inspectChainTail, instructionMode, isBasouStopHookCommand, isGitNotFound, isImportDerivedSource, isLazyExpired, isRenderable, isValidPrefixedId, lineHash, linkYamlFile, loadApproval, loadFederatedSessionEntries, loadSessionEntries, loadTaskEntries, normalizeRepoKey, normalizeRepoPath, overwriteYamlFile, parseDuration, parseMarkers, parseReviewRecordInput, pathBasename, planArchive, planGitignore, planRename, planRosterAdoption, planWorkspaceView, prefixedUlid, readAllEvents, readManifest, readMarkdownFile, readSessionYaml, readStatus, readTaskFile, readTaskFileWithArchiveFallback, readYamlFile, rechainSessionInPlace, reconcileAllTasks, reconcileSourceRoots, reconcileTask, refreshTaskLinkedSessions, reimportPreservingId, removeMarkerSection, removeStopHook, renderAnchorStarter, renderDecisions, renderHandoff, renderOrientation, renderPresetBlock, renderReport, renderViewPresetBlock, renderWithMarkers, replayEvents, resolveBasouRepositoryRoot, resolveClaudeCodeCommand, resolveCodexCommand, resolveRepositoryRoot, resolveSessionId, resolveTaskId, resolveViewLanguage, resolveViewLanguageFromPaths, safeSimpleGit, sanitizePath, sanitizeRelatedFiles, sanitizeWorkingDirectory, seedMarkers, serializeEventLine, serializeJsonSchema, sessionWorkStatsFromEvents, summarizeAdapterOutput, summarizeOrientation, summarizePresetPlan, summarizeRosterDrift, summarizeSymlinkPlan, summarizeWiring, summarizeWiringDrift, tryRemoteUrl, ulid, unknownManifestKeys, updateTaskStatusWithEvent, upsertStopHook, verifyEventsChain, viewStrings, writeEventsBulk, writeManifest, writeMarkdownFile, writeStatus, writeTaskFile, writeYamlFile };
6716
+ export { ACTIVE_GAP_CAP_MS, AGENT_INFRA_DIRS, type ActiveTimeBasis, type AdapterOutputEvent, type AdoptCandidate, type AdoptCandidateKind, type AnchorStarterInput, type AnchorStarterRepo, type AppendBasouGitignoreOptions, type AppendBasouGitignoreResult, type AppendEventToExistingInput, type AppendEventToExistingResult, type Approval, type ApprovalApprovedEvent, type ApprovalExpiredEvent, ApprovalIdSchema, type ApprovalLocation, type ApprovalRejectedEvent, type ApprovalRequestedEvent, ApprovalSchema, type ApprovalStatus, ApprovalStatusSchema, type ArchivePlan, type ArchiveTaskInput, type ArchiveTaskResult, type AttachTaskInput, type AttachUpdateTaskStatusInput, type AttachableStatus, BASOU_CORE_VERSION, type BasouPaths, type BuildStopHookCommandOptions, type BulkChainResult, CLAUDE_IMPORT_SOURCE, CODEX_IMPORT_SOURCE, type CaptureMode, type ChainBreakReason, type ChainTailState, type ChainVerdict, type ChainVerdictStatus, type ChainedEvents, ChildProcessRunner, type CitedReview, type ClaudeSettings, type ClaudeTranscriptRecord, type ClaudeTranscriptToPayloadOptions, type CodexCommandLookup, type CodexRolloutRecord, type CodexRolloutToPayloadOptions, type CommandExecutedEvent, type CommandLookup, type CreateAdHocSessionInput, type CreateAdHocSessionResult, type CreateAdHocTaskInput, type CreateManifestInput, type CreateTaskInput, type CreateTaskResult, DEFAULT_STOP_HOOK_MIN_EDITS, type DayWorkStats, DecisionIdSchema, type DecisionRecordedEvent, type DecisionsRendererInput, type DecisionsRendererResult, type DeleteTaskInput, type DeleteTaskResult, type DiffResult, type EditTaskInput, type EditTaskResult, type Event, EventIdSchema, EventSchema, EventSourceSchema, type ExistingViewLink, FailedToFinalizeError, type FederatedRoot, type FileChange, type FileChangeStatus, type FileChangedEvent, GENERATED_END, GENERATED_START, type GitSnapshot, type GitSnapshotEvent, type GitignorePlanSummary, type HandoffRendererInput, type HandoffRendererResult, ID_PREFIXES, type IdPrefix, type ImportSessionOptions, type ImportSessionResult, type IncompleteWiring, type InstructionFileFact, type InstructionSymlinkFact, type InstructionSymlinkState, IsoTimestampSchema, JSON_SCHEMA_VERSION, type JsonSchemaArtifact, type LoadFederatedOptions, type LoadSessionEntriesOptions, type LoadTaskEntriesOptions, type LoadedApproval, type LockHandle, type LockScope, type Manifest, ManifestSchema, type MarkerSection, type Markers, type MeasureAvailability, type MissingCanonical, type NoteAddedEvent, ORIENTATION_END, ORIENTATION_START, type OrientationRendererInput, type OrientationRendererResult, type OrientationSummary, PROTOCOL_END, PROTOCOL_START, type PrefixedId, type PresetAction, type PresetCollision, type PresetMarkerConflict, type PresetMarkerKind, type PresetPlanSummary, type PresetRepo, type PresetStrings, type ProcessRunner, type PublishKind, type PublishTarget, REVIEW_RECORD_NO_INPUT_HINT, type RechainOptions, type RechainResult, type ReconcileAllResult, type ReconcileAllTasksInput, type ReconcileAllTasksOptions, type ReconcileFailure, type ReconcileResult, type ReconcileTaskInput, type RefreshLinkageInput, type RefreshLinkageResult, type ReimportOptions, type ReimportResult, type RenamePlan, type ReplayOptions, type ReplayWarning, type RepoEntry, type RepoGitignoreFacts, type RepoGitignorePlan, type RepoInstructions, type RepoLanguage, type RepoPresetFacts, type RepoPresetPlan, type RepoSymlinkFacts, type RepoSymlinkPlan, type RepoVisibility, type RepoWiringFacts, type ReportApprovalItem, type ReportData, type ReportDecisionItem, type ReportRendererInput, type ReportRendererResult, type ReportSessionItem, type ReportTaskItem, type RetrofitAction, type RetrofitAgentsState, type RetrofitFacts, type RetrofitPlan, type RetrofitReason, type ReviewBlocked, type ReviewFinding, type ReviewGapRepoSummary, type ReviewGapUnit, type ReviewGapVerdict, type ReviewGapsInput, type ReviewGapsSummary, type ReviewGateResult, type ReviewGateSilentReason, type ReviewRecordBlockedInput, type ReviewRecordFindingInput, type ReviewRecordInput, type ReviewRecordedEvent, type RiskLevel, RiskLevelSchema, type RosterAdoptionPlan, type RosterDriftSummary, type RunOptions, type RunResult, STOP_HOOK_TIMEOUT_SECONDS, STUCK_THRESHOLD_MS, type SanitizePathOptions, type SanitizeRelatedFilesResult, SchemaVersionSchema, type Session, type SessionEndedEvent, type SessionEntry, SessionIdSchema, type SessionImportPayload, SessionImportPayloadSchema, type SessionInnerImportInput, SessionInnerImportSchema, type SessionIntegrity, SessionIntegritySchema, type SessionMetrics, SessionMetricsSchema, SessionSchema, type SessionSkipReason, type SessionSourceKind, SessionSourceKindSchema, type SessionStartedEvent, type SessionStatus, type SessionStatusChangedEvent, SessionStatusSchema, type SessionWorkStats, type SourceRootScope, type SourceRootsReconcile, type SourceWorkStats, type StatusCount, StatusSchema, type StatusSnapshot, type StopHookEvaluation, type StopHookEvaluationInput, type StopHookRemoval, type StopHookSilentReason, type StopHookUpsert, type SuspectReason, type SymlinkCollision, type SymlinkConflict, type SymlinkPlanSummary, type Task, type TaskArchivedEvent, type TaskCreatedEvent, type TaskDeletedEvent, type TaskDocument, TaskIdSchema, type TaskLinkageRefreshedEvent, type TaskReconciledEvent, TaskSchema, type TaskSkipReason, type TaskStatus, type TaskStatusChangedEvent, type TaskStatusCount, TaskStatusSchema, TaskWriteAfterEventError, type TaskWriteAfterEventPhase, type TokenTotals, type UpdateAdHocTaskStatusInput, type UpdateTaskStatusInput, type UpdateTaskStatusResult, type ViewCollision, type ViewConflict, type ViewLanguage, type ViewLinkState, type ViewPresetInput, type ViewPresetRepo, type ViewRepoFact, type ViewStrayUnknown, type ViewStrings, type ViewWiringFacts, type WiringCollision, type WiringConflict, type WiringDriftSummary, type WiringRisk, type WiringSummary, type WorkStatsInput, type WorkStatsResult, type WorkStatsTotals, WorkspaceIdSchema, type WorkspaceViewPlan, type WriteEventsBulkOptions, type WriteTaskFileMode, acquireLock, appendBasouGitignore, appendChainedEvent, appendChainedEventLocked, appendEvent, appendEventToExistingSession, archiveTask, assertBasouRootSafe, basouPaths, buildJsonSchemas, buildReviewRecordLabel, buildReviewRecordedEvent, buildStatusSnapshot, buildStopHookCommand, chainEvents, chainRawJsonLines, classifyFilesBySourceRoot, classifyRetrofit, classifySuspect, claudeCodeAdapterMetadata, claudeTranscriptToImportPayload, codexAdapterMetadata, codexRolloutToImportPayload, computeWorkStats, createAdHocSessionWithEvent, createManifest, createTaskWithEvent, deleteTask, editTask, ensureBasouDirectory, enumerateApprovals, enumerateArchivedTaskIds, enumerateSessionDirs, enumerateTaskIds, evaluateStopHook, finalizeSessionYaml, findBasouStopHookCommand, findErrorCode, findReviewGaps, formatDurationMs, genesisHash, getDiff, getSnapshot, importSessionFromJson, inspectChainTail, instructionMode, isBasouStopHookCommand, isGitNotFound, isImportDerivedSource, isLazyExpired, isRenderable, isValidPrefixedId, lineHash, linkYamlFile, loadApproval, loadFederatedSessionEntries, loadSessionEntries, loadTaskEntries, normalizeRepoKey, normalizeRepoPath, overwriteYamlFile, parseDuration, parseMarkers, parseReviewRecordInput, pathBasename, planArchive, planGitignore, planRename, planRosterAdoption, planWorkspaceView, prefixedUlid, presetStrings, readAllEvents, readManifest, readMarkdownFile, readSessionYaml, readStatus, readTaskFile, readTaskFileWithArchiveFallback, readYamlFile, rechainSessionInPlace, reconcileAllTasks, reconcileSourceRoots, reconcileTask, refreshTaskLinkedSessions, reimportPreservingId, removeMarkerSection, removeStopHook, renderAnchorStarter, renderDecisions, renderHandoff, renderOrientation, renderPresetBlock, renderReport, renderViewPresetBlock, renderWithMarkers, replayEvents, resolveAnchorContentLanguage, resolveBasouRepositoryRoot, resolveClaudeCodeCommand, resolveCodexCommand, resolveRepoContentLanguage, resolveRepositoryRoot, resolveSessionId, resolveTaskId, resolveViewLanguage, resolveViewLanguageFromPaths, safeSimpleGit, sanitizePath, sanitizeRelatedFiles, sanitizeWorkingDirectory, seedMarkers, serializeEventLine, serializeJsonSchema, sessionWorkStatsFromEvents, summarizeAdapterOutput, summarizeOrientation, summarizePresetPlan, summarizeRosterDrift, summarizeSymlinkPlan, summarizeWiring, summarizeWiringDrift, tryRemoteUrl, ulid, unknownManifestKeys, updateTaskStatusWithEvent, upsertStopHook, verifyEventsChain, viewStrings, writeEventsBulk, writeManifest, writeMarkdownFile, writeStatus, writeTaskFile, writeYamlFile };