@turri-dev/cli 0.1.6-next.336dd6e → 0.1.7-next.9aec40e

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 (146) hide show
  1. package/.pi/themes/turri-dark.json +1 -1
  2. package/README.md +1 -1
  3. package/dist/ask.d.ts +83 -0
  4. package/dist/brand.d.ts +13 -0
  5. package/dist/btw.d.ts +67 -0
  6. package/dist/chat-models.d.ts +22 -0
  7. package/dist/chat-skills.d.ts +17 -0
  8. package/dist/cli-options.d.ts +25 -0
  9. package/dist/cli.d.ts +9 -0
  10. package/dist/cli.js +7 -1
  11. package/dist/config-command.d.ts +26 -0
  12. package/dist/config-edit.d.ts +69 -0
  13. package/dist/config.d.ts +321 -0
  14. package/dist/conform-cli.d.ts +1 -0
  15. package/dist/cultivate-cli.d.ts +1 -0
  16. package/dist/drift-cli.d.ts +1 -0
  17. package/dist/environment.d.ts +39 -0
  18. package/dist/environment.js +26 -0
  19. package/dist/extension.d.ts +147 -0
  20. package/dist/extension.js +36 -10
  21. package/dist/genome.d.ts +62 -0
  22. package/dist/graph.d.ts +52 -0
  23. package/dist/host.d.ts +20 -0
  24. package/dist/host.js +23 -0
  25. package/dist/identity.d.ts +2 -0
  26. package/dist/init-config.d.ts +106 -0
  27. package/dist/jellyfish.d.ts +25 -0
  28. package/dist/judge.d.ts +25 -0
  29. package/dist/lineage-cli.d.ts +1 -0
  30. package/dist/loop-cli.d.ts +34 -0
  31. package/dist/loop-tools.d.ts +80 -0
  32. package/dist/mature-tools.d.ts +53 -0
  33. package/dist/model-check.d.ts +42 -0
  34. package/dist/module-report.d.ts +9 -0
  35. package/dist/pi-launch.d.ts +1 -0
  36. package/dist/pi.d.ts +246 -0
  37. package/dist/picture-row.d.ts +10 -0
  38. package/dist/plain/check.d.ts +23 -0
  39. package/dist/plain/concepts.d.ts +11 -0
  40. package/dist/plain/errors.d.ts +22 -0
  41. package/dist/plain/files.d.ts +12 -0
  42. package/dist/plain/highlight.d.ts +42 -0
  43. package/dist/plain/index.d.ts +15 -0
  44. package/dist/plain/liquid.d.ts +22 -0
  45. package/dist/plain/markdown.d.ts +74 -0
  46. package/dist/plain/parser.d.ts +87 -0
  47. package/dist/plain/spec.d.ts +90 -0
  48. package/dist/plain/stdlib.d.ts +14 -0
  49. package/dist/question-dialog.d.ts +51 -0
  50. package/dist/questioning.d.ts +55 -0
  51. package/dist/quiet.d.ts +34 -0
  52. package/dist/regenerate/activity.d.ts +207 -0
  53. package/dist/regenerate/agent-env.d.ts +44 -0
  54. package/dist/regenerate/agent-shell.d.ts +49 -0
  55. package/dist/regenerate/arbiter.d.ts +68 -0
  56. package/dist/regenerate/audit.d.ts +69 -0
  57. package/dist/regenerate/cases.d.ts +9 -0
  58. package/dist/regenerate/change-view.d.ts +18 -0
  59. package/dist/regenerate/choose-conformance.d.ts +32 -0
  60. package/dist/regenerate/chunk-plan.d.ts +164 -0
  61. package/dist/regenerate/codebase.d.ts +21 -0
  62. package/dist/regenerate/command-check.d.ts +40 -0
  63. package/dist/regenerate/compaction.d.ts +13 -0
  64. package/dist/regenerate/confine.d.ts +62 -0
  65. package/dist/regenerate/conform.d.ts +63 -0
  66. package/dist/regenerate/conformance-agents.d.ts +405 -0
  67. package/dist/regenerate/conformance.d.ts +189 -0
  68. package/dist/regenerate/conversation-writes.d.ts +10 -0
  69. package/dist/regenerate/credentials.d.ts +18 -0
  70. package/dist/regenerate/debug-log.d.ts +54 -0
  71. package/dist/regenerate/debugger.d.ts +31 -0
  72. package/dist/regenerate/delivery.d.ts +6 -0
  73. package/dist/regenerate/diagnose-job.d.ts +2 -0
  74. package/dist/regenerate/diagnose.d.ts +46 -0
  75. package/dist/regenerate/diff-view.d.ts +61 -0
  76. package/dist/regenerate/drift.d.ts +84 -0
  77. package/dist/regenerate/engine.d.ts +52 -0
  78. package/dist/regenerate/environment-error.d.ts +136 -0
  79. package/dist/regenerate/job-log.d.ts +28 -0
  80. package/dist/regenerate/job-panel.d.ts +122 -0
  81. package/dist/regenerate/jobs-tree.d.ts +71 -0
  82. package/dist/regenerate/jobs.d.ts +186 -0
  83. package/dist/regenerate/lanes.d.ts +16 -0
  84. package/dist/regenerate/lineage.d.ts +95 -0
  85. package/dist/regenerate/list-arguments.d.ts +21 -0
  86. package/dist/regenerate/loop.d.ts +392 -0
  87. package/dist/regenerate/masking.d.ts +19 -0
  88. package/dist/regenerate/notes.d.ts +159 -0
  89. package/dist/regenerate/os-sandbox.d.ts +89 -0
  90. package/dist/regenerate/panel-dock.d.ts +23 -0
  91. package/dist/regenerate/paths.d.ts +92 -0
  92. package/dist/regenerate/plain-palette.d.ts +34 -0
  93. package/dist/regenerate/prompt.d.ts +192 -0
  94. package/dist/regenerate/records.d.ts +88 -0
  95. package/dist/regenerate/regenerate.d.ts +108 -0
  96. package/dist/regenerate/regression.d.ts +58 -0
  97. package/dist/regenerate/release.d.ts +123 -0
  98. package/dist/regenerate/requires.d.ts +96 -0
  99. package/dist/regenerate/resources.d.ts +53 -0
  100. package/dist/regenerate/self-check.d.ts +29 -0
  101. package/dist/regenerate/services.d.ts +28 -0
  102. package/dist/regenerate/shell.d.ts +91 -0
  103. package/dist/regenerate/side-panel.d.ts +57 -0
  104. package/dist/regenerate/spec-map-view.d.ts +139 -0
  105. package/dist/regenerate/spec-map.d.ts +138 -0
  106. package/dist/regenerate/spec-steps.d.ts +137 -0
  107. package/dist/regenerate/state.d.ts +20 -0
  108. package/dist/regenerate/steer.d.ts +34 -0
  109. package/dist/regenerate/steering.d.ts +56 -0
  110. package/dist/regenerate/stop-report.d.ts +43 -0
  111. package/dist/regenerate/submit-work.d.ts +42 -0
  112. package/dist/regenerate/test-kinds.d.ts +42 -0
  113. package/dist/regenerate/test-scripts.d.ts +221 -0
  114. package/dist/regenerate/testing.d.ts +141 -0
  115. package/dist/regenerate/transcript-view.d.ts +21 -0
  116. package/dist/regenerate/unit-gate.d.ts +27 -0
  117. package/dist/regenerate/unit-review.d.ts +152 -0
  118. package/dist/regenerate/web.d.ts +61 -0
  119. package/dist/regenerate/workspace.d.ts +12 -0
  120. package/dist/regenerate-cli.d.ts +1 -0
  121. package/dist/release-agent.d.ts +26 -0
  122. package/dist/release-cli.d.ts +1 -0
  123. package/dist/release-tools.d.ts +38 -0
  124. package/dist/resume-line.d.ts +2 -0
  125. package/dist/review/live.d.ts +72 -0
  126. package/dist/rules.d.ts +20 -0
  127. package/dist/run-report.d.ts +88 -0
  128. package/dist/screen-padding.d.ts +28 -0
  129. package/dist/self-invocation.d.ts +25 -0
  130. package/dist/setup.d.ts +43 -0
  131. package/dist/skill-progress.d.ts +46 -0
  132. package/dist/skill.d.ts +98 -0
  133. package/dist/skills.d.ts +30 -0
  134. package/dist/spec-diff-cli.d.ts +1 -0
  135. package/dist/spec-tools.d.ts +36 -0
  136. package/dist/stack.d.ts +58 -0
  137. package/dist/stacks.d.ts +12 -0
  138. package/dist/stdlib.d.ts +27 -0
  139. package/dist/terminal-images.d.ts +2 -0
  140. package/dist/tools.d.ts +101 -0
  141. package/dist/validate-cli.d.ts +1 -0
  142. package/docs/README.md +2 -0
  143. package/docs/hosting.md +51 -0
  144. package/docs/installation.md +1 -1
  145. package/docs/theming.md +2 -2
  146. package/package.json +8 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The ***plain standard library, as the agents that write specs are told it: every stack's import name,
