donna 0.2.0__py3-none-any.whl → 0.2.1__py3-none-any.whl

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 (68) hide show
  1. donna/artifacts/intro.md +39 -0
  2. donna/artifacts/research/specs/report.md +163 -0
  3. donna/artifacts/research/work/research.md +198 -0
  4. donna/artifacts/rfc/specs/request_for_change.md +271 -0
  5. donna/artifacts/rfc/work/create.md +120 -0
  6. donna/artifacts/rfc/work/do.md +109 -0
  7. donna/artifacts/rfc/work/plan.md +68 -0
  8. donna/artifacts/usage/artifacts.md +41 -6
  9. donna/artifacts/usage/cli.md +106 -37
  10. donna/artifacts/usage/worlds.md +8 -2
  11. donna/cli/__main__.py +1 -1
  12. donna/cli/commands/artifacts.py +104 -17
  13. donna/cli/commands/sessions.py +7 -7
  14. donna/cli/commands/workspaces.py +42 -0
  15. donna/cli/errors.py +18 -0
  16. donna/cli/types.py +16 -9
  17. donna/cli/utils.py +2 -2
  18. donna/core/errors.py +1 -11
  19. donna/core/result.py +5 -8
  20. donna/core/utils.py +0 -3
  21. donna/lib/__init__.py +4 -0
  22. donna/lib/sources.py +1 -1
  23. donna/lib/worlds.py +2 -2
  24. donna/machine/action_requests.py +0 -5
  25. donna/machine/artifacts.py +8 -6
  26. donna/machine/primitives.py +4 -4
  27. donna/machine/sessions.py +12 -4
  28. donna/machine/state.py +2 -2
  29. donna/machine/tasks.py +4 -18
  30. donna/machine/templates.py +4 -2
  31. donna/primitives/artifacts/specification.py +13 -2
  32. donna/primitives/artifacts/workflow.py +11 -2
  33. donna/primitives/directives/list.py +86 -0
  34. donna/primitives/directives/view.py +52 -11
  35. donna/primitives/operations/finish_workflow.py +13 -2
  36. donna/primitives/operations/output.py +87 -0
  37. donna/primitives/operations/request_action.py +3 -9
  38. donna/primitives/operations/run_script.py +2 -2
  39. donna/protocol/utils.py +22 -0
  40. donna/workspaces/artifacts.py +238 -0
  41. donna/{world → workspaces}/artifacts_discovery.py +1 -1
  42. donna/{world → workspaces}/config.py +13 -6
  43. donna/{world → workspaces}/errors.py +55 -45
  44. donna/workspaces/initialization.py +78 -0
  45. donna/{world → workspaces}/markdown.py +21 -26
  46. donna/{world → workspaces}/sources/base.py +2 -2
  47. donna/{world → workspaces}/sources/markdown.py +7 -6
  48. donna/{world → workspaces}/templates.py +4 -4
  49. donna/{world → workspaces}/tmp.py +19 -1
  50. donna/{world → workspaces}/worlds/base.py +5 -2
  51. donna/{world → workspaces}/worlds/filesystem.py +23 -9
  52. donna/{world → workspaces}/worlds/python.py +12 -9
  53. {donna-0.2.0.dist-info → donna-0.2.1.dist-info}/METADATA +4 -1
  54. donna-0.2.1.dist-info/RECORD +92 -0
  55. {donna-0.2.0.dist-info → donna-0.2.1.dist-info}/WHEEL +1 -1
  56. donna/artifacts/work/do_it.md +0 -142
  57. donna/artifacts/work/do_it_fast.md +0 -98
  58. donna/artifacts/work/planning.md +0 -245
  59. donna/cli/commands/projects.py +0 -49
  60. donna/world/artifacts.py +0 -122
  61. donna/world/initialization.py +0 -42
  62. donna/world/worlds/__init__.py +0 -0
  63. donna-0.2.0.dist-info/RECORD +0 -85
  64. /donna/{artifacts/work → workspaces}/__init__.py +0 -0
  65. /donna/{world → workspaces}/sources/__init__.py +0 -0
  66. /donna/{world → workspaces/worlds}/__init__.py +0 -0
  67. {donna-0.2.0.dist-info → donna-0.2.1.dist-info}/entry_points.txt +0 -0
  68. {donna-0.2.0.dist-info → donna-0.2.1.dist-info}/licenses/LICENSE +0 -0
