@mohammadhprp/system-prompt 0.12.2 → 0.12.3

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 (117) hide show
  1. package/framework/commands/README.md +1 -1
  2. package/framework/commands/review.md +1 -1
  3. package/framework/mcps/README.md +0 -1
  4. package/framework/plugins/ponytail/README.md +0 -1
  5. package/framework/plugins/ponytail/capabilities.md +1 -1
  6. package/framework/references/standards/api.md +0 -1
  7. package/framework/references/standards/architecture.md +0 -1
  8. package/framework/references/standards/database.md +0 -1
  9. package/framework/references/standards/debugging.md +0 -1
  10. package/framework/references/standards/documentation.md +0 -1
  11. package/framework/references/standards/logging.md +0 -1
  12. package/framework/references/standards/naming.md +0 -1
  13. package/framework/references/standards/observability.md +0 -1
  14. package/framework/references/standards/performance.md +0 -1
  15. package/framework/references/standards/pull-requests.md +0 -1
  16. package/framework/references/standards/security.md +0 -1
  17. package/framework/references/standards/testing.md +0 -1
  18. package/framework/skills/README.md +1 -12
  19. package/framework/skills/improve/SKILL.md +1 -3
  20. package/framework/skills/improve/examples.md +1 -1
  21. package/framework/skills/laravel-best-practices/SKILL.md +56 -216
  22. package/framework/skills/laravel-best-practices/references/architecture.md +1 -1
  23. package/framework/skills/laravel-best-practices/references/checklist.md +139 -0
  24. package/framework/skills/laravel-best-practices/references/eloquent.md +4 -2
  25. package/framework/skills/laravel-best-practices/references/infer-conventions.md +97 -0
  26. package/framework/skills/laravel-best-practices/references/pest-testing.md +47 -18
  27. package/framework/skills/laravel-best-practices/references/security.md +1 -1
  28. package/framework/skills/laravel-best-practices/references/style.md +1 -1
  29. package/framework/skills/laravel-best-practices/references/tailwindcss.md +0 -1
  30. package/package.json +1 -1
  31. package/src/catalog.js +1 -13
  32. package/framework/mcps/notion-mcp/README.md +0 -57
  33. package/framework/mcps/notion-mcp/capabilities.md +0 -118
  34. package/framework/mcps/notion-mcp/configs/opencode.json +0 -9
  35. package/framework/mcps/notion-mcp/install.md +0 -70
  36. package/framework/mcps/notion-mcp/troubleshooting.md +0 -95
  37. package/framework/skills/brainstorming/SKILL.md +0 -159
  38. package/framework/skills/brainstorming/examples.md +0 -49
  39. package/framework/skills/brainstorming/scripts/frame-template.html +0 -213
  40. package/framework/skills/brainstorming/scripts/helper.js +0 -167
  41. package/framework/skills/brainstorming/scripts/server.cjs +0 -723
  42. package/framework/skills/brainstorming/scripts/start-server.sh +0 -209
  43. package/framework/skills/brainstorming/scripts/stop-server.sh +0 -120
  44. package/framework/skills/brainstorming/visual-companion.md +0 -291
  45. package/framework/skills/code-review/SKILL.md +0 -72
  46. package/framework/skills/code-review/examples.md +0 -31
  47. package/framework/skills/codenavi/SKILL.md +0 -306
  48. package/framework/skills/codenavi/examples.md +0 -33
  49. package/framework/skills/codenavi/references/coding-principles.md +0 -143
  50. package/framework/skills/codenavi/references/notebook-spec.md +0 -171
  51. package/framework/skills/create-adr/SKILL.md +0 -429
  52. package/framework/skills/create-adr/examples.md +0 -35
  53. package/framework/skills/design/SKILL.md +0 -399
  54. package/framework/skills/design/examples.md +0 -34
  55. package/framework/skills/great-interface/SKILL.md +0 -43
  56. package/framework/skills/great-interface/references/animations.md +0 -205
  57. package/framework/skills/great-interface/references/better-accessibility.md +0 -106
  58. package/framework/skills/great-interface/references/better-colors.md +0 -100
  59. package/framework/skills/great-interface/references/better-interface.md +0 -132
  60. package/framework/skills/great-interface/references/better-layout.md +0 -76
  61. package/framework/skills/great-interface/references/better-typography.md +0 -157
  62. package/framework/skills/great-interface/references/better-ui.md +0 -107
  63. package/framework/skills/great-interface/references/better-writing.md +0 -109
  64. package/framework/skills/great-interface/references/choosing-fonts.md +0 -64
  65. package/framework/skills/great-interface/references/color-formats.md +0 -90
  66. package/framework/skills/great-interface/references/color-usage.md +0 -118
  67. package/framework/skills/great-interface/references/contrast.md +0 -79
  68. package/framework/skills/great-interface/references/css-cheat-sheet.md +0 -65
  69. package/framework/skills/great-interface/references/details-and-accessibility.md +0 -119
  70. package/framework/skills/great-interface/references/enter-exit.md +0 -147
  71. package/framework/skills/great-interface/references/explain-interface.md +0 -126
  72. package/framework/skills/great-interface/references/find-the-effect.md +0 -94
  73. package/framework/skills/great-interface/references/focus-and-keyboard.md +0 -131
  74. package/framework/skills/great-interface/references/forms.md +0 -84
  75. package/framework/skills/great-interface/references/from-an-image.md +0 -55
  76. package/framework/skills/great-interface/references/grouping-and-alignment.md +0 -123
  77. package/framework/skills/great-interface/references/hit-areas.md +0 -94
  78. package/framework/skills/great-interface/references/icon-transitions.md +0 -102
  79. package/framework/skills/great-interface/references/icons.md +0 -110
  80. package/framework/skills/great-interface/references/interface-review.md +0 -148
  81. package/framework/skills/great-interface/references/motion-and-zoom.md +0 -79
  82. package/framework/skills/great-interface/references/no-browser.md +0 -73
  83. package/framework/skills/great-interface/references/palette-generation.md +0 -104
  84. package/framework/skills/great-interface/references/palette-structure.md +0 -76
  85. package/framework/skills/great-interface/references/performance.md +0 -88
  86. package/framework/skills/great-interface/references/picker.md +0 -76
  87. package/framework/skills/great-interface/references/read-the-system.md +0 -178
  88. package/framework/skills/great-interface/references/removed-signals.md +0 -38
  89. package/framework/skills/great-interface/references/review-format.md +0 -46
  90. package/framework/skills/great-interface/references/scope-resolution.md +0 -88
  91. package/framework/skills/great-interface/references/screen-readers.md +0 -101
  92. package/framework/skills/great-interface/references/semantics-and-aria.md +0 -84
  93. package/framework/skills/great-interface/references/spacing-and-adaptivity.md +0 -159
  94. package/framework/skills/great-interface/references/spacing-and-sizing.md +0 -121
  95. package/framework/skills/great-interface/references/surfaces.md +0 -219
  96. package/framework/skills/great-interface/references/token-naming.md +0 -97
  97. package/framework/skills/great-interface/references/variable-fonts-and-opentype.md +0 -105
  98. package/framework/skills/great-interface/references/variant.md +0 -104
  99. package/framework/skills/great-interface/references/wrapping-and-punctuation.md +0 -55
  100. package/framework/skills/learning-opportunities/SKILL.md +0 -140
  101. package/framework/skills/learning-opportunities/examples.md +0 -34
  102. package/framework/skills/learning-opportunities/references/PRINCIPLES.md +0 -42
  103. package/framework/skills/notion-mcp/SKILL.md +0 -57
  104. package/framework/skills/notion-mcp/examples.md +0 -31
  105. package/framework/skills/notion-mcp/references/comments.md +0 -112
  106. package/framework/skills/notion-mcp/references/databases.md +0 -193
  107. package/framework/skills/notion-mcp/references/pages.md +0 -235
  108. package/framework/skills/spec-driven-eval/SKILL.md +0 -341
  109. package/framework/skills/spec-driven-eval/examples.md +0 -35
  110. package/framework/skills/spec-driven-eval/references/quickstart.md +0 -118
  111. package/framework/skills/spec-driven-eval/references/reference.md +0 -295
  112. package/framework/skills/technical-design-doc-creator/README.md +0 -411
  113. package/framework/skills/technical-design-doc-creator/SKILL.md +0 -1484
  114. package/framework/skills/technical-design-doc-creator/examples.md +0 -35
  115. package/framework/skills/web-design-guidelines/SKILL.md +0 -65
  116. package/framework/skills/web-design-guidelines/examples.md +0 -32
  117. package/framework/skills/web-design-guidelines/references/guideline.md +0 -174
