Skip to content

Commit 007de7a

Browse files
authored
Merge branch 'main' into repo-assist/feature-llmstxt-951-9e151877ea004bb1
2 parents c6e2c24 + dc0b101 commit 007de7a

8 files changed

Lines changed: 259 additions & 115 deletions

File tree

.github/workflows/repo-assist.lock.yml

Lines changed: 33 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.github/workflows/repo-assist.md

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ tools:
7171
bash: true
7272
repo-memory: true
7373

74-
source: githubnext/agentics/workflows/repo-assist.md@f2c5cf1e4af58e09a93ba0703c6bf084711b265f
74+
source: githubnext/agentics/workflows/repo-assist.md@afb00b92a9514fee9a14c583f059a03d05738f70
7575
---
7676

7777
# Repo Assist
@@ -109,23 +109,35 @@ Use persistent repo memory to track:
109109

110110
Read memory at the **start** of every run; update it at the **end**.
111111

112-
**Important**: Memory may not be 100% accurate. Issues may have been created, closed, or commented on; PRs may have been created, merged, commented on, or closed since the last run. Always verify memory against current repository state - reviewing recent activity since your last run is wise before acting on stale assumptions.
112+
**Important**: Memory may not be 100% accurate. Issues may have been created, closed, or commented on; PRs may have been created, merged, commented on, or closed since the last run. Always verify memory against current repository state — reviewing recent activity since your last run is wise before acting on stale assumptions.
113+
114+
**Memory backlog tracking**: Your memory may contain notes about issues or PRs that still need attention (e.g., "issues #384, #336 have labels but no comments"). These are **action items for you**, not just informational notes. Each run, check your memory's `notes` field and other tracking fields for any explicitly flagged backlog work, and prioritise acting on it.
113115

114116
## Workflow
115117

116118
Use a **round-robin strategy**: each run, work on a different subset of tasks, rotating through them across runs so that all tasks get attention over time. Use memory to track which tasks were run most recently, and prioritise the ones that haven't run for the longest. Aim to do 2–4 tasks per run (plus the mandatory Task 11).
117119

118120
**Repeat-run mode**: When invoked via `gh aw run repo-assist --repeat`, runs occur every 5–10 minutes. Even in this mode, **actively look for useful work to do** on every run. Do not skip a run just because the last one was recent or because open PRs are awaiting CI — there is always a task to advance: label issues, scan the backlog, study the codebase, prepare a fix, push an update, or work on Task 10. Treat a "nothing to do" conclusion as a sign you haven't looked hard enough, unless there really is, like, literally nothing to do. And be careful not to do duplicate work across runs — check memory to see if you've already tried a fix or commented on an issue before doing it again.
119121

122+
**Progress Imperative**: Your primary purpose is to make forward progress on the repository. A "no action taken" outcome should be rare and only occur when:
123+
- Every open issue has either been fixed, is being actively worked on, or has already received a substantive Repo Assist comment AND no new human activity has occurred
124+
- Every open PR has been reviewed or commented on appropriately
125+
- All labeling is complete
126+
- There are genuinely no improvements, fixes, or triage actions possible
127+
128+
If your memory notes issues that "have labels but no Repo Assist comments" or similar backlog items, **you must act on them** — don't just note them for future runs. Scan the full issue list, not just recent activity. The absence of new issues since your last run does not mean there's nothing to do — there may be older issues awaiting triage, comment, or fix attempts.
129+
120130
Always do Task 11 (Update Monthly Activity Summary Issue) every run. In all comments and PR descriptions, identify yourself as "Repo Assist".
121131

122132
### Task 1: Triage and Comment on Open Issues
123133