@@ -7,14 +7,14 @@ from donna.core.errors import ErrorsList
7
7
  from donna.core.result import Err, Ok, Result, unwrap_to_error
8
8
  from donna.domain.ids import ArtifactId, FullArtifactId, FullArtifactIdPattern, WorldId
9
9
  from donna.machine.artifacts import Artifact
10
- from donna.world import errors as world_errors
11
- from donna.world.artifacts import ArtifactRenderContext
12
- from donna.world.artifacts_discovery import ArtifactListingNode, list_artifacts_by_pattern
13
- from donna.world.worlds.base import World as BaseWorld
14
- from donna.world.worlds.base import WorldConstructor
10
+ from donna.workspaces import errors as world_errors
11
+ from donna.workspaces.artifacts import ArtifactRenderContext
12
+ from donna.workspaces.artifacts_discovery import ArtifactListingNode, list_artifacts_by_pattern
13
+ from donna.workspaces.worlds.base import World as BaseWorld
14
+ from donna.workspaces.worlds.base import WorldConstructor
15
15
 
16
16
  if TYPE_CHECKING:
17
- from donna.world.config import SourceConfigValue, WorldConfig
17
+ from donna.workspaces.config import SourceConfigValue, WorldConfig
18
18
 
19
19
 
20
20
  class Python(BaseWorld):
@@ -59,7 +59,7 @@ class Python(BaseWorld):
59
59
  if not resource_dir.is_dir():
60
60
  return Ok(None)
61
61
 
62
- from donna.world.config import config
62
+ from donna.workspaces.config import config
63
63
 
64
64
  supported_extensions = config().supported_extensions()
