Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ build/
**/ios/Flutter/Flutter.framework
**/ios/Flutter/Flutter.podspec
**/ios/Flutter/Generated.xcconfig
**/ios/Flutter/ephemeral/
**/ios/Flutter/app.flx
**/ios/Flutter/app.zip
**/ios/Flutter/flutter_assets/
Expand All @@ -73,7 +74,7 @@ build/
!**/ios/**/default.mode2v3
!**/ios/**/default.pbxuser
!**/ios/**/default.perspectivev3
/example/ios/Podfile
!/example/ios/Podfile
!/example/ios/Runner.xcodeproj/
/web/
/web/.idea/
Expand All @@ -82,3 +83,9 @@ build/
/web/.idea/vcs.xml
/web/.idea/web.iml
/web/.idea/
.agents
.claude
.vscode
AGENTS.md
CONTEXT.md
skills-lock.json
2 changes: 2 additions & 0 deletions README-EN.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,8 @@ void _showDemo(){
| pickerStyle | See [Styles](#styles) | DefaultPickerStyle()|
| onChanged | Callback when picker changes, returns (List data, List<int> position) | null|
| onConfirm | Callback when picker confirms, returns (List data, List<int> position)| null|
| editorBuilder | Custom editor below the wheels; call `updateSelection` for two-way synchronization | null|
| editorHeight | Custom editor height | 56.0|
| onCancel | Callback when picker cancels, returns (bool isCancel) whether closed by cancel button | null|

<br>
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,8 @@ Widget _demo() {
| onChanged | 选择器发生变动 return (List data, List<int> position) | null|
| onConfirm | 选择器提交 return (List data, List<int> position)| null|
| onCancel | 选择器取消 return (bool isCancel) 是否通过点击取消按钮关闭 | null|
| editorBuilder | 选择器下方的自定义编辑区,调用 `updateSelection` 可与各列双向联动 | null|
| editorHeight | 自定义编辑区高度 | 56.0|

<br>

Expand Down
60 changes: 4 additions & 56 deletions analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -1,63 +1,11 @@
include: package:flutter_lints/flutter.yaml

# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options

linter:
rules:
# 禁用一些过于严格的规则,避免对现有代码造成太多警告
# prefer_single_quotes: false # 地址数据文件有大量双引号
# prefer_const_constructors: false # 需要大量修改现有代码

# 保留重要的规则
always_declare_return_types: true
annotate_overrides: true
avoid_empty_else: true
avoid_init_to_null: true
avoid_null_checks_in_equality_operators: true
avoid_relative_lib_imports: true
avoid_return_types_on_setters: true
await_only_futures: true
camel_case_types: true
cancel_subscriptions: true
close_sinks: true
empty_catches: true
empty_constructor_bodies: true
library_names: true
library_prefixes: true
non_constant_identifier_names: true
prefer_collection_literals: true
prefer_conditional_assignment: true
prefer_contains: true
prefer_final_fields: true
prefer_for_elements_to_map_fromIterable: true
prefer_if_null_operators: true
prefer_is_empty: true
prefer_is_not_empty: true
prefer_iterable_whereType: true
prefer_spread_collections: true
recursive_getters: true
type_init_formals: true
unnecessary_brace_in_string_interps: true
unnecessary_getters_setters: true
unnecessary_new: true
unnecessary_null_aware_assignments: true
unnecessary_null_in_if_null_operators: true
unnecessary_overrides: true
unnecessary_this: true
use_function_type_syntax_for_parameters: true
use_rethrow_when_possible: true
valid_regexps: true

analyzer:
exclude:
- "**/*.g.dart"
- "**/*.freezed.dart"
# 地址数据文件包含大量自动生成的数据,忽略其 lint 警告
- "lib/address_picker/locations_data.dart"
- lib/address_picker/locations_data.dart
- lib/l10n/generated/**
errors:
invalid_annotation_target: ignore
# 将一些 info 级别的警告降级,避免干扰
prefer_single_quotes: ignore
# Keep the published package compatible while legacy call sites migrate.
prefer_const_constructors: ignore
prefer_single_quotes: ignore
unnecessary_parenthesis: ignore
42 changes: 42 additions & 0 deletions docs/agents/domain.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Domain Docs

How the engineering skills should consume this repo's domain documentation when exploring the codebase.

## Layout

This repository uses the single-context domain documentation layout:

- `CONTEXT.md` at the repository root
- Architecture decision records under `docs/adr/`

These files are created lazily when domain terminology or architectural decisions need to be recorded.

## Before exploring, read these

- **`CONTEXT.md`** at the repo root.
- **`docs/adr/`** — read ADRs that touch the area you're about to work in.

If either location doesn't exist, **proceed silently**. Don't flag its absence or suggest creating it upfront. The `/domain-modeling` skill creates these files lazily when terms or decisions actually get resolved.

## File structure

```text
/
├── CONTEXT.md
├── docs/
│ └── adr/
├── lib/
└── test/
```

## Use the glossary's vocabulary

When your output names a domain concept—in an issue title, refactor proposal, hypothesis, or test name—use the term as defined in `CONTEXT.md`. Don't drift to synonyms the glossary explicitly avoids.

If the concept you need isn't in the glossary yet, that's a signal: either you're inventing language the project doesn't use, or there's a real gap to note for `/domain-modeling`.

## Flag ADR conflicts

If your output contradicts an existing ADR, surface it explicitly rather than silently overriding:

> _Contradicts ADR-0007 (event-sourced orders)—but worth reopening because…_
45 changes: 45 additions & 0 deletions docs/agents/issue-tracker.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Issue tracker: GitHub

Issues and PRDs for this repo live as GitHub issues. Use the `gh` CLI for all operations.

## Conventions

- **Create an issue**: `gh issue create --title "..." --body "..."`. Use a heredoc for multi-line bodies.
- **Read an issue**: `gh issue view <number> --comments`, filtering comments by `jq` and also fetching labels.
- **List issues**: `gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'` with appropriate `--label` and `--state` filters.
- **Comment on an issue**: `gh issue comment <number> --body "..."`
- **Apply / remove labels**: `gh issue edit <number> --add-label "..."` / `--remove-label "..."`
- **Close**: `gh issue close <number> --comment "..."`

Infer the repo from `git remote -v``gh` does this automatically when run inside a clone.

## Pull requests as a triage surface

**PRs as a request surface: no.** _(Set to `yes` if this repo treats external PRs as feature requests; `/triage` reads this flag.)_

When set to `yes`, PRs run through the same labels and states as issues, using the `gh pr` equivalents:

- **Read a PR**: `gh pr view <number> --comments` and `gh pr diff <number>` for the diff.
- **List external PRs for triage**: `gh pr list --state open --json number,title,body,labels,author,authorAssociation,comments` then keep only `authorAssociation` of `CONTRIBUTOR`, `FIRST_TIME_CONTRIBUTOR`, or `NONE` (drop `OWNER`/`MEMBER`/`COLLABORATOR`).
- **Comment / label / close**: `gh pr comment`, `gh pr edit --add-label`/`--remove-label`, `gh pr close`.

GitHub shares one number space across issues and PRs, so a bare `#42` may be either — resolve with `gh pr view 42` and fall back to `gh issue view 42`.

## When a skill says "publish to the issue tracker"

Create a GitHub issue.

## When a skill says "fetch the relevant ticket"

Run `gh issue view <number> --comments`.

## Wayfinding operations

Used by `/wayfinder`. The **map** is a single issue with **child** issues as tickets.

- **Map**: a single issue labelled `wayfinder:map`, holding the Notes / Decisions-so-far / Fog body. `gh issue create --label wayfinder:map`.
- **Child ticket**: an issue linked to the map as a GitHub sub-issue (`gh api` on the sub-issues endpoint). Where sub-issues aren't enabled, add the child to a task list in the map body and put `Part of #<map>` at the top of the child body. Labels: `wayfinder:<type>` (`research`/`prototype`/`grilling`/`task`). Once claimed, the ticket is assigned to the driving dev.
- **Blocking**: GitHub's **native issue dependencies** — the canonical, UI-visible representation. Add an edge with `gh api --method POST repos/<owner>/<repo>/issues/<child>/dependencies/blocked_by -F issue_id=<blocker-db-id>`, where `<blocker-db-id>` is the blocker's numeric **database id** (`gh api repos/<owner>/<repo>/issues/<n> --jq .id`, _not_ the `#number` or `node_id`). GitHub reports `issue_dependencies_summary.blocked_by` (open blockers only — the live gate). Where dependencies aren't available, fall back to a `Blocked by: #<n>, #<n>` line at the top of the child body. A ticket is unblocked when every blocker is closed.
- **Frontier query**: list the map's open children (`gh issue list --state open`, scoped to the map's sub-issues / task list), drop any with an open blocker (`issue_dependencies_summary.blocked_by > 0`, or an open issue in the `Blocked by` line) or an assignee; first in map order wins.
- **Claim**: `gh issue edit <n> --add-assignee @me` — the session's first write.
- **Resolve**: `gh issue comment <n> --body "<answer>"`, then `gh issue close <n>`, then append a context pointer (gist + link) to the map's Decisions-so-far.
15 changes: 15 additions & 0 deletions docs/agents/triage-labels.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Triage Labels

The skills speak in terms of five canonical triage roles. This file maps those roles to the actual label strings used in this repo's issue tracker.

| Label in mattpocock/skills | Label in our tracker | Meaning |
| -------------------------- | -------------------- | ---------------------------------------- |
| `needs-triage` | `needs-triage` | Maintainer needs to evaluate this issue |
| `needs-info` | `needs-info` | Waiting on reporter for more information |
| `ready-for-agent` | `ready-for-agent` | Fully specified, ready for an AFK agent |
| `ready-for-human` | `ready-for-human` | Requires human implementation |
| `wontfix` | `wontfix` | Will not be actioned |

When a skill mentions a role (e.g. "apply the AFK-ready triage label"), use the corresponding label string from this table.

Edit the right-hand column to match whatever vocabulary you actually use.
Loading