flanders 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/skills.js CHANGED
@@ -1,207 +1,256 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.planSkillBody = exports.ruleSkillBody = exports.contractSkillBody = void 0;
4
- exports.contractSkillBody = `---
5
- description: Translate a free-form request into one or more contract markdown files inside the project's contracts/ folder.
6
- ---
7
-
8
- You are the /flanders-contract skill. Your sole deliverable is one or more contract markdown files inside the project's contracts/ folder. You must not write, modify, or delete any source code or any file outside contracts/.
9
-
10
- ## Input resolution
11
-
12
- The user invokes you as: /flanders-contract [<data>]
13
-
14
- - If <data> is omitted, take the user's natural-language request from the same turn or from subsequent turns of the conversation.
15
- - If <data> is supplied and resolves to an existing file path, read the file's content and use it as input.
16
- - If <data> is supplied and does not resolve to an existing file, use the value verbatim as inline input.
17
-
18
- ## What a contract is
19
-
20
- A contract is a markdown document that describes the public-facing obligations of a piece of software. It captures what a user of that software will see, do, and rely on. Implementation choices are out of scope; only behavior visible to the user is in scope.
21
-
22
- Contracts are the most public surface of the project. Once written, they are immovable unless the user explicitly asks for a change.
23
-
24
- ## Procedure
25
-
26
- 1. Resolve the input from the invocation rule above.
27
- 2. Recursively list every file currently inside the project's contracts/ folder. Capture relative paths from the project root. When the folder does not exist or is empty, the listing is empty. This listing is exhaustive — do not enumerate files in any other way.
28
- 3. Run the clarification phase before writing anything to disk:
29
- - Pick the files relevant to the request from the listing and read their content to understand the project context.
30
- - Ask clarifying questions sequentially — one question per turn — whenever the request leaves an obligation ambiguous, leaves a UI or logic decision unspecified, or admits multiple valid interpretations. Do not bundle several questions in one turn.
31
- - Prefer multiple-choice questions when the answer space is bounded. Use open-ended questions only when multiple-choice would force a false dichotomy.
32
- - When two or three substantially different approaches would all satisfy the request, present those approaches with a short trade-off summary for each and ask the user to pick or redirect, instead of silently choosing one.
33
- - The clarification phase ends only when you have enough information to draft contract files that contain no placeholders, no contradictions, and no scope ambiguity.
34
- 4. Run the drafting phase. Before persisting any file:
35
- - Present the planned file layout (which files will exist, what each file will cover) and the key obligations of each file as a structured summary, and wait for user approval or redirection.
36
- - For non-trivial requests, present the draft of each file (or each section, when a file is large) and wait for approval before moving on. Trivial requests may be presented as a single combined draft.
37
- - Update related existing contract files in place when the request affects obligations they already cover, and create new files only for obligations not already covered. Do not duplicate an existing obligation across files.
38
- 5. After approval, run a self-review pass before finalizing each file: re-read the draft and check for placeholders left behind, contradictions with other contract files, ambiguous wording, and scope that drifted beyond what the user requested. Fix any issue in place; if a fix would change the meaning of an already-approved obligation, surface the issue to the user and ask before applying it.
39
- 6. Organize the resulting files in whichever shape best fits the requested product:
40
- - A single descriptive file when the product is small.
41
- - Multiple files inside contracts/ when the product has clearly separable concerns (for example, a logic file and a UI file).
42
- - Subfolders grouping related files when the product has multiple sections (for example, one folder per major feature).
43
- 7. Filenames must be descriptive of their content — the user must be able to tell what each file covers from its name alone.
44
-
45
- ## Output language
46
-
47
- Write contract files in the same natural language as the input request. If the input is in Spanish, the output is in Spanish; if English, English; and so on. Do not translate unless the user says otherwise.
48
-
49
- ## Idempotency and overwrites
50
-
4
+ exports.contractSkillBody = `---
5
+ description: Translate a free-form request into one or more contract markdown files inside the project's contracts/ folder.
6
+ ---
7
+
8
+ You are the /flanders-contract skill. Your sole deliverable is one or more contract markdown files inside the project's contracts/ folder. You must not write, modify, or delete any source code or any file outside contracts/.
9
+
10
+ ## Input resolution
11
+
12
+ The user invokes you as: /flanders-contract [<data>]
13
+
14
+ - If <data> is omitted, take the user's natural-language request from the same turn or from subsequent turns of the conversation.
15
+ - If <data> is supplied and resolves to an existing file path, read the file's content and use it as input.
16
+ - If <data> is supplied and does not resolve to an existing file, use the value verbatim as inline input.
17
+
18
+ ## What a contract is
19
+
20
+ A contract is a markdown document that describes the public-facing obligations of a piece of software. It captures what a user of that software will see, do, and rely on. Implementation choices are out of scope; only behavior visible to the user is in scope.
21
+
22
+ Contracts are the most public surface of the project. Once written, they are immovable unless the user explicitly asks for a change.
23
+
24
+ ## Procedure
25
+
26
+ 1. Resolve the input from the invocation rule above.
27
+ 2. Recursively list every file currently inside the project's contracts/ folder. Capture relative paths from the project root. When the folder does not exist or is empty, the listing is empty. This listing is exhaustive — do not enumerate files in any other way.
28
+ 3. Run the clarification phase before writing anything to disk:
29
+ - Pick the files relevant to the request from the listing and read their content to understand the project context.
30
+ - Ask clarifying questions sequentially — one question per turn — whenever the request leaves an obligation ambiguous, leaves a UI or logic decision unspecified, or admits multiple valid interpretations. Do not bundle several questions in one turn.
31
+ - Prefer multiple-choice questions when the answer space is bounded. Use open-ended questions only when multiple-choice would force a false dichotomy.
32
+ - When two or three substantially different approaches would all satisfy the request, present those approaches with a short trade-off summary for each and ask the user to pick or redirect, instead of silently choosing one.
33
+ - The clarification phase ends only when you have enough information to draft contract files that contain no placeholders, no contradictions, and no scope ambiguity.
34
+ 4. Run the drafting phase. Before persisting any file:
35
+ - Present the planned file layout (which files will exist, what each file will cover) and the key obligations of each file as a structured summary, and wait for user approval or redirection.
36
+ - For non-trivial requests, present the draft of each file (or each section, when a file is large) and wait for approval before moving on. Trivial requests may be presented as a single combined draft.
37
+ - Update related existing contract files in place when the request affects obligations they already cover, and create new files only for obligations not already covered. Do not duplicate an existing obligation across files.
38
+ 5. After approval, run a self-review pass before finalizing each file: re-read the draft and check for placeholders left behind, contradictions with other contract files, ambiguous wording, and scope that drifted beyond what the user requested. Fix any issue in place; if a fix would change the meaning of an already-approved obligation, surface the issue to the user and ask before applying it.
39
+ 6. Organize the resulting files in whichever shape best fits the requested product:
40
+ - A single descriptive file when the product is small.
41
+ - Multiple files inside contracts/ when the product has clearly separable concerns (for example, a logic file and a UI file).
42
+ - Subfolders grouping related files when the product has multiple sections (for example, one folder per major feature).
43
+ 7. Filenames must be descriptive of their content — the user must be able to tell what each file covers from its name alone.
44
+
45
+ ## Output language
46
+
47
+ Write contract files in the same natural language as the input request. If the input is in Spanish, the output is in Spanish; if English, English; and so on. Do not translate unless the user says otherwise.
48
+
49
+ ## Idempotency and overwrites
50
+
51
51
  Existing files in contracts/ are not protected. Because you receive the current state of the folder and update related files in place, re-running with related input will modify those files rather than create parallel duplicates. Preserving prior versions is the user's responsibility (typically through version control).`;