65
65
  matches = [
@@ -81,7 +81,7 @@ class Python(BaseWorld):
81
81
  def _get_source_by_filename(
82
82
  self, artifact_id: ArtifactId, filename: str
83
83
  ) -> Result["SourceConfigValue", ErrorsList]:
84
- from donna.world.config import config
84
+ from donna.workspaces.config import config
85
85
 
86
86
  extension = pathlib.Path(filename).suffix
87
87
  source_config = config().find_source_for_extension(extension)
@@ -115,7 +115,7 @@ class Python(BaseWorld):
115
115
  full_id = FullArtifactId((self.id, artifact_id))
116
116
 
117
117
  extension = pathlib.Path(resource_path.name).suffix
118
- from donna.world.config import config
118
+ from donna.workspaces.config import config
119
119
 
120
120
  source_config = config().find_source_for_extension(extension)
121
121
  if source_config is None:
@@ -142,6 +142,9 @@ class Python(BaseWorld):
142
142
  def update(self, artifact_id: ArtifactId, content: bytes, extension: str) -> Result[None, ErrorsList]:
143
143
  return Err([world_errors.WorldReadonly(world_id=self.id)])
144
144
 
145
+ def remove(self, artifact_id: ArtifactId) -> Result[None, ErrorsList]:
146
+ return Err([world_errors.WorldReadonly(world_id=self.id)])
147
+
145
148
  @unwrap_to_error
146
149
  def file_extension_for(self, artifact_id: ArtifactId) -> Result[str, ErrorsList]:
147
150
  resource_path = self._resolve_artifact_file(artifact_id).unwrap()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: donna
3
- Version: 0.2.0
3
+ Version: 0.2.1
4
4
  Summary: A deterministic workflow and state orchestration engine for LLM agents.
5
5
  License-Expression: BSD-3-Clause
6
6
  License-File: LICENSE
@@ -11,6 +11,7 @@ Requires-Python: >=3.12,<4.0
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: BSD License
14
15
  Classifier: Programming Language :: Python :: 3
15
16
  Classifier: Programming Language :: Python :: 3.12
16
17
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -20,7 +21,9 @@ Requires-Dist: jinja2 (>=3.1,<3.2)
20
21
  Requires-Dist: markdown-it-py (>=4.0,<4.1)
21
22
  Requires-Dist: mdformat (>=1.0.0,<1.1.0)
22
23
  Requires-Dist: pydantic (>=2.12,<2.13)
24
+ Requires-Dist: tomli-w (>=1.2,<1.3)
23
25
  Requires-Dist: typer (>=0.20,<0.21)
26
+ Project-URL: Changelog, https://github.com/Tiendil/donna/blob/main/CHANGELOG.md
24
27
  Project-URL: Homepage, https://github.com/Tiendil/donna
25
28
  Project-URL: Issues, https://github.com/Tiendil/donna/issues
26
29
  Project-URL: Repository, https://github.com/Tiendil/donna
@@ -0,0 +1,92 @@
1
+ donna/__init__.py,sha256=lEC7l3wDCBiC5gw56XkAeBW1XJA52pck7SFR1_CUals,41
2
+ donna/artifacts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ donna/artifacts/intro.md,sha256=sWkuHnYLiScoux6XNeFeC8PIfZbhpLT0mk6LmKLe8MA,2141
4
+ donna/artifacts/research/specs/report.md,sha256=yg1rrLGjzgAr5ZbezTGXbKfHshsd23mTJAZb4ZkUFDY,8576
5
+ donna/artifacts/research/work/research.md,sha256=TacNXHhKDo2HFLigqTZJyKwgarAyIBHThUdH4Nuc4Os,7082
6
+ donna/artifacts/rfc/specs/request_for_change.md,sha256=IXkQWfVG1l-oUvlOpWTIINoxykPzaYp8C4ZQolq_28s,12980
7
+ donna/artifacts/rfc/work/create.md,sha256=f8bOggAQa22aIkS0i8z7rHdyqxy-SBls-ZLpMxT5PAQ,3761
8
+ donna/artifacts/rfc/work/do.md,sha256=tifHYbwTHybjZgJ3pJBs0A748ACcITA8SKkRW5hWvp4,2949
9
+ donna/artifacts/rfc/work/plan.md,sha256=DD4qU9aJOlJkkDAa8I1j4a6AqLCEY36xU3DqFt48-g8,2532
10
+ donna/artifacts/usage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ donna/artifacts/usage/artifacts.md,sha256=ZDkUnzgr583suhDFe8f2lup7VC8ocJCuDRfGKL-mWt0,13531
12
+ donna/artifacts/usage/cli.md,sha256=hyfCtMiwN-nJUoJEpuh8goecOlk85ZAjDww0CstHn9w,10578
13
+ donna/artifacts/usage/worlds.md,sha256=iA61-ZzS29NLxrdVQhdSF-2hpS6wGO1stlWkMkHnNDU,2078
14
+ donna/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ donna/cli/__main__.py,sha256=_zo9JRR0m_ggVlrSaCpwo84bo0-cR9DgnJFup1AcH5U,224
16
+ donna/cli/application.py,sha256=rIEseTvPZgX4tZ23fTX49LF0XLfyzTO8gtpA8G80MTI,466
17
+ donna/cli/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ donna/cli/commands/artifacts.py,sha256=qakcdQ_9h4ZE1Yw0xxNfA5vhxWEPRsZjA0DjJdsNvp0,6416
19
+ donna/cli/commands/sessions.py,sha256=CqE8EocRmay3_CQGAgBwPtNffQ9KjpD7IXOOYxVW33Y,2142
20
+ donna/cli/commands/workspaces.py,sha256=ZFTFCojhi14njRFsCIpXjUWYY_aYyLH06xLFNTRDrk4,1078
21
+ donna/cli/errors.py,sha256=9UzGo4tINr3EEwhOu361M7ulGS-bEe7wGgVivu07Z1o,524
22
+ donna/cli/types.py,sha256=ZWALGkmfZQ62C8Sb6nGRkSLi0g79cEM0cAUQoITn1v0,3692
23
+ donna/cli/utils.py,sha256=rtgtCttr-txPVp1BNJYF9Nfb8zMAnBFsZ7ORsYaLsRw,1418
24
+ donna/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ donna/core/entities.py,sha256=Y3udcI1ykWDI_yPqCX6JTuDmF81BxO0PnnJzzD5uMoM,753
26
+ donna/core/errors.py,sha256=jkblzdC1bk0-E5eSGiiPSSIEHPbUbz88CXPvrHdLVuU,3313
27
+ donna/core/result.py,sha256=3QLzoRWs9ph_oGcWYbephbZjx97M_0Ayx_yFhweOcFo,2374
28
+ donna/core/utils.py,sha256=lviOkI-aFGWMy-3_VWVdf7iKGdOsIZtEzEa-5f618mk,1141
29
+ donna/domain/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ donna/domain/errors.py,sha256=jewM3wYUCGLwNb8tvHkJ35-Y59ezJKgWy7pr_Utk7iA,1253
31
+ donna/domain/ids.py,sha256=CMEBRj6i2vjVi74TtUcjLTALn3MqKsEbs-Iv463mjVg,14678
32
+ donna/lib/__init__.py,sha256=01wddMlBwKz3gtcWiSD1rAKfhMMtsp_n90DHCplWRzI,987
33
+ donna/lib/sources.py,sha256=VvnAsIm7V_CnQeEN7KqB5Z-5yzQOmz3TTAYpB6MxZZk,182
34
+ donna/lib/worlds.py,sha256=w6QmpSx3gF0q71GyTdWQAKgMwT5VaMHAa_0FdNiyOnI,286
35
+ donna/machine/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ donna/machine/action_requests.py,sha256=BRJHHex3O0-3MT2hf66QdkaSrjCA84wKBXscr1zwVtk,1249
37
+ donna/machine/artifacts.py,sha256=IpwVDUV3lUEuA80hHDSoRd3qcjYoDbZpPF7EO4VFi-o,6627
38
+ donna/machine/changes.py,sha256=TlgMA70u0ffRvwKVBwXEgEk1bp4m9w9MsVxtishX9Sw,2463
39
+ donna/machine/errors.py,sha256=45EPNC12rRT2pdgd2b9HMXCP0aon4sxo9DdUfxXeMnQ,4956
40
+ donna/machine/operations.py,sha256=CHXPy8hDYNqE5woVMj_lu2p4wgl7fqRxO0Dz0v1t4zI,761
41
+ donna/machine/primitives.py,sha256=ptPIO1yu4xXBNuVcnhKlOSPHfFj3Fo2kr_I8cbEbF04,3287
42
+ donna/machine/sessions.py,sha256=TSwNP_ELAjvnPBfHdNOVi4FguZYlf3UIhcRB0qXgK5Y,7135
43
+ donna/machine/state.py,sha256=W8mlxlH0cL91zNgOJ4dSngg-pUS7RO9J4R1ALkN782U,8121
44
+ donna/machine/tasks.py,sha256=2dfz5AoXC0pBH7t7x2SXSfZTM7_3tMYXRjJClGJY_Xc,2175
45
+ donna/machine/templates.py,sha256=oIlvYgpeuofq52sKtGvhlB850FQeuBIuwCkphoaOvss,2535
46
+ donna/primitives/__init__.py,sha256=CfJhz3TLdFxYbqCXioWVAIKGQ2tAMwXwL_Fg3A68Dqo,53
47
+ donna/primitives/artifacts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
+ donna/primitives/artifacts/specification.py,sha256=SYqRHJwfIvSVd0PTrrLG_Q0IdNy2mbdeK73Y1bt80_o,844
49
+ donna/primitives/artifacts/workflow.py,sha256=4u4Y9Le8ICKqWJR6qmC-flXKMers9Udm4vzKCHHLMME,7939
50
+ donna/primitives/directives/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
+ donna/primitives/directives/goto.py,sha256=uJdMJe3leJPSl_0PU4jd2AbHFJsJkf-x6rKhn4hKZd8,1679
52
+ donna/primitives/directives/list.py,sha256=VgpUdZyGFQJbuhbMxNqRBWGn0_75u9lEzgjjKTqFKZY,3198
53
+ donna/primitives/directives/task_variable.py,sha256=KvxY8ZOKFh6alkBhgDvkWzIJBfRNP4oYKRJ0SgHzO_g,2959
54
+ donna/primitives/directives/view.py,sha256=-FvVKksxTx8WyyZgsh2jkauqQOWf7b5LL201dbv_hac,3198
55
+ donna/primitives/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ donna/primitives/operations/finish_workflow.py,sha256=-3vaYAjj6oN93JWeQIoV9TOqzDjv-2ch_Wp4pXcOHvs,1846
57
+ donna/primitives/operations/output.py,sha256=30gAqmCdgh0UqkQIrOevpiAlONW3rT4wgOrdEtXv4nU,3271
58
+ donna/primitives/operations/request_action.py,sha256=aovOrEIfyzaiqiLEvR-dUNgCEaIEX2x1uHPEDUMQtq4,2893
59
+ donna/primitives/operations/run_script.py,sha256=R72TCPv-vsI9sZzkyikw6dulmW4iSIKWT4vEGYU4vjc,9348
60
+ donna/protocol/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
+ donna/protocol/cell_shortcuts.py,sha256=dZVCzoaPu09IYEA5g5gYPhR-q8MpgmehcYti1z9BBuI,385
62
+ donna/protocol/cells.py,sha256=jQCM-l31Kt7gEBXgvb7Ph5Fstbz9lf0lEUbH0bgNlWg,1348
63
+ donna/protocol/errors.py,sha256=u54fxMtJMWL8cbOLWU0acrmxV7Q8uHnyT1NFw959SMI,486
64
+ donna/protocol/formatters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
+ donna/protocol/formatters/automation.py,sha256=I_I-b8bixuXBlKqn2ryHDKSdRJy77FzDATJi-jhEPWI,928
66
+ donna/protocol/formatters/base.py,sha256=PGrAgxiEtZKyg1wPePQMt5syOr6IpC4ydh5rMElaojE,405
67
+ donna/protocol/formatters/human.py,sha256=WvoZVYlD4H3MftDkpEEP_RtyZnzJhUWKNecKgm3FoXg,1168
68
+ donna/protocol/formatters/llm.py,sha256=z_2djZFaVVHjLYFMneUrYp5sA-EvtPuHUDzGKV1ogu4,1266
69
+ donna/protocol/modes.py,sha256=vFDjciPdPy26XlLBGrgAn1kAVW7EJAHrccGcJrK7vUo,960
70
+ donna/protocol/nodes.py,sha256=aP5IVOouZe6akSdfzPpfcGuZLbxkEieTE6j6SuVuTUU,1974
71
+ donna/protocol/utils.py,sha256=GMiqGH2vawKu8_MmofWhCljI7AqoYDI0w19I-21t02g,663
72
+ donna/workspaces/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ donna/workspaces/artifacts.py,sha256=co6MBjIX2kV91WgNqCnDiK01hqUeB5cGPhE_ftJMl8U,8254
74
+ donna/workspaces/artifacts_discovery.py,sha256=JEf5ZVLaK2wwhx5mVE4ulOdmC2lApCdyfpfv2vBB_DE,2803
75
+ donna/workspaces/config.py,sha256=p7ujpAeOewikSWrfLLc64JeDsyrXBRCI7QLNMGng18w,6507
76
+ donna/workspaces/errors.py,sha256=ZK77AKjnRLc0-Qnu-NKztliSbCYBDmzr71fo1soWDrg,8276
77
+ donna/workspaces/initialization.py,sha256=d2oRwU4YEhhDeB1UtcOhqT0LD08QJoWEtvmSoQ6QwMg,2456
78
+ donna/workspaces/markdown.py,sha256=Aom9AnnpGHXI8LndmizwwG5r6aIFlosHjCvw-juL85Q,7214
79
+ donna/workspaces/sources/__init__.py,sha256=IRwKWnqQKh1ase742jhdadBcS4E9Hxr6j_l9Li6wwfw,70
80
+ donna/workspaces/sources/base.py,sha256=y6CawcOSBUX3oMO8YXlxE6p_NMJ713ukTZhgNKKBl94,2020
81
+ donna/workspaces/sources/markdown.py,sha256=vfNXIjDYOE40h8Thj0U593LYK874FiaFurLm6q0EFEY,9741
82
+ donna/workspaces/templates.py,sha256=tovUVXCHKfHDymr7jxPO_nN-7r_-K_pcmzkdBa9FEes,6092
83
+ donna/workspaces/tmp.py,sha256=q-ZPPTrssRjNNBJlP3wua7JjvLnXqOmYrcn2rUnhleo,1330
84
+ donna/workspaces/worlds/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ donna/workspaces/worlds/base.py,sha256=8Wt70dTlMzuO1Mmjll4reUgB_-hem9-rx_cAwaSyFVM,2589
86
+ donna/workspaces/worlds/filesystem.py,sha256=cInj9GE65OCA4Ax27uYDuPMKJ4nlTcZ1JVZe51JSkQw,7055
87
+ donna/workspaces/worlds/python.py,sha256=dRPS4jHIMRqdecCAmF7FuC6IwH3__nfWaf2cMSc7Txk,7223
88
+ donna-0.2.1.dist-info/METADATA,sha256=_NTdFT_tdpPEQqVozdqt1vyHKUHe8E6DKgxYQokDJaA,2179
89
+ donna-0.2.1.dist-info/WHEEL,sha256=kJCRJT_g0adfAJzTx2GUMmS80rTJIVHRCfG0DQgLq3o,88
90
+ donna-0.2.1.dist-info/entry_points.txt,sha256=r2W_yOzauooYCu312OQwCycIN1UjVnO5paPpS2EDZqo,48
91
+ donna-0.2.1.dist-info/licenses/LICENSE,sha256=KiF6_RVxH0MLeHZZtc8ag497X-c6oPmk-0OOf9qQDDk,1504
92
+ donna-0.2.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.3.0
2
+ Generator: poetry-core 2.3.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,142 +0,0 @@
1
- # Meta Work Loop
2
-
3
- ```toml donna
4
- kind = "donna.lib.workflow"
5
- start_operation_id = "start"
6
- ```
7
-
8
- General purpose work planning and execution workflow. Use it when you need to do complex work and there is no more specific workflow available.
9
-
10
- ## Start Work
11
-
12
- ```toml donna
13
- id = "start"
14
- kind = "donna.lib.request_action"
15
- fsm_mode = "start"
16
- ```
17
-
18
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
19
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
20
- 3. If the developer hasn't provided you a description of the work for this session, ask them to provide it.
21
- 4. Create new session-level specification `session:work_scope` with developer-provided description of the work to be done.
22
- 5. `{{ donna.lib.goto("create_work_description") }}`
23
-
24
- ## Create Work Description
25
-
26
- ```toml donna
27
- id = "create_work_description"
28
- kind = "donna.lib.request_action"
29
- ```
30
-
31
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
32
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
33
- 3. Formulate a concise high-level description of the work to be done, based on the developer-provided description.
34
- 4. Add this description to the `session:work_scope`.
35
- 5. `{{ donna.lib.goto("list_primary_goals") }}`
36
-
37
- ## List Primary Goals
38
-
39
- ```toml donna
40
- id = "list_primary_goals"
41
- kind = "donna.lib.request_action"
42
- ```
43
-
44
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
45
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
46
- 3. If you can add more goals based on existing `{{ donna.lib.view("session:work_scope") }}` add them to the specification.
47
- 4. If you can polish the existing goals according to the quality criteria in the `{{ donna.lib.view("donna:work:planning") }}` do it.
48
- 5. `{{ donna.lib.goto("list_objectives") }}`
49
-
50
- ## List Objectives
51
-
52
- ```toml donna
53
- id = "list_objectives"
54
- kind = "donna.lib.request_action"
55
- ```
56
-
57
- You MUST list objectives that need to be achieved to complete each goal.
58
-
59
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
60
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
61
- 3. If you can add more objectives based on existing `{{ donna.lib.view("session:work_scope") }}` add them to the specification.
62
- 4. If you can polish the existing objectives according to the quality criteria in the `{{ donna.lib.view("donna:work:planning") }}` do it.
63
- 5. `{{ donna.lib.goto("list_constraints") }}`
64
-
65
- ## List Constraints
66
-
67
- ```toml donna
68
- id = "list_constraints"
69
- kind = "donna.lib.request_action"
70
- ```
71
-
72
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
73
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
74
- 3. If you can add more constraints based on existing `{{ donna.lib.view("session:work_scope") }}` add them to the specification.
75
- 4. If you can polish the existing constraints according to the quality criteria in the `{{ donna.lib.view("donna:work:planning") }}` do it.
76
- 5. `{{ donna.lib.goto("list_acceptance_criteria") }}`
77
-
78
- ## List Acceptance Criteria
79
-
80
- ```toml donna
81
- id = "list_acceptance_criteria"
82
- kind = "donna.lib.request_action"
83
- ```
84
-
85
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
86
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
87
- 3. If you can add more acceptance criteria based on existing `{{ donna.lib.view("session:work_scope") }}` add them to the specification.
88
- 4. If you can polish the existing acceptance criteria according to the quality criteria in the `{{ donna.lib.view("donna:work:planning") }}` do it.
89
- 5. `{{ donna.lib.goto("list_deliverables") }}`
90
-
91
- ## List Deliverables
92
-
93
- ```toml donna
94
- id = "list_deliverables"
95
- kind = "donna.lib.request_action"
96
- ```
97
-
98
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
99
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
100
- 3. If you can list more deliverables based on existing `{{ donna.lib.view("session:work_scope") }}` add them to the specification.
101
- 4. If you can polish the existing deliverables according to the quality criteria in the `{{ donna.lib.view("donna:work:planning") }}` do it.
102
- 5. `{{ donna.lib.goto("prepare_plan") }}`
103
-
104
- ## Prepare Work Plan
105
-
106
- ```toml donna
107
- id = "prepare_plan"
108
- kind = "donna.lib.request_action"
109
- ```
110
-
111
- 1. Read the specification `{{ donna.lib.view("donna:work:planning") }}` if you haven't done it yet.
112
- 2. Read the specification `{{ donna.lib.view("donna:usage:artifacts") }}` if you haven't done it yet.
113
- 3. Read the specification `{{ donna.lib.view("session:work_scope") }}` if you haven't done it yet.
114
- 4. Create new session-level workflow `session:work_execution` according to the scope of work you have defined.
115
- 5. `{{ donna.lib.goto("execute_plan") }}`
116
-
117
- ## Execute Plan
118
-
119
- ```toml donna
120
- id = "execute_plan"
121
- kind = "donna.lib.request_action"
122
- ```
123
-
124
- 1. Run workflow `session:work_execution` to execute the work according to the plan.
125
- 2. `{{ donna.lib.goto("groom_work") }}`
126
-
127
- ## Groom Work
128
-
129
- ```toml donna
130
- id = "groom_work"
131
- kind = "donna.lib.request_action"
132
- ```
133
-
134
- 1. Run the grooming workflow to ensure that the result is polished, clean, and ready for review.
135
- 2. `{{ donna.lib.goto("finish") }}`
136
-
137
- ## Finish
138
-
139
- ```toml donna
140
- id = "finish"
141
- kind = "donna.lib.finish"
142
- ```
@@ -1,98 +0,0 @@
1
- # Show Workflow Spec + Schema
2
-
3
- ```toml donna
4
- kind = "donna.lib.workflow"
5
- start_operation_id = "read_workflow_source"
6
- ```
7
-
8
- <!-- This is a temporary worflow, later Donna should have a specialized command to display the spec -->
9
-
10
- This workflow guides an agent through loading a workflow artifact source, choosing the correct FSM graph DSL, and producing a concise schema summary with a graph and per-operation descriptions.
11
-
12
- ## Read workflow source
13
-
14
- ```toml donna
15
- id = "read_workflow_source"
16
- kind = "donna.lib.request_action"
17
- fsm_mode = "start"
18
- ```
19
-
20
- 1. Identify the full workflow artifact id to summarize from the developer request (for example: `project:work:grooming`).
21
- 2. If the workflow id is missing or ambiguous, ask the developer to provide the exact id, then repeat this operation.
22
- 3. Fetch the workflow artifact source with:
23
- - `./bin/donna.sh artifacts fetch '<workflow-id>'`
24
- 4. Read the fetched source from the path printed by the command to capture:
25
- - Workflow name (H1 title) and short description.
26
- - The start operation (from `start_operation_id` in the workflow head config, which must be marked with `fsm_mode = "start"`).
27
- - Each operation `id`, `kind`, and any {% raw %}`{{ donna.lib.goto(...) }}`{% endraw %} transitions in its body.
28
- 5. Continue to {{ donna.lib.goto("select_fsm_dsl") }}.
29
-
30
- ## Select FSM graph DSL
31
-
32
- ```toml donna
33
- id = "select_fsm_dsl"
34
- kind = "donna.lib.request_action"
35
- ```
36
-
37
- 1. Determine whether the developer requested a specific FSM graph DSL (from the original request or provided inputs).
38
- 2. If a DSL is specified, record it verbatim for rendering.
39
- 3. If no DSL is specified, select Mermaid DSL.
40
- 4. Continue to {{ donna.lib.goto("render_schema") }}.
41
-
42
- ## Render short schema
43
-
44
- ```toml donna
45
- id = "render_schema"
46
- kind = "donna.lib.request_action"
47
- ```
48
-
49
- 1. Produce the schema output in the exact meta format below, using the selected DSL for the FSM graph:
50
-
51
- ```
52
- # <workflow name>
53
-
54
- <very short one sentence description of what it does>
55
-
56
- <FSM graph description in some DSL>
57
-
58
- <list of operations: `<id>` — <short one sentence description of what it does>
59
- ```
60
-
61
- 2. Ensure the FSM graph includes all operations and transitions, and clearly marks the start and finish operations.
62
- 3. For Mermaid, use a `stateDiagram-v2` or `flowchart` representation and keep node ids aligned with operation ids.
63
- 4. For each operation list entry, write a single concise sentence that is clean, complete, and faithful to the operation body.
64
- 5. Continue to {{ donna.lib.goto("refine_schema") }}.
65
-
66
- ## Refine schema output
67
-
68
- ```toml donna
69
- id = "refine_schema"
70
- kind = "donna.lib.request_action"
71
- ```
72
-
73
- 1. Re-read the produced schema and improve clarity and correctness without changing the required format.
74
- 2. Tighten wording to keep each description to a single clean sentence while still being thorough and accurate.
75
- 3. Ensure the DSL selection rule is reflected in the graph and described output.
76
- 4. Continue to {{ donna.lib.goto("validate_schema") }}.
77
-
78
- ## Validate schema output
79
-
80
- ```toml donna
81
- id = "validate_schema"
82
- kind = "donna.lib.request_action"
83
- ```
84
-
85
- 1. Verify the output contains the title, one-sentence description, FSM graph, and operation list in the required order.
86
- 2. Confirm the chosen DSL is correct (developer-specified or Mermaid by default).
87
- 3. Confirm each operation description is a single sentence and matches the operation purpose.
88
- 4. If any check fails, return to {{ donna.lib.goto("refine_schema") }}.
89
- 5. If all checks pass, proceed to {{ donna.lib.goto("finish") }}.
90
-
91
- ## Finish
92
-
93
- ```toml donna
94
- id = "finish"
95
- kind = "donna.lib.finish"
96
- ```
97
-
98
- Workflow complete.