@fro.bot/systematic 2.33.3 → 3.0.0
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/ATTRIBUTIONS.md +1 -1
- package/agents/design/design-iterator.md +1 -0
- package/agents/research/best-practices-researcher.md +6 -8
- package/agents/review/pattern-recognition-specialist.md +1 -1
- package/agents/workflow/systematic-implementer.md +1 -0
- package/dist/cli.js +348 -53
- package/dist/{index-vyzhzvap.js → index-yskzf7vh.js} +587 -386
- package/dist/index.js +100 -155
- package/dist/lib/agent-overlays.d.ts +0 -1
- package/dist/lib/agent-resolver.d.ts +28 -0
- package/dist/lib/bootstrap.d.ts +8 -1
- package/dist/lib/bundled-names.d.ts +3 -3
- package/dist/lib/pi-delegate-session.d.ts +31 -0
- package/dist/lib/pi-delegate-tool.d.ts +42 -0
- package/dist/lib/removed-names.d.ts +3 -3
- package/dist/lib/setup.d.ts +36 -0
- package/dist/lib/skill-loader.d.ts +1 -2
- package/dist/lib/skill-resolver.d.ts +39 -0
- package/dist/lib/skill-tool.d.ts +2 -11
- package/dist/lib/skills.d.ts +1 -9
- package/dist/lib/source-model-defaults.d.ts +1 -1
- package/dist/pi.d.ts +7 -0
- package/dist/pi.js +3641 -0
- package/dist/schemas/systematic-config.schema.json +47 -242
- package/package.json +29 -6
- package/skills/ce-brainstorm/references/handoff.md +5 -26
- package/skills/ce-brainstorm/references/universal-brainstorming.md +0 -1
- package/skills/ce-compound/SKILL.md +8 -12
- package/skills/ce-ideate/references/post-ideation-workflow.md +21 -85
- package/skills/ce-plan/SKILL.md +6 -6
- package/skills/ce-plan/references/deepening-workflow.md +6 -7
- package/skills/ce-plan/references/plan-handoff.md +1 -17
- package/skills/ce-plan/references/universal-planning.md +0 -4
- package/skills/ce-review/SKILL.md +10 -19
- package/skills/ce-review/references/persona-catalog.md +2 -7
- package/skills/ce-review/references/review-output-template.md +0 -1
- package/skills/ce-work/SKILL.md +1 -1
- package/skills/deepen-plan/SKILL.md +6 -7
- package/skills/document-review/SKILL.md +2 -2
- package/skills/git-commit-push-pr/SKILL.md +1 -2
- package/skills/lfg/SKILL.md +1 -1
- package/skills/onboarding/SKILL.md +1 -12
- package/skills/orchestrating-subagents/SKILL.md +2 -2
- package/skills/slfg/SKILL.md +2 -3
- package/skills/test-browser/SKILL.md +2 -2
- package/skills/todos/SKILL.md +239 -0
- package/skills/writing-skills/SKILL.md +102 -1
- package/skills/{writing-systematic-skills → writing-skills}/references/foundation-conventions.md +5 -5
- package/agents/design/design-implementation-reviewer.md +0 -95
- package/agents/design/figma-design-sync.md +0 -173
- package/agents/docs/ankane-readme-writer.md +0 -51
- package/agents/review/cli-agent-readiness-reviewer.md +0 -418
- package/agents/review/data-integrity-guardian.md +0 -72
- package/agents/review/data-migration-expert.md +0 -99
- package/agents/review/dhh-rails-reviewer.md +0 -46
- package/agents/review/julik-frontend-races-reviewer.md +0 -49
- package/agents/review/kieran-python-reviewer.md +0 -47
- package/agents/review/kieran-rails-reviewer.md +0 -47
- package/agents/review/performance-oracle.md +0 -112
- package/agents/review/schema-drift-detector.md +0 -143
- package/agents/review/security-sentinel.md +0 -95
- package/agents/workflow/lint.md +0 -17
- package/dist/lib/converter.d.ts +0 -14
- package/skills/andrew-kane-gem-writer/SKILL.md +0 -184
- package/skills/andrew-kane-gem-writer/references/database-adapters.md +0 -231
- package/skills/andrew-kane-gem-writer/references/module-organization.md +0 -121
- package/skills/andrew-kane-gem-writer/references/rails-integration.md +0 -183
- package/skills/andrew-kane-gem-writer/references/resources.md +0 -119
- package/skills/andrew-kane-gem-writer/references/testing-patterns.md +0 -261
- package/skills/changelog/SKILL.md +0 -139
- package/skills/claude-permissions-optimizer/SKILL.md +0 -166
- package/skills/claude-permissions-optimizer/scripts/extract-commands.mjs +0 -655
- package/skills/claude-permissions-optimizer/scripts/normalize.mjs +0 -151
- package/skills/dhh-rails-style/SKILL.md +0 -186
- package/skills/dhh-rails-style/references/architecture.md +0 -653
- package/skills/dhh-rails-style/references/controllers.md +0 -303
- package/skills/dhh-rails-style/references/frontend.md +0 -510
- package/skills/dhh-rails-style/references/gems.md +0 -266
- package/skills/dhh-rails-style/references/models.md +0 -359
- package/skills/dhh-rails-style/references/testing.md +0 -338
- package/skills/dspy-ruby/SKILL.md +0 -737
- package/skills/dspy-ruby/assets/config-template.rb +0 -187
- package/skills/dspy-ruby/assets/module-template.rb +0 -300
- package/skills/dspy-ruby/assets/signature-template.rb +0 -221
- package/skills/dspy-ruby/references/core-concepts.md +0 -674
- package/skills/dspy-ruby/references/observability.md +0 -366
- package/skills/dspy-ruby/references/optimization.md +0 -603
- package/skills/dspy-ruby/references/providers.md +0 -418
- package/skills/dspy-ruby/references/toolsets.md +0 -502
- package/skills/every-style-editor/SKILL.md +0 -135
- package/skills/every-style-editor/references/EVERY_WRITE_STYLE.md +0 -529
- package/skills/feature-video/SKILL.md +0 -383
- package/skills/gemini-imagegen/SKILL.md +0 -237
- package/skills/gemini-imagegen/requirements.txt +0 -2
- package/skills/gemini-imagegen/scripts/compose_images.py +0 -157
- package/skills/gemini-imagegen/scripts/edit_image.py +0 -144
- package/skills/gemini-imagegen/scripts/gemini_images.py +0 -263
- package/skills/gemini-imagegen/scripts/generate_image.py +0 -133
- package/skills/gemini-imagegen/scripts/multi_turn_chat.py +0 -216
- package/skills/generate_command/SKILL.md +0 -164
- package/skills/orchestrating-swarms/SKILL.md +0 -1723
- package/skills/proof/SKILL.md +0 -291
- package/skills/proof/references/hitl-review.md +0 -368
- package/skills/rclone/SKILL.md +0 -150
- package/skills/rclone/scripts/check_setup.sh +0 -60
- package/skills/setup/SKILL.md +0 -22
- package/skills/test-xcode/SKILL.md +0 -214
- package/skills/todo-create/SKILL.md +0 -109
- package/skills/todo-resolve/SKILL.md +0 -68
- package/skills/todo-triage/SKILL.md +0 -70
- package/skills/writing-systematic-skills/SKILL.md +0 -119
- /package/skills/{todo-create → todos}/assets/todo-template.md +0 -0
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
Interactive multi-turn image generation and refinement using Gemini API.
|
|
4
|
-
|
|
5
|
-
Usage:
|
|
6
|
-
python multi_turn_chat.py [--model MODEL] [--output-dir DIR]
|
|
7
|
-
|
|
8
|
-
This starts an interactive session where you can:
|
|
9
|
-
- Generate images from prompts
|
|
10
|
-
- Iteratively refine images through conversation
|
|
11
|
-
- Load existing images for editing
|
|
12
|
-
- Save images at any point
|
|
13
|
-
|
|
14
|
-
Commands:
|
|
15
|
-
/save [filename] - Save current image
|
|
16
|
-
/load <path> - Load an image into the conversation
|
|
17
|
-
/clear - Start fresh conversation
|
|
18
|
-
/quit - Exit
|
|
19
|
-
|
|
20
|
-
Environment:
|
|
21
|
-
GEMINI_API_KEY - Required API key
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
import argparse
|
|
25
|
-
import os
|
|
26
|
-
import sys
|
|
27
|
-
from datetime import datetime
|
|
28
|
-
from pathlib import Path
|
|
29
|
-
|
|
30
|
-
from PIL import Image
|
|
31
|
-
from google import genai
|
|
32
|
-
from google.genai import types
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class ImageChat:
|
|
36
|
-
"""Interactive chat session for image generation and refinement."""
|
|
37
|
-
|
|
38
|
-
def __init__(
|
|
39
|
-
self,
|
|
40
|
-
model: str = "gemini-2.5-flash-image",
|
|
41
|
-
output_dir: str = ".",
|
|
42
|
-
):
|
|
43
|
-
api_key = os.environ.get("GEMINI_API_KEY")
|
|
44
|
-
if not api_key:
|
|
45
|
-
raise EnvironmentError("GEMINI_API_KEY environment variable not set")
|
|
46
|
-
|
|
47
|
-
self.client = genai.Client(api_key=api_key)
|
|
48
|
-
self.model = model
|
|
49
|
-
self.output_dir = Path(output_dir)
|
|
50
|
-
self.output_dir.mkdir(parents=True, exist_ok=True)
|
|
51
|
-
|
|
52
|
-
self.chat = None
|
|
53
|
-
self.current_image = None
|
|
54
|
-
self.image_count = 0
|
|
55
|
-
|
|
56
|
-
self._init_chat()
|
|
57
|
-
|
|
58
|
-
def _init_chat(self):
|
|
59
|
-
"""Initialize or reset the chat session."""
|
|
60
|
-
config = types.GenerateContentConfig(
|
|
61
|
-
response_modalities=["TEXT", "IMAGE"]
|
|
62
|
-
)
|
|
63
|
-
self.chat = self.client.chats.create(
|
|
64
|
-
model=self.model,
|
|
65
|
-
config=config,
|
|
66
|
-
)
|
|
67
|
-
self.current_image = None
|
|
68
|
-
|
|
69
|
-
def send_message(self, message: str, image: Image.Image | None = None) -> tuple[str | None, Image.Image | None]:
|
|
70
|
-
"""Send a message and optionally an image, return response text and image."""
|
|
71
|
-
contents = []
|
|
72
|
-
if message:
|
|
73
|
-
contents.append(message)
|
|
74
|
-
if image:
|
|
75
|
-
contents.append(image)
|
|
76
|
-
|
|
77
|
-
if not contents:
|
|
78
|
-
return None, None
|
|
79
|
-
|
|
80
|
-
response = self.chat.send_message(contents)
|
|
81
|
-
|
|
82
|
-
text_response = None
|
|
83
|
-
image_response = None
|
|
84
|
-
|
|
85
|
-
for part in response.parts:
|
|
86
|
-
if part.text is not None:
|
|
87
|
-
text_response = part.text
|
|
88
|
-
elif part.inline_data is not None:
|
|
89
|
-
image_response = part.as_image()
|
|
90
|
-
self.current_image = image_response
|
|
91
|
-
|
|
92
|
-
return text_response, image_response
|
|
93
|
-
|
|
94
|
-
def save_image(self, filename: str | None = None) -> str | None:
|
|
95
|
-
"""Save the current image to a file."""
|
|
96
|
-
if self.current_image is None:
|
|
97
|
-
return None
|
|
98
|
-
|
|
99
|
-
if filename is None:
|
|
100
|
-
self.image_count += 1
|
|
101
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
102
|
-
filename = f"image_{timestamp}_{self.image_count}.png"
|
|
103
|
-
|
|
104
|
-
filepath = self.output_dir / filename
|
|
105
|
-
self.current_image.save(filepath)
|
|
106
|
-
return str(filepath)
|
|
107
|
-
|
|
108
|
-
def load_image(self, path: str) -> Image.Image:
|
|
109
|
-
"""Load an image from disk."""
|
|
110
|
-
img = Image.open(path)
|
|
111
|
-
self.current_image = img
|
|
112
|
-
return img
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def main():
|
|
116
|
-
parser = argparse.ArgumentParser(
|
|
117
|
-
description="Interactive multi-turn image generation",
|
|
118
|
-
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
119
|
-
epilog=__doc__
|
|
120
|
-
)
|
|
121
|
-
parser.add_argument(
|
|
122
|
-
"--model", "-m",
|
|
123
|
-
default="gemini-2.5-flash-image",
|
|
124
|
-
choices=["gemini-2.5-flash-image", "gemini-3-pro-image-preview"],
|
|
125
|
-
help="Model to use"
|
|
126
|
-
)
|
|
127
|
-
parser.add_argument(
|
|
128
|
-
"--output-dir", "-o",
|
|
129
|
-
default=".",
|
|
130
|
-
help="Directory to save images"
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
args = parser.parse_args()
|
|
134
|
-
|
|
135
|
-
try:
|
|
136
|
-
chat = ImageChat(model=args.model, output_dir=args.output_dir)
|
|
137
|
-
except Exception as e:
|
|
138
|
-
print(f"Error initializing: {e}", file=sys.stderr)
|
|
139
|
-
sys.exit(1)
|
|
140
|
-
|
|
141
|
-
print(f"Gemini Image Chat ({args.model})")
|
|
142
|
-
print("Commands: /save [name], /load <path>, /clear, /quit")
|
|
143
|
-
print("-" * 50)
|
|
144
|
-
|
|
145
|
-
while True:
|
|
146
|
-
try:
|
|
147
|
-
user_input = input("\nYou: ").strip()
|
|
148
|
-
except (EOFError, KeyboardInterrupt):
|
|
149
|
-
print("\nGoodbye!")
|
|
150
|
-
break
|
|
151
|
-
|
|
152
|
-
if not user_input:
|
|
153
|
-
continue
|
|
154
|
-
|
|
155
|
-
# Handle commands
|
|
156
|
-
if user_input.startswith("/"):
|
|
157
|
-
parts = user_input.split(maxsplit=1)
|
|
158
|
-
cmd = parts[0].lower()
|
|
159
|
-
arg = parts[1] if len(parts) > 1 else None
|
|
160
|
-
|
|
161
|
-
if cmd == "/quit":
|
|
162
|
-
print("Goodbye!")
|
|
163
|
-
break
|
|
164
|
-
|
|
165
|
-
elif cmd == "/clear":
|
|
166
|
-
chat._init_chat()
|
|
167
|
-
print("Conversation cleared.")
|
|
168
|
-
continue
|
|
169
|
-
|
|
170
|
-
elif cmd == "/save":
|
|
171
|
-
path = chat.save_image(arg)
|
|
172
|
-
if path:
|
|
173
|
-
print(f"Image saved to: {path}")
|
|
174
|
-
else:
|
|
175
|
-
print("No image to save.")
|
|
176
|
-
continue
|
|
177
|
-
|
|
178
|
-
elif cmd == "/load":
|
|
179
|
-
if not arg:
|
|
180
|
-
print("Usage: /load <path>")
|
|
181
|
-
continue
|
|
182
|
-
try:
|
|
183
|
-
chat.load_image(arg)
|
|
184
|
-
print(f"Loaded: {arg}")
|
|
185
|
-
print("You can now describe edits to make.")
|
|
186
|
-
except Exception as e:
|
|
187
|
-
print(f"Error loading image: {e}")
|
|
188
|
-
continue
|
|
189
|
-
|
|
190
|
-
else:
|
|
191
|
-
print(f"Unknown command: {cmd}")
|
|
192
|
-
continue
|
|
193
|
-
|
|
194
|
-
# Send message to model
|
|
195
|
-
try:
|
|
196
|
-
# If we have a loaded image and this is first message, include it
|
|
197
|
-
image_to_send = None
|
|
198
|
-
if chat.current_image and not chat.chat.history:
|
|
199
|
-
image_to_send = chat.current_image
|
|
200
|
-
|
|
201
|
-
text, image = chat.send_message(user_input, image_to_send)
|
|
202
|
-
|
|
203
|
-
if text:
|
|
204
|
-
print(f"\nGemini: {text}")
|
|
205
|
-
|
|
206
|
-
if image:
|
|
207
|
-
# Auto-save
|
|
208
|
-
path = chat.save_image()
|
|
209
|
-
print(f"\n[Image generated: {path}]")
|
|
210
|
-
|
|
211
|
-
except Exception as e:
|
|
212
|
-
print(f"\nError: {e}")
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
if __name__ == "__main__":
|
|
216
|
-
main()
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: generate_command
|
|
3
|
-
description: Create a new custom slash command following conventions and best practices
|
|
4
|
-
argument-hint: '[command purpose and requirements]'
|
|
5
|
-
disable-model-invocation: true
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Create a Custom OpenCode Command
|
|
9
|
-
|
|
10
|
-
Create a new skill in `.opencode/skills/` for the requested task.
|
|
11
|
-
|
|
12
|
-
## Goal
|
|
13
|
-
|
|
14
|
-
#$ARGUMENTS
|
|
15
|
-
|
|
16
|
-
## Key Capabilities to Leverage
|
|
17
|
-
|
|
18
|
-
**File Operations:**
|
|
19
|
-
- Read, Edit, Write - modify files precisely
|
|
20
|
-
- Glob, Grep - search codebase
|
|
21
|
-
- MultiEdit - atomic multi-part changes
|
|
22
|
-
|
|
23
|
-
**Development:**
|
|
24
|
-
- Bash - run commands (git, tests, linters)
|
|
25
|
-
- Task - launch specialized agents for complex tasks
|
|
26
|
-
- todowrite - track progress with todo lists
|
|
27
|
-
|
|
28
|
-
**Web & APIs:**
|
|
29
|
-
- webfetch, google_search - research documentation
|
|
30
|
-
- GitHub (gh cli) - PRs, issues, reviews
|
|
31
|
-
- Playwright - browser automation, screenshots
|
|
32
|
-
|
|
33
|
-
**Integrations:**
|
|
34
|
-
- AppSignal - logs and monitoring
|
|
35
|
-
- Context7 - framework docs
|
|
36
|
-
- Stripe, Todoist, Featurebase (if relevant)
|
|
37
|
-
|
|
38
|
-
## Best Practices
|
|
39
|
-
|
|
40
|
-
1. **Be specific and clear** - detailed instructions yield better results
|
|
41
|
-
2. **Break down complex tasks** - use step-by-step plans
|
|
42
|
-
3. **Use examples** - reference existing code patterns
|
|
43
|
-
4. **Include success criteria** - tests pass, linting clean, etc.
|
|
44
|
-
5. **Think first** - use "think hard" or "plan" keywords for complex problems
|
|
45
|
-
6. **Iterate** - guide the process step by step
|
|
46
|
-
|
|
47
|
-
## Required: YAML Frontmatter
|
|
48
|
-
|
|
49
|
-
**EVERY command MUST start with YAML frontmatter:**
|
|
50
|
-
|
|
51
|
-
```yaml
|
|
52
|
-
---
|
|
53
|
-
name: command-name
|
|
54
|
-
description: Brief description of what this command does (max 100 chars)
|
|
55
|
-
argument-hint: "[what arguments the command accepts]"
|
|
56
|
-
---
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**Fields:**
|
|
60
|
-
- `name`: Lowercase command identifier (used internally)
|
|
61
|
-
- `description`: Clear, concise summary of command purpose
|
|
62
|
-
- `argument-hint`: Shows user what arguments are expected (e.g., `[file path]`, `[PR number]`, `[optional: format]`)
|
|
63
|
-
|
|
64
|
-
## Structure Your Command
|
|
65
|
-
|
|
66
|
-
```markdown
|
|
67
|
-
# [Command Name]
|
|
68
|
-
|
|
69
|
-
[Brief description of what this command does]
|
|
70
|
-
|
|
71
|
-
## Steps
|
|
72
|
-
|
|
73
|
-
1. [First step with specific details]
|
|
74
|
-
- Include file paths, patterns, or constraints
|
|
75
|
-
- Reference existing code if applicable
|
|
76
|
-
|
|
77
|
-
2. [Second step]
|
|
78
|
-
- Use parallel tool calls when possible
|
|
79
|
-
- Check/verify results
|
|
80
|
-
|
|
81
|
-
3. [Final steps]
|
|
82
|
-
- Run tests
|
|
83
|
-
- Lint code
|
|
84
|
-
- Commit changes (if appropriate)
|
|
85
|
-
|
|
86
|
-
## Success Criteria
|
|
87
|
-
|
|
88
|
-
- [ ] Tests pass
|
|
89
|
-
- [ ] Code follows style guide
|
|
90
|
-
- [ ] Documentation updated (if needed)
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## Tips for Effective Commands
|
|
94
|
-
|
|
95
|
-
- **Use $ARGUMENTS** placeholder for dynamic inputs
|
|
96
|
-
- **Reference AGENTS.md** patterns and conventions
|
|
97
|
-
- **Include verification steps** - tests, linting, visual checks
|
|
98
|
-
- **Be explicit about constraints** - don't modify X, use pattern Y
|
|
99
|
-
- **Use XML tags** for structured prompts: `<task>`, `<requirements>`, `<constraints>`
|
|
100
|
-
|
|
101
|
-
## Example Pattern
|
|
102
|
-
|
|
103
|
-
```markdown
|
|
104
|
-
Implement #$ARGUMENTS following these steps:
|
|
105
|
-
|
|
106
|
-
1. Research existing patterns
|
|
107
|
-
- Search for similar code using Grep
|
|
108
|
-
- Read relevant files to understand approach
|
|
109
|
-
|
|
110
|
-
2. Plan the implementation
|
|
111
|
-
- Think through edge cases and requirements
|
|
112
|
-
- Consider test cases needed
|
|
113
|
-
|
|
114
|
-
3. Implement
|
|
115
|
-
- Follow existing code patterns (reference specific files)
|
|
116
|
-
- Write tests first if doing TDD
|
|
117
|
-
- Ensure code follows AGENTS.md conventions
|
|
118
|
-
|
|
119
|
-
4. Verify
|
|
120
|
-
- Run tests: `bin/rails test`
|
|
121
|
-
- Run linter: `bundle exec standardrb`
|
|
122
|
-
- Check changes with git diff
|
|
123
|
-
|
|
124
|
-
5. Commit (optional)
|
|
125
|
-
- Stage changes
|
|
126
|
-
- Write clear commit message
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Creating the Command File
|
|
130
|
-
|
|
131
|
-
1. **Create the directory** at `.opencode/skills/[name]/SKILL.md`
|
|
132
|
-
2. **Start with YAML frontmatter** (see section above)
|
|
133
|
-
3. **Structure the skill** using the template above
|
|
134
|
-
4. **Test the skill** by using it with appropriate arguments
|
|
135
|
-
|
|
136
|
-
## Command File Template
|
|
137
|
-
|
|
138
|
-
```markdown
|
|
139
|
-
---
|
|
140
|
-
name: command-name
|
|
141
|
-
description: What this command does
|
|
142
|
-
argument-hint: "[expected arguments]"
|
|
143
|
-
---
|
|
144
|
-
|
|
145
|
-
# Command Title
|
|
146
|
-
|
|
147
|
-
Brief introduction of what the command does and when to use it.
|
|
148
|
-
|
|
149
|
-
## Workflow
|
|
150
|
-
|
|
151
|
-
### Step 1: [First Major Step]
|
|
152
|
-
|
|
153
|
-
Details about what to do.
|
|
154
|
-
|
|
155
|
-
### Step 2: [Second Major Step]
|
|
156
|
-
|
|
157
|
-
Details about what to do.
|
|
158
|
-
|
|
159
|
-
## Success Criteria
|
|
160
|
-
|
|
161
|
-
- [ ] Expected outcome 1
|
|
162
|
-
- [ ] Expected outcome 2
|
|
163
|
-
```
|
|
164
|
-
|