personal memory agent
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(activities): add --entity filter to list subcommand

Use a simple case-insensitive substring match against active_entities because there is no existing CLI entity-filter precedent in-tree.

+55
+15
apps/activities/call.py
··· 130 130 days: list[str], 131 131 *, 132 132 activity: str | None, 133 + entity: str | None, 133 134 include_hidden: bool, 134 135 ) -> list[dict[str, Any]]: 135 136 matches: list[dict[str, Any]] = [] 137 + entity_query = entity.lower() if entity else None 136 138 for facet_name in facets: 137 139 for day in days: 138 140 for record in load_activity_records( ··· 140 142 ): 141 143 if activity and record.get("activity") != activity: 142 144 continue 145 + if entity_query: 146 + active_entities = record.get("active_entities", []) 147 + if not any( 148 + entity_query in str(active_entity).lower() 149 + for active_entity in active_entities 150 + ): 151 + continue 143 152 enriched = dict(record) 144 153 enriched["facet"] = facet_name 145 154 enriched["day"] = day ··· 186 195 "-a", 187 196 help="Filter by activity type.", 188 197 ), 198 + entity: str | None = typer.Option( 199 + None, 200 + "--entity", 201 + help="Filter by active entity.", 202 + ), 189 203 include_all: bool = typer.Option( 190 204 False, 191 205 "--all", ··· 212 226 facets, 213 227 resolved_days, 214 228 activity=activity, 229 + entity=entity, 215 230 include_hidden=include_all, 216 231 ) 217 232
+40
apps/activities/tests/test_call.py
··· 69 69 assert any(item["hidden"] for item in payload) 70 70 71 71 72 + def test_list_filters_by_entity(activities_env): 73 + activities_env( 74 + [ 75 + { 76 + "id": "coding_090000_300", 77 + "activity": "coding", 78 + "description": "Entity match", 79 + "segments": ["090000_300"], 80 + "created_at": 1, 81 + "active_entities": ["Ada Lovelace"], 82 + }, 83 + { 84 + "id": "meeting_100000_300", 85 + "activity": "meeting", 86 + "description": "Different entity", 87 + "segments": ["100000_300"], 88 + "created_at": 2, 89 + "active_entities": ["Grace Hopper"], 90 + }, 91 + ] 92 + ) 93 + 94 + result = runner.invoke( 95 + call_app, 96 + [ 97 + "activities", 98 + "list", 99 + "--facet", 100 + "work", 101 + "--entity", 102 + "lovel", 103 + "--json", 104 + ], 105 + ) 106 + 107 + assert result.exit_code == 0 108 + payload = json.loads(result.output) 109 + assert [item["id"] for item in payload] == ["coding_090000_300"] 110 + 111 + 72 112 def test_get_returns_hidden_record_with_json_output(activities_env): 73 113 activities_env( 74 114 [