3
+ * its conformance template and what it is, and where the files are - read from `stdlib/` each time, so
4
+ * what they are told is what is there. Sorted, so the rules block it goes into is the same every turn and
5
+ * stays cached.
6
+ */
7
+ export interface StdlibTemplate {
8
+ /** What a spec imports it as: `stdlib/backend/python-fastapi`. */
9
+ name: string;
10
+ description: string;
11
+ text: string;
12
+ }
13
+ export declare function stdlibTemplates(dir?: string): StdlibTemplate[];
14
+ /** A stack to import - not a kind's `common`, not a conformance template, and not a language's. */
15
+ export declare function isStack(template: StdlibTemplate): boolean;
16
+ /** A stack's conformance template: `stdlib/backend/python-fastapi` has `stdlib/backend/conformance/python-fastapi`. */
17
+ export declare function conformanceOf(stack: string): string;
18
+ /**
19
+ * The catalogue appended to the stdlib rule: every stack with its conformance template and what it is, the
20
+ * shared templates, and the folder they are all in - an absolute path, so an agent reads the one it imports
21
+ * instead of looking for it. The text of each is not in it: there are too many to carry in every prompt.
22
+ */
23
+ export declare function stdlibCatalogue(templates?: StdlibTemplate[], dir?: string): string;
24
+ /** How many stacks the standard library has, for the banner. */
25
+ export declare function stdlibStackCount(templates?: StdlibTemplate[]): number;
26
+ /** The standard library as the person reads it, with `/stdlib`: each kind's stacks, what each is, and how to import one. */
27
+ export declare function describeStdlib(templates?: StdlibTemplate[], dir?: string): string;
@@ -0,0 +1,2 @@
1
+ /** What PI_IMAGE_PROTOCOL turri sets for this terminal: none where it shows no images, kitty for an iTerm2 that speaks it, else nothing. */
2
+ export declare function imageProtocolFor(env?: NodeJS.ProcessEnv): "none" | "kitty" | undefined;
@@ -0,0 +1,101 @@
1
+ import { type ToolDefinition } from "@earendil-works/pi-coding-agent";
2
+ import { Type, type Static } from "typebox";
3
+ import type { Questioning } from "./questioning.ts";
4
+ /**
5
+ * Personal tools.
6
+ *
7
+ * `write_artifact` is the executor's only way to produce output: it can read the
8
+ * repo, but everything it makes lands in one sandboxed directory under a name the
9
+ * graph chose. That is what lets the gate know exactly what to review - there is
10
+ * no "find the thing the agent probably changed" step.
11
+ */
12
+ export declare function createWriteArtifactTool(runDir: string): ToolDefinition<Type.TObject<{
13
+ path: Type.TString;
14
+ content: Type.TString;
15
+ }>, {
16
+ path: string;
17
+ bytes: number;
18
+ }, any> & ToolDefinition<any, any, any>;
19
+ export declare const VerdictSchema: Type.TObject<{
20
+ verdict: Type.TUnion<[Type.TLiteral<"pass">, Type.TLiteral<"fail">]>;
21
+ violations: Type.TArray<Type.TObject<{
22
+ criterion: Type.TString;
23
+ evidence: Type.TString;
24
+ fix: Type.TString;
25
+ }>>;
26
+ }>;
27
+ export type Verdict = Static<typeof VerdictSchema>;
28
+ /**
29
+ * The judge's only tool. Forcing the verdict through a schema is the difference
30
+ * between a decision the graph can branch on and a paragraph someone has to read.
31
+ * `terminate` stops the judge session as soon as the verdict lands.
32
+ */
33
+ export declare function createVerdictTool(onVerdict: (v: Verdict) => void): ToolDefinition<Type.TObject<{
34
+ verdict: Type.TUnion<[Type.TLiteral<"pass">, Type.TLiteral<"fail">]>;
35
+ violations: Type.TArray<Type.TObject<{
36
+ criterion: Type.TString;
37
+ evidence: Type.TString;
38
+ fix: Type.TString;
39
+ }>>;
40
+ }>, {
41
+ verdict: "pass" | "fail";
42
+ violations: {
43
+ fix: string;
44
+ evidence: string;
45
+ criterion: string;
46
+ }[];
47
+ }, any> & ToolDefinition<any, any, any>;
48
+ import { runAsk, type AskUser, type AskUserRequest } from "./ask.ts";
49
+ import { type LiveReviewer } from "./review/live.ts";
50
+ export type { AskUser, AskUserRequest };
51
+ /**
52
+ * Lets a skill step put a question to the person running it.
53
+ *
54
+ * A gated skill otherwise runs to completion with nobody to ask, which is fine for work
55
+ * that is fully specified and useless for an interview. The harness still owns the
56
+ * sequence - the step decides what to ask, not whether the gate afterwards runs.
57
+ */
58
+ /**
59
+ * `gate`, for an interview that holds its questions to rules - the questioning level's cap (questioning.ts), an answer
60
+ * written as a spec change before the next question: a question it refuses is not asked, and `confirms_phase` marks a
61
+ * phase's closing confirmation, which the cap never counts.
62
+ *
63
+ * `talks`: where the asker answers a person who chose "Chat about this" - `"reply"`, the conversation's agent, in its
64
+ * reply; `"context"`, a skill's agent, whose replies nobody sees, as the `context` of the question asked again. Such a
65
+ * choice is no answer: neither the cap nor `onAnswered` counts it.
66
+ */
67
+ export declare function createAskUserTool(ask: AskUser, onAnswered?: (answer: string, confirmsPhase: boolean) => void, said?: () => string, gate?: Pick<Questioning, "refusal" | "answered">, talks?: "reply" | "context"): ToolDefinition<Type.TObject<{
68
+ confirms_phase?: Type.TOptional<Type.TBoolean> | undefined;
69
+ question: Type.TString;
70
+ options: Type.TOptional<Type.TArray<Type.TString>>;
71
+ multi_select: Type.TOptional<Type.TBoolean>;
72
+ context: Type.TOptional<Type.TString>;
73
+ free_form: Type.TOptional<Type.TBoolean>;
74
+ }>, {
75
+ question: string;
76
+ answer: string;
77
+ }, any> & ToolDefinition<any, any, any>;
78
+ export { runAsk };
79
+ /** Ends the questions of a phase the questioning level caps: what is left, the agent decides itself. */
80
+ export declare function createEndQuestionsTool(questioning: Pick<Questioning, "end">): ToolDefinition<Type.TObject<{}>, {}, any> & ToolDefinition<any, any, any>;
81
+ /**
82
+ * Everything the reviewer has to say since the last tool call.
83
+ *
84
+ * It rides along on the tool results the interviewer is already getting, so a finding
85
+ * lands between two questions without the interviewer having to remember to go looking
86
+ * for one.
87
+ */
88
+ export declare function reviewNote(liveReview: LiveReviewer | undefined): string;
89
+ export type { LiveReviewer };
90
+ /**
91
+ * With a live reviewer, a way to answer the reviewer's questions. How the builds stand, a skill reads with the
92
+ * conversation's own drift (loop-tools.ts), the reviewer's findings riding along on it (`withReviewNote`).
93
+ */
94
+ export declare function createReviewTools(liveReview?: LiveReviewer): (ToolDefinition<Type.TObject<{
95
+ question_id: Type.TString;
96
+ answer: Type.TString;
97
+ }>, {
98
+ accepted: boolean;
99
+ }, any> & ToolDefinition<any, any, any>)[];
100
+ /** A tool whose every result carries what the reviewer has said since the last one. */
101
+ export declare function withReviewNote(tool: ToolDefinition<any, any, any>, liveReview: LiveReviewer | undefined): ToolDefinition<any, any, any>;
@@ -0,0 +1 @@
1
+ export {};
package/docs/README.md CHANGED
@@ -31,6 +31,7 @@ turri implements regenerative software: the \*\*\*plain specs are the durable de
31
31
  | what the agents can and cannot reach | [the sandbox](sandbox.md) |