@@ -0,0 +1,139 @@
1
+ # Detection Checklist
2
+
3
+ Every dimension here is a genuine fork: Laravel offers two or more valid approaches, the app's choice changes what the next agent writes, and no active project tool can pick for you. Left out on purpose: pure formatting (Pint owns it), any form an installed and enabled Rector rule rewrites to one canonical shape (`$casts` to `casts()`, `$fillable` to attributes, pipe-string rules to arrays, named to anonymous migrations, `$signature` to `#[Signature]`), and framework defaults any agent writes unprompted (`ShouldQueue` jobs, relation return types, `HasFactory`).
4
+
5
+ Each item gives the fork, then a hint (a grep or dir to spot which side the app takes). Hints are only a start. Read the matched files, never record on a raw count. Apply the ground rules to every verdict: a consistent choice that is a default or a tool's target form is not a pattern. Rows tagged (architecture) are the highest-signal, so record presence and deliberate absence.
6
+
7
+ ---
8
+
9
+ ## A. Validation & HTTP input
10
+
11
+ 1. Validation entry point: inline `$request->validate()` vs Form Request classes vs `Validator::make()`.
12
+ - Hint: `ls app/Http/Requests`; grep `->validate(` / `Validator::make(` in `app/Http/Controllers`.
13
+ 2. Custom rule location: invokable rule objects in `app/Rules` vs inline closures vs `Validator::extend()` in a provider. Rule objects are the default `make:rule` path, so record only if the app leans on closures or `Validator::extend` instead. "No rule objects" alone is just no-signal.
14
+ - Hint: `ls app/Rules`; grep `Validator::extend` in `app/Providers`.
15
+ 3. Typed input retrieval: typed getters (`$request->string()`, `->integer()`, `->enum()`, `->date()`) vs raw `$request->input()` / dynamic properties.
16
+ - Hint: grep `->string(` / `->integer(` / `->enum(` vs `->input(` in `app/Http`.
17
+ 4. Custom messages/attributes: `lang/*/validation.php` vs Form Request `messages()` / `attributes()` methods.
18
+ - Hint: `ls lang`; grep `function messages`, `function attributes` in `app/Http/Requests`.
19
+
20
+ ## B. Controllers & routing
21
+
22
+ 1. Controller shape: invokable single-action (`__invoke`) vs resource controllers vs plain multi-method.
23
+ - Hint: grep `__invoke` in controllers; `Route::resource` / `apiResource` vs verb routes.
24
+ 2. Business-logic location (architecture): fat controllers vs delegated to Actions / Services / Jobs.
25
+ - Hint: read a few controller methods; `ls app/Actions app/Services`.
26
+ 3. Route handler style: closures in `routes/*.php` vs controller classes.
27
+ - Hint: count `function ()` vs `::class` in `routes/web.php`, `routes/api.php`.
28
+ 4. Middleware assignment: route/group `->middleware()` vs controller `HasMiddleware::middleware()` vs `#[Middleware]` attribute.
29
+ - Hint: grep `implements HasMiddleware`, `#[Middleware(` in controllers vs `->middleware(` in routes.
30
+ 5. Route model binding: implicit (type-hinted models) vs explicit `Route::bind` vs manual `findOrFail`.
31
+ - Hint: typed model params in signatures vs `findOrFail(` in controllers; grep `Route::bind`.
32
+ 6. Rate limiting: named `RateLimiter::for()` + `throttle:name` vs inline `throttle:60,1`.
33
+ - Hint: grep `RateLimiter::for` in providers vs `throttle:` in route files.
34
+
35
+ ## C. Authorization
36
+
37
+ 1. Authorization home: Gates (`Gate::define`) vs Policy classes in `app/Policies`.
38
+ - Hint: `ls app/Policies`; grep `Gate::define` in `app/Providers`.
39
+ 2. Authorization call site: `$this->authorize()` / `Gate::authorize()` vs `$user->can()` vs `can` middleware vs `#[Authorize]` vs `@can` in Blade.
40
+ - Hint: grep `authorize(`, `->can(`, `middleware('can:`, `#[Authorize(`, `@can(`.
41
+
42
+ ## D. Eloquent & models
43
+
44
+ 1. Mass assignment: `$fillable` allow-list vs `$guarded` block-list.
45
+ - Hint: grep `protected $fillable` / `protected $guarded` in `app/Models`.
46
+ 2. Accessors/mutators: modern `Attribute` class vs legacy `getXxxAttribute()` / `setXxxAttribute()`. Record a legacy hold, it goes against the tool's grain.
47
+ - Hint: grep `: Attribute` / `Attribute::make` vs `function get[A-Z].*Attribute` in `app/Models`.
48
+ 3. Primary keys: auto-increment vs `HasUuids` vs `HasUlids`.
49
+ - Hint: grep `HasUuids` / `HasUlids` in `app/Models`; migration `id()` vs `uuid('id')`.
50
+ 4. Custom casts: dedicated `CastsAttributes` classes (`app/Casts`) vs inline `Attribute` vs built-in cast strings.
51
+ - Hint: `ls app/Casts`; grep `Cast::class`, `AsStringable::class` in models.
52
+ 5. Data/query layer (architecture): Eloquent directly in controllers vs repositories vs dedicated query objects (e.g. classes exposing `builder(): Builder`).
53
+ - Hint: `ls app/Repositories app/Queries`; see where non-trivial queries are built.
54
+ 6. Query scopes: local `scope`/`#[Scope]` methods vs dedicated builder classes.
55
+ - Hint: grep `function scope` / `#[Scope]` in models; `ls app/*/Builders`.
56
+ 7. Model events: observers (`app/Observers`, `#[ObservedBy]`) vs `booted()` closures vs event classes.
57
+ - Hint: `ls app/Observers`; grep `booted`, `::observe`, `#[ObservedBy]`.
58
+ 8. Eager-load posture: explicit per-query `->with()` vs model-level `$with` defaults. Treat `preventLazyLoading()` separately as a development guard because it can complement either posture.
59
+ - Hint: grep `protected $with`, `->with(`, and separately `preventLazyLoading` in `app/`.
60
+
61
+ ## E. Architecture & organization
62
+
63
+ 1. Action/Service structure (architecture): Action classes (invoked via `handle` / `execute` / `__invoke`) vs service objects vs neither. Cross-check the Step 0 `app/` map: any `Actions`/`Services`/`Pipelines`/`Jobs`-as-actions folder is this pattern, so record how it is invoked.
64
+ - Hint: `ls app/` (the whole tree, not just `Actions`/`Services`); grep the invocation method in the folder you find.
65
+ 2. DTOs (architecture): spatie/laravel-data vs plain readonly classes vs arrays everywhere.
66
+ - Hint: `ls app/Data`; grep `extends Data`, `readonly class` in `app/`.
67
+ 3. Dependency acquisition: constructor/method injection vs `app()` / `resolve()` / `App::make()` service location.
68
+ - Hint: grep `app(` / `resolve(` / `::make(` in `app/` vs promoted constructor deps.
69
+ 4. Decoupling: events + listeners vs direct service calls.
70
+ - Hint: `ls app/Events app/Listeners`; grep `event(`, `::dispatch(`.
71
+ 5. Helper vs facade idiom: global helpers (`config()`, `auth()`, `response()`) vs facades (`Config::`, `Auth::`, `Response::`).
72
+ - Hint: ratio of `config(` vs `Config::` (etc.) across `app/`.
73
+ 6. Namespace layout (architecture): default `app/` skeleton vs domain/module folders (`app/Domain/**`, modules).
74
+ - Hint: `ls app/`, look for `Domain/`, `Modules/`, bounded-context folders.
75
+ 7. Enums: backed vs pure; case naming; where they live.
76
+ - Hint: `ls app/Enums`; grep `enum .*: string`, `enum .*: int`.
77
+
78
+ ## F. Frontend & views
79
+
80
+ This app ships a frontend stack, so the items below apply.
81
+
82
+ 1. Frontend stack: Blade+Livewire vs Inertia (Vue/React/Svelte) vs Blade-only / API + separate SPA.
83
+ - Hint: `composer.json` + `package.json`; `ls resources/js/pages`, `resources/views`.
84
+ 2. Blade composition: class `<x-*>` components vs anonymous components (`@props`) vs `@include` partials.
85
+ - Hint: `ls app/View/Components`; grep `<x-`, `@include` in `resources/views`.
86
+ 3. Livewire component format: Volt functional/class components, native Livewire 4 single-file (SFC), multi-file (MFC), view-based, or class-based components. Evaluate full-page vs nested separately because it is an independent usage choice.
87
+ - Hint: check the installed Livewire major and `livewire/volt`; inspect `app/Livewire`, `resources/views/livewire`, and Livewire 4 component/page directories for `@volt`, SFC, MFC, view-based, and class-based formats.
88
+ 4. Localization: short keys (`lang/*/*.php` + `__('messages.welcome')`) vs JSON string keys (`lang/*.json` + `__('Full sentence')`).
89
+ - Hint: `ls lang`; grep dotted `__('` vs sentence keys.
90
+
91
+ ## G. Database & migrations
92
+
93
+ 1. Foreign keys: `foreignId()->constrained()` vs `foreignIdFor(Model::class)` vs manual `foreign()->references()->on()`.
94
+ - Hint: grep `foreignId(`, `foreignIdFor(`, `->foreign(` in `database/migrations`.
95
+ 2. `down()` methods: real reverse logic vs omitted / one-way migrations.
96
+ - Hint: grep `function down` vs the migration count.
97
+ 3. Enum storage: DB `enum()` column vs `string()` + PHP-enum cast on the model.
98
+ - Hint: grep `->enum(` in migrations vs string columns cast to enums.
99
+ 4. Transactions: `DB::transaction(fn ...)` closure vs manual `beginTransaction` / `commit` / `rollBack`.
100
+ - Hint: grep `DB::transaction`, `beginTransaction` in `app/`.
101
+ 5. Idempotent writes: `upsert` / `updateOrCreate` / `firstOrCreate` vs find-then-save.
102
+ - Hint: grep `upsert(`, `updateOrCreate(`, `firstOrCreate(` in `app/`.
103
+
104
+ ## H. Testing
105
+
106
+ 1. Framework: Pest (`it()` / `test()` / `expect()`) vs PHPUnit classes.
107
+ - Hint: `ls tests/Pest.php`; grep `it(` / `test(` vs `extends TestCase`.
108
+ 2. DB reset: `RefreshDatabase` vs `DatabaseTruncation` vs `DatabaseMigrations`.
109
+ - Hint: grep those trait names in `tests/`.
110
+ 3. Fixtures: compare how equivalent test-owned records are created, such as factories vs manual inserts. Track seeders separately for shared reference data because `$this->seed()` commonly and legitimately coexists with factories.
111
+ - Hint: grep `::factory(` and direct inserts in `tests/`; separately inspect `$this->seed(` calls and what those seeders provide.
112
+ 4. Collaborator isolation: how the app doubles its own classes, Mockery `mock()` / `spy()` vs real integration. Ignore facade fakes like `Mail::fake()` here, they isolate framework services by default and are not a fork against Mockery.
113
+ - Hint: grep `->mock(`, `->spy(`, `Mockery::` in `tests/`.
114
+ 5. Endpoint assertions: array `assertJson([...])` / `assertJsonFragment` vs fluent `AssertableJson`.
115
+ - Hint: grep `AssertableJson`, `assertJsonFragment` in `tests/`.
116
+
117
+ ## I. Responses & API resources
118
+
119
+ 1. Response shape: API Resource classes vs `response()->json()` vs returning models/arrays directly.
120
+ - Hint: `ls app/Http/Resources`; grep `JsonResource`, `->json(` in controllers.
121
+ 2. Resource relationship inclusion: `whenLoaded()` guards vs unconditional relationship access. Do not count ordinary scalar attributes as rivals to conditional relationships, and evaluate general `when()` fields separately.
122
+ - Hint: compare relationship fields using `whenLoaded(` with unconditional relationship property access in `app/Http/Resources`.
123
+ 3. Pagination contracts: within comparable endpoint categories, length-aware `paginate()` vs `simplePaginate()` vs `cursorPaginate()`. These have different totals, navigation, ordering, and performance contracts, so record only a stable path-scoped API policy, never a project-wide majority.
124
+ - Hint: grep those in `app/`, then group matches by endpoint type and client contract before comparing them.
125
+ 4. Web redirects/URLs: `route('name')` vs `url('/path')` vs `action([...])`.
126
+ - Hint: grep `route('`, `url('/`, `action([` in `app/Http` and views.
127
+
128
+ ## J. Strings, collections & dates
129
+
130
+ 1. Iteration idiom: `collect()->map()->filter()` pipelines vs `array_map` / `foreach`.
131
+ - Hint: grep `collect(`, `->map(` vs `array_map`, `foreach` density in `app/`.
132
+ 2. String API: fluent `Str::of()->...` (Stringable) vs static `Str::` vs native (`trim`, `strtoupper`).
133
+ - Hint: grep `Str::of(` vs `Str::` vs native string funcs.
134
+ 3. Dates: compare equivalent construction call styles (`now()` / `today()` helpers vs `Carbon::`) separately from the application's mutable/immutable date policy. `Date::use(CarbonImmutable::class)` can make helpers return immutable dates, so those signals are complementary rather than conflicting.
135
+ - Hint: grep `now(` and `Carbon::` for call style; separately inspect `CarbonImmutable` and `Date::use` for mutability policy.
136
+
137
+ ---
138
+
139
+ Genuine forks only. Every row survived the "no tool can decide this, and it isn't the default" filter. Give each applicable dimension exactly one verdict: pattern, conflict, default, no-signal, tooling-owned, or already-recorded. The rows tagged (architecture) are where the highest-value rules come from.
@@ -30,7 +30,8 @@ $articles = Article::whereHas('user', function ($q) {
30
30
 
31
31
  Correct:
32
32
  ```php
33
- public function scopeActive(Builder $query): Builder
33
+ #[Scope]
34
+ protected function active(Builder $query): Builder
34
35
  {
35
36
  return $query->where('verified', true)->whereNotNull('activated_at');
36
37
  }
@@ -58,7 +59,8 @@ class PublishedScope implements Scope
58
59
 
59
60
  Correct (local scope you opt into):
60
61
  ```php
61
- public function scopePublished(Builder $query): Builder
62
+ #[Scope]
63
+ protected function published(Builder $query): Builder
62
64
  {
63
65
  return $query->where('published', true);
64
66
  }
@@ -0,0 +1,97 @@
1
+
2
+ # Infer Conventions
3
+
4
+ Learn how this application writes Laravel, then record what you learn as durable, path-scoped rules other agents will read. You are documenting reality, not improving it.
5
+
6
+ ## Ground Rules (read before you start)
7
+
8
+ - Consistency first. The codebase's majority style is the convention. Never judge it, never propose a "better" pattern, never record what the code should do. If the app validates inline everywhere, that is the rule, even if Form Requests would be nicer.
9
+ - Skip what an active tool produces, keep what a tool would fight. Inspect the project's Pint and Rector configuration first; a Rector transformation is tooling-owned only when its package and relevant rule or set are installed and enabled. Active tools may rewrite code toward one canonical form: `$casts` to `casts()`, `$fillable` to attributes, magic accessors to the `Attribute` class, pipe-string rules to arrays, `$signature` to `#[Signature]`, named migrations to anonymous, and many more. When the app already sits at an active tool's target form, the tool owns it, so record nothing. But when the app deliberately holds a form an active tool would refactor away, such as legacy `getXxxAttribute()` accessors the `Attribute` class would replace, no tool can reproduce that choice and an agent defaults the other way. That against-the-grain hold is exactly what to record.
10
+ - Record decisions, not defaults. A consistent pattern earns a rule only when it reflects a choice: the app took one valid option where the framework or common practice offered others, or the pattern would surprise a competent agent. Framework defaults steer nothing, so skip them: anonymous migrations, `$signature` commands, `ShouldQueue` jobs, `casts()` on Laravel 11+, named routes, Rule objects in `app/Rules`, and `Mail::fake()` or `Bus::fake()` to isolate framework services. A real fork is not enough on its own. Weigh the side the app took, and record only the side an agent would not reach for by itself: inline closures everywhere, legacy accessors, a bespoke query layer. Watch for the false fork too. "No Mockery" next to facade fakes is not a choice against Mockery, because they double different things. The test for every candidate: without this rule, would the next agent plausibly write it differently? Only "yes" earns a rule.
11
+ - Architecture choices are the gold. Record presence and deliberate absence. The structural pattern the app commits to is the highest-signal convention and the one no tool can decide: Action classes and how they are invoked (`handle` / `execute` / `__invoke`), service objects, dedicated query objects exposing `builder()`, DTOs (spatie/laravel-data vs readonly classes), Form Request validation vs inline, an events and listeners spine vs direct calls, and domain or module folders. Also record a consistent non-pattern, such as "query Eloquent directly in controllers, no repository layer", so the next agent matches the app's altitude instead of over-engineering.
12
+ - Never duplicate `.ai/rules`. Read `.ai/rules/index.md` and the area files before the sweep. A dimension already covered there is marked done and skipped.
13
+ - Evidence or silence. A convention needs at least 3 consistent examples and no meaningful rival to become a candidate. Every Step 1 verdict applies this bar.
14
+ - The recorded rule states the convention, nothing else. One or two imperative lines: this project does X, so do X here. Keep detection evidence out. No counts, ratios, current usage, file lists, or example paths, because that is proof for the confirm step, not part of the rule. One short syntax fragment at most, and point to `search-docs` for API details.
15
+
16
+ ## Process
17
+
18
+ Each step ends on a checkable completion criterion. Do not advance until it holds.
19
+
20
+ Fan out when you can. The sweep is embarrassingly parallel. If your environment can spawn subagents (a Task, dispatch, or equivalent tool), do Step 0 yourself, then hand each checklist group (A to J) and the architecture map to its own subagent. Each subagent runs the greps, reads a few representative files, and returns structured verdicts (dimension, verdict, evidence, proposed glob / title / note). You aggregate, dedupe, then run Steps 3 to 5. It is far faster on a real app. No subagents available? Run the steps in sequence, with the same bar and the same output.
21
+
22
+ ### Step 0: Orient
23
+
24
+ Read `composer.json` (installed packages tell you which checklist groups apply), the `pint.json` / PHPStan / Rector config, `.ai/rules/index.md` if present, and most important, map the `app/` tree. List every directory under `app/` (and any `Modules/`, `src/`, `packages/`, or domain root). Every folder beyond Laravel's default skeleton (`Http`, `Models`, `Providers`, `Console`, `Exceptions`) is a structural pattern the app committed to and a high-value rule waiting to be written: `Actions`, `Services`, `Data` or DTOs, `Queries`, `Repositories`, `ViewModels`, `Pipelines`, `Support`, `Enums`, `Contracts`, `Observers`, or `Domain` and module roots. Note each one. You will confirm how it is used in Step 2.
25
+
26
+ This app ships a frontend stack, so the frontend checklist group applies. Sweep it.
27
+
28
+ Done when: you have the applicable checklist groups, the dimensions already recorded in `.ai/rules`, and a list of every non-default `app/` directory mapped to the pattern it represents.
29
+
30
+ ### Step 1: Predefined sweep
31
+
32
+ Open `references/checklist.md` and work every applicable dimension using its search hints. Give each exactly one verdict:
33
+
34
+ - Pattern. Clears the bar, rival under ~20% of sites, and reflects a real choice (passes the decisions-not-defaults test). A recording candidate. Cite 2 to 3 example files.
35
+ - Conflict. Both styles present in meaningful numbers. Report the split with counts and example files. Never record a preferred winner while the code remains mixed, even in yolo, because that would describe an aspiration rather than reality. Record only if the user identifies a stable path or context boundary that explains both styles; otherwise defer until the code is reconciled.
36
+ - Default. Consistent, but a framework or common-practice default the agent already writes unprompted. Skip it as a no-op, not a convention.
37
+ - No signal. Under the bar: feature unused, or too few examples. Skip silently (one summary line at most).
38
+ - Tooling-owned or Already-recorded. Skip per the ground rules.
39
+
40
+ Done when: every applicable dimension carries exactly one of those verdicts.
41
+
42
+ ### Step 2: Open-ended pass
43
+
44
+ First, close out the architecture map from Step 0. For every non-default `app/` directory you listed, confirm how the pattern is used and apply the same evidence and decisions-not-defaults tests as Step 1. Generator-standard or sparsely used directories such as `Rules`, `Observers`, `Mail`, and `Notifications` are signals to inspect, not automatic conventions. Make genuine structural patterns candidates: Action classes invoked via `handle` / `execute` / `__invoke`, Services constructor-injected, `Queries` objects exposing `builder(): Builder`, DTOs as readonly classes or spatie/laravel-data, module or domain folders as the unit of organization. Scope each qualifying pattern to its own directory glob. Also record a consistent deliberate absence, such as "no repository layer, controllers query Eloquent directly", so the next agent matches the app's altitude.
45
+
46
+ Then find what else makes this codebase itself: base or abstract classes most code extends, traits used everywhere, tenancy or authorization scoping woven through queries, naming schemes, and custom helpers. Same evidence bar, cite files. Record every genuine structural pattern, and cap the other house findings at ~5 so the pass stays high-signal.
47
+
48
+ Done when: every non-default `app/` directory from Step 0 has a verdict, and the pass has produced its cited house findings (or concluded there are none).
49
+
50
+ ### Step 3: Confirm
51
+
52
+ Present every candidate in one batch. Per item: dimension, verdict, evidence (counts and files), and the exact proposed `glob` or `globs` / `title` / `note`. Conflicts are presented as questions about an existing context boundary or deferred cleanup, not as a choice of future style.
53
+
54
+ Default mode is confirm: record only what the user approves. Switch to yolo only when the invocation said so ("yolo", "don't ask", "just record them"), then record all pattern candidates without asking. Conflicts still go to the user in yolo.
55
+
56
+ Done when: every candidate is approved, rejected, or (conflicts) decided.
57
+
58
+ ### Step 4: Record
59
+
60
+ Make one `record-rule` call for each glob an approved convention applies to. Choose the most specific globs that cover the cited evidence from the mapping table below; if a convention spans models and migrations, record it under both domains so agents discover it from either path. The `note` is the bare convention: strip every trace of detection (see the ground rule). If `record-rule` is unavailable (rules disabled), report the full rule text so the user can enable `BOOST_RULES_ENABLED` or add it by hand.
61
+
62
+ Record this:
63
+
64
+ > Accessors and mutators: use the legacy magic-method style (`getXxxAttribute()` / `setXxxAttribute()`), not the `Attribute` class. Match it in models.
65
+
66
+ Not this:
67
+
68
+ > Accessors/mutators use the legacy magic-method style; the `Attribute`-class style is not used anywhere (13 legacy, 0 Attribute-class), e.g. `app/Models/Post.php`. Match the legacy style in existing models.
69
+
70
+ Done when: every approved item has a successful tool response, and any failure is reported with its rule text.
71
+
72
+ ### Step 5: Summarize
73
+
74
+ List recorded rules (file and title), conflicts the user deferred, notable no-signals, and remind the user to commit `.ai/rules` so their team and agents share the conventions.
75
+
76
+ ## Glob mapping
77
+
78
+ Attach each rule to the most specific path that covers its evidence. Never a lazy `app/**` when a subtree fits. Match the glob to where the code actually lives, which is not the same in a default skeleton and in a modular or DDD layout. Use the Step 0 `app/` map to pick the real path.
79
+
80
+ Examples:
81
+
82
+ - Models: `app/Models/**` in a default app, or `app/Modules/Blog/Models/**` / `src/Domain/Blog/**` in a modular one.
83
+ - Controllers, routing, validation, responses: `app/Http/**`, or `app/Modules/*/Http/**` when each module owns its HTTP layer.
84
+ - Actions, Services, DTOs: `app/Actions/**`, `app/Services/**`, `app/Data/**`, or the module path the app actually uses.
85
+ - Tests: `tests/**`.
86
+ - Migrations and database: `database/migrations/**`.
87
+ - Truly app-wide (rare, e.g. auth retrieval): `app/**`.
88
+
89
+ `record-rule` takes one glob. When a convention genuinely spans two domains (e.g. UUID keys touch models and migrations), call it once per domain with the same title and note; mentioning another path in the note does not make the rule discoverable there.
90
+
91
+ ## Edge cases
92
+
93
+ - Rules disabled or `record-rule` missing: detection is read-only, so Steps 0 to 3 still run, and recording falls back to the manual path in Step 4.
94
+ - Tiny or fresh app: most dimensions land on no-signal. Say so honestly ("not enough code to infer conventions yet") and record nothing.
95
+ - Huge app: each dimension is a bounded grep plus a handful of file reads. Sample representative files, do not read everything.
96
+ - Re-runs: reading `.ai/rules` in Step 0 makes re-runs incremental, so only new or undecided dimensions surface.
97
+ - Non-standard layout (modules, DDD): the open-ended pass catches the layout itself as convention #1. Adapt the globs in the mapping table to the observed paths.
@@ -1,16 +1,8 @@
1
- ---
2
- name: pest-testing
3
- description: "Use this skill for Pest PHP testing in Laravel projects only. Trigger whenever any test is being written, edited, fixed, or refactored — including fixing tests that broke after a code change, adding assertions, converting PHPUnit to Pest, adding datasets, and TDD workflows. Always activate when the user asks how to write something in Pest, mentions test files or directories (tests/Feature, tests/Unit, tests/Browser), or needs browser testing, smoke testing multiple pages for JS errors, or architecture tests. Covers: test()/it()/expect() syntax, datasets, mocking, browser testing (visit/click/fill), smoke testing, arch(), Livewire component tests, RefreshDatabase, and all Pest 4 features. Do not use for factories, seeders, migrations, controllers, models, or non-test PHP code."
4
- license: MIT
5
- metadata:
6
- author: laravel
7
- ---
8
-
9
- # Pest Testing 4
1
+ # Pest Testing 5
10
2
 
11
3
  ## Documentation
12
4
 
13
- Use `search-docs` for detailed Pest 4 patterns and documentation.
5
+ Use `search-docs` for detailed Pest 5 patterns and documentation.
14
6
 
15
7
  ## Basic Usage
16
8
 
@@ -46,6 +38,7 @@ it('is true', function () {
46
38
  - Run minimal tests with filter before finalizing: `php artisan test --compact --filter=testName`.
47
39
  - Run all tests: `php artisan test --compact`.
48
40
  - Run file: `php artisan test --compact tests/Feature/ExampleTest.php`.
41
+ - Run only tests affected by recent changes (Tia): `./vendor/bin/pest --parallel --tia`.
49
42
 
50
43
  ## Assertions
51
44
 
@@ -82,16 +75,58 @@ it('has emails', function (string $email) {
82
75
  ]);
83
76
  ```
84
77
 
85
- ## Pest 4 Features
78
+ ## Pest 5 Features
86
79
 
87
80
  | Feature | Purpose |
88
81
  |---------|---------|
82
+ | Tia (Test Impact Analysis) | Rerun only tests affected by recent changes |
83
+ | Time-Balanced Sharding | Split tests across CI shards by execution time |
84
+ | New Validation Expectations | `toBeEmail()`, `toBeUlid()`, `toBeIpAddress()`, and more |
89
85
  | Browser Testing | Full integration tests in real browsers |
90
86
  | Smoke Testing | Validate multiple pages quickly |
91
87
  | Visual Regression | Compare screenshots for visual changes |
92
- | Test Sharding | Parallel CI runs |
93
88
  | Architecture Testing | Enforce code conventions |
94
89
 
90
+ ### Tia (Test Impact Analysis)
91
+
92
+ Tia reruns only tests affected by recent changes and replays cached results for the rest, dramatically reducing suite duration:
93
+
94
+ <!-- Tia Example -->
95
+ ```shell
96
+ ./vendor/bin/pest --parallel --tia
97
+ ```
98
+
99
+ - Replayed tests are not skipped — cached tests store everything they produced, including covered lines and branches.
100
+ - Detects Laravel, Symfony, Livewire, and Inertia automatically.
101
+
102
+ ### New Validation Expectations
103
+
104
+ Pest 5 ships eight new validation matchers, all supporting `.not` negation:
105
+
106
+ <!-- Pest 5 Validation Expectations -->
107
+ ```php
108
+ expect('nuno@pestphp.com')->toBeEmail();
109
+ expect('01ARZ3NDEKTSV4RRFFQ69G5FAV')->toBeUlid();
110
+ expect('192.168.1.1')->toBeIpAddress();
111
+ expect('00:1a:2b:3c:4d:5e')->toBeMacAddress();
112
+ expect('example.com')->toBeHostname();
113
+ expect('example.co.uk')->toBeDomain();
114
+ expect('Zm9vYmFy')->toBeBase64();
115
+ expect('deadbeef')->toBeHexadecimal();
116
+ ```
117
+
118
+ ### Time-Balanced Sharding
119
+
120
+ Distribute tests across CI shards by execution time rather than count:
121
+
122
+ <!-- Pest Sharding Example -->
123
+ ```shell
124
+ ./vendor/bin/pest --update-shards
125
+ ./vendor/bin/pest --shard=1/4
126
+ ```
127
+
128
+ Commit `tests/.pest/shards.json` to the repository so CI shards stay consistent.
129
+
95
130
  ### Browser Test Example
96
131
 
97
132
  Browser tests run in real browsers for full integration testing:
@@ -140,14 +175,8 @@ $pages->assertNoJavaScriptErrors()->assertNoConsoleLogs();
140
175
 
141
176
  Capture and compare screenshots to detect visual changes.
142
177
 
143
- ### Test Sharding
144
-
145
- Split tests across parallel processes for faster CI runs.
146
-
147
178
  ### Architecture Testing
148
179
 
149
- Pest 4 includes architecture testing (from Pest 3):
150
-
151
180
  <!-- Architecture Test Example -->
152
181
  ```php
153
182
  arch('controllers')
@@ -90,7 +90,7 @@ Correct:
90
90
 
91
91
  ## CSRF Protection
92
92
 
93
- Include `@csrf` in all POST/PUT/DELETE Blade forms. In Inertia apps, the `@csrf` directive is automatically applied.
93
+ Include `@csrf` in all POST/PUT/DELETE Blade forms. Inertia doesn't use `@csrf`; its HTTP client sends the `XSRF-TOKEN` cookie back as the `X-XSRF-TOKEN` header, which Laravel accepts in place of the `_token` field.
94
94
 
95
95
  Incorrect:
96
96
  ```blade
@@ -44,7 +44,7 @@ Strings — use `Str` and fluent `Str::of()` over raw PHP:
44
44
  // Incorrect
45
45
  $slug = strtolower(str_replace(' ', '-', $title));
46
46
  $short = substr($text, 0, 100) . '...';
47
- $class = substr(strrchr('App\Models\User', '\'), 1);
47
+ $class = substr(strrchr('App\Models\User', '\\'), 1);
48
48
 
49
49
  // Correct
50
50
  $slug = Str::slug($title);
@@ -1,4 +1,3 @@
1
-
2
1
  # Tailwind CSS Development
3
2
 
4
3
  ## Documentation
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mohammadhprp/system-prompt",
3
- "version": "0.12.2",
3
+ "version": "0.12.3",
4
4
  "description": "AI Coding Agent Framework — interactive bootstrap CLI",
5
5
  "keywords": [
6
6
  "ai",
package/src/catalog.js CHANGED
@@ -6,34 +6,23 @@ export const categories = {
6
6
  items: [
7
7
  { id: 'agent-browser', name: 'Agent Browser', description: 'Automate browser and Electron workflows for navigation, testing, screenshots, and data extraction' },
8
8
  { id: 'backend-best-practices', name: 'Backend Best Practices', description: 'Consolidated backend engineering practices across API, data, security, testing, and operations' },
9
- { id: 'brainstorming', name: 'Brainstorming', description: 'Turn ideas into fully formed designs through dialogue' },
10
- { id: 'code-review', name: 'Code Review', description: 'Review backend changes for correctness and maintainability' },
11
- { id: 'codenavi', name: 'CodeNavi', description: 'Navigate unknown codebases with precision, a persistent .notebook knowledge base, and surgical implementation' },
12
- { id: 'create-adr', name: 'Create ADR', description: 'Create Architecture Decision Records documenting significant architectural choices and rationale' },
13
- { id: 'design', name: 'Design Like Damien', description: 'Premium UI design philosophy and Lovable prompting' },
14
9
  { id: 'diagram-design', name: 'Diagram Design', description: 'Create technical and product diagrams as standalone HTML with inline SVG' },
15
10
  { id: 'docs-writer', name: 'Docs Writer', description: 'Write, review, and edit documentation files with consistent structure, tone, and technical accuracy' },
16
11
  { id: 'effective-html', name: 'Effective HTML', description: 'Create self-contained HTML artifacts with routed guidance for design, wireframes, prototypes, plans, and diagrams' },
17
12
  { id: 'find-skills', name: 'Find Skills', description: 'Discover, evaluate, and install agent skills for specialized tasks' },
18
13
  { id: 'frontend-design', name: 'Frontend Design', description: 'Distinctive, intentional visual design for new UI or reshaping existing UI' },
19
14
  { id: 'glab', name: 'Glab', description: 'Work with GitLab via the glab CLI for MRs, issues, and pipelines' },
20
- { id: 'great-interface', name: 'Great Interface', description: 'Build, explain, review, and refine product interfaces across accessibility, layout, writing, typography, color, and UI polish' },
21
15
  { id: 'humanizer', name: 'Humanizer', description: 'Remove signs of AI-generated writing to make text sound more natural and human' },
22
16
  { id: 'improve', name: 'Improve', description: 'Audit repositories and produce prioritized, read-only implementation plans for another agent' },
23
17
  { id: 'jira-cli', name: 'Jira CLI', description: 'Work with Jira via the jira CLI for issues, sprints, and epics' },
24
18
  { id: 'laravel-best-practices', name: 'Laravel Best Practices', description: 'Laravel patterns for Eloquent, validation, testing' },
25
- { id: 'learning-opportunities', name: 'Learning Opportunities', description: 'Facilitate deliberate skill development during AI-assisted coding with short, interactive exercises' },
26
- { id: 'notion-mcp', name: 'Notion MCP', description: 'Work with Notion MCP for pages, databases, search' },
27
19
  { id: 'perf-web-optimization', name: 'Web Performance Optimization', description: 'Optimize web performance: bundle size, images, caching, lazy loading, and overall page speed' },
28
20
  { id: 'security-best-practices', name: 'Security Best Practices', description: 'Language and framework specific security best-practice reviews and secure-by-default coding help' },
29
21
  { id: 'sentry', name: 'Sentry', description: 'Inspect Sentry issues, summarize production errors, and pull health data via the Sentry API' },
30
22
  { id: 'show-me', name: 'Show Me', description: 'Explain the current topic visually with diagrams, code-shape sketches, and focused HTML artifacts' },
31
23
  { id: 'skill-creator', name: 'Skill Creator', description: 'Create and evaluate new agent skills' },
32
- { id: 'spec-driven-eval', name: 'Spec-Driven Eval', description: 'Score how completely an implementation fulfills a PRD/spec, case by case, into a single comparable grade' },
33
- { id: 'technical-design-doc-creator', name: 'Technical Design Doc Creator', description: 'Create comprehensive Technical Design Documents with mandatory and optional sections through interactive discovery' },
34
24
  { id: 'taste', name: 'Taste', description: 'Unified design-quality skill spanning anti-slop frontend, image generation and image-to-code, brand kits, minimalist and industrial UI, and Google Stitch design systems' },
35
- { id: 'tlc-spec-driven', name: 'TLC Spec-Driven', description: 'Feature planning and implementation with adaptive phases, EARS testable requirements, atomic commits, and independent verification' },
36
- { id: 'web-design-guidelines', name: 'Web Design Guidelines', description: 'Review UI code for Web Interface Guidelines compliance: accessibility, interaction patterns, and design best practices' }
25
+ { id: 'tlc-spec-driven', name: 'TLC Spec-Driven', description: 'Feature planning and implementation with adaptive phases, EARS testable requirements, atomic commits, and independent verification' }
37
26
  ],
38
27
  },
39
28
 
@@ -72,7 +61,6 @@ export const categories = {
72
61
  { id: 'excalidraw', name: 'Excalidraw MCP', description: 'Stream hand-drawn diagrams with interactive editing' },
73
62
  { id: 'figma-mcp-go', name: 'Figma MCP Go', description: 'Read/write access to Figma designs via plugin bridge' },
74
63
  { id: 'laravel-boost', name: 'Laravel Boost MCP', description: 'Laravel application context and ecosystem docs' },
75
- { id: 'notion-mcp', name: 'Notion MCP', description: 'Search, read, and write Notion content' },
76
64
  { id: 'playwright-mcp', name: 'Playwright MCP', description: 'Cross-browser automation with accessibility snapshots' },
77
65
  { id: 'supabase-mcp', name: 'Supabase MCP', description: 'Manage Supabase projects, SQL, Edge Functions, Auth, Storage, and Realtime' },
78
66
  ],
@@ -1,57 +0,0 @@
1
- # Notion MCP
2
-
3
- ## Overview
4
-
5
- Notion MCP is a hosted, officially maintained MCP server by Notion that lets AI agents search, read, and write content in a Notion workspace. It uses OAuth authentication and communicates over Streamable HTTP — no API tokens or local infrastructure required.
6
-
7
- Official source:
8
-
9
- - [Notion MCP get-started guide](https://developers.notion.com/guides/mcp/get-started-with-mcp)
10
- - [Tool reference](https://developers.notion.com/guides/mcp/mcp-supported-tools)
11
- - [GitHub: makenotion/notion-mcp-server](https://github.com/makenotion/notion-mcp-server) (open-source server, no longer actively maintained)
12
-
13
- ## Features
14
-
15
- - Search across Notion workspace and connected tools (Slack, Google Drive, Jira).
16
- - Fetch page and database content by URL or ID.
17
- - Create, update, move, and duplicate pages.
18
- - Create and update databases, data sources, and views (table, board, list, calendar, timeline, gallery, form, chart, map, dashboard).
19
- - Query databases with SQL or using pre-defined views.
20
- - Query meeting notes for the current user.
21
- - Add and list comments and discussions.
22
- - Get workspace teams and users.
23
- - Async support for long-running create and update operations.
24
- - OAuth authentication — no manual token management.
25
-
26
- ## Supported AI Clients
27
-
28
- Notion MCP officially documents setup for Claude Code, Cursor, VS Code (GitHub Copilot), Claude Desktop, Windsurf, ChatGPT, Codex, and Antigravity.
29
-
30
- - OpenCode
31
-
32
- ## When to Use
33
-
34
- Use Notion MCP when an AI coding agent needs to read or write content in a Notion workspace.
35
-
36
- Good fits:
37
-
38
- - Creating project documentation pages from code context.
39
- - Searching for existing notes, specs, or meeting notes.
40
- - Updating task statuses, tracking work, or filing bugs.
41
- - Querying databases for structured data.
42
- - Managing comments and discussions on pages.
43
- - Fetching user and team information from the workspace.
44
-
45
- Avoid using it for fully automated or headless workflows — Notion MCP requires interactive OAuth authentication.
46
-
47
- ## Requirements
48
-
49
- - A Notion workspace with appropriate permissions.
50
- - An MCP-compatible AI client that supports remote HTTP (Streamable HTTP or SSE) MCP servers.
51
- - For some tools (search, query, meeting notes): a Business plan or higher with Notion AI.
52
-
53
- ## Related Skills
54
-
55
- Relevant skills in this repository:
56
-
57
- - [`backend-best-practices`](../../skills/backend-best-practices/SKILL.md): backend best practices for API design, testing, and debugging.
@@ -1,118 +0,0 @@
1
- # Notion MCP Capabilities
2
-
3
- ## What It Can Do
4
-
5
- 18 tools for searching, reading, and writing content in a Notion workspace.
6
-
7
- ### Search & Fetch
8
-
9
- | Tool | Description |
10
- | --- | --- |
11
- | `notion-search` | Search across workspace and connected tools (Slack, Drive, Jira); requires Notion AI for cross-tool search |
12
- | `notion-fetch` | Fetch content from a page, database, or data source by URL or ID; pass `self` to get workspace and user identity |
13
-
14
- ### Create
15
-
16
- | Tool | Description |
17
- | --- | --- |
18
- | `notion-create-pages` | Create one or more pages with properties, content, icons, and covers; supports database templates and async mode |
19
- | `notion-create-database` | Create a new database with specified properties, initial data source, and initial view |
20
- | `notion-create-view` | Create a view on a database (table, board, list, calendar, timeline, gallery, form, chart, map, dashboard) |
21
- | `notion-create-comment` | Add a comment to a page, block-level content, or reply to an existing discussion |
22
-
23
- ### Update
24
-
25
- | Tool | Description |
26
- | --- | --- |
27
- | `notion-update-page` | Update page properties, content, icon, or cover; supports database templates and async mode |
28
- | `notion-update-data-source` | Update a data source's properties, name, description |
29
- | `notion-update-view` | Update a view's name, filters, sorts, display configuration |
30
-
31
- ### Move & Duplicate
32
-
33
- | Tool | Description |
34
- | --- | --- |
35
- | `notion-move-pages` | Move one or more pages or databases to a new parent |
36
- | `notion-duplicate-page` | Duplicate a page within the workspace (async) |
37
-
38
- ### Query
39
-
40
- | Tool | Description |
41
- | --- | --- |
42
- | `notion-query-data-sources` | Query data sources with SQL across multiple databases; requires Business plan or higher with Notion AI |
43
- | `notion-query-database-view` | Query a database using a pre-defined view's filters and sorts; requires Business plan or higher with Notion AI |
44
- | `notion-query-meeting-notes` | Query the current user's meeting notes; requires Business plan or higher with Notion AI |
45
-
46
- ### Comments
47
-
48
- | Tool | Description |
49
- | --- | --- |
50
- | `notion-get-comments` | List all comments and discussions on a page, including resolved threads |
51
-
52
- ### Workspace
53
-
54
- | Tool | Description |
55
- | --- | --- |
56
- | `notion-get-teams` | List teams (teamspaces) in the current workspace |
57
- | `notion-get-users` | List workspace members and guests with search by name or email; pass `self` for current user |
58
-
59
- ### Async Tasks
60
-
61
- | Tool | Description |
62
- | --- | --- |
63
- | `notion-get-async-task` | Check the status of an async task (duplicate, large create/update) |
64
-
65
- ### OpenAI Client Note
66
-
67
- When connecting from an OpenAI-based client (ChatGPT), `notion-fetch` and `notion-search` appear without the `notion-` prefix as `fetch` and `search`.
68
-
69
- ## What It Cannot Do
70
-
71
- - It cannot work without interactive OAuth authentication — no PAT or bearer token support.
72
- - It cannot upload images or file attachments (on the roadmap).
73
- - It cannot access Notion content outside the authenticated user's permissions.
74
- - Some tools require a Business plan or higher with Notion AI (search, query tools).
75
- - It cannot operate fully headless or automated — a human must complete the OAuth flow.
76
- - It cannot be self-hosted (use the deprecated open-source server for that).
77
-
78
- ## Best Practices
79
-
80
- - Use `notion-fetch` with `self` to verify the workspace and user identity after connecting.
81
- - Use `notion-fetch` with a page URL to understand its structure before making changes.
82
- - Use `notion-search` first to find relevant pages, then `notion-fetch` to read details.
83
- - Use `allow_async: true` for large page create/update operations, then poll with `notion-get-async-task`.
84
- - Fetch a database first to see available templates before creating pages with them.
85
- - Use `notion-get-users` to look up user IDs before assigning or mentioning users.
86
- - Stay within rate limits: 180 requests/min average (shared across all tools), 30 requests/min for search.
87
-
88
- ## Common Workflows
89
-
90
- ### Search and read content
91
-
92
- 1. Call `notion-search` to find pages matching a topic.
93
- 2. Call `notion-fetch` with a page URL to read its full content.
94
- 3. Call `notion-get-comments` to see discussions on the page.
95
-
96
- ### Create a page from a template
97
-
98
- 1. Call `notion-fetch` on a database to see available templates.
99
- 2. Call `notion-create-pages` with the template reference and desired properties.
100
- 3. Optionally set an icon and cover image.
101
-
102
- ### Update a task status
103
-
104
- 1. Call `notion-fetch` with the page URL to get the current properties.
105
- 2. Call `notion-update-page` to change the status property.
106
- 3. Call `notion-create-comment` to leave a note about the change.
107
-
108
- ### Query a database
109
-
110
- 1. Call `notion-fetch` on the database URL to see its schema and views.
111
- 2. Call `notion-query-database-view` with a view name to get filtered results.
112
- 3. Or call `notion-query-data-sources` with SQL for custom queries.
113
-
114
- ### Duplicate and populate a template
115
-
116
- 1. Call `notion-duplicate-page` on a template page.
117
- 2. Poll with `notion-get-async-task` until complete.
118
- 3. Call `notion-update-page` on the new copy to fill in properties.
@@ -1,9 +0,0 @@
1
- {
2
- "mcp": {
3
- "notion": {
4
- "type": "remote",
5
- "enabled": true,
6
- "url": "https://mcp.notion.com/mcp"
7
- }
8
- }
9
- }