Commit d0156e05fd
Unsigned
Layout: unified · split
Hutch.xcodeproj/project.pbxproj +12 −12
| @@ -597,7 +597,7 @@ | ||
| 597 | 597 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; |
| 598 | 598 | CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements; |
| 599 | 599 | CODE_SIGN_STYLE = Automatic; |
| 600 | CURRENT_PROJECT_VERSION = 93; | |
| 600 | CURRENT_PROJECT_VERSION = 94; | |
| 601 | 601 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 602 | 602 | ENABLE_PREVIEWS = YES; |
| 603 | 603 | GENERATE_INFOPLIST_FILE = YES; |
| @@ -614,7 +614,7 @@ | ||
| 614 | 614 | "$(inherited)", |
| 615 | 615 | "@executable_path/Frameworks", |
| 616 | 616 | ); |
| 617 | MARKETING_VERSION = 3.8.5; | |
| 617 | MARKETING_VERSION = 3.9.0; | |
| 618 | 618 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch; |
| 619 | 619 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 620 | 620 | STRING_CATALOG_GENERATE_SYMBOLS = YES; |
| @@ -634,7 +634,7 @@ | ||
| 634 | 634 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; |
| 635 | 635 | CODE_SIGN_ENTITLEMENTS = Hutch/Hutch.entitlements; |
| 636 | 636 | CODE_SIGN_STYLE = Automatic; |
| 637 | CURRENT_PROJECT_VERSION = 93; | |
| 637 | CURRENT_PROJECT_VERSION = 94; | |
| 638 | 638 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 639 | 639 | ENABLE_PREVIEWS = YES; |
| 640 | 640 | GENERATE_INFOPLIST_FILE = YES; |
| @@ -651,7 +651,7 @@ | ||
| 651 | 651 | "$(inherited)", |
| 652 | 652 | "@executable_path/Frameworks", |
| 653 | 653 | ); |
| 654 | MARKETING_VERSION = 3.8.5; | |
| 654 | MARKETING_VERSION = 3.9.0; | |
| 655 | 655 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch; |
| 656 | 656 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 657 | 657 | STRING_CATALOG_GENERATE_SYMBOLS = YES; |
| @@ -714,7 +714,7 @@ | ||
| 714 | 714 | APPLICATION_EXTENSION_API_ONLY = YES; |
| 715 | 715 | CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements; |
| 716 | 716 | CODE_SIGN_STYLE = Automatic; |
| 717 | CURRENT_PROJECT_VERSION = 93; | |
| 717 | CURRENT_PROJECT_VERSION = 94; | |
| 718 | 718 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 719 | 719 | GENERATE_INFOPLIST_FILE = NO; |
| 720 | 720 | INFOPLIST_FILE = HutchWidgetExtension/Info.plist; |
| @@ -724,7 +724,7 @@ | ||
| 724 | 724 | "@executable_path/Frameworks", |
| 725 | 725 | "@executable_path/../../Frameworks", |
| 726 | 726 | ); |
| 727 | MARKETING_VERSION = 3.8.5; | |
| 727 | MARKETING_VERSION = 3.9.0; | |
| 728 | 728 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension; |
| 729 | 729 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 730 | 730 | SKIP_INSTALL = YES; |
| @@ -743,7 +743,7 @@ | ||
| 743 | 743 | APPLICATION_EXTENSION_API_ONLY = YES; |
| 744 | 744 | CODE_SIGN_ENTITLEMENTS = HutchWidgetExtension/HutchWidgetExtension.entitlements; |
| 745 | 745 | CODE_SIGN_STYLE = Automatic; |
| 746 | CURRENT_PROJECT_VERSION = 93; | |
| 746 | CURRENT_PROJECT_VERSION = 94; | |
| 747 | 747 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 748 | 748 | GENERATE_INFOPLIST_FILE = NO; |
| 749 | 749 | INFOPLIST_FILE = HutchWidgetExtension/Info.plist; |
| @@ -753,7 +753,7 @@ | ||
| 753 | 753 | "@executable_path/Frameworks", |
| 754 | 754 | "@executable_path/../../Frameworks", |
| 755 | 755 | ); |
| 756 | MARKETING_VERSION = 3.8.5; | |
| 756 | MARKETING_VERSION = 3.9.0; | |
| 757 | 757 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchWidgetExtension; |
| 758 | 758 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 759 | 759 | SKIP_INSTALL = YES; |
| @@ -772,7 +772,7 @@ | ||
| 772 | 772 | APPLICATION_EXTENSION_API_ONLY = YES; |
| 773 | 773 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
| 774 | 774 | CODE_SIGN_STYLE = Automatic; |
| 775 | CURRENT_PROJECT_VERSION = 93; | |
| 775 | CURRENT_PROJECT_VERSION = 94; | |
| 776 | 776 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 777 | 777 | GENERATE_INFOPLIST_FILE = NO; |
| 778 | 778 | INFOPLIST_FILE = HutchSafariExtension/Info.plist; |
| @@ -782,7 +782,7 @@ | ||
| 782 | 782 | "@executable_path/Frameworks", |
| 783 | 783 | "@executable_path/../../Frameworks", |
| 784 | 784 | ); |
| 785 | MARKETING_VERSION = 3.8.5; | |
| 785 | MARKETING_VERSION = 3.9.0; | |
| 786 | 786 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchSafariExtension; |
| 787 | 787 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 788 | 788 | SKIP_INSTALL = YES; |
| @@ -801,7 +801,7 @@ | ||
| 801 | 801 | APPLICATION_EXTENSION_API_ONLY = YES; |
| 802 | 802 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; |
| 803 | 803 | CODE_SIGN_STYLE = Automatic; |
| 804 | CURRENT_PROJECT_VERSION = 93; | |
| 804 | CURRENT_PROJECT_VERSION = 94; | |
| 805 | 805 | DEVELOPMENT_TEAM = ZCNAX3VL9D; |
| 806 | 806 | GENERATE_INFOPLIST_FILE = NO; |
| 807 | 807 | INFOPLIST_FILE = HutchSafariExtension/Info.plist; |
| @@ -811,7 +811,7 @@ | ||
| 811 | 811 | "@executable_path/Frameworks", |
| 812 | 812 | "@executable_path/../../Frameworks", |
| 813 | 813 | ); |
| 814 | MARKETING_VERSION = 3.8.5; | |
| 814 | MARKETING_VERSION = 3.9.0; | |
| 815 | 815 | PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.Hutch.HutchSafariExtension; |
| 816 | 816 | PRODUCT_NAME = "$(TARGET_NAME)"; |
| 817 | 817 | SKIP_INSTALL = YES; |
ROADMAP.txt +41 −26
| @@ -143,17 +143,19 @@ so "breaking change" does not apply. These buckets track *user-visible scale*. | ||
| 143 | 143 | | --- | --- | --- | |
| 144 | 144 | | v3.8.1 | SonarCloud triage; housekeeping | No behaviour change at all | |
| 145 | 145 | | v3.8.2 | Home system status moved to a title-bar status badge | Small UI relocation, no new surface | |
| 146 | | v3.9.0 | "What's cooking" ingest; doc truth-up; deploy keys | Ships one feature, corrects the map | | |
| 147 | | v3.10.0 | hub.sr.ht writes: projects, discovery, `mailingListSubscribe` | Provisional — gated on what v3.9.0 finds | | |
| 146 | | v3.9.0 | ~~hub.sr.ht project writes + discovery (#12–#15); multi-language highlighting (#16); App Intents expansion (#17); man-page catalog sync (#7); checklist / recent-activity / pull-to-refresh fixes (#18, #11, #9)~~ | Shipped — the cut this session | | |
| 147 | | v3.10.0 | "What's cooking" ingest; doc truth-up; deploy keys; revisit `mailingListSubscribe` | Ships one feature, corrects the map | | |
| 148 | 148 | | v3.11.0 | Accessibility | Independent, device-verified | |
| 149 | 149 | | v4.0.0 | Localization *with* translations | The only true re-presentation | |
| 150 | 150 | | — | Swift 6 language mode; cache reads | Internal; ride along, no tag | |
| 151 | 151 | |
| 152 | Ordering is by dependency, not size. v3.9.0 leads because it is the only item | |
| 153 | that corrects the others' inputs: the ingest's real output is a `SCOPE.txt` that | |
| 154 | is true, and v3.10.0 rests entirely on one unverified sentence in a blog post. | |
| 155 | Do not commit v3.10.0's number until the SDL has been read — the bucket may turn | |
| 156 | out to be empty, which is the point of sequencing it second. | |
| 152 | 3.9.0 was cut this session, bundling the hub.sr.ht writes with the other | |
| 153 | features listed. That reorders the original plan: the "What's cooking" ingest | |
| 154 | and deploy keys — once slated for 3.9.0 — move to 3.10.0, and the hub.sr.ht | |
| 155 | writes that were provisionally 3.10.0 landed early, because the SDL, once | |
| 156 | actually read, turned out to have the mutations (it was not the empty bucket the | |
| 157 | sequencing had guarded against). The ingest still leads 3.10.0: its real output | |
| 158 | is a `SCOPE.txt` that is true. | |
| 157 | 159 | |
| 158 | 160 | `KeychainHelper` is deliberately unbucketed; see the SonarCloud hotspots below. |
| 159 | 161 | |
| @@ -290,10 +292,11 @@ and it has been discouraging work that is in fact already done. | ||
| 290 | 292 | flags two openings: |
| 291 | 293 | |
| 292 | 294 | - **hub.sr.ht gained a writable GraphQL API** for managing projects and project |
| 293 | resources. Hutch's projects are read-only, and `SCOPE.txt` still rules out | |
| 294 | discovery on the grounds that hub has no public API. Both claims need | |
| 295 | rechecking — this may also unblock `mailingListSubscribe`, which Phase 1 left | |
| 296 | out for exactly that reason. | |
| 295 | resources. ~~Rechecked and shipped~~: project create/edit, resource | |
| 296 | link/unlink, and public discovery landed (#12–#15) — see "hub.sr.ht writes" | |
| 297 | below. `SCOPE.txt` still needs its "hub has no public API / no discovery" | |
| 298 | claim corrected. `mailingListSubscribe` was *not* unblocked — that needs a | |
| 299 | per-list subscription field lists.sr.ht still lacks. | |
| 297 | 300 | - **git.sr.ht deploy keys are complete** (`createDeployKey` / `deleteDeployKey` |
| 298 | 301 | are in the SDL). Hutch never calls them. |
| 299 | 302 | |
| @@ -305,18 +308,28 @@ self-contained feature it has already surfaced and that the SDL confirms exists. | ||
| 305 | 308 | That gives the release something a user can see. Everything else the ingest turns |
| 306 | 309 | up gets filed, not built, and hub.sr.ht gets its own bucket below. |
| 307 | 310 | |
| 308 | ### hub.sr.ht writes — v3.10.0, provisional | |
| 311 | ### hub.sr.ht writes — projects and discovery done | |
| 309 | 312 | |
| 310 | Everything here rests on a single sentence in the Q2 2026 post: that hub.sr.ht | |
| 311 | gained a writable GraphQL API. If true, three things unblock at once — | |
| 312 | project writes (Hutch's projects are read-only), discovery (which `SCOPE.txt` | |
| 313 | rules out on the grounds hub has no public API), and `mailingListSubscribe`, | |
| 314 | which Phase 1 declined for exactly that reason. | |
| 313 | Reading `api/graph/schema.graphqls` in `hub.sr.ht` settled the Q2 2026 claim: | |
| 314 | the master schema does expose the project write API — `createProject`, | |
| 315 | `updateProject`, `deleteProject`, the `link*` / `unlink*` resource mutations, | |
| 316 | and a public `projects` discovery query. Two of the three items this bucket | |
| 317 | tracked shipped against it: | |
| 315 | 318 | |
| 316 | All three live or die on the same unverified claim, which is why this is | |
| 317 | sequenced after the ingest rather than planned now. Read | |
| 318 | `api/graph/schema.graphqls` in `hub.sr.ht` before committing the version number. | |
| 319 | The bucket may be empty. | |
| 319 | - ~~Project writes~~ — create (#13), edit (#14), and manage linked | |
| 320 | repositories, trackers, and mailing lists (#15). | |
| 321 | - ~~Discovery~~ — a browsable directory of public projects (#12). | |
| 322 | ||
| 323 | Built against the master SDL; live deployment on `sr.ht/query` could not be | |
| 324 | confirmed without a token (introspection there is auth-gated), so the mutations | |
| 325 | degrade to a visible error rather than a crash if a field is not yet deployed. | |
| 326 | Verify on a signed-in device. | |
| 327 | ||
| 328 | `mailingListSubscribe` stays out. `MailingList` still has no `subscription` | |
| 329 | field, and public *project* discovery does not help find a mailing list the user | |
| 330 | is *not* subscribed to — the reason Phase 1 declined it. Revisit only if | |
| 331 | lists.sr.ht gains per-list subscription state. `SCOPE.txt` still needs its | |
| 332 | "hub has no public API / no discovery" claim corrected. | |
| 320 | 333 | |
| 321 | 334 | ### App Intent gaps — unscheduled |
| 322 | 335 | |
| @@ -326,11 +339,13 @@ search/persistence layer — so neither is schedulable until that lands. (These | ||
| 326 | 339 | were the two `swift:S1135` TODOs; promoted here so the code carries a reference |
| 327 | 340 | rather than a bare `TODO`.) |
| 328 | 341 | |
| 329 | - **Global content search.** `SearchHutchIntent` accepts a query but routes to | |
| 330 | the Lookup screen — sourcehut entity resolution — because Hutch has no | |
| 331 | full-text search across tickets, repos, and lists. Its own description says | |
| 332 | "Opens Hutch lookup with a search query." When a real search exists, repoint | |
| 333 | the `.search` route in `SearchHutchIntent.route`. | |
| 342 | - **Global content search.** `SearchHutchIntent` accepts a query — and now a | |
| 343 | search *type* (#17) — but still routes to the Lookup screen, sourcehut entity | |
| 344 | resolution, because Hutch has no full-text search across tickets, repos, and | |
| 345 | lists. When a real search exists, repoint the `.search` route in | |
| 346 | `SearchHutchIntent.route`. (#17 also completed Check Status / Check Builds | |
| 347 | dialogs and added the Clear Recent Activity and Unpin Resource mutating | |
| 348 | intents; those were shipped, not gaps.) | |
| 334 | 349 | - **`OpenSavedSearchIntent`.** Saved searches are per-tracker only |
| 335 | 350 | (`TicketSavedFilterStore`, `ScopedSearchHistoryStore`); there is no global |
| 336 | 351 | saved-search store for an intent to open. Add the intent once global |