52
- exports.ruleSkillBody = `---
53
- description: Translate a free-form request into one or more rule markdown files inside the project's rules/ folder.
54
- ---
55
-
56
- You are the /flanders-rule skill. Your sole deliverable is one or more rule markdown files inside the project's rules/ folder. You must not write, modify, or delete any source code or any file outside rules/.
57
-
58
- ## Input resolution
59
-
60
- The user invokes you as: /flanders-rule [<data>]
61
-
62
- - If <data> is omitted, take the user's natural-language request from the same turn or from subsequent turns of the conversation.
63
- - If <data> is supplied and resolves to an existing file path, read the file's content and use it as input.
64
- - If <data> is supplied and does not resolve to an existing file, use the value verbatim as inline input.
65
-
66
- ## What a rule is
67
-
68
- A rule is a markdown document that captures a single, atomic piece of implementation guidance — a constraint, convention, or pattern that the project's code must follow. Each rule file describes exactly one rule.
69
-
70
- Bundles of related rules (for example, the multiple obligations that make up SOLID, or the dispose pattern) are modeled as a subfolder under rules/ containing one file per atomic rule inside, never as a single multi-rule file.
71
-
72
- The namespace of a rule is its relative path inside rules/ — the combination of its enclosing subfolders and its filename. The namespace is what downstream tooling uses to organize, filter, and reference rules.
73
-
74
- Rules are immovable once written unless the user explicitly asks for a change.
75
-
76
- ## Procedure
77
-
78
- 1. Resolve the input from the invocation rule above.
79
- 2. Recursively list every file currently inside the project's rules/ folder. Capture relative paths from the project root. When the folder does not exist or is empty, the listing is empty. This listing is exhaustive — do not enumerate files in any other way.
80
- 3. Run the clarification phase before writing anything to disk:
81
- - Pick the files relevant to the request from the listing and read their content to understand the project's existing rule set.
82
- - Ask the user clarifying questions sequentially — one question per turn — whenever the request leaves a rule ambiguous, leaves the scope of enforcement unspecified, or admits multiple valid interpretations. Do not bundle several questions in one turn.
83
- - Prefer multiple-choice questions when the answer space is bounded. Use open-ended questions only when multiple-choice would force a false dichotomy.
84
- - When two or three substantially different formulations of a rule would all satisfy the request, present those formulations with a short trade-off summary for each and ask the user to pick or redirect, instead of silently choosing one.
85
- - The clarification phase ends only when you have enough information to draft rule files that contain no placeholders, no contradictions, and no scope ambiguity.
86
- 4. Run the drafting phase. Before persisting any file:
87
- - Present the planned file layout (which rule files will exist, in which subfolders, and the atomic rule each file captures) as a structured summary, and wait for user approval or redirection.
88
- - For non-trivial requests, present the draft of each file (or each section, when a file is large) and wait for approval before moving on. Trivial requests may be presented as a single combined draft.
89
- - Update related existing rule files in place when the request affects rules they already cover, and create new files only for rules not already covered. Do not duplicate the same rule across files.
90
- 5. After approval, run the self-review pass before finalizing each file: re-read the draft and check for placeholders left behind, contradictions with other rule files or with existing contracts, ambiguous wording, and scope that drifted beyond what the user requested. Fix any issue in place; if a fix would change the meaning of an already-approved rule, surface the issue to the user and ask before applying it.
91
- 6. Organize the resulting files so that each rule lives in its own file. Use subfolders inside rules/ to group thematically related rules (for example, a testing/ subfolder for testing-related rules, a dependencies/ subfolder for dependency-management rules, a solid/ subfolder with one file per SOLID principle, a disposes/ subfolder with one file per dispose-pattern obligation). A bundle of related rules MUST be modeled as a subfolder of single-rule files, never as one multi-rule file.
92
- 7. Filenames must be descriptive of the single rule the file captures — the user must be able to tell which rule a file pins from its name alone.
93
-
94
- ## Output language
95
-
96
- Write rule files in the same natural language as the input request. If the input is in Spanish, the output is in Spanish; if English, English; and so on. Do not translate unless the user says otherwise.
97
-
98
- ## Idempotency and overwrites
99
-
52
+ exports.ruleSkillBody = `---
53
+ description: Translate a free-form request into one or more rule markdown files inside the project's rules/ folder.
54
+ ---
55
+
56
+ You are the /flanders-rule skill. Your sole deliverable is one or more rule markdown files inside the project's rules/ folder. You must not write, modify, or delete any source code or any file outside rules/.
57
+
58
+ ## Input resolution
59
+
60
+ The user invokes you as: /flanders-rule [<data>]
61
+
62
+ - If <data> is omitted, take the user's natural-language request from the same turn or from subsequent turns of the conversation.
63
+ - If <data> is supplied and resolves to an existing file path, read the file's content and use it as input.
64
+ - If <data> is supplied and does not resolve to an existing file, use the value verbatim as inline input.
65
+
66
+ ## What a rule is
67
+
68
+ A rule is a markdown document that captures a single, atomic piece of implementation guidance — a constraint, convention, or pattern that the project's code must follow. Each rule file describes exactly one rule.
69
+
70
+ Bundles of related rules (for example, the multiple obligations that make up SOLID, or the dispose pattern) are modeled as a subfolder under rules/ containing one file per atomic rule inside, never as a single multi-rule file.
71
+
72
+ The namespace of a rule is its relative path inside rules/ — the combination of its enclosing subfolders and its filename. The namespace is what downstream tooling uses to organize, filter, and reference rules.
73
+
74
+ Rules are immovable once written unless the user explicitly asks for a change.
75
+
76
+ ## Procedure
77
+
78
+ 1. Resolve the input from the invocation rule above.
79
+ 2. Recursively list every file currently inside the project's rules/ folder. Capture relative paths from the project root. When the folder does not exist or is empty, the listing is empty. This listing is exhaustive — do not enumerate files in any other way.
80
+ 3. Run the clarification phase before writing anything to disk:
81
+ - Pick the files relevant to the request from the listing and read their content to understand the project's existing rule set.
82
+ - Ask the user clarifying questions sequentially — one question per turn — whenever the request leaves a rule ambiguous, leaves the scope of enforcement unspecified, or admits multiple valid interpretations. Do not bundle several questions in one turn.
83
+ - Prefer multiple-choice questions when the answer space is bounded. Use open-ended questions only when multiple-choice would force a false dichotomy.
84
+ - When two or three substantially different formulations of a rule would all satisfy the request, present those formulations with a short trade-off summary for each and ask the user to pick or redirect, instead of silently choosing one.
85
+ - The clarification phase ends only when you have enough information to draft rule files that contain no placeholders, no contradictions, and no scope ambiguity.
86
+ 4. Run the drafting phase. Before persisting any file:
87
+ - Present the planned file layout (which rule files will exist, in which subfolders, and the atomic rule each file captures) as a structured summary, and wait for user approval or redirection.
88
+ - For non-trivial requests, present the draft of each file (or each section, when a file is large) and wait for approval before moving on. Trivial requests may be presented as a single combined draft.
89
+ - Update related existing rule files in place when the request affects rules they already cover, and create new files only for rules not already covered. Do not duplicate the same rule across files.
90
+ 5. After approval, run the self-review pass before finalizing each file: re-read the draft and check for placeholders left behind, contradictions with other rule files or with existing contracts, ambiguous wording, and scope that drifted beyond what the user requested. Fix any issue in place; if a fix would change the meaning of an already-approved rule, surface the issue to the user and ask before applying it.
91
+ 6. Organize the resulting files so that each rule lives in its own file. Use subfolders inside rules/ to group thematically related rules (for example, a testing/ subfolder for testing-related rules, a dependencies/ subfolder for dependency-management rules, a solid/ subfolder with one file per SOLID principle, a disposes/ subfolder with one file per dispose-pattern obligation). A bundle of related rules MUST be modeled as a subfolder of single-rule files, never as one multi-rule file.
92
+ 7. Filenames must be descriptive of the single rule the file captures — the user must be able to tell which rule a file pins from its name alone.
93
+
94
+ ## Output language
95
+
96
+ Write rule files in the same natural language as the input request. If the input is in Spanish, the output is in Spanish; if English, English; and so on. Do not translate unless the user says otherwise.
97
+
98
+ ## Idempotency and overwrites
99
+
100
100
  Existing files in rules/ are not protected. Because you receive the current state of the folder and update related files in place, re-running with related input will modify those files rather than create parallel duplicates. Preserving prior versions is the user's responsibility (typically through version control).`;
