1# nasin pali (the way of work)
2
3[](https://api.reuse.software/info/git.secluded.site/nasin-pali)
4[](https://goreportcard.com/report/git.secluded.site/nasin-pali)
5
6**This README is aspirational!** None of the code exists yet, I'm just getting
7my ideas down. I previously wrote a
8[planning-mcp-server](https://git.secluded.site/planning-mcp-server) that I'll
9keep some ideas from, and the overall workflow is about the same. I'm trying a
10CLI over MCP because MCP seems quite protocol-heavy for what _could_ just be a
11few simple CLI invocations. Maybe connecting arbitrarty data sources warrants a
12whole protocol like MCP, but I don't think something as basic as this does. Just
13some thoughtful design and prompting.
14
15---
16
17## Overview
18
19_nasin pali_, installed as `np`, is a CLI tool that encourages LLMs in agentic
20coding tools (specifically coding, I don't think we want to support generic
21workflows) to do a bit more planning before going off and making a bunch of
22changes. It is _both_ meant for humans and LLMs; there are subcommands that
23produce output for the model and subcommands for the human to inspect the
24model's progress. There's a section on [the name](#the-name) if you're curious
25about it.
26
27The todo systems built into agentic coding tools are often just that: todo and
28nothing else. I think (backed by no evidence) that they do better when they can
29also set a goal. If I understand the coding tools correctly, they also have the
30LLM reproduce the entire task list with each `todo_write` invocation, which just
31seems wasteful and careless to me. What if it decides it doesn't want to do a
32task because it's "too hard" and it just omits that task next time it writes the
33list? _nasin pali_ helps force the model into a different overall flow.
34
35## Expected workflow
36
37_This is what I like, I'd be happy to hear of other workflows that lead to
38better/different success and to consider whether nasin-pali can support them_
39
40The operator is expected to load the prompt up with relevant text. Type the
41issue in the prompt, paste the bug report, tell it how to fetch the issue from
42your issue tracker, whatever you like. If the issue content is too sparse, make
43sure to add more context. The more context you give and the higher its quality
44and relevancy, the better results you'll have. Include paths to as many files
45you know will be relevant as possible. Mention particular symbols, paste
46snippets of code, etc. Once your prompt looks good, send it off.
47
48In the `np` section of the model's rules, we'll have instructions to
49_immediately_ set an overarching goal with `np g s -t title -d description` that
50captures the operator's request, combining the information from the ticket and
51any extra operator-provided context. It should then go off and look at the
52provided references and thoroughly consider how to go about resolving the goal.
53After gathering that context, it adds tasks with `np t a -t title -d description
54-t title2 -d description2` and gets started on them.
55
56As it works through the tasks, it's expected to update statuses by ID with
57something like `np t u -i id -s status`. Commands that modify the model's plan
58output the revision so it can immediately see the result of its invocation
59without running another command (obviating patterns like running `git status`
60after every `git commit`). Format the list something like this, using individual
61unicode symbols to represent task statuses using one token per status instead of
62more verbose checkboxes `- [x]` or words `completed` that might use more tokens.
63The failed icon (`☒`) and cancelled icon (`⊗`) are only shown in the legend if
64there are actually failed or cancelled tasks in the list.
65
66```
67Create a comprehensive MCP server for task planning and management
68
69Legend: ☐ pending ⟳ in progress ☑ completed
70☑ Set up project structure [a1b2c3d4]
71 Create Go module, directories, and basic files
72⟳ Implement core planning logic [e5f6g7h8]
73 Create Goal and Task data structures with deterministic IDs
74☐ Build MCP server integration [i9j0k1l2]
75```
76
77I'm unsure how to handle session archival (mentioned in [random
78thoughts](#random-thoughts)). We could tell the model how to archive sessions in
79the rules, but I don't know that the model even needs to know about sessions;
80maybe archival should require human interaction. If the model can't archive
81sessions, and the agentic coding tool doesn't have a way for the operator to
82execute shell commands, they'd have to quit or open a new shell to run that
83command before the model can create a new one session. Maybe telling it about
84the archival command, but to never run it without operator interaction, would be
85sufficient.
86
87## The name
88
89Is [toki pona](https://tokipona.org/). [_nasin_](https://nimi.li/nasin) occupies
90the semantic space of "method, doctrine, tradition; path, road, way" while
91[_pali_](https://nimi.li/pali) covers "work, activity; create, build, design;
92put effort toward, take action on". Together and in this context, _nasin pali_
93could be translated as "the way of work", "the doctrine of design", etc.
94
95## Random thoughts
96
97- When providing multiple lines for the body, use
98
99 ```bash
100 np goal set "Sentence case title" "$(cat <<'EOF'
101 Multi-line
102 - Body
103 - Here
104
105 EOF
106 )"
107 ```
108
109- Start a new session with `np s`. It adds details to the global sqlite database
110 and produces output to guide the LLM through its next steps. Instead of
111 telling the model up-front about everything it can do with _nasin pali_ though
112 AGENTS.md or tool definitions or something, we only reveal the sub-commands
113 and flags it might actually need once it needs them. It shouldn't ever use the
114 interactive commands, so we never tell them model about them.
115 - There can be one active session per working directory and the previous
116 session must be archived before starting a new one. This is so the model
117 doesn't have to provide a session ID or something for each invocation.
118- `np s` tells the model about the goal and task sub-commands and their flags
119 and to begin the session by turning the user's request, bug report, issue
120 contents, spec, etc. into a concise overarching goal with a thorough
121 description.
122- `np g s` accepts title and description arguments and tells the model to, if
123 necessary, look around at additional relevant files before adding some tasks
124 with `np t a`. <mark>How to provide/require/validate for pairs of -t and -d
125 flags?</mark>
126- Have the model update task statuses by ID and render the goal, the updated
127 task, and the _remaining_ tasks in the same format as planning-mcp-server. By
128 default, `planning-mcp-server` returned all tasks, but I think it would be
129 better to just return the modified one, so the model can see its previous
130 command worked, and the still-open ones. Include a flag or something so it can
131 look at all tasks including the completed ones.