32
32
  | how skill review gates and judges work | [skills and gates](skills-and-gates.md) |
33
33
  | how the parser matches the reference implementation | [the \*\*\*plain parser](parser.md) |
34
+ | how a desktop app or an editor runs turri's conversation itself | [running turri in a host](hosting.md) |
34
35
  | where the code for something lives | [development](development.md#layout) |
35
36
 
36
37
  ## All pages
@@ -48,4 +49,5 @@ turri implements regenerative software: the \*\*\*plain specs are the durable de
48
49
  | [Skills and gates](skills-and-gates.md) | the gate syntax, what the harness enforces, what a step can do, the rules, trying the gates |
49
50
  | [The \*\*\*plain parser](parser.md) | the TypeScript port, `turri validate`, inheritance, the iterator, fidelity |
50
51
  | [Theming](theming.md) | the turri themes, contrast, backgrounds, the font |
52
+ | [Running turri in a host](hosting.md) | `@turri-dev/cli/host`: the conversation in a host's own window - its jobs, its questions - and what a host shows beside it |
51
53
  | [Development](development.md) | tests, the source layout, known edges |
@@ -0,0 +1,51 @@
1
+ # Running turri in a host
2
+
3
+ `turri` runs its conversation in a terminal. A host - a desktop app, an editor - can run the same conversation itself, in its own window, and show what turri's terminal would draw in its own way: the jobs, the questions, the spec. It imports turri from npm as `@turri-dev/cli/host`.
4
+
5
+ ## What the host entry gives
6
+
7
+ `@turri-dev/cli/host` is turri's compiled code (`dist/host.js`, with its types) - the conversation and what a host shows beside it:
8
+
9
+ | export | what it is |
10
+ | --- | --- |
11
+ | `createTurriExtension(host)` | turri's conversation as an extension of pi's: every tool, slash command, rule and skill the terminal has. The host is told of its jobs and asks its questions - see below. |
12
+ | `pi` | pi itself, as turri's extension is built against it. Make the session with this one - `pi.createAgentSession`, `pi.DefaultResourceLoader` - not another copy. |
13
+ | `readProjectConfig`, `projectModels`, `modelSpec`, `configForSpec`, `hasProjectConfig`, `stacksOf` | the project's settings, as [config.turri.yaml](config.md) has them. |
14
+ | `checkPlainFile`, `plainFileParser`, `resolveTemplateDirs`, `iterateFunctionalSpecs`, `FUNCTIONAL_REQUIREMENTS` | a spec checked and parsed, its functional specs one by one - as `turri validate` reads it. |
15
+ | `highlightLines`, `roleOf` | a spec's lines coloured by turri's own \*\*\*plain grammar. |
16
+ | `functionalityCompletion`, `createWorkLoop`, `createJobRegistry`, `promptOf`, `describeModules` | how far each functional spec is built, and - on a loop of the host's own with `dryRun` - the work a spec change would plan, as `turri glimpse` does. |
17
+ | `onModelEvent`, `describeTurnIncident` | a provider failing and waited out, a turn turri ended itself. |
18
+ | `sweepOrphanedGroups` | stop what a turri killed outright left running, before anything starts. |
19
+
20
+ It is turri's own code, as the terminal runs it: a 0.x release may change any of it.
21
+
22
+ ## The conversation in a host
23
+
24
+ ```js
25
+ import { createTurriExtension, pi } from "@turri-dev/cli/host";
26
+
27
+ const loader = new pi.DefaultResourceLoader({
28
+ cwd,
29
+ agentDir: pi.getAgentDir(),
30
+ extensionFactories: [
31
+ createTurriExtension({
32
+ onJobs: (jobs) => {}, // the conversation's job registry: every pulse it starts
33
+ onWorkLoop: (loop) => {}, // its work loop, once work is first asked for
34
+ onJobChange: (job) => {}, // a job started, moved on, did something, or ended
35
+ onPlanChange: () => {}, // what is planned changed with no job
36
+ dialogs: { select, input }, // ask_user's questions, put in the host's own dialogs
37
+ }),
38
+ ],
39
+ });
40
+ await loader.reload();
41
+ const { session } = await pi.createAgentSession({ cwd, resourceLoader: loader });
42
+ await session.bindExtensions({ uiContext, mode: "tui" });
43
+ ```
44
+
45
+ - **The jobs.** The pulses the conversation starts - its tools, `/regenerate`, a spec change - run in its own job registry and work loop, the project's one. The host is handed both as they are made, and told of each job as it changes, so it shows the very jobs the conversation runs. Its buttons are best the conversation's commands - `session.prompt("/regenerate app.plain")` - so there is never a second loop on the same project.
46
+ - **The questions.** `dialogs` is `ask_user`'s two dialogs: `select(title, options, context, at)` and `input(title, context)`, each resolving with the answer, or undefined when the person dismissed it. Given, the conversation's questions and a skill's interview are put in them; without it, in the terminal's own dialog.
47
+ - **The mode.** `mode: "tui"` runs the work in the background and keeps the conversation free, as the terminal does; `rpc`, `json` and `print` wait for each job. The extension's other UI calls - its notices, its working line, a confirm - come to the host's `uiContext`, as pi's [SDK](https://github.com/earendil-works/pi) describes it.
48
+
49
+ ## Running it
50
+
51
+ The host entry is compiled JavaScript, so any Node from 22.19 runs it - Electron's own included; nothing strips types. It finds turri's own folders - `genome/`, `stdlib/`, `.pi/` - beside `dist/` in the package, wherever npm installed it.
@@ -17,7 +17,7 @@ turri init-config # a config.turri.yaml with the model you talk to and the one
17
17
  turri # pi, with turri's tools, skills and themes loaded
18
18
  ```
19
19
 
20
- The package is `@turri-dev/cli` - npm keeps the name `turri` back, as too like another package's - and the command it puts on your PATH is `turri`. `npm install -g @turri-dev/cli@next` gets the latest prerelease instead, built from the last commit on `main`.
20
+ The package is `@turri-dev/cli` - npm keeps the name `turri` back, as too like another package's - and the command it puts on your PATH is `turri`. `npm install -g @turri-dev/cli@next` gets the latest prerelease instead, built from the last commit on `main`. Installed again - `@latest` or `@next` - it replaces the one there. `turri --version` says which turri runs, and the pi under it: `turri 0.1.6 (pi 1.3.0)`, and from a clone its commit too.
21
21
 
22
22
  ## From a clone
23
23
 
package/docs/theming.md CHANGED
@@ -26,10 +26,10 @@ Both themes, the command line's colours, the spec diff's, the banner's jellyfish
26
26
  | path | `#3e5a6b` | the editor's border, what is dim: `dim`, line numbers |
27
27
  | grauzone | `#85a3b2` | body text, and what can be skimmed: `text`, `muted` |
28
28
  | white | `#f4f7f9` | headings, tool titles, what you typed, the jellyfish's shine |
29
- | siesta tan | `#e9d8c8` | inline code, \*\*\*plain's text in quotes or backticks |
29
+ | siesta tan | `#e9d8c8` | strings in code, \*\*\*plain's text in quotes or backticks |
30
30
  | eggplant | `#732553` | a removed line's fill in a spec diff |
31
31
  | neon | `#5ce1e6` | links, focus, the selection, section labels, \*\*\*plain's concepts in a spec diff: `accent`, `mdLink`, regen's `◆` |
32
- | neon hover | `#8eebee` | types in code, an added line's fill in a light theme's spec diff |
32
+ | neon hover | `#8eebee` | inline code - siesta tan beside white text was too close to tell apart, and tiring to read - types in code, an added line's fill in a light theme's spec diff: `mdCode` |
33
33
  | pink | `#ff5c8d` | the wordmark, the jellyfish's bell, and what is done - its `✓`, the spec map's `◇` and `◆`: `success` |
34
34
  | pink hover | `#ff7fa6` | \*\*\*plain's section headers, a removed line's `-`, keywords in code |
35
35
  | orange | `#ff7a3d` | the jellyfish's gut, the `$` of bash mode, and everything that asks for you - what failed (`✗`), what works with limits, what needs you (the spec map's `!`): `error`, `warning` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@turri-dev/cli",
3
- "version": "0.1.6-next.336dd6e",
3
+ "version": "0.1.7-next.9aec40e",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "repository": {
@@ -16,6 +16,13 @@
16
16
  "bin": {
17
17
  "turri": "bin/turri.mjs"
18
18
  },
19
+ "exports": {
20
+ "./host": {
21
+ "types": "./dist/host.d.ts",
22
+ "import": "./dist/host.js"
23
+ },
24
+ "./package.json": "./package.json"
25
+ },
19
26
  "scripts": {
20
27
  "cultivate": "tsx src/cultivate-cli.ts",
21
28
  "typecheck": "tsc --noEmit",