124134
1. List open issues sorted by creation date ascending (oldest first). Resume from your memory's backlog cursor; reset when you reach the end.
125-
2. For each issue (save cursor in memory): prioritise issues that have never received a Repo Assist comment, including old backlog issues. Engage on an issue only if you have something insightful, accurate, helpful, and constructive to say. Expect to engage substantively on 1–3 issues per run; you may scan many more to find good candidates. Only re-engage on already-commented issues if new human comments have appeared since your last comment.
126-
3. Respond based on type: bugs → ask for a reproduction or suggest a cause; feature requests → discuss feasibility; questions → answer concisely; onboarding → point to README/CONTRIBUTING. Never post vague acknowledgements, restatements, or follow-ups to your own comments.
135+
2. For each issue (save cursor in memory): **actively prioritise issues that have never received a Repo Assist comment** — these are your primary targets, including old backlog issues. Read the issue comments and check your memory's `comments_made` fields to help determine priority issues. Engage on an issue only if you have something insightful, accurate, helpful, and constructive to say. Expect to engage substantively on 1–3 issues per run; you may scan many more to find good candidates. Expect to eventually engage on most issues - only very rarely choose not to engage, as your engagement is usually helpful. Only re-engage on already-commented issues if new human comments engaging in conversation with you have appeared since your last comment.
136+
3. Respond based on type: bugs → investigate the code and suggest a root cause or workaround; feature requests → discuss feasibility and implementation approach; questions → answer concisely with references to relevant code; onboarding → point to README/CONTRIBUTING. Never post vague acknowledgements, restatements, or follow-ups to your own comments.
127137
4. Begin every comment with: `🤖 *This is an automated response from Repo Assist.*`
128-
5. Update memory with comments made and the new cursor position.
138+
5. Update memory with comments made and the new cursor position. **Remove issue numbers from the "uncommented issues" note when you comment on them.**
139+
140+
**Important**: If issues have labels but no Repo Assist comments, treat this as a backlog you must work through — do not defer indefinitely.
129141

130142
### Task 2: Fix Issues via Pull Requests
131143

@@ -263,7 +275,7 @@ Maintain a single open issue titled `[Repo Assist] Monthly Activity {YYYY}-{MM}`
263275
- PRs that should be closed (stale, superseded, etc.)
264276
- Any strategic suggestions (goals, priorities)
265277
Use repo memory and the activity log to compile this list. Include direct links for every item. Keep entries to one line each.
266-
5. Do not update the activity issue if nothing was done in the current run.
278+
5. Do not update the activity issue if nothing was done in the current run. However, if you conclude "nothing to do", first verify this by checking: (a) Are there any open issues without a Repo Assist comment? (b) Are there issues in your memory flagged for attention? (c) Are there any bugs that could be investigated or fixed? If any of these are true, go back and do that work instead of concluding with no action.
267279

268280
## Guidelines
269281

@@ -277,3 +289,4 @@ Maintain a single open issue titled `[Repo Assist] Monthly Activity {YYYY}-{MM}`
277289
- **Anti-spam**: no repeated or follow-up comments to yourself in a single run; re-engage only when new human comments have appeared.
278290
- **Systematic**: use the backlog cursor to process oldest issues first over successive runs. Do not stop early.
279291
- **Quality over quantity**: noise erodes trust. Do nothing rather than add low-value output.
292+
- **Bias toward action**: While avoiding spam, actively seek ways to contribute value. If you're about to conclude "no action needed", first verify: (a) you've checked the full open issue list, not just recent activity, (b) check there are no uncommented issues where you haven't engaged but should, (c) check there are no issues that are fixable or investigatable, (d) check all labeling is current, (e) check there are no useful engineering improvements you could perform, (f) check there is no testing to improve, (g) check there are no dependency updates to make, (h) check there are no code simplifications to make, (i) check there are no documentation improvements to make, (j) check there are no CI performance improvements to make. A "no action" run should be genuinely exceptional except in a near-perfect repository with no recent changes.

