@@ -15,14 +15,30 @@ export interface HeartbeatResult {
1515
1616export interface HeartbeatOpts {
1717 json ?: boolean ;
18+ /** Override the glob patterns used to discover heartbeat files (relative to
19+ * `config.scaffoldRoot`). Defaults to {@link DEFAULT_HEARTBEAT_PATTERNS}. */
20+ scaffoldPatterns ?: readonly string [ ] ;
1821}
1922
23+ /**
24+ * Default glob patterns used by the heartbeat checker, relative to
25+ * `MexConfig.scaffoldRoot`. NOT a stable contract — mex may add to this list
26+ * between minor versions. Pass `scaffoldPatterns` explicitly when exact
27+ * behavior matters.
28+ */
29+ export const DEFAULT_HEARTBEAT_PATTERNS = [
30+ "ROUTER.md" ,
31+ "AGENTS.md" ,
32+ "context/*.md" ,
33+ "patterns/*.md" ,
34+ ] as const ;
35+
2036const DEFAULT_STALE_DAYS = 7 ;
2137const DEFAULT_MEMORY_CLEANUP_DAYS = 7 ;
2238const DEFAULT_DAILY_MEMORY_RETENTION_DAYS = 14 ;
2339
2440export async function runHeartbeat ( config : MexConfig , opts : HeartbeatOpts = { } ) : Promise < HeartbeatResult > {
25- const result = checkHeartbeat ( config ) ;
41+ const result = checkHeartbeat ( config , new Date ( ) , { scaffoldPatterns : opts . scaffoldPatterns } ) ;
2642 if ( opts . json ) {
2743 console . log ( JSON . stringify ( result , null , 2 ) ) ;
2844 return result ;
@@ -31,12 +47,22 @@ export async function runHeartbeat(config: MexConfig, opts: HeartbeatOpts = {}):
3147 return result ;
3248}
3349
34- export function checkHeartbeat ( config : MexConfig , now = new Date ( ) ) : HeartbeatResult {
50+ export interface CheckHeartbeatOpts {
51+ /** Override the glob patterns used to discover heartbeat files (relative to
52+ * `config.scaffoldRoot`). Defaults to {@link DEFAULT_HEARTBEAT_PATTERNS}. */
53+ scaffoldPatterns ?: readonly string [ ] ;
54+ }
55+
56+ export function checkHeartbeat (
57+ config : MexConfig ,
58+ now = new Date ( ) ,
59+ opts : CheckHeartbeatOpts = { }
60+ ) : HeartbeatResult {
3561 const staleDays = config . heartbeat ?. staleDays ?? DEFAULT_STALE_DAYS ;
3662 const memoryCleanupDays = config . heartbeat ?. memoryCleanupDays ?? DEFAULT_MEMORY_CLEANUP_DAYS ;
3763 const dailyRetentionDays = config . heartbeat ?. dailyMemoryRetentionDays ?? DEFAULT_DAILY_MEMORY_RETENTION_DAYS ;
3864
39- const staleFiles = scaffoldHeartbeatFiles ( config . scaffoldRoot )
65+ const staleFiles = scaffoldHeartbeatFiles ( config . scaffoldRoot , opts . scaffoldPatterns )
4066 . map ( ( file ) => {
4167 const fm = parseFrontmatter ( file ) ;
4268 const days = daysSinceFrontmatterDate (
@@ -60,8 +86,10 @@ export function checkHeartbeat(config: MexConfig, now = new Date()): HeartbeatRe
6086 } ;
6187}
6288
63- function scaffoldHeartbeatFiles ( scaffoldRoot : string ) : string [ ] {
64- const patterns = [ "ROUTER.md" , "AGENTS.md" , "context/*.md" , "patterns/*.md" ] ;
89+ function scaffoldHeartbeatFiles (
90+ scaffoldRoot : string ,
91+ patterns : readonly string [ ] = DEFAULT_HEARTBEAT_PATTERNS ,
92+ ) : string [ ] {
6593 return patterns . flatMap ( ( pattern ) =>
6694 globSync ( pattern , {
6795 cwd : scaffoldRoot ,
0 commit comments