@turri-dev/cli 0.0.0-stage → 0.1.2-next.48dacfc

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 (315) hide show
  1. package/.pi/themes/turri-dark.json +80 -0
  2. package/.pi/themes/turri-light.json +82 -0
  3. package/LICENSE +21 -0
  4. package/README.md +272 -2
  5. package/assets/jellyfish/dark-00.png +0 -0
  6. package/assets/jellyfish/dark-01.png +0 -0
  7. package/assets/jellyfish/dark-02.png +0 -0
  8. package/assets/jellyfish/dark-03.png +0 -0
  9. package/assets/jellyfish/dark-04.png +0 -0
  10. package/assets/jellyfish/dark-05.png +0 -0
  11. package/assets/jellyfish/dark-06.png +0 -0
  12. package/assets/jellyfish/dark-07.png +0 -0
  13. package/assets/jellyfish/dark-08.png +0 -0
  14. package/assets/jellyfish/dark-09.png +0 -0
  15. package/assets/jellyfish/dark-10.png +0 -0
  16. package/assets/jellyfish/dark-11.png +0 -0
  17. package/assets/jellyfish/dark-12.png +0 -0
  18. package/assets/jellyfish/dark-13.png +0 -0
  19. package/assets/jellyfish/dark-14.png +0 -0
  20. package/assets/jellyfish/fallback.txt +252 -0
  21. package/assets/jellyfish/light-00.png +0 -0
  22. package/assets/jellyfish/light-01.png +0 -0
  23. package/assets/jellyfish/light-02.png +0 -0
  24. package/assets/jellyfish/light-03.png +0 -0
  25. package/assets/jellyfish/light-04.png +0 -0
  26. package/assets/jellyfish/light-05.png +0 -0
  27. package/assets/jellyfish/light-06.png +0 -0
  28. package/assets/jellyfish/light-07.png +0 -0
  29. package/assets/jellyfish/light-08.png +0 -0
  30. package/assets/jellyfish/light-09.png +0 -0
  31. package/assets/jellyfish/light-10.png +0 -0
  32. package/assets/jellyfish/light-11.png +0 -0
  33. package/assets/jellyfish/light-12.png +0 -0
  34. package/assets/jellyfish/light-13.png +0 -0
  35. package/assets/jellyfish/light-14.png +0 -0
  36. package/bin/turri.mjs +29 -0
  37. package/dist/ask.js +149 -0
  38. package/dist/brand.js +50 -0
  39. package/dist/btw.js +174 -0
  40. package/dist/chat-models.js +37 -0
  41. package/dist/chat-skills.js +18 -0
  42. package/dist/cli.js +178 -0
  43. package/dist/config-command.js +197 -0
  44. package/dist/config-edit.js +367 -0
  45. package/dist/config.js +489 -0
  46. package/dist/conform-cli.js +29 -0
  47. package/dist/cultivate-cli.js +110 -0
  48. package/dist/drift-cli.js +25 -0
  49. package/dist/environment.js +70 -0
  50. package/dist/extension.js +2372 -0
  51. package/dist/genome.js +301 -0
  52. package/dist/graph.js +246 -0
  53. package/dist/identity.js +35 -0
  54. package/dist/init-config.js +511 -0
  55. package/dist/judge.js +62 -0
  56. package/dist/lineage-cli.js +13 -0
  57. package/dist/loop-cli.js +132 -0
  58. package/dist/loop-tools.js +225 -0
  59. package/dist/mature-tools.js +193 -0
  60. package/dist/model-check.js +117 -0
  61. package/dist/module-report.js +9 -0
  62. package/dist/pi-launch.js +31 -0
  63. package/dist/pi.js +813 -0
  64. package/dist/plain/check.js +76 -0
  65. package/dist/plain/concepts.js +213 -0
  66. package/dist/plain/errors.js +43 -0
  67. package/dist/plain/files.js +57 -0
  68. package/dist/plain/highlight.js +195 -0
  69. package/dist/plain/index.js +15 -0
  70. package/dist/plain/liquid.js +129 -0
  71. package/dist/plain/markdown.js +208 -0
  72. package/dist/plain/parser.js +752 -0
  73. package/dist/plain/plain.tmLanguage.json +124 -0
  74. package/dist/plain/spec.js +291 -0
  75. package/dist/plain/stdlib.js +44 -0
  76. package/dist/question-dialog.js +125 -0
  77. package/dist/questioning.js +109 -0
  78. package/dist/quiet.js +125 -0
  79. package/dist/regenerate/activity.js +187 -0
  80. package/dist/regenerate/agent-env.js +190 -0
  81. package/dist/regenerate/agent-shell.js +114 -0
  82. package/dist/regenerate/arbiter.js +133 -0
  83. package/dist/regenerate/audit.js +203 -0
  84. package/dist/regenerate/cases.js +83 -0
  85. package/dist/regenerate/change-view.js +102 -0
  86. package/dist/regenerate/choose-conformance.js +117 -0
  87. package/dist/regenerate/chunk-plan.js +625 -0
  88. package/dist/regenerate/codebase.js +75 -0
  89. package/dist/regenerate/command-check.js +312 -0
  90. package/dist/regenerate/compaction.js +20 -0
  91. package/dist/regenerate/confine.js +310 -0
  92. package/dist/regenerate/conform.js +133 -0
  93. package/dist/regenerate/conformance-agents.js +955 -0
  94. package/dist/regenerate/conformance.js +936 -0
  95. package/dist/regenerate/conversation-writes.js +100 -0
  96. package/dist/regenerate/credentials.js +88 -0
  97. package/dist/regenerate/debug-log.js +228 -0
  98. package/dist/regenerate/debugger.js +90 -0
  99. package/dist/regenerate/delivery.js +19 -0
  100. package/dist/regenerate/diagnose-job.js +40 -0
  101. package/dist/regenerate/diagnose.js +81 -0
  102. package/dist/regenerate/diff-view.js +240 -0
  103. package/dist/regenerate/drift.js +194 -0
  104. package/dist/regenerate/engine.js +118 -0
  105. package/dist/regenerate/environment-error.js +220 -0
  106. package/dist/regenerate/job-log.js +102 -0
  107. package/dist/regenerate/job-panel.js +336 -0
  108. package/dist/regenerate/jobs-tree.js +300 -0
  109. package/dist/regenerate/jobs.js +427 -0
  110. package/dist/regenerate/lanes.js +32 -0
  111. package/dist/regenerate/lineage.js +384 -0
  112. package/dist/regenerate/loop.js +1435 -0
  113. package/dist/regenerate/masking.js +95 -0
  114. package/dist/regenerate/notes.js +397 -0
  115. package/dist/regenerate/os-sandbox.js +243 -0
  116. package/dist/regenerate/paths.js +165 -0
  117. package/dist/regenerate/plain-palette.js +83 -0
  118. package/dist/regenerate/prompt.js +704 -0
  119. package/dist/regenerate/records.js +294 -0
  120. package/dist/regenerate/regenerate.js +598 -0
  121. package/dist/regenerate/regression.js +181 -0
  122. package/dist/regenerate/release.js +262 -0
  123. package/dist/regenerate/requires.js +241 -0
  124. package/dist/regenerate/resources.js +164 -0
  125. package/dist/regenerate/self-check.js +111 -0
  126. package/dist/regenerate/services.js +155 -0
  127. package/dist/regenerate/shell.js +320 -0
  128. package/dist/regenerate/side-panel.js +278 -0
  129. package/dist/regenerate/spec-map-view.js +574 -0
  130. package/dist/regenerate/spec-map.js +561 -0
  131. package/dist/regenerate/spec-steps.js +527 -0
  132. package/dist/regenerate/state.js +10 -0
  133. package/dist/regenerate/steer.js +91 -0
  134. package/dist/regenerate/steering.js +119 -0
  135. package/dist/regenerate/stop-report.js +161 -0
  136. package/dist/regenerate/submit-work.js +71 -0
  137. package/dist/regenerate/test-kinds.js +124 -0
  138. package/dist/regenerate/test-scripts.js +695 -0
  139. package/dist/regenerate/testing.js +406 -0
  140. package/dist/regenerate/transcript-view.js +1 -0
  141. package/dist/regenerate/unit-gate.js +20 -0
  142. package/dist/regenerate/unit-review.js +347 -0
  143. package/dist/regenerate/web.js +256 -0
  144. package/dist/regenerate/workspace.js +99 -0
  145. package/dist/regenerate-cli.js +68 -0
  146. package/dist/release-agent.js +114 -0
  147. package/dist/release-cli.js +131 -0
  148. package/dist/release-tools.js +148 -0
  149. package/dist/review/live.js +165 -0
  150. package/dist/rules.js +47 -0
  151. package/dist/self-invocation.js +110 -0
  152. package/dist/setup.js +245 -0
  153. package/dist/skill-progress.js +78 -0
  154. package/dist/skill.js +149 -0
  155. package/dist/skills.js +74 -0
  156. package/dist/spec-diff-cli.js +37 -0
  157. package/dist/spec-tools.js +155 -0
  158. package/dist/stack.js +158 -0
  159. package/dist/stacks.js +97 -0
  160. package/dist/stdlib.js +100 -0
  161. package/dist/terminal-images.js +46 -0
  162. package/dist/tools.js +242 -0
  163. package/dist/validate-cli.js +52 -0
  164. package/docs/README.md +58 -0
  165. package/docs/authoring-plain.md +245 -0
  166. package/docs/config.md +353 -0
  167. package/docs/deploy.md +109 -0
  168. package/docs/development.md +88 -0
  169. package/docs/headless.md +148 -0
  170. package/docs/images/how-turri-works.svg +50 -0
  171. package/docs/images/turri-banner.png +0 -0
  172. package/docs/installation.md +119 -0
  173. package/docs/parser.md +108 -0
  174. package/docs/regenerating.md +1116 -0
  175. package/docs/sandbox.md +233 -0
  176. package/docs/skills-and-gates.md +254 -0
  177. package/docs/theming.md +76 -0
  178. package/docs/using.md +454 -0
  179. package/genome/rules/bullet-continuation.md +69 -0
  180. package/genome/rules/concise-specs-examples.md +431 -0
  181. package/genome/rules/concise-specs-integration-examples.md +270 -0
  182. package/genome/rules/concise-specs.md +80 -0
  183. package/genome/rules/definitions.md +107 -0
  184. package/genome/rules/examples/integration-embedded-testing/run_conformance_tests_java.sh +163 -0
  185. package/genome/rules/examples/integration-embedded-testing/run_unittests_java.sh +51 -0
  186. package/genome/rules/exported-concepts.md +39 -0
  187. package/genome/rules/func-specs.md +129 -0
  188. package/genome/rules/impl-reqs.md +68 -0
  189. package/genome/rules/import-modules.md +48 -0
  190. package/genome/rules/integration-embedded-testing.md +276 -0
  191. package/genome/rules/integration-embedded.md +171 -0
  192. package/genome/rules/integration-standalone.md +135 -0
  193. package/genome/rules/integrations.md +137 -0
  194. package/genome/rules/linked-resources.md +69 -0
  195. package/genome/rules/module-structure.md +105 -0
  196. package/genome/rules/project-model.md +88 -0
  197. package/genome/rules/required-concepts.md +44 -0
  198. package/genome/rules/requires-modules.md +80 -0
  199. package/genome/rules/stdlib.md +73 -0
  200. package/genome/rules/test-reqs.md +57 -0
  201. package/genome/skills/add-acceptance-test/SKILL.md +100 -0
  202. package/genome/skills/add-concept/SKILL.md +71 -0
  203. package/genome/skills/add-functional-spec/SKILL.md +84 -0
  204. package/genome/skills/add-functional-specs/SKILL.md +118 -0
  205. package/genome/skills/add-implementation-requirement/SKILL.md +86 -0
  206. package/genome/skills/add-resource/SKILL.md +105 -0
  207. package/genome/skills/add-template/SKILL.md +64 -0
  208. package/genome/skills/add-test-requirement/SKILL.md +73 -0
  209. package/genome/skills/analyze-2-func-specs/SKILL.md +101 -0
  210. package/genome/skills/analyze-func-specs/SKILL.md +123 -0
  211. package/genome/skills/analyze-if-func-spec-too-complex/SKILL.md +211 -0
  212. package/genome/skills/break-down-func-spec/SKILL.md +205 -0
  213. package/genome/skills/brood/SKILL.md +229 -0
  214. package/genome/skills/brood/references/intent.md +35 -0
  215. package/genome/skills/brood/references/product.md +101 -0
  216. package/genome/skills/brood/references/stack.md +61 -0
  217. package/genome/skills/brood/references/testing.md +56 -0
  218. package/genome/skills/bud/SKILL.md +148 -0
  219. package/genome/skills/bud/references/checklist.md +44 -0
  220. package/genome/skills/bud/references/intent.md +30 -0
  221. package/genome/skills/check-plain-env/SKILL.md +285 -0
  222. package/genome/skills/consolidate-concepts/SKILL.md +192 -0
  223. package/genome/skills/create-import-module/SKILL.md +104 -0
  224. package/genome/skills/create-requires-module/SKILL.md +109 -0
  225. package/genome/skills/debug-specs/SKILL.md +188 -0
  226. package/genome/skills/implement-conformance-testing-script/SKILL.md +238 -0
  227. package/genome/skills/implement-conformance-testing-script/assets/run_conformance_tests_cypress.ps1 +337 -0
  228. package/genome/skills/implement-conformance-testing-script/assets/run_conformance_tests_golang.ps1 +111 -0
  229. package/genome/skills/implement-conformance-testing-script/assets/run_conformance_tests_java.sh +136 -0
  230. package/genome/skills/implement-conformance-testing-script/assets/run_conformance_tests_python.ps1 +103 -0
  231. package/genome/skills/implement-conformance-testing-script/assets/run_conformance_tests_python.sh +150 -0
  232. package/genome/skills/implement-unit-testing-script/SKILL.md +160 -0
  233. package/genome/skills/implement-unit-testing-script/assets/run_unittests_flutter.ps1 +87 -0
  234. package/genome/skills/implement-unit-testing-script/assets/run_unittests_golang.ps1 +73 -0
  235. package/genome/skills/implement-unit-testing-script/assets/run_unittests_java.sh +72 -0
  236. package/genome/skills/implement-unit-testing-script/assets/run_unittests_python.ps1 +81 -0
  237. package/genome/skills/implement-unit-testing-script/assets/run_unittests_python.sh +98 -0
  238. package/genome/skills/implement-unit-testing-script/assets/run_unittests_react.ps1 +87 -0
  239. package/genome/skills/init-plain-project/SKILL.md +117 -0
  240. package/genome/skills/init-plain-project/references/checklist.md +30 -0
  241. package/genome/skills/mature/SKILL.md +126 -0
  242. package/genome/skills/refactor-module/SKILL.md +196 -0
  243. package/genome/skills/resolve-section-ownership/SKILL.md +64 -0
  244. package/genome/skills/resolve-spec-conflict/SKILL.md +96 -0
  245. package/genome/skills/spawn/SKILL.md +163 -0
  246. package/package.json +68 -4
  247. package/stdlib/backend/common.plain +25 -0
  248. package/stdlib/backend/conformance/common.plain +12 -0
  249. package/stdlib/backend/conformance/go-gin.plain +9 -0
  250. package/stdlib/backend/conformance/go-nethttp.plain +9 -0
  251. package/stdlib/backend/conformance/java-springboot.plain +9 -0
  252. package/stdlib/backend/conformance/python-django.plain +9 -0
  253. package/stdlib/backend/conformance/python-fastapi.plain +9 -0
  254. package/stdlib/backend/conformance/python-flask.plain +9 -0
  255. package/stdlib/backend/conformance/rust-axum.plain +9 -0
  256. package/stdlib/backend/conformance/typescript-express.plain +9 -0
  257. package/stdlib/backend/conformance/typescript-fastify.plain +9 -0
  258. package/stdlib/backend/conformance/typescript-nestjs.plain +9 -0
  259. package/stdlib/backend/go-gin.plain +18 -0
  260. package/stdlib/backend/go-nethttp.plain +18 -0
  261. package/stdlib/backend/java-springboot.plain +19 -0
  262. package/stdlib/backend/python-django.plain +19 -0
  263. package/stdlib/backend/python-fastapi.plain +23 -0
  264. package/stdlib/backend/python-flask.plain +23 -0
  265. package/stdlib/backend/rust-axum.plain +17 -0
  266. package/stdlib/backend/typescript-express.plain +19 -0
  267. package/stdlib/backend/typescript-fastify.plain +19 -0
  268. package/stdlib/backend/typescript-nestjs.plain +19 -0
  269. package/stdlib/cli/common.plain +17 -0
  270. package/stdlib/cli/conformance/common.plain +11 -0
  271. package/stdlib/cli/conformance/go-cobra.plain +9 -0
  272. package/stdlib/cli/conformance/go-flag.plain +9 -0
  273. package/stdlib/cli/conformance/java-picocli.plain +9 -0
  274. package/stdlib/cli/conformance/python-argparse.plain +9 -0
  275. package/stdlib/cli/conformance/python-click.plain +9 -0
  276. package/stdlib/cli/conformance/python-typer.plain +9 -0
  277. package/stdlib/cli/conformance/rust-clap.plain +9 -0
  278. package/stdlib/cli/conformance/typescript-commander.plain +9 -0
  279. package/stdlib/cli/go-cobra.plain +14 -0
  280. package/stdlib/cli/go-flag.plain +14 -0
  281. package/stdlib/cli/java-picocli.plain +15 -0
  282. package/stdlib/cli/python-argparse.plain +18 -0
  283. package/stdlib/cli/python-click.plain +16 -0
  284. package/stdlib/cli/python-typer.plain +16 -0
  285. package/stdlib/cli/rust-clap.plain +14 -0
  286. package/stdlib/cli/typescript-commander.plain +17 -0
  287. package/stdlib/frontend/angular.plain +17 -0
  288. package/stdlib/frontend/common.plain +17 -0
  289. package/stdlib/frontend/conformance/angular.plain +5 -0
  290. package/stdlib/frontend/conformance/common.plain +11 -0
  291. package/stdlib/frontend/conformance/react-vite.plain +5 -0
  292. package/stdlib/frontend/conformance/sveltekit-spa.plain +5 -0
  293. package/stdlib/frontend/conformance/vue-vite.plain +5 -0
  294. package/stdlib/frontend/react-vite.plain +16 -0
  295. package/stdlib/frontend/sveltekit-spa.plain +16 -0
  296. package/stdlib/frontend/vue-vite.plain +16 -0
  297. package/stdlib/lang/go.plain +13 -0
  298. package/stdlib/lang/java.plain +12 -0
  299. package/stdlib/lang/python.plain +18 -0
  300. package/stdlib/lang/rust.plain +12 -0
  301. package/stdlib/lang/typescript.plain +13 -0
  302. package/stdlib/library/common.plain +15 -0
  303. package/stdlib/library/conformance/common.plain +9 -0
  304. package/stdlib/library/conformance/go.plain +9 -0
  305. package/stdlib/library/conformance/java-gradle.plain +9 -0
  306. package/stdlib/library/conformance/java-maven.plain +9 -0
  307. package/stdlib/library/conformance/python.plain +9 -0
  308. package/stdlib/library/conformance/rust.plain +9 -0
  309. package/stdlib/library/conformance/typescript.plain +9 -0
  310. package/stdlib/library/go.plain +12 -0
  311. package/stdlib/library/java-gradle.plain +13 -0
  312. package/stdlib/library/java-maven.plain +13 -0
  313. package/stdlib/library/python.plain +13 -0
  314. package/stdlib/library/rust.plain +12 -0
  315. package/stdlib/library/typescript.plain +15 -0