RELEASE_NOTES.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
* Add `<FsDocsAllowExecutableProject>true</FsDocsAllowExecutableProject>` project file setting to include executable projects (OutputType=Exe/WinExe) in API documentation generation. [#918](https://github.com/fsprojects/FSharp.Formatting/issues/918)
1010
* Add `{{fsdocs-logo-alt}}` substitution (configurable via `<FsDocsLogoAlt>` MSBuild property, defaults to `Logo`) for accessible alt text on the header logo image. [#626](https://github.com/fsprojects/FSharp.Formatting/issues/626)
1111
* Generate `llms.txt` and `llms-full.txt` for LLM consumption by default; opt out via `<FsDocsGenerateLlmsTxt>false</FsDocsGenerateLlmsTxt>` in your project file. [#951](https://github.com/fsprojects/FSharp.Formatting/issues/951)
12+
* Add "Copy" button to all code blocks in generated documentation, making it easy to copy code samples to the clipboard. [#72](https://github.com/fsprojects/FSharp.Formatting/issues/72)
13+
* Add `<FsDocsAllowExecutableProject>true</FsDocsAllowExecutableProject>` project file setting to include executable projects (OutputType=Exe/WinExe) in API documentation generation. [#918](https://github.com/fsprojects/FSharp.Formatting/issues/918)
14+
* Add `{{fsdocs-logo-alt}}` substitution (configurable via `<FsDocsLogoAlt>` MSBuild property, defaults to `Logo`) for accessible alt text on the header logo image. [#626](https://github.com/fsprojects/FSharp.Formatting/issues/626)
15+
* Add `fsdocs init` command to scaffold a minimal `docs/index.md` (and optionally `_template.html`) for new projects. [#872](https://github.com/fsprojects/FSharp.Formatting/issues/872)
1216

1317
### Fixed
1418
* Fix doc generation failure for members with 5D/6D+ array parameters by correctly formatting array type signatures in XML doc format (e.g. `System.Double[0:,0:,0:,0:,0:]` for a 5D array). [#702](https://github.com/fsprojects/FSharp.Formatting/issues/702)
@@ -25,6 +29,7 @@
2529
* Improve CommonMark compliance for ATX headings: reject `#` not followed by a space (e.g. `#NoSpace` is now a paragraph), reject more than 6 `#` characters as a heading, support 0–3 leading spaces before the opening `#` sequence, and fix empty content when the entire header body is a closing `###` sequence. [#191](https://github.com/fsprojects/FSharp.Formatting/issues/191)
2630

2731
### Changed
32+
* Markdown API docs for members now use section-based layout (per-member `####` headings) instead of a Markdown table, eliminating embedded `<br />` separators, `&#124;` pipe escaping, and improving rendering of multi-line content and code examples. [#725](https://github.com/fsprojects/FSharp.Formatting/issues/725)
2833
* Update FCS to 43.10.100. [#935](https://github.com/fsprojects/FSharp.Formatting/pull/966)
2934
* Reduce dark mode header border contrast to match the visual subtlety of light mode borders. [#885](https://github.com/fsprojects/FSharp.Formatting/issues/885)
3035

src/FSharp.Formatting.ApiDocs/GenerateMarkdown.fs

Lines changed: 69 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -31,82 +31,74 @@ type MarkdownRender(model: ApiDocModel, ?menuTemplateFolder: string) =
3131
| None -> ()
3232
| Some href -> link [ img "Link to source code" (sprintf "%scontent/img/github.png" root) ] (href) ]
3333

34-
let renderMembers header tableHeader (members: ApiDocMember list) =
34+
let renderMembers header (members: ApiDocMember list) =
3535
[ if members.Length > 0 then
3636
``###`` [ !!header ]
3737

38-
table
39-
[ [ p [ !!tableHeader ] ]; [ p [ !!"Description" ] ]; [ p [ !!"Source" ] ] ]
40-
[ AlignLeft; AlignLeft; AlignCenter ]
41-
[ for m in members ->
42-
[ [ p [ link [ embedSafe (m.UsageHtml) ] ("#" + urlEncode (m.Name)) ] ]
43-
[ let summary = m.Comment.Summary
38+
for m in members do
39+
// HTML anchor so existing per-member links (#Name) continue to work
40+
p [ !!(sprintf "<a name=\"%s\"></a>" (urlEncode m.Name)) ]
41+
42+
// Member heading containing the full usage signature
43+
``####`` [ embed m.UsageHtml ]
4444

45-
let emptySummary = summary.HtmlText |> String.IsNullOrWhiteSpace
45+
let summary = m.Comment.Summary
4646

47-
if not emptySummary then
48-
p [ embedSafe m.Comment.Summary; br ]
47+
if not (summary.HtmlText |> String.IsNullOrWhiteSpace) then
48+
p [ embed m.Comment.Summary ]
4949

50-
match m.Comment.Remarks with
51-
| None -> ()
52-
| Some r -> p [ embedSafe r; br ]
50+
match m.Comment.Remarks with
51+
| None -> ()
52+
| Some r -> p [ embed r ]
5353

54-
if not m.Parameters.IsEmpty then
55-
p [ !!"Parameters" ]
56-
p []
54+
if not m.Parameters.IsEmpty then
55+
p [ strong [ !!"Parameters:" ] ]
5756

58-
yield!
59-
m.Parameters
60-
|> List.collect (fun parameter ->
61-
[ p
62-
[ strong [ !!parameter.ParameterNameText ]
63-
!!": "
64-
embedSafe parameter.ParameterType ]
65-
match parameter.ParameterDocs with
66-
| None -> ()
67-
| Some d -> p [ !!(sprintf ": %s" (htmlStringSafe d)) ]
68-
69-
])
70-
71-
p []
72-
73-
match m.ExtendedType with
74-
| None -> ()
75-
| Some(_, extendedTypeHtml) -> p [ !!"Extended Type: "; embedSafe extendedTypeHtml; br ]
76-
77-
match m.ReturnInfo.ReturnType with
78-
| None -> ()
79-
| Some(_, returnTypeHtml) ->
80-
p
81-
[ !!(if m.Kind <> ApiDocMemberKind.RecordField then
82-
"Returns: "
83-
else
84-
"Field type: ")
85-
embedSafe returnTypeHtml
86-
br
87-
match m.ReturnInfo.ReturnDocs with
88-
| None -> ()
89-
| Some r ->
90-
embedSafe r
91-
br ]
92-
93-
if not m.Comment.Exceptions.IsEmpty then
94-
for (nm, url, html) in m.Comment.Exceptions do
95-
p
96-
[ match url with
97-
| None -> ()
98-
| Some href -> link [ !!nm ] href
99-
embed html
100-
br ]
101-
102-
for e in m.Comment.Notes do
103-
p [ !!"Note" ]
104-
p [ embed e; br ]
105-
106-
for e in m.Comment.Examples do
107-
p [ !!"Example" ]
108-
p [ embed e; br ] ]
109-
[ p [ yield! sourceLink m.SourceLocation ] ] ] ] ]
57+
for parameter in m.Parameters do
58+
p [ strong [ !!parameter.ParameterNameText ]; !!": "; embed parameter.ParameterType ]
59+
60+
match parameter.ParameterDocs with
61+
| None -> ()
62+
| Some d -> p [ embed d ]
63+
64+
match m.ExtendedType with
65+
| None -> ()
66+
| Some(_, extendedTypeHtml) -> p [ !!"Extended Type: "; embed extendedTypeHtml ]
67+
68+
match m.ReturnInfo.ReturnType with
69+
| None -> ()
70+
| Some(_, returnTypeHtml) ->
71+
p
72+
[ !!(if m.Kind <> ApiDocMemberKind.RecordField then
73+
"Returns: "
74+
else
75+
"Field type: ")
76+
embed returnTypeHtml ]
77+
78+
match m.ReturnInfo.ReturnDocs with
79+
| None -> ()
80+
| Some r -> p [ embed r ]
81+
82+
if not m.Comment.Exceptions.IsEmpty then
83+
for (nm, url, html) in m.Comment.Exceptions do
84+
p
85+
[ match url with
86+
| None -> ()
87+
| Some href -> link [ !!nm ] href
88+
embed html ]
89+
90+
for e in m.Comment.Notes do
91+
``#####`` [ !!"Note" ]
92+
p [ embed e ]
93+
94+
for e in m.Comment.Examples do
95+
``#####`` [ !!"Example" ]
96+
p [ embed e ]
97+
98+
let sl = sourceLink m.SourceLocation
99+
100+
if not sl.IsEmpty then
101+
p sl ]
110102

111103
let renderEntities (entities: ApiDocEntity list) =
112104
[ if entities.Length > 0 then
@@ -268,15 +260,15 @@ type MarkdownRender(model: ApiDocModel, ?menuTemplateFolder: string) =
268260
let instanceMembers = ms |> List.filter (fun m -> m.Kind = ApiDocMemberKind.InstanceMember)
269261
let staticMembers = ms |> List.filter (fun m -> m.Kind = ApiDocMemberKind.StaticMember)
270262

271-
yield! renderMembers "Functions and values" "Function or value" functionsOrValues
272-
yield! renderMembers "Type extensions" "Type extension" extensions
273-
yield! renderMembers "Active patterns" "Active pattern" activePatterns
274-
yield! renderMembers "Union cases" "Union case" unionCases
275-
yield! renderMembers "Record fields" "Record Field" recordFields
276-
yield! renderMembers "Static parameters" "Static parameters" staticParameters
277-
yield! renderMembers "Constructors" "Constructor" constructors
278-
yield! renderMembers "Instance members" "Instance member" instanceMembers
279-
yield! renderMembers "Static members" "Static member" staticMembers ]
263+
yield! renderMembers "Functions and values" functionsOrValues
264+
yield! renderMembers "Type extensions" extensions
265+
yield! renderMembers "Active patterns" activePatterns
266+
yield! renderMembers "Union cases" unionCases
267+
yield! renderMembers "Record fields" recordFields
268+
yield! renderMembers "Static parameters" staticParameters
269+
yield! renderMembers "Constructors" constructors
270+
yield! renderMembers "Instance members" instanceMembers
271+
yield! renderMembers "Static members" staticMembers ]
280272

281273
let namespaceContent (nsIndex, ns: ApiDocNamespace) =
282274
let allByCategory = Categorise.entities (nsIndex, ns, false)

0 commit comments

Comments
 (0)