101
- exports.planSkillBody = `---
102
- description: Produce a contract-aware work plan inside the project's plans/ folder.
103
- ---
104
-
105
- You are the /flanders-plan skill. Your sole deliverable is exactly one markdown plan file inside the project's plans/ folder. You must not write, modify, or delete any source code or any file outside plans/.
106
-
107
- ## Input resolution
108
-
109
- The user invokes you as: /flanders-plan [<data>]
110
-
111
- - If <data> is omitted, take the user's natural-language request from the conversation.
112
- - If <data> is supplied and resolves to an existing file path, read the file's content and use it as input.
113
- - If <data> is supplied and does not resolve to an existing file, use the value verbatim as inline input.
114
-
115
- ## Procedure
116
-
117
- 1. Recursively list every file inside the project's contracts/ folder and every file inside the project's rules/ folder. Capture relative paths from the project root. The contracts listing is the canonical reference of contracts for this run; the rules listing is the canonical reference of rules for this run.
118
- 2. Resolve the input from the invocation rule above.
119
- 3. Produce exactly one markdown file inside the project's plans/ folder. The filename must be descriptive of the plan's subject.
120
-
121
- ## Plan file format
122
-
123
- The plan file must follow these rules exactly:
124
-
125
- ### Task lines
126
-
127
- A task is a markdown list item that carries a checkbox and a metrics object at the start of its content. The full shape of a task line is:
128
-
129
- [ ]{"it":0,"ot":0,"t":0} 1.1 TITLE
130
-
131
- with the following pieces, in this exact order and spacing:
132
-
133
- - A checkbox, in one of two states:
134
- - \`[ ]\` — open (not yet implemented).
135
- - \`[x]\` — done (already implemented).
136
- - Immediately after the closing \`]\`, with no whitespace between them, the metrics object (a strict JSON literal — see Task metrics below).
137
- - A single space after the closing \`}\`.
138
- - The task number (see Numbering).
139
- - A single space.
140
- - The task title.
141
-
142
- No malformed variants such as \`[]\`, \`[ x]\`, or \`[X ]\` are permitted. All new tasks are written as open (\`[ ]\`).
143
-
144
- ### Task metrics
145
-
146
- Every leaf task line carries a metrics object \`{"it":0,"ot":0,"t":0}\` at generation time. This is a strict JSON literal with three integer fields: \`it\` (input tokens), \`ot\` (output tokens), and \`t\` (time in seconds), all set to zero for new tasks. The object is placed immediately after the checkbox with no whitespace between \`]\` and \`{\`, and one space between the closing \`}\` and the task number.
147
-
148
- ### Hierarchy and sub-tasks
149
-
150
- - A leaf task (no sub-tasks) carries a checkbox.
151
- - A parent task (has sub-tasks with their own checkboxes) does NOT carry its own checkbox. It appears as a heading or list item with a title and description, but no checkbox.
152
-
153
- Checkboxes appear only on the smallest atomic units of work, never on a unit that aggregates other checkboxed units.
154
-
155
- ### Numbering
156
-
157
- Tasks are numbered hierarchically:
158
- - Top-level tasks: 1, 2, 3, ...
159
- - Sub-tasks of task 2: 2.1, 2.2, 2.3, ...
160
- - Deeper levels follow the same dotted convention.
161
-
162
- The numbering is part of the visible task identifier.
163
-
164
- ### Ordering
165
-
166
- Tasks are written in the order they must be implemented, accounting for dependencies. A task that depends on another must appear after the task it depends on.
167
-
168
- ### Task content
169
-
170
- - Write each leaf task with a detailed description and explicit acceptance criteria — the conditions that must be true once the task is implemented for it to be considered complete.
171
- - Every leaf task carries the initial metrics object \`{"it":0,"ot":0,"t":0}\` literally. Done tasks generated by \`/flanders-plan\` follow the same shape with the same zero values.
172
- - Choose a granularity that is neither too broad nor too narrow. Tasks must be small enough for a single AI invocation without excessive tokens, but large enough that splitting further would create artificial fragmentation. When in doubt, subdivide.
173
- - For every leaf task, link the relevant contract file or files by their listed relative path. When the relevant obligation lives in a specific section or line range, reference that section or line range as well.
174
- - For every leaf task, link the relevant rule file or files by their listed relative path. The planner MUST read every rule file it determines is relevant to the request before drafting the plan; reading the relevant rules is not optional. When a rule's enforcement is bound to a specific scope, reference that scope alongside the file path.
175
- - Rule selection per task is scope-driven, not topic-driven. Before listing the rule links for a leaf task, walk the rules/ listing and ask: which rule namespaces are in scope for the work this task actually performs? Use the namespace as the scope hint. Heuristics: a task that modifies or adds tests must link every applicable file under \`rules/testing/*\`; a task that creates or modifies anything with timers, listeners, controllers, child processes, or other async lifecycle must link every applicable file under \`rules/disposables/*\`; a task that changes terminal UI or live-region output must link every applicable file under \`rules/ui/*\`. Walk every namespace whose scope could plausibly apply, and pick every file whose obligation could be triggered by the task. Under-linking is costly: the downstream implementor is FAILed by the adversarial reviewer for any global rule that should have applied but was not applied, so when in doubt, link rather than omit.
176
- - No task may describe work that creates, modifies, deletes, or renames files inside contracts/, inside rules/, or inside plans/ (the bounded checkbox/metrics update that the implement command holds is not available to tasks — see shared/spec-folder-write-authority.md).
177
-
178
- ### Contract and rule compliance
179
-
180
- Never produce a plan that violates any contract or rule on the canonical lists.
181
-
182
- ## Post-write verification
183
-
184
- After writing the plan file, re-read it and verify:
185
- - The file exists at the expected path inside plans/ and is non-empty.
186
- - Every task line follows the checkbox shape defined above (every list item carrying a task identifier has a valid \`[ ]\` or \`[x]\` checkbox; no malformed variants).
187
- - Every leaf task line carries a metrics object literally equal to \`{"it":0,"ot":0,"t":0}\`. The verification re-parses each metrics object with strict JSON, so the check is byte-exact — no extra spaces, no reordered keys, no trailing commas.
188
- - At least one task line was produced.
189
-
190
- If any check fails, fix the file and re-verify instead of leaving a malformed plan on disk.
191
-
192
- ## Summary
193
-
194
- After successful verification, print a summary in chat containing:
195
- - The plan file path.
196
- - The plan file's character size.
197
- - The plan file's total line count.
198
- - The total number of detected tasks.
199
-
200
- ## Output language
201
-
202
- Write the plan file in the same natural language as the input request, unless the user says otherwise.
203
-
204
- ## Missing contracts or rules
205
-
101
+ exports.planSkillBody = `---
102
+ description: Produce a contract-aware work plan inside the project's plans/ folder.
103
+ ---
104
+
105
+ You are the /flanders-plan skill. Your sole deliverable is exactly one markdown plan file inside the project's plans/ folder. You must not write, modify, or delete any source code or any file outside plans/.
106
+
107
+ ## Input resolution
108
+
109
+ The user invokes you as: /flanders-plan [<data>]
110
+
111
+ - If <data> is omitted, take the user's natural-language request from the conversation.
112
+ - If <data> is supplied and resolves to an existing file path, read the file's content and use it as input.
113
+ - If <data> is supplied and does not resolve to an existing file, use the value verbatim as inline input.
114
+
115
+ ## Procedure
116
+
117
+ 1. Recursively list every file inside the project's contracts/ folder and every file inside the project's rules/ folder. Capture relative paths from the project root. The contracts listing is the canonical reference of contracts for this run; the rules listing is the canonical reference of rules for this run.
118
+ 2. Resolve the input from the invocation rule above.
119
+ 3. Produce exactly one markdown file inside the project's plans/ folder. The filename must be descriptive of the plan's subject.
120
+
121
+ ## Plan file format
122
+
123
+ The plan file must follow these rules exactly:
124
+
125
+ ### Task lines
126
+
127
+ A task is a markdown list item that carries a checkbox and a metrics object at the start of its content. The full shape of a task line is:
128
+
129
+ [ ]{"it":0,"ot":0,"t":0} 1.1 TITLE
130
+
131
+ with the following pieces, in this exact order and spacing:
132
+
133
+ - A checkbox, in one of two states:
134
+ - \`[ ]\` — open (not yet implemented).
135
+ - \`[x]\` — done (already implemented).
136
+ - Immediately after the closing \`]\`, with no whitespace between them, the metrics object (a strict JSON literal — see Task metrics below).
137
+ - A single space after the closing \`}\`.
138
+ - The task number (see Numbering).
139
+ - A single space.
140
+ - The task title.
141
+
142
+ No malformed variants such as \`[]\`, \`[ x]\`, or \`[X ]\` are permitted. All new tasks are written as open (\`[ ]\`).
143
+
144
+ ### Task metrics
145
+
146
+ Every leaf task line carries a metrics object \`{"it":0,"ot":0,"t":0}\` at generation time. This is a strict JSON literal with three integer fields: \`it\` (input tokens), \`ot\` (output tokens), and \`t\` (time in seconds), all set to zero for new tasks. The object is placed immediately after the checkbox with no whitespace between \`]\` and \`{\`, and one space between the closing \`}\` and the task number.
147
+
148
+ ### Hierarchy and sub-tasks
149
+
150
+ - A leaf task (no sub-tasks) carries a checkbox.
151
+ - A parent task (has sub-tasks with their own checkboxes) does NOT carry its own checkbox. It appears as a heading or list item with a title and description, but no checkbox.
152
+
153
+ Checkboxes appear only on the smallest atomic units of work, never on a unit that aggregates other checkboxed units.
154
+
155
+ ### Numbering
156
+
157
+ Tasks are numbered hierarchically:
158
+ - Top-level tasks: 1, 2, 3, ...
159
+ - Sub-tasks of task 2: 2.1, 2.2, 2.3, ...
160
+ - Deeper levels follow the same dotted convention.
161
+
162
+ The numbering is part of the visible task identifier.
163
+
164
+ ### Ordering
165
+
166
+ Tasks are written in the order they must be implemented, accounting for dependencies. A task that depends on another must appear after the task it depends on.
167
+
168
+ ### Task content
169
+
170
+ - Write each leaf task with a detailed description and explicit acceptance criteria — the conditions that must be true once the task is implemented for it to be considered complete.
171
+ - Every leaf task carries the initial metrics object \`{"it":0,"ot":0,"t":0}\` literally. Done tasks generated by \`/flanders-plan\` follow the same shape with the same zero values.
172
+ - Choose a granularity that is neither too broad nor too narrow. Tasks must be small enough for a single AI invocation without excessive tokens, but large enough that splitting further would create artificial fragmentation. When in doubt, subdivide.
173
+ - For every leaf task, link the relevant contract file or files by their listed relative path. When the relevant obligation lives in a specific section or line range, reference that section or line range as well.
174
+ - For every leaf task, link the relevant rule file or files by their listed relative path. The planner MUST read every rule file it determines is relevant to the request before drafting the plan; reading the relevant rules is not optional. When a rule's enforcement is bound to a specific scope, reference that scope alongside the file path.
175
+ - Rule selection per task is scope-driven, not topic-driven. Before listing the rule links for a leaf task, walk the rules/ listing and ask: which rule namespaces are in scope for the work this task actually performs? Use the namespace as the scope hint. Heuristics: a task that modifies or adds tests must link every applicable file under \`rules/testing/*\`; a task that creates or modifies anything with timers, listeners, controllers, child processes, or other async lifecycle must link every applicable file under \`rules/disposables/*\`; a task that changes terminal UI or live-region output must link every applicable file under \`rules/ui/*\`. Walk every namespace whose scope could plausibly apply, and pick every file whose obligation could be triggered by the task. Under-linking is costly: the downstream implementor is FAILed by the adversarial reviewer for any global rule that should have applied but was not applied, so when in doubt, link rather than omit.
176
+ - No task may describe work that creates, modifies, deletes, or renames files inside contracts/, inside rules/, or inside plans/ (the bounded checkbox/metrics update that the implement command holds is not available to tasks — see shared/spec-folder-write-authority.md).
177
+
178
+ ### Contract and rule compliance
179
+
180
+ Never produce a plan that violates any contract or rule on the canonical lists.
181
+
182
+ ## Post-write verification
183
+
184
+ After writing the plan file, re-read it and verify:
185
+ - The file exists at the expected path inside plans/ and is non-empty.
186
+ - Every task line follows the checkbox shape defined above (every list item carrying a task identifier has a valid \`[ ]\` or \`[x]\` checkbox; no malformed variants).
187
+ - Every leaf task line carries a metrics object literally equal to \`{"it":0,"ot":0,"t":0}\`. The verification re-parses each metrics object with strict JSON, so the check is byte-exact — no extra spaces, no reordered keys, no trailing commas.
188
+ - At least one task line was produced.
189
+
190
+ If any check fails, fix the file and re-verify instead of leaving a malformed plan on disk.
191
+
192
+ ## Final validation
193
+
194
+ Before declaring this skill complete, run a final validator over the plan file. The validator is the gate — only declare complete when it returns PASS. The full obligation lives in rules/ai/skills/plan/final-validator.md; the procedure below is what the skill prompt encodes.
195
+
196
+ ### Validator host
197
+
198
+ Launch the validator as a fresh subagent via the Agent tool, in a session that does not share context with this drafting session. The fresh session is load-bearing — it forces the validator to re-derive its judgments from the file on disk rather than from this session's confirmation bias.
199
+
200
+ You may fall back to an inline pass (running the validator in this same session) only when the Agent tool is unavailable in the current environment, or when an Agent invocation returns an unrecoverable error (spawn failure, transport error, environment refusal). Inline fallback for ergonomic reasons — the plan looks small, tokens feel tight, you are confident — is forbidden. When you take the inline path, state in chat that you are falling back and name the concrete reason; a silent fallback is a violation. The validator subagent is subject to rules/ai/agents/no-git-writes.md (read-only on git, read-only on the project).
201
+
202
+ ### Validator inputs
203
+
204
+ Pass the validator:
205
+ - The absolute path to the plan file you just wrote.
206
+ - The canonical contract listing captured in step 1 of the procedure.
207
+ - The canonical rule listing captured in step 1 of the procedure.
208
+
209
+ The validator reads the plan file in full, plus any contract or rule from the listings it judges relevant to forming its verdict.
210
+
211
+ ### Validator checks
212
+
213
+ Three categories, all mandatory; failure in any one is a FAIL:
214
+
215
+ 1. Format and shape — every task line conforms to shared/plan-file-format.md: valid \`[ ]\` or \`[x]\` checkbox (no malformed variants), immediately-following metrics object literally equal to \`{"it":0,"ot":0,"t":0}\` for freshly generated tasks, hierarchical task number coherent with document position (1 before 2, 1.1 before 1.2, no malformed numbering), leaf-vs-parent distinction respected (leaves carry checkbox and metrics, parents carry neither), each leaf carries a description and an explicit acceptance-criteria section, plan file inside plans/ and non-empty, at least one task line.
216
+ 2. Semantic dependency order — tasks appear top-to-bottom in implementation order. The audit is semantic, not numeric: read each task's description and acceptance criteria and confirm that no task depends on work performed by a task that appears later in the document.
217
+ 3. Spec-folder write boundary and contract non-contradiction — no task (leaf or parent) describes work that creates, modifies, deletes, or renames any file inside contracts/, rules/, or plans/. There is no exception for flipping checkboxes or rewriting metrics: those mutations are performed programmatically by the implement command and are never described by a task. Additionally, the plan as a whole does not contradict any contract or rule in the canonical listings.
218
+
219
+ Out of scope: verifying that contract and rule paths referenced by tasks resolve to files that physically exist on disk.
220
+
221
+ ### Validator output
222
+
223
+ The validator's final response ends with a single verdict line, with no Evidence Report and no other multi-line content after it:
224
+
225
+ - \`PASS\`
226
+ - \`FAIL <enumerated issues>\` — each issue stated clearly enough that the auto-fix step can act on it. Multiple issues are enumerated inline on that same final line, each independently actionable.
227
+
228
+ If the validator wants to show its work, it does so in the body of its response above the verdict line.
229
+
230
+ ### On FAIL: bounded auto-fix loop
231
+
232
+ When the validator returns FAIL, enter the auto-fix loop:
233
+
234
+ 1. Read the FAIL report and rewrite the plan file in place, addressing every enumerated issue.
235
+ 2. Re-launch the validator (a new subagent in a fresh session when the subagent host is available) over the rewritten file.
236
+ 3. Repeat. Perform at most FIVE auto-fix passes per /flanders-plan invocation. The fifth FAIL ends the loop.
237
+
238
+ When the loop ends with a PASS at any iteration, proceed to the end-of-run summary below.
239
+
240
+ When the loop ends with FAIL after five passes, do not declare complete: surface the last FAIL report and the plan file path to the user in chat, then stop. Do not print the end-of-run summary as if the plan were valid.
241
+
242
+ ## Summary
243
+
244
+ After the final validator returns PASS, print a summary in chat containing:
245
+ - The plan file path.
246
+ - The plan file's character size.
247
+ - The plan file's total line count.
248
+ - The total number of detected tasks.
249
+
250
+ ## Output language
251
+
252
+ Write the plan file in the same natural language as the input request, unless the user says otherwise.
253
+
254
+ ## Missing contracts or rules
255
+
206
256
  If the contracts/ folder is missing or empty, warn the user in chat and produce a plan that includes whatever contracts the request implicitly requires before any implementation work. If the rules/ folder is missing or empty, warn the user in chat and proceed without rule references on the resulting tasks.`;
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NraWxscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGlCQUFpQixHQUM5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aVVBK0NpVSxDQUFDO0FBRXJULFFBQUEsYUFBYSxHQUMxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZUQWdENlQsQ0FBQztBQUVqVCxRQUFBLGFBQWEsR0FDMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztvVEF5R29ULENBQUMifQ==
@@ -13,21 +13,19 @@ const CURSOR_UP_3 = "\x1b[3A";
13
13
  const CLEAR_TO_END = "\x1b[J";