@@ -0,0 +1,80 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "turri-dark",
4
+ "vars": {
5
+ "yellow": "#e0ff6e",
6
+ "yellowMuted": "#b9cb69",
7
+ "green": "#79fc96",
8
+ "greenLight": "#c5dcd9",
9
+ "greenDark": "#223936",
10
+ "black": "#0f0f0f",
11
+ "white": "#ffffff",
12
+ "gray": "#808080",
13
+ "grayLight": "#666666",
14
+ "statusError": "#dd5353",
15
+ "statusWarning": "#dc6803"
16
+ },
17
+ "colors": {
18
+ "accent": "yellow",
19
+ "border": "green",
20
+ "borderAccent": "green",
21
+ "borderMuted": "greenDark",
22
+ "success": "green",
23
+ "error": "statusError",
24
+ "warning": "statusWarning",
25
+ "muted": "gray",
26
+ "dim": "grayLight",
27
+ "text": "greenLight",
28
+ "thinkingText": "gray",
29
+ "selectedBg": "greenDark",
30
+ "scrollbarTrack": "greenDark",
31
+ "scrollbarThumb": "green",
32
+ "searchMatchBg": "yellow",
33
+ "searchMatchText": "black",
34
+ "userMessageBg": "",
35
+ "userMessageText": "yellow",
36
+ "customMessageBg": "",
37
+ "customMessageText": "greenLight",
38
+ "customMessageLabel": "yellow",
39
+ "toolPendingBg": "",
40
+ "toolSuccessBg": "",
41
+ "toolErrorBg": "",
42
+ "toolTitle": "yellow",
43
+ "toolOutput": "gray",
44
+ "mdHeading": "yellow",
45
+ "mdLink": "green",
46
+ "mdLinkUrl": "grayLight",
47
+ "mdCode": "yellowMuted",
48
+ "mdCodeBlock": "greenLight",
49
+ "mdCodeBlockBorder": "greenDark",
50
+ "mdQuote": "gray",
51
+ "mdQuoteBorder": "greenDark",
52
+ "mdHr": "grayLight",
53
+ "mdListBullet": "green",
54
+ "toolDiffAdded": "green",
55
+ "toolDiffRemoved": "statusError",
56
+ "toolDiffContext": "gray",
57
+ "syntaxComment": "grayLight",
58
+ "syntaxKeyword": "yellow",
59
+ "syntaxFunction": "green",
60
+ "syntaxVariable": "greenLight",
61
+ "syntaxString": "yellowMuted",
62
+ "syntaxNumber": "statusWarning",
63
+ "syntaxType": "white",
64
+ "syntaxOperator": "gray",
65
+ "syntaxPunctuation": "grayLight",
66
+ "thinkingOff": "grayLight",
67
+ "thinkingMinimal": "gray",
68
+ "thinkingLow": "greenLight",
69
+ "thinkingMedium": "green",
70
+ "thinkingHigh": "yellowMuted",
71
+ "thinkingXhigh": "yellow",
72
+ "thinkingMax": "statusWarning",
73
+ "bashMode": "yellow"
74
+ },
75
+ "export": {
76
+ "pageBg": "#0f0f0f",
77
+ "cardBg": "#121212",
78
+ "infoBg": "#223936"
79
+ }
80
+ }
@@ -0,0 +1,82 @@
1
+ {
2
+ "$schema": "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json",
3
+ "name": "turri-light",
4
+ "vars": {
5
+ "blue": "#0a1fd4",
6
+ "greenLight": "#c5dcd9",
7
+ "greenDark": "#223936",
8
+ "diffGreen": "#1a7f37",
9
+ "black": "#0f0f0f",
10
+ "gray": "#808080",
11
+ "grayLight": "#666666",
12
+ "red": "#d00505",
13
+ "statusErrorLight": "#fee4e2",
14
+ "statusWarningLight": "#fef0c7",
15
+ "statusWarning": "#dc6803",
16
+ "paleGreen": "#eef7f5",
17
+ "paleGray": "#f4f4f2"
18
+ },
19
+ "colors": {
20
+ "accent": "blue",
21
+ "border": "gray",
22
+ "borderAccent": "blue",
23
+ "borderMuted": "greenLight",
24
+ "success": "greenDark",
25
+ "error": "red",
26
+ "warning": "statusWarning",
27
+ "muted": "grayLight",
28
+ "dim": "gray",
29
+ "text": "black",
30
+ "thinkingText": "grayLight",
31
+ "selectedBg": "greenLight",
32
+ "scrollbarTrack": "greenLight",
33
+ "scrollbarThumb": "grayLight",
34
+ "searchMatchBg": "statusWarningLight",
35
+ "searchMatchText": "black",
36
+ "userMessageBg": "paleGray",
37
+ "userMessageText": "black",
38
+ "customMessageBg": "paleGreen",
39
+ "customMessageText": "black",
40
+ "customMessageLabel": "blue",
41
+ "toolPendingBg": "paleGray",
42
+ "toolSuccessBg": "paleGreen",
43
+ "toolErrorBg": "statusErrorLight",
44
+ "toolTitle": "blue",
45
+ "toolOutput": "grayLight",
46
+ "mdHeading": "blue",
47
+ "mdLink": "blue",
48
+ "mdLinkUrl": "grayLight",
49
+ "mdCode": "greenDark",
50
+ "mdCodeBlock": "black",
51
+ "mdCodeBlockBorder": "greenLight",
52
+ "mdQuote": "grayLight",
53
+ "mdQuoteBorder": "greenLight",
54
+ "mdHr": "gray",
55
+ "mdListBullet": "blue",
56
+ "toolDiffAdded": "diffGreen",
57
+ "toolDiffRemoved": "red",
58
+ "toolDiffContext": "grayLight",
59
+ "syntaxComment": "grayLight",
60
+ "syntaxKeyword": "blue",
61
+ "syntaxFunction": "greenDark",
62
+ "syntaxVariable": "black",
63
+ "syntaxString": "greenDark",
64
+ "syntaxNumber": "statusWarning",
65
+ "syntaxType": "blue",
66
+ "syntaxOperator": "gray",
67
+ "syntaxPunctuation": "grayLight",
68
+ "thinkingOff": "gray",
69
+ "thinkingMinimal": "grayLight",
70
+ "thinkingLow": "greenDark",
71
+ "thinkingMedium": "blue",
72
+ "thinkingHigh": "blue",
73
+ "thinkingXhigh": "statusWarning",
74
+ "thinkingMax": "red",
75
+ "bashMode": "blue"
76
+ },
77
+ "export": {
78
+ "pageBg": "#ffffff",
79
+ "cardBg": "#f4f4f2",
80
+ "infoBg": "#eef7f5"
81
+ }
82
+ }
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Codeplain Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,273 @@
1
- # Temporary Holding Version
1
+ <p align="center"><img src="docs/images/turri-banner.png" alt="turri - coding agent with the power of regenerative software: regenerate, drift, lineage"></p>
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ <h1 align="center">turri<br>the first coding agent with the power of<br>regenerative software<br>&nbsp;</h1>
4
+
5
+ <p align="center">
6
+ <a href="https://www.npmjs.com/package/@turri-dev/cli"><img src="https://img.shields.io/npm/v/@turri-dev/cli?label=npm" alt="npm version"></a>
7
+ <a href="LICENSE"><img src="https://img.shields.io/npm/l/@turri-dev/cli" alt="MIT licence"></a>
8
+ <a href="https://nodejs.org/en/download"><img src="https://img.shields.io/node/v/@turri-dev/cli" alt="Node version"></a>
9
+ </p>
10
+
11
+ You tell **turri** what the system should do, and **turri** writes it down as [\*\*\*plain](https://plainlang.org/).
12
+ **turri** builds the code from it. From then on \*\*\*plain is the durable source of truth: the code can always be
13
+ regenerated from it, and healed against it, as it changes.
14
+
15
+ **turri** is named after *Turritopsis dohrnii*, the immortal jellyfish that regenerates itself from its young
16
+ form, again and again - as **turri** regenerates the code from \*\*\*plain - see [the name](#the-name).
17
+
18
+ ## Quick start
19
+
20
+ **turri** is built on [pi](https://pi.dev), the coding agent, and runs wherever pi runs: macOS, Linux, WSL; native
21
+ Windows best effort, with Git Bash. You need git, bash and [Node](https://nodejs.org/en/download) 22.19 or newer - a
22
+ Linux distribution's own `nodejs` package is often older. The agents use this machine's toolchains, fenced by a command check and an audit everywhere, and an OS sandbox where the
23
+ OS has one - Seatbelt on macOS, bubblewrap on Linux (`apt install bubblewrap`) - see [installation](docs/installation.md#installation).
24
+
25
+ ```bash
26
+ npm install -g @turri-dev/cli # puts `turri` on your PATH
27
+ turri doctor # checks the machine
28
+ ```
29
+
30
+ To work on turri itself, run it from a clone instead - see [installation](docs/installation.md#from-a-clone).
31
+
32
+ `doctor` checks for Node 22.19+, bash, the OS sandbox and a model provider for pi; in a project, the toolchains its
33
+ modules need, what its testing scripts run against this machine, and that each model `config.turri.yaml` names
34
+ answers with your credentials. It changes nothing without asking: when a check fails - the OS sandbox does not start,
35
+ say - it says why, and the command for you to run. Run it again whenever something breaks. What each check means:
36
+ [installation](docs/installation.md).
37
+
38
+ Then start it in your project, signed in to your model providers:
39
+
40
+ ```bash
41
+ cd ~/my-project
42
+ turri init-config # asks which vendor you use: Anthropic, OpenAI, Google, Amazon Bedrock, or other
43
+ export ANTHROPIC_API_KEY=... # the key it names - or skip it, and type /login in turri once it has started
44
+ turri
45
+ ```
46
+
47
+ `turri init-config` asks which vendor's models you use and writes the project's `config.turri.yaml` with two of theirs - a
48
+ capable one you talk to, which writes \*\*\*plain and plans the work, and a smaller, cheaper one that writes the code.
49
+ For Anthropic:
50
+
51
+ ```yaml
52
+ harness-model: anthropic/claude-opus-5-5:medium # you talk to it: it writes ***plain and plans the work
53
+ coding-model: anthropic/claude-haiku-5-5:low # it writes the code
54
+ ```
55
+
56
+ To skip the question, name the vendor - `anthropic`, `openai`, `google`, `amazon-bedrock` (with `--maker` and
57
+ `--region`) or `other`:
58
+
59
+ ```bash
60
+ turri init-config --vendor anthropic
61
+ ```
62
+
63
+ It then tells you which API key to set - or to type `/login` once **turri** is running instead. **turri** loads the
64
+ `config.turri.yaml` in the folder you start it from.
65
+ Below the two models, the file sets every other setting to its default - change any of them in the file, or from the
66
+ chat with `/turri-config`. Any other model works too: [models](#models).
67
+
68
+ Once `turri` is running, say: *Let's start a new project: a small API where people can register and sign in.*
69
+
70
+ No project of your own yet? Build one of [**the examples**](examples/README.md) with turri, step by step.
71
+
72
+ Rather not install Node and the rest? **turri** also runs in Docker, from one image: [turri in Docker](docker/README.md).
73
+
74
+ Choosing models: [models](#models); what to do next: [use](#use).
75
+
76
+ ## Why
77
+
78
+ In the age of coding agents, writing code is getting easy. The hard and important part is
79
+ defining what the system should do. Agents can fix bugs, ask questions and keep getting more
80
+ capable - but they still cannot read your mind. The question is not only whether an agent can
81
+ write the code, but whether it understands what it is building.
82
+
83
+ Code that is patched, prompt after prompt, drifts: every misunderstanding stays in it, and the
84
+ next change is made on top. When the software can always be regenerated from durable information
85
+ instead, that understanding is written down - explicit, reviewable and tested - and it evolves with
86
+ the software rather than against it.
87
+
88
+ ## How it differs from ye old coding agent
89
+
90
+ With a coding agent you work on code: you ask for a change, it edits the code, and you review the
91
+ code it wrote.
92
+
93
+ With **turri** you work on \*\*\*plain. You say what the software must do, and **turri** updates \*\*\*plain
94
+ and can always regenerate the code from that. You don't review the code or keep it - you review and
95
+ keep the intent: what the software must do, and what must hold as it changes. \*\*\*plain is the
96
+ durable part. The code is a disposable artefact, rebuilt from it whenever it changes.
97
+
98
+ | | ye old coding agent | **turri** |
99
+ | --- | --- | --- |
100
+ | **What you maintain** | the code, patched prompt after prompt | \*\*\*plain; the code is generated from it and never edited by hand |
101
+ | **Who drives** | the agent picks what to do next | the harness, in a fixed order: one functionality or one change to \*\*\*plain at a time, or a whole module functionality by functionality, in \*\*\*plain's order, each on top of the ones before it |
102
+ | **What counts as done** | the agent writes the code, runs the tests, and decides for itself that it is done | ye old coding agent writes the code; **turri** runs the whole test suite itself, with the project's own testing scripts, and decides deterministically when it is done - every test passes in its own run, or the work goes back |
103
+ | **Tests** | written and changed by whoever writes the code | conformance tests written from \*\*\*plain, black box, and kept apart from your acceptance tests; an agent fixing the code cannot change them |
104
+ | **What the agent sees** | your whole machine | only the prompt the harness writes, its module's folders, and the public web through its search and fetch tools; every command it runs is checked, fenced and audited |
105
+ | **Memory** | one conversation that fills up | a fresh agent for every step, starting from working notes the agents before it left - dated, attributed, and never allowed to override \*\*\*plain |
106
+ | **When it gets stuck** | it keeps trying, or quietly works around the problem | after 20 attempts it stops and tells you what to change in \*\*\*plain - never in the code |
107
+ | **A change** | another patch on top | a change to \*\*\*plain: what it touches is rebuilt, everything built before is tested again, and code that disagrees with \*\*\*plain is healed to match |
108
+ | **History** | whatever you commit | every build, regeneration and repair is a commit; a build interrupted halfway starts again from the last one |
109
+
110
+ ## How it works
111
+
112
+ <p align="center"><img src="docs/images/how-turri-works.svg" width="900" alt="How turri works: you describe changes to turri, and turri asks and reports back. turri writes ***plain and reads it; you review it with turri in a review loop. turri regenerates the code from ***plain and tests it against ***plain - an endless loop."></p>
113
+
114
+ 1. **Define.** Write \*\*\*plain with **turri**: it interviews you one question at a time and
115
+ writes the `.plain` files, held to the \*\*\*plain authoring rules and reviewed by independent
116
+ judges.
117
+ 2. **Generate.** **turri** builds the code one functionality at a time, each on top of the ones
118
+ before it, into `plain_modules/` - and builds each answer in the background while the interview
119
+ goes on.
120
+ 3. **Validate.** The harness runs the unit tests, then conformance tests written from \*\*\*plain,
121
+ then everything built so far, and moves on only when all of it passes.
122
+ 4. **Regenerate.** To change the system, change its definition. The functionalities whose \*\*\*plain
123
+ changed are rebuilt, and everything built before is tested again.
124
+
125
+ A bug is fixed in \*\*\*plain; a new behaviour goes into \*\*\*plain; and the next regeneration carries
126
+ it. When a build is done, ask to try it: **turri** puts what is built in `dist/<module>` and
127
+ starts it on your machine - an app, and it tells you where to open your browser.
128
+
129
+ \*\*\*plain looks like this.
130
+
131
+ ```plain
132
+ ***definitions***
133
+
134
+ - :User: is a person with an account: an email address and a password.
135
+
136
+ ***implementation reqs***
137
+
138
+ - :Implementation: is written in Python 3.12 with FastAPI.
139
+
140
+ ***functional specs***
141
+
142
+ - A new :User: can register with an email address and a password.
143
+ - Registering with an email address already in use fails with status 400.
144
+
145
+ - A registered :User: can sign in and receives a bearer token.
146
+ ```
147
+
148
+ Each item under `***functional specs***` is one functionality, built on top of the ones before it.
149
+
150
+ **turri** runs as an extension to [pi](https://github.com/earendil-works/pi), so you work with it
151
+ in a conversation, and as a command line for unattended runs.
152
+
153
+ ## The name
154
+
155
+ **turri** is short for [*Turritopsis dohrnii*](https://en.wikipedia.org/wiki/Turritopsis_dohrnii), the immortal
156
+ jellyfish, which, when injured or old, turns back into its young self and regenerates - the same jellyfish, from the
157
+ same genes, again and again.
158
+
159
+ That is what regenerative software asks of software, and what **turri** does:
160
+
161
+ | *Turritopsis dohrnii* | **turri** |
162
+ | --- | --- |
163
+ | Its genes are what it is: every generation develops from the same ones. | \*\*\*plain is what the software is: every generation of code is regenerated from it. |
164
+ | Injured or old, it does not patch itself: it goes back to the polyp and regenerates the adult. | Code that has drifted is not patched prompt after prompt: it is regenerated from \*\*\*plain, as much of it as has to be. |
165
+ | Every cell can become another, and it is still the same jellyfish. | Every line of code can be replaced, and it is still the same software - because what it is never lived in the code. |
166
+ | It can do it again and again, for as long as it lives. | The code can be regenerated whenever \*\*\*plain changes or a model gets better, for as long as \*\*\*plain is kept. |
167
+
168
+ So the tools speak its language: **`regenerate`** regenerates the code from \*\*\*plain as it is now - or the functionalities
169
+ you name, though nothing changed, or all of it from scratch - **`drift`** says how far the code has moved from it, and
170
+ **`lineage`** shows every generation of a module and what each was regenerated from.
171
+
172
+ ## Models
173
+
174
+ `init-config`'s models are only a starting point. **turri** is built on [pi](https://github.com/earendil-works/pi),
175
+ so any model pi supports works - Anthropic, OpenAI, Google, Amazon Bedrock, OpenRouter, a local one. A model is reached
176
+ as pi reaches it - `/login`, in `turri` as in `pi`, the provider's API key in the environment (`ANTHROPIC_API_KEY`,
177
+ `OPENAI_API_KEY`, `GEMINI_API_KEY`, ...), or a cloud account - and named as pi names it, `provider/model-id`, with
178
+ `:high`, `:low` and so on for how hard it thinks. It uses three: the **harness** model you talk
179
+ to, which writes \*\*\*plain and plans the work - worth a capable one - and the **coding** and
180
+ **judge** models its agents build and judge with, which can be smaller and cheaper, such as GPT-6
181
+ Luna or Gemini 3.1 Flash Lite. `turri --harness-model` and `--coding-model` choose them for a
182
+ session, and pi's `/model` switches the one you talk to as you go; to keep them for the project,
183
+ set them with `/turri-config harness-model`, `/turri-config coding-model` and so on - each role's too, as
184
+ `models.<role>` - or write them in its `config.turri.yaml`:
185
+
186
+ ```yaml
187
+ harness-model: anthropic/claude-opus-5-5 # the model you talk to: a capable one
188
+ coding-model: openai/gpt-6-luna # writes the code and the tests: a smaller one will do
189
+ judge-model: google/gemini-3.1-flash-lite # judges the conformance runs
190
+ ```
191
+
192
+ One left out is the one before it: judge from coding, coding from harness. Every way to set them:
193
+ [models](docs/config.md#models).
194
+
195
+ ## Use
196
+
197
+ In the project where your \*\*\*plain lives:
198
+
199
+ ```bash
200
+ cd ~/my-project
201
+ turri
202
+ ```
203
+
204
+ Then talk to it:
205
+
206
+ > Let's start a new project: a small API where people can register and sign in.
207
+
208
+ It runs the interview skill, asks you about the problem, the stack and the product, writes
209
+ \*\*\*plain, and builds each functionality as it is written. While it works:
210
+
211
+ - the **panel** above the input shows every build - its stage, what its agents are doing, its
212
+ model and cost - and the queue behind it;
213
+ - ask to try it at any time - "let me try it" - and **`release`** puts what is built so far in
214
+ `dist/<module>` and **`activate`** starts it, installing what it needs - nothing to approve;
215
+ - the **side panel** (`ctrl+h`) takes the screen and opens on **regen** (`/regen`) - \*\*\*plain, every item marked planned, working, regenerated, validating, conform or needs you - and `p` turns it to the **pulses** (`/pulses`) - every pulse, running, queued and finished, and what each regenerates; what its agents did is in each pulse's log in `.turri/jobs/`;
216
+ - **`/halt`** halts a pulse, **`/lineage`** shows every generation of a
217
+ module, and the **`drift`** tool says what is left to regenerate;
218
+ - **`/btw <question>`** asks turri something on the side - answered at once, even in the middle of a skill's interview
219
+ (typed as the answer, under "Something else…"), and left out of the conversation;
220
+ - **`/turri-config`** changes any setting of the project's `config.turri.yaml` - the models, review, conformance tests,
221
+ how many pulses at once - and says when it takes effect: now, at your next message, or at the next pulse. No
222
+ restart: `/turri-config review false`, or `/turri-config` alone to pick from the list;
223
+ - **`/stack`** chooses the stack to build with, in a project whose backend and frontend each have their own testing
224
+ scripts in `config.turri.<stack>.yaml` - `/stack backend`, `/stack none` - for the session (`--stack <name>` on the
225
+ command line).
226
+
227
+ Other things to ask for:
228
+
229
+ > Add password reset to \*\*\*plain.
230
+ >
231
+ > Regenerate the whole module, and conform every functionality with conformance tests.
232
+ >
233
+ > Regenerate changes to \*\*\*plain with a faster model.
234
+
235
+ The last one holds for the rest of the session; the model can be chosen separately for changes to
236
+ \*\*\*plain and for functionalities, and a name that fits more than one model is asked about rather
237
+ than guessed.
238
+
239
+ Without a conversation, the same work is on the command line:
240
+
241
+ ```bash
242
+ turri validate app.plain # validate ***plain - no model, no API key
243
+ turri drift app.plain # what is left to regenerate - starts nothing
244
+ turri regenerate app.plain # regenerate the code from ***plain: planned into jobs, run until it is done
245
+ turri regenerate app.plain 3 # regenerate functionality 3, changed or not
246
+ ```
247
+
248
+ More: [using **turri**](docs/using.md); to render \*\*\*plain overnight, see
249
+ [running unattended](docs/headless.md).
250
+
251
+ ## Documentation
252
+
253
+ Start at the [documentation index](docs/README.md), or go straight to a page:
254
+
255
+ | | |
256
+ | --- | --- |
257
+ | [Installation](docs/installation.md) | doctor, what turri needs of this machine, **turri** and `pi`, environment variables |
258
+ | [Examples](examples/README.md) | projects to build with turri step by step: cognio from an empty folder, a CLI, a backend service with conformance tests, a REST API integration |
259
+ | [Using **turri**](docs/using.md) | the conversation, skills, tools, pulses and regen, choosing models, the command line |
260
+ | [The project config](docs/config.md) | `config.turri.yaml` and each stack's `config.turri.<stack>.yaml`: every key, models and their inheritance, conformance, the testing scripts, stacks and choosing one, the old `config.yaml` |
261
+ | [Deploy](docs/deploy.md) | trying what is built: the last commit in `dist/<module>`, started on your machine, nothing installed without asking |
262
+ | [Running unattended](docs/headless.md) | rendering \*\*\*plain overnight or in CI: the command, keeping it running, the results, resuming, rebuilding one functionality |
263
+ | [Authoring \*\*\*plain](docs/authoring-plain.md) | what \*\*\*plain is made of, the authoring rules, the skills that write and fix it, checking it |
264
+ | [Regenerating](docs/regenerating.md) | what each build does and in which order: functionalities, modules, regeneration, changes to \*\*\*plain, conformance and acceptance tests, working notes, what the code is built from |
265
+ | [The sandbox](docs/sandbox.md) | what agents can reach, the walls every command passes, time limits, the web tools |
266
+ | [Skills and gates](docs/skills-and-gates.md) | the gate syntax, what the harness enforces, judges, rules |
267
+ | [The \*\*\*plain parser](docs/parser.md) | the TypeScript port, `turri validate`, fidelity to the reference parser |
268
+ | [Theming](docs/theming.md) | the two brand themes |
269
+ | [Development](docs/development.md) | tests, layout, known edges |
270
+
271
+ ## License
272
+
273
+ turri is open source, under the [MIT licence](LICENSE).
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file