Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add rules/jrpribs/smarterstarter/700-angular-routinggit clone --depth 1 https://github.com/JrPribs/SmarterStarterWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/rules/jrpribs/smarterstarter/700-angular-routing)<a href="https://agentmods.dev/rules/jrpribs/smarterstarter/700-angular-routing"><img src="https://agentmods.dev/badge/rules/jrpribs/smarterstarter/700-angular-routing.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00000 | $0.01762 |
| Opus 5 | $0.00000 | $0.00881 |
| Sonnet 5 | $0.00000 | $0.00352 |
| Haiku 4.5 | $0.00000 | $0.00176 |
Grade A, and why
700-angular-routing scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 3d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 326 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Angular Routing Best Practices
- Standalone Component Routing: Use the standalone component routing APIs.
// app.routes.ts
import { Routes } from '@angular/router';
export const routes: Routes = [
{ path: '', component: HomeComponent },
{ path: 'users', component: UsersComponent },
{ path: 'users/:id', component: UserDetailComponent },
{
path: 'admin',
canActivate: [() => inject(AuthService).isAdmin()],
loadChildren: () => import('./admin/admin.routes').then(m => m.ADMIN_ROUTES)
},
{ path: '**', component: NotFoundComponent }
];
- Lazy Loading: Use lazy loading for feature routes to improve initial load performance.
// In app.routes.ts
{
path: 'products',
loadChildren: () => import('./products/product.routes')
.then(m => m.PRODUCT_ROUTES)
},
// In products/product.routes.ts
export const PRODUCT_ROUTES: Routes = [
{ path: '', component: ProductListComponent },
{ path: ':id', component: ProductDetailComponent }
];
- Component Input Binding: Use component input binding to map route parameters directly to component inputs.
// In app.config.ts
import { provideRouter, withComponentInputBinding } from '@angular/router';
export const appConfig: ApplicationConfig = {
providers: [
provideRouter(routes, withComponentInputBinding())
]
};
// In user-detail.component.ts
@Component({
selector: 'app-user-detail',
standalone: true,
template: '...'
})
export class UserDetailComponent {
// This will automatically receive the value from route parameter 'id'
id = input<string>('');
user = signal<User | null>(null);
constructor(private userService: UserService) {
effect(() => {
const userId = this.id();
if (userId) {
this.loadUser(userId);
}
});
}
private loadUser(id: string): void {
this.userService.getUser(id).subscribe(user => {
this.user.set(user);
});
}
}
- Route Guards: Use functional route guards instead of class-based guards when possible.
// auth.guard.ts
import { inject } from '@angular/core';
import { Router } from '@angular/router';
import { AuthService } from './auth.service';
export const authGuard = () => {
const authService = inject(AuthService);
const router = inject(Router);
if (authService.isLoggedIn()) {
return true;
}
// Redirect to login page with return url
return router.parseUrl('/login?returnUrl=' + router.url);
};
// Usage in routes
{
path: 'profile',
component: ProfileComponent,
canActivate: [authGuard]
}
- Route Resolvers: Use route resolvers to pre-fetch data before activating a route.
// products.resolver.ts
import { inject } from '@angular/core';
import { ResolveFn } from '@angular/router';
import { ProductService } from './product.service';
import { Product } from './product.model';
export const productsResolver: ResolveFn<Product[]> = () => {
return inject(ProductService).getProducts();
};
// In routes
{
path: 'products',
component: ProductListComponent,
resolve: { products: productsResolver }
}
// In component
export class ProductListComponent {
products = input<Product[]>([]);
// With component input binding enabled, the resolver data is automatically
// bound to the input above
}
- Route Data: Use route data for static configuration.
{
path: 'about',
component: AboutComponent,
data: {
title: 'About Us',
breadcrumb: 'About',
animation: 'AboutPage'
}
}
// In component
export class AboutComponent {
// With component input binding enabled
title = input<string>('');
breadcrumb = input<string>('');
animation = input<string>('');
}
- Route Events: Listen to router events to implement features like loading indicators.
@Component({
selector: 'app-root',
template: `
<app-loading-bar *ngIf="isLoading()"></app-loading-bar>
<router-outlet></router-outlet>
`
})
export class AppComponent implements OnInit {
private router = inject(Router);
isLoading = signal(false);
ngOnInit() {
this.router.events.pipe(
filter(event =>
event instanceof NavigationStart ||
event instanceof NavigationEnd ||
event instanceof NavigationCancel ||
event instanceof NavigationError
)
).subscribe(event => {
if (event instanceof NavigationStart) {
this.isLoading.set(true);
} else {
this.isLoading.set(false);
}
});
}
}
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 3d ago First seen · 326 lines · 0 tokens per session scan A d3ea2b506d6b
700-angular-routing is a cursor rule published in the GitHub repository JrPribs/SmarterStarter (2 stars, last pushed 1y ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 1,762 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other cursor rules, from other repositories
angular-20
This rule provides comprehensive best practices and coding standards for Angular development, focusing on modern TypeScript, standalone components, signals, and performance optimizations.
dev-standard
Apache Superset development standards and guidelines for Cursor IDE.
cli-error-handling
CLI command error handling patterns.
prefer-direct-imports-over-module-mocks
Prefer extracting a testable core over vi.mock / vi.resetModules when unit tests need to reach production logic entangled with config, env, or singletons.
control-plane-descriptors
Control plane descriptor and instance implementation patterns.
family-instance-domain-actions
Family instance domain action implementation patterns.