14
14
  const CR = "\r";
15
15
  class BottomBlock {
16
- _io;
17
- _time;
18
- _mounted = false;
19
- _finalized = false;
20
- _disposed = false;
21
- _header = {};
22
- _metrics = {};
23
- _footer = { kind: "working" };
24
- _animFrame = 0;
25
- _animTimer = null;
26
- _countdownTimer = null;
27
- _unsubResize = null;
28
16
  constructor(_io, _time) {
29
17
  this._io = _io;
30
18
  this._time = _time;
19
+ this._mounted = false;
20
+ this._finalized = false;
21
+ this._disposed = false;
22
+ this._header = {};
23
+ this._metrics = {};
24
+ this._footer = { kind: "working" };
25
+ this._animFrame = 0;
26
+ this._animTimer = null;
27
+ this._countdownTimer = null;
28
+ this._unsubResize = null;
31
29
  }
32
30
  mount() {
33
31
  if (this._disposed)
@@ -167,7 +165,8 @@ class BottomBlock {
167
165
  this._io.write(separator + "\n" + header + "\n" + metrics + "\n" + footer);
168
166
  }
169
167
  _renderHeader(cols) {
170
- return (0, formatters_1.formatHeaderLine)(this._header.indexLabel ?? null, this._header.iteration ?? null, this._header.activity ?? null, this._header.taskNumber ?? null, this._header.title ?? null, cols);
168
+ var _a, _b, _c, _d, _e;
169
+ return (0, formatters_1.formatHeaderLine)((_a = this._header.indexLabel) !== null && _a !== void 0 ? _a : null, (_b = this._header.iteration) !== null && _b !== void 0 ? _b : null, (_c = this._header.activity) !== null && _c !== void 0 ? _c : null, (_d = this._header.taskNumber) !== null && _d !== void 0 ? _d : null, (_e = this._header.title) !== null && _e !== void 0 ? _e : null, cols);
171
170
  }
172
171
  _renderMetrics(cols) {
173
172
  return (0, formatters_1.formatMetricsLine)(this._metrics.task, this._metrics.plan, cols);
@@ -190,4 +189,3 @@ class BottomBlock {
190
189
  }
191
190
  }
192
191
  exports.BottomBlock = BottomBlock;
193
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQm90dG9tQmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdWkvQm90dG9tQmxvY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsNkNBQXFIO0FBeUJySCxNQUFNLGFBQWEsR0FBNEI7SUFDM0MsWUFBWSxFQUFFLG9CQUFvQjtDQUNyQyxDQUFDO0FBVUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsRSxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDckIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUM7QUFDaEMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQ3hCLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQztBQUM5QixNQUFNLFlBQVksR0FBRyxRQUFRLENBQUM7QUFDOUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRWhCLE1BQWEsV0FBVztJQVlBO0lBQTJCO0lBWHZDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQixTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE9BQU8sR0FBZ0IsRUFBRSxDQUFDO0lBQzFCLFFBQVEsR0FBaUIsRUFBRSxDQUFDO0lBQzVCLE9BQU8sR0FBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUMxQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsVUFBVSxHQUFzQixJQUFJLENBQUM7SUFDckMsZUFBZSxHQUFzQixJQUFJLENBQUM7SUFDMUMsWUFBWSxHQUFxQixJQUFJLENBQUM7SUFFOUMsWUFBb0IsR0FBaUIsRUFBVSxLQUFpQjtRQUE1QyxRQUFHLEdBQUgsR0FBRyxDQUFjO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBWTtJ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
@@ -86,8 +86,8 @@ function truncateToWidth(text, cols) {
86
86
  return text.slice(0, Math.max(0, cols - 1)) + "…";
87
87
  }
88
88
  function formatTokens(n) {
89
- if (n >= 1_000_000)
90
- return (n / 1_000_000).toFixed(1) + "M";
89
+ if (n >= 1000000)
90
+ return (n / 1000000).toFixed(1) + "M";
91
91
  if (n >= 1000)
92
92
  return (n / 1000).toFixed(1) + "k";
93
93
  return String(Math.floor(n));
@@ -219,4 +219,3 @@ function formatSnapshotBlock(indexLabel, iteration, taskNumber, title, taskToken
219
219
  const metrics = formatSnapshotMetrics(taskTokens, taskSeconds, planTokens, planSeconds);
220
220
  return sep + "\n" + header + "\n" + metrics + "\n" + sep + "\n";
221
221
  }
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9mb3JtYXR0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLDRCQUVDO0FBT0Qsd0NBVUM7QUFFRCxzREFtQkM7QUFFRCwwQ0FlQztBQUVELHdDQUdDO0FBRUQsMENBR0M7QUFFRCxvQ0FJQztBQUVELDRDQVdDO0FBSUQsNENBd0JDO0FBeUNELDhDQTJCQztBQUVELG9EQUVDO0FBRUQsc0RBTUM7QUFFRCxrREFLQztBQW5OWSxRQUFBLElBQUksR0FBRyxVQUFVLENBQUM7QUFDbEIsUUFBQSxNQUFNLEdBQUcsVUFBVSxDQUFDO0FBQ3BCLFFBQUEsT0FBTyxHQUFHLFVBQVUsQ0FBQztBQUNyQixRQUFBLEtBQUssR0FBRyxVQUFVLENBQUM7QUFDbkIsUUFBQSxJQUFJLEdBQUcsVUFBVSxDQUFDO0FBQ2xCLFFBQUEsR0FBRyxHQUFHLFNBQVMsQ0FBQztBQUNoQixRQUFBLEtBQUssR0FBRyxTQUFTLENBQUM7QUFFbEIsUUFBQSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBRW5DLFNBQWdCLFFBQVEsQ0FBQyxJQUFXLEVBQUUsSUFBVztJQUM3QyxPQUFPLElBQUksR0FBRyxJQUFJLEdBQUcsYUFBSyxDQUFDO0FBQy9CLENBQUM7QUFPRCxTQUFnQixjQUFjLENBQUMsUUFBa0I7SUFDN0MsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDekIsSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLGFBQUssQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7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QztBQUlELFNBQVMsd0JBQXdCLENBQUMsSUFBVyxFQUFFLEtBQVksRUFBRSxJQUFXLEVBQUUsS0FBWTtJQUNsRixPQUFPO1FBQ0gsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUFLLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFJLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1FBQ2QsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDekIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1FBQ2QsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxhQUFLLEVBQUU7UUFDNUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxZQUFJLEVBQUU7S0FDL0IsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEtBQVksRUFBRSxHQUFVLEVBQUUsSUFBVztJQUNoRSxPQUFPO1FBQ0gsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxXQUFHLEVBQUU7UUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxhQUFLLEVBQUU7UUFDM0IsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFO1FBQ2IsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxZQUFJLEVBQUU7S0FD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
package/lib/wait.js CHANGED
@@ -14,7 +14,7 @@ function wait(durationMs, chunkMs, time, signal) {
14
14
  resolve();
15
15
  };
16
16
  const onAbort = () => {
17
- currentHandle?.cancel();
17
+ currentHandle === null || currentHandle === void 0 ? void 0 : currentHandle.cancel();
18
18
  done();
19
19
  };
20
20
  const tick = () => {
@@ -33,4 +33,3 @@ function wait(durationMs, chunkMs, time, signal) {
33
33
  tick();
34
34
  });
35
35
  }
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93YWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsb0JBZ0NDO0FBaENELFNBQWdCLElBQUksQ0FBQyxVQUFpQixFQUFFLE9BQWMsRUFBRSxJQUFnQixFQUFFLE1BQWtCO0lBQ3hGLE9BQU8sSUFBSSxPQUFPLENBQU8sT0FBTyxDQUFDLEVBQUU7UUFDL0IsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsT0FBTyxPQUFPLEVBQUUsQ0FBQztRQUNyQixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksYUFBYSxHQUE4QyxJQUFJLENBQUM7UUFDcEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2QsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM3QyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ2pCLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN4QixJQUFJLEVBQUUsQ0FBQztRQUNYLENBQUMsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUVkLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixPQUFPLElBQUksRUFBRSxDQUFDO1lBQ2xCLENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDO1lBQ25DLE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUM7WUFDdkMsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLE9BQU8sSUFBSSxFQUFFLENBQUM7WUFDbEIsQ0FBQztZQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDLENBQUM7UUFDRixNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksRUFBRSxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIn0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flanders",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "Stubborn and smart plan implementation looper using AI",
5
5
  "main": "lib/",
6
6
  "types": "lib/types",
@@ -14,6 +14,7 @@
14
14
  },
15
15
  "private": false,
16
16
  "publishConfig": {
17
+ "provenance": true,
17
18
  "access": "public"
18
19
  },
19
20
  "scripts": {