Fix index.md not being generated
- Generate index even when no .org files are found - Don't halt CLI early when no org files - let pipeline complete - Index will be empty but present, allowing Quartz to serve something
This commit is contained in:
@@ -10171,4 +10171,582 @@ Generated org_garden app
|
|||||||
```
|
```
|
||||||
## Agent (2026-02-21 21:50:09)
|
## Agent (2026-02-21 21:50:09)
|
||||||
|
|
||||||
Now let's commit and push:
|
Now let's commit and push:
|
||||||
|
|
||||||
|
### Tool Call [completed]: git add -A && git commit -m "Fix Quartz port not being passed correctly
|
||||||
|
|
||||||
|
When CLI options --port/--ws-port were not provided, nil values were
|
||||||
|
being explicitly passed to Server.start_link, which caused Keyword.get
|
||||||
|
to return nil instead of the default. Now we only include port options
|
||||||
|
in the keyword list if they have actual values."
|
||||||
|
|
||||||
|
**Tool:** execute
|
||||||
|
**Timestamp:** 2026-02-21 21:50:13
|
||||||
|
|
||||||
|
```
|
||||||
|
[main 11ab833] Fix Quartz port not being passed correctly
|
||||||
|
2 files changed, 1147 insertions(+), 7 deletions(-)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Tool Call [completed]: git push
|
||||||
|
|
||||||
|
**Tool:** execute
|
||||||
|
**Timestamp:** 2026-02-21 21:50:17
|
||||||
|
|
||||||
|
```
|
||||||
|
remote: . Processing 1 references
|
||||||
|
remote: Processed 1 references in total
|
||||||
|
To gitea.bueso.eu:ignacio.ballesteros/org-garden.git
|
||||||
|
87fd311..11ab833 main -> main
|
||||||
|
```
|
||||||
|
## Agent (2026-02-21 21:50:19)
|
||||||
|
|
||||||
|
Fixed. The issue was that when CLI options `--port` and `--ws-port` weren't provided, the code was passing `port: nil` and `ws_port: nil` explicitly. `Keyword.get(opts, :port, default)` returns `nil` (not the default) when the key exists with a `nil` value.
|
||||||
|
|
||||||
|
Now only non-nil port values are included in the options passed to `Server.start_link`.
|
||||||
|
|
||||||
|
## User (2026-02-22 11:44:42)
|
||||||
|
|
||||||
|
Now index.md is missing, review the pipeline and transformations
|
||||||
|
|
||||||
|
➜ org-garden git:(main) ✗
|
||||||
|
|
||||||
|
## Agent (2026-02-22 11:44:46)
|
||||||
|
|
||||||
|
Let me investigate the index generation issue by reviewing the pipeline flow:
|
||||||
|
|
||||||
|
### Tool Call [completed]: read
|
||||||
|
|
||||||
|
**Tool:** read
|
||||||
|
**Timestamp:** 2026-02-22 11:44:47
|
||||||
|
|
||||||
|
```
|
||||||
|
<path>/home/ignaciobll/code/org-garden/lib/org_garden/index.ex</path>
|
||||||
|
<type>file</type>
|
||||||
|
<content>1: defmodule OrgGarden.Index do
|
||||||
|
2: @moduledoc """
|
||||||
|
3: Generates a fallback `index.md` in the content directory if none was
|
||||||
|
4: exported from an `.org` file.
|
||||||
|
5:
|
||||||
|
6: The generated index lists all markdown pages alphabetically with links.
|
||||||
|
7: """
|
||||||
|
8:
|
||||||
|
9: @doc """
|
||||||
|
10: Generate `content_dir/index.md` if it does not already exist.
|
||||||
|
11:
|
||||||
|
12: If an `index.md` was already created by ox-hugo (from an `index.org`),
|
||||||
|
13: it is left untouched.
|
||||||
|
14: """
|
||||||
|
15: @spec generate(String.t()) :: :ok
|
||||||
|
16: def generate(content_dir) do
|
||||||
|
17: index_path = Path.join(content_dir, "index.md")
|
||||||
|
18:
|
||||||
|
19: unless File.exists?(index_path) do
|
||||||
|
20: IO.puts(" generating default index.md")
|
||||||
|
21:
|
||||||
|
22: pages =
|
||||||
|
23: Path.join(content_dir, "**/*.md")
|
||||||
|
24: |> Path.wildcard()
|
||||||
|
25: |> Enum.map(fn path ->
|
||||||
|
26: slug = Path.relative_to(path, content_dir) |> Path.rootname()
|
||||||
|
27:
|
||||||
|
28: title =
|
||||||
|
29: path
|
||||||
|
30: |> File.read!()
|
||||||
|
31: |> then(fn content ->
|
||||||
|
32: case Regex.run(~r/^title\s*=\s*"(.+)"/m, content) do
|
||||||
|
33: [_, t] -> t
|
||||||
|
34: _ -> slug
|
||||||
|
35: end
|
||||||
|
36: end)
|
||||||
|
37:
|
||||||
|
38: {slug, title}
|
||||||
|
39: end)
|
||||||
|
40: |> Enum.sort_by(fn {_, title} -> title end)
|
||||||
|
41: |> Enum.map(fn {slug, title} -> "- [#{title}](#{slug})" end)
|
||||||
|
42: |> Enum.join("\n")
|
||||||
|
43:
|
||||||
|
44: File.write!(index_path, """
|
||||||
|
45: ---
|
||||||
|
46: title: Index
|
||||||
|
47: ---
|
||||||
|
48:
|
||||||
|
49: #{pages}
|
||||||
|
50: """)
|
||||||
|
51: end
|
||||||
|
52:
|
||||||
|
53: :ok
|
||||||
|
54: end
|
||||||
|
55:
|
||||||
|
56: @doc """
|
||||||
|
57: Regenerate the index by removing any previously generated one first.
|
||||||
|
58:
|
||||||
|
59: Only removes the index if it was generated by us (contains `title: Index`).
|
||||||
|
60: User-exported index files (from `index.org`) are left untouched.
|
||||||
|
61: """
|
||||||
|
62: @spec regenerate(String.t()) :: :ok
|
||||||
|
63: def regenerate(content_dir) do
|
||||||
|
64: index_path = Path.join(content_dir, "index.md")
|
||||||
|
65:
|
||||||
|
66: if File.exists?(index_path) do
|
||||||
|
67: content = File.read!(index_path)
|
||||||
|
68:
|
||||||
|
69: if generated_index?(content) do
|
||||||
|
70: File.rm!(index_path)
|
||||||
|
71: end
|
||||||
|
72: end
|
||||||
|
73:
|
||||||
|
74: generate(content_dir)
|
||||||
|
75: end
|
||||||
|
76:
|
||||||
|
77: defp generated_index?(content) do
|
||||||
|
78: # Our generated index uses "title: Index" in YAML frontmatter.
|
||||||
|
79: # ox-hugo uses TOML frontmatter (title = "..."), so this won't
|
||||||
|
80: # match user-exported files.
|
||||||
|
81: String.contains?(content, "title: Index")
|
||||||
|
82: end
|
||||||
|
83: end
|
||||||
|
84:
|
||||||
|
|
||||||
|
(End of file - total 84 lines)
|
||||||
|
</content>
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:44:49)
|
||||||
|
|
||||||
|
The index module looks fine. Let me check the server.ex to see how the pipeline is called:
|
||||||
|
|
||||||
|
### Tool Call [completed]: read
|
||||||
|
|
||||||
|
**Tool:** read
|
||||||
|
**Timestamp:** 2026-02-22 11:44:51
|
||||||
|
|
||||||
|
```
|
||||||
|
<path>/home/ignaciobll/code/org-garden/lib/org_garden/server.ex</path>
|
||||||
|
<type>file</type>
|
||||||
|
<content>136: defp run_initial_pipeline(state) do
|
||||||
|
137: %{
|
||||||
|
138: notes_dir: notes_dir,
|
||||||
|
139: output_dir: output_dir,
|
||||||
|
140: content_dir: content_dir,
|
||||||
|
141: pipeline_opts: pipeline_opts
|
||||||
|
142: } = state
|
||||||
|
143:
|
||||||
|
144: Logger.info("Running initial export pipeline...")
|
||||||
|
145:
|
||||||
|
146: # Wipe content directory
|
||||||
|
147: wipe(content_dir)
|
||||||
|
148:
|
||||||
|
149: # Export all org files
|
||||||
|
150: case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
||||||
|
151: {:ok, 0} ->
|
||||||
|
152: Logger.warning("No .org files found in #{notes_dir}")
|
||||||
|
153: :ok
|
||||||
|
154:
|
||||||
|
155: {:ok, count} ->
|
||||||
|
156: Logger.info("Exported #{count} file(s)")
|
||||||
|
157:
|
||||||
|
158: # Run transforms
|
||||||
|
159: {:ok, stats} = OrgGarden.run(content_dir, @transforms, pipeline_opts)
|
||||||
|
160:
|
||||||
|
161: Enum.each(stats, fn {mod, c} ->
|
||||||
|
162: Logger.info("#{inspect(mod)}: #{c} file(s) modified")
|
||||||
|
163: end)
|
||||||
|
164:
|
||||||
|
165: # Generate index
|
||||||
|
166: OrgGarden.Index.generate(content_dir)
|
||||||
|
167: :ok
|
||||||
|
168:
|
||||||
|
169: {:error, failures} ->
|
||||||
|
170: Logger.error("Failed to export #{length(failures)} file(s)")
|
||||||
|
171: {:error, {:export_failed, failures}}
|
||||||
|
172: end
|
||||||
|
173: end
|
||||||
|
174:
|
||||||
|
175: defp start_supervisor(state) do
|
||||||
|
|
||||||
|
(File has more lines. Use 'offset' parameter to read beyond line 175)
|
||||||
|
</content>
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:44:53)
|
||||||
|
|
||||||
|
I see the issue! When there are 0 org files (line 151-153), we return `:ok` early without generating an index. But more importantly, let me check what happens with the parallel export - maybe it's returning early on the `{:ok, 0}` case incorrectly.
|
||||||
|
|
||||||
|
Let me also check the export.ex parallel code more carefully:
|
||||||
|
|
||||||
|
### Tool Call [completed]: read
|
||||||
|
|
||||||
|
**Tool:** read
|
||||||
|
**Timestamp:** 2026-02-22 11:44:57
|
||||||
|
|
||||||
|
```
|
||||||
|
<path>/home/ignaciobll/code/org-garden/lib/org_garden/export.ex</path>
|
||||||
|
<type>file</type>
|
||||||
|
<content>74: @default_max_concurrency 8
|
||||||
|
75:
|
||||||
|
76: @doc """
|
||||||
|
77: Export all `.org` files found under `notes_dir`.
|
||||||
|
78:
|
||||||
|
79: Exports files in parallel for improved performance. The concurrency level
|
||||||
|
80: can be configured via the `:export_concurrency` application config or
|
||||||
|
81: the `EXPORT_CONCURRENCY` environment variable. Defaults to #{@default_max_concurrency}.
|
||||||
|
82:
|
||||||
|
83: Returns `{:ok, count}` where `count` is the number of successfully
|
||||||
|
84: exported files, or `{:error, failures}` if any files failed.
|
||||||
|
85: """
|
||||||
|
86: @spec export_all(String.t(), String.t()) :: {:ok, non_neg_integer()} | {:error, list()}
|
||||||
|
87: def export_all(notes_dir, output_dir) do
|
||||||
|
88: org_files =
|
||||||
|
89: Path.join(notes_dir, "**/*.org")
|
||||||
|
90: |> Path.wildcard()
|
||||||
|
91:
|
||||||
|
92: if org_files == [] do
|
||||||
|
93: Logger.warning("No .org files found in #{notes_dir}")
|
||||||
|
94: {:ok, 0}
|
||||||
|
95: else
|
||||||
|
96: max_concurrency = get_concurrency()
|
||||||
|
97: Logger.info("Exporting #{length(org_files)} org file(s) from #{notes_dir} (concurrency: #{max_concurrency})")
|
||||||
|
98:
|
||||||
|
99: results =
|
||||||
|
100: org_files
|
||||||
|
101: |> Task.async_stream(
|
||||||
|
102: fn orgfile ->
|
||||||
|
103: Logger.info(" exporting: #{orgfile}")
|
||||||
|
104: {orgfile, export_file(orgfile, notes_dir, output_dir)}
|
||||||
|
105: end,
|
||||||
|
106: max_concurrency: max_concurrency,
|
||||||
|
107: timeout: :infinity,
|
||||||
|
108: ordered: false
|
||||||
|
109: )
|
||||||
|
110: |> Enum.map(fn {:ok, result} -> result end)
|
||||||
|
111:
|
||||||
|
112: failures =
|
||||||
|
113: Enum.filter(results, fn
|
||||||
|
114: {_, {:ok, _}} -> false
|
||||||
|
115: {_, {:error, _}} -> true
|
||||||
|
116: end)
|
||||||
|
117:
|
||||||
|
118: if failures == [] do
|
||||||
|
119: {:ok, length(results)}
|
||||||
|
120: else
|
||||||
|
121: {:error, failures}
|
||||||
|
122: end
|
||||||
|
123: end
|
||||||
|
124: end
|
||||||
|
125:
|
||||||
|
126: defp get_concurrency do
|
||||||
|
127: Application.get_env(:org_garden, :export_concurrency, @default_max_concurrency)
|
||||||
|
128: end
|
||||||
|
129:
|
||||||
|
130: @doc """
|
||||||
|
131: Compute the expected `.md` path for a given `.org` file.
|
||||||
|
132:
|
||||||
|
133: Uses the same section-mapping logic as ox-hugo: the relative directory
|
||||||
|
|
||||||
|
(File has more lines. Use 'offset' parameter to read beyond line 133)
|
||||||
|
</content>
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:00)
|
||||||
|
|
||||||
|
The export looks fine. Let me run the actual build to see what's happening. First let me check what the actual content_dir is and if index.md exists there:
|
||||||
|
|
||||||
|
### Tool Call [completed]: ls -la content/ 2>/dev/null || echo "content/ doesn't exist"
|
||||||
|
|
||||||
|
**Tool:** execute
|
||||||
|
**Timestamp:** 2026-02-22 11:45:02
|
||||||
|
|
||||||
|
```
|
||||||
|
total 8
|
||||||
|
drwxr-xr-x 2 ignaciobll users 4096 Feb 21 21:48 .
|
||||||
|
drwxr-xr-x 15 ignaciobll users 4096 Feb 21 21:48 ..
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:06)
|
||||||
|
|
||||||
|
Content directory is empty. Let me check what notes are available:
|
||||||
|
|
||||||
|
### Tool Call [completed]: ls -la notes/ 2>/dev/null || echo "notes/ doesn't exist"
|
||||||
|
|
||||||
|
**Tool:** execute
|
||||||
|
**Timestamp:** 2026-02-22 11:45:07
|
||||||
|
|
||||||
|
```
|
||||||
|
total 20
|
||||||
|
drwxr-xr-x 5 ignaciobll users 4096 Feb 21 00:35 .
|
||||||
|
drwxr-xr-x 15 ignaciobll users 4096 Feb 21 21:48 ..
|
||||||
|
drwxr-xr-x 2 ignaciobll users 4096 Feb 21 00:35 bus
|
||||||
|
drwxr-xr-x 2 ignaciobll users 4096 Feb 21 00:35 metro
|
||||||
|
drwxr-xr-x 2 ignaciobll users 4096 Feb 21 00:35 roads
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Tool Call [completed]: find notes/ -name "*.org" 2>/dev/null
|
||||||
|
|
||||||
|
**Tool:** execute
|
||||||
|
**Timestamp:** 2026-02-22 11:45:10
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:12)
|
||||||
|
|
||||||
|
There are no `.org` files in `notes/`. Let me check if there are any org files elsewhere, or if the content was previously in a different form:
|
||||||
|
|
||||||
|
### Tool Call [completed]: find . -name "*.org" -not -path "./.git/*" 2>/dev/null | head -20
|
||||||
|
|
||||||
|
**Tool:** execute
|
||||||
|
**Timestamp:** 2026-02-22 11:45:13
|
||||||
|
|
||||||
|
```
|
||||||
|
./README.org
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:15)
|
||||||
|
|
||||||
|
There's only the README.org. So the actual issue is that when there are no org files to export, the index.md isn't being generated. Let me trace through the pipeline:
|
||||||
|
|
||||||
|
1. In `server.ex:run_initial_pipeline`, when `export_all` returns `{:ok, 0}`, we just return `:ok` without calling `OrgGarden.Index.generate`
|
||||||
|
|
||||||
|
Let me also check the CLI flow since you might be running the CLI directly:
|
||||||
|
|
||||||
|
### Tool Call [completed]: read
|
||||||
|
|
||||||
|
**Tool:** read
|
||||||
|
**Timestamp:** 2026-02-22 11:45:19
|
||||||
|
|
||||||
|
```
|
||||||
|
<path>/home/ignaciobll/code/org-garden/lib/org_garden/cli.ex</path>
|
||||||
|
<type>file</type>
|
||||||
|
<content>300: # ---------------------------------------------------------------------------
|
||||||
|
301: # Phase 2: Export org files via Emacs + ox-hugo
|
||||||
|
302: # ---------------------------------------------------------------------------
|
||||||
|
303:
|
||||||
|
304: defp export_all(notes_dir, output_dir) do
|
||||||
|
305: IO.puts("==> Exporting org files from #{notes_dir}")
|
||||||
|
306:
|
||||||
|
307: case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
||||||
|
308: {:ok, 0} ->
|
||||||
|
309: IO.puts("No .org files found in #{notes_dir}")
|
||||||
|
310: System.halt(0)
|
||||||
|
311:
|
||||||
|
312: {:ok, count} ->
|
||||||
|
313: IO.puts(" exported #{count} file(s)")
|
||||||
|
314:
|
||||||
|
315: {:error, failures} ->
|
||||||
|
316: IO.puts(:stderr, "\nFailed to export #{length(failures)} file(s):")
|
||||||
|
317:
|
||||||
|
318: Enum.each(failures, fn {f, {:error, reason}} ->
|
||||||
|
319: IO.puts(:stderr, " #{f}: #{inspect(reason)}")
|
||||||
|
320: end)
|
||||||
|
321:
|
||||||
|
322: System.halt(1)
|
||||||
|
323: end
|
||||||
|
324: end
|
||||||
|
325:
|
||||||
|
326: # ---------------------------------------------------------------------------
|
||||||
|
327: # Phase 3: Markdown transformation pipeline
|
||||||
|
328: # ---------------------------------------------------------------------------
|
||||||
|
329:
|
||||||
|
|
||||||
|
(File has more lines. Use 'offset' parameter to read beyond line 329)
|
||||||
|
</content>
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:22)
|
||||||
|
|
||||||
|
I see the problem! In the CLI's `export_all` function (line 308-310), when there are 0 org files, it calls `System.halt(0)` immediately - it doesn't even get to run transforms or generate the index!
|
||||||
|
|
||||||
|
But wait, you said index.md is missing. Let me check if there ARE org files being exported but the index isn't being generated. Let me trace the full serve flow:
|
||||||
|
|
||||||
|
### Tool Call [completed]: read
|
||||||
|
|
||||||
|
**Tool:** read
|
||||||
|
**Timestamp:** 2026-02-22 11:45:25
|
||||||
|
|
||||||
|
```
|
||||||
|
<path>/home/ignaciobll/code/org-garden/lib/org_garden/cli.ex</path>
|
||||||
|
<type>file</type>
|
||||||
|
<content>118: ]
|
||||||
|
119: )
|
||||||
|
120:
|
||||||
|
121: notes_dir = extract_notes_dir(positional, "serve")
|
||||||
|
122: output_dir = extract_output_dir(opts)
|
||||||
|
123: content_dir = extract_content_dir(opts, output_dir)
|
||||||
|
124:
|
||||||
|
125: {notes_dir, output_dir, content_dir, opts}
|
||||||
|
126: end
|
||||||
|
127:
|
||||||
|
128: # ---------------------------------------------------------------------------
|
||||||
|
129: # Command: build
|
||||||
|
130: # ---------------------------------------------------------------------------
|
||||||
|
131:
|
||||||
|
132: def handle_build(argv) do
|
||||||
|
133: quartz_path = require_quartz_env()
|
||||||
|
134: {notes_dir, output_dir, content_dir, _opts} = parse_build_args(argv)
|
||||||
|
135: pipeline_opts = Config.pipeline_opts()
|
||||||
|
136:
|
||||||
|
137: # Full batch export
|
||||||
|
138: wipe(content_dir)
|
||||||
|
139: export_all(notes_dir, output_dir)
|
||||||
|
140: run_pipeline(content_dir, pipeline_opts)
|
||||||
|
141: generate_index(content_dir)
|
||||||
|
142:
|
||||||
|
143: node_path = Config.get(:node_path, "node")
|
||||||
|
144:
|
||||||
|
145: IO.puts("==> Building static site with Quartz...")
|
||||||
|
146:
|
||||||
|
147: {output, status} =
|
||||||
|
148: System.cmd(
|
||||||
|
149: node_path,
|
||||||
|
150: [
|
||||||
|
151: Path.join(quartz_path, "quartz/bootstrap-cli.mjs"),
|
||||||
|
152: "build",
|
||||||
|
153: "--directory",
|
||||||
|
154: content_dir,
|
||||||
|
155: "--output",
|
||||||
|
156: Path.join(output_dir, "public")
|
||||||
|
157: ],
|
||||||
|
158: cd: quartz_path,
|
||||||
|
159: stderr_to_stdout: true
|
||||||
|
160: )
|
||||||
|
161:
|
||||||
|
162: IO.puts(output)
|
||||||
|
163:
|
||||||
|
164: if status != 0 do
|
||||||
|
165: abort("Quartz build failed with status #{status}")
|
||||||
|
166: end
|
||||||
|
167:
|
||||||
|
|
||||||
|
(File has more lines. Use 'offset' parameter to read beyond line 167)
|
||||||
|
</content>
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:27)
|
||||||
|
|
||||||
|
I see - for `build` command, `generate_index` is called (line 141), but the problem is `export_all` on line 139 might call `System.halt(0)` before we get there if no org files exist.
|
||||||
|
|
||||||
|
Let me look at where serve mode handles this:
|
||||||
|
|
||||||
|
### Tool Call [completed]: read
|
||||||
|
|
||||||
|
**Tool:** read
|
||||||
|
**Timestamp:** 2026-02-22 11:45:29
|
||||||
|
|
||||||
|
```
|
||||||
|
<path>/home/ignaciobll/code/org-garden/lib/org_garden/cli.ex</path>
|
||||||
|
<type>file</type>
|
||||||
|
<content>68: # ---------------------------------------------------------------------------
|
||||||
|
69: # Command: serve
|
||||||
|
70: # ---------------------------------------------------------------------------
|
||||||
|
71:
|
||||||
|
72: def handle_serve(argv) do
|
||||||
|
73: require_quartz_env()
|
||||||
|
74: {notes_dir, output_dir, content_dir, opts} = parse_serve_args(argv)
|
||||||
|
75:
|
||||||
|
76: IO.puts("==> Starting development server...")
|
||||||
|
77:
|
||||||
|
78: server_opts =
|
||||||
|
79: [
|
||||||
|
80: notes_dir: notes_dir,
|
||||||
|
81: output_dir: output_dir,
|
||||||
|
82: content_dir: content_dir
|
||||||
|
83: ]
|
||||||
|
84: |> maybe_put(:port, opts[:port])
|
||||||
|
85: |> maybe_put(:ws_port, opts[:ws_port])
|
||||||
|
86:
|
||||||
|
87: case OrgGarden.Server.start_link(server_opts) do
|
||||||
|
88: {:ok, pid} ->
|
||||||
|
89: IO.puts("==> Server running at http://localhost:#{opts[:port] || Config.get(:http_port, 8080)}")
|
||||||
|
90: IO.puts("==> Watching #{notes_dir} for changes (Ctrl+C to stop)")
|
||||||
|
91:
|
||||||
|
92: # Wait for server to exit
|
||||||
|
93: ref = Process.monitor(pid)
|
||||||
|
94:
|
||||||
|
95: receive do
|
||||||
|
96: {:DOWN, ^ref, :process, ^pid, reason} ->
|
||||||
|
97: case reason do
|
||||||
|
98: :normal -> :ok
|
||||||
|
99: :shutdown -> :ok
|
||||||
|
100: {:shutdown, _} -> :ok
|
||||||
|
101: _ -> abort("Server crashed: #{inspect(reason)}")
|
||||||
|
102: end
|
||||||
|
|
||||||
|
(File has more lines. Use 'offset' parameter to read beyond line 102)
|
||||||
|
</content>
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:32)
|
||||||
|
|
||||||
|
For `serve`, it delegates to `OrgGarden.Server` which calls `run_initial_pipeline`. The problem there is that when `{:ok, 0}` is returned, index is not generated.
|
||||||
|
|
||||||
|
Let me fix both issues:
|
||||||
|
|
||||||
|
1. In `server.ex`: Generate index even when there are 0 org files
|
||||||
|
2. In `cli.ex`: Don't halt immediately when 0 org files - let the pipeline continue
|
||||||
|
|
||||||
|
### Tool Call [completed]: edit
|
||||||
|
|
||||||
|
**Tool:** edit
|
||||||
|
**Timestamp:** 2026-02-22 11:45:39
|
||||||
|
|
||||||
|
```
|
||||||
|
Edit applied successfully.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭─────────╮
|
||||||
|
│ changes │
|
||||||
|
╰─────────╯
|
||||||
|
|
||||||
|
@@ -2,6 +2,8 @@
|
||||||
|
case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
||||||
|
{:ok, 0} ->
|
||||||
|
Logger.warning("No .org files found in #{notes_dir}")
|
||||||
|
+ # Still generate index (will be empty or have default content)
|
||||||
|
+ OrgGarden.Index.generate(content_dir)
|
||||||
|
:ok
|
||||||
|
|
||||||
|
{:ok, count} ->
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:41)
|
||||||
|
|
||||||
|
Now let me fix the CLI as well - it shouldn't halt immediately when there are no files. That's overly aggressive. The pipeline should still complete (even if empty):
|
||||||
|
|
||||||
|
### Tool Call [completed]: edit
|
||||||
|
|
||||||
|
**Tool:** edit
|
||||||
|
**Timestamp:** 2026-02-22 11:45:46
|
||||||
|
|
||||||
|
```
|
||||||
|
Edit applied successfully.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
╭─────────╮
|
||||||
|
│ changes │
|
||||||
|
╰─────────╯
|
||||||
|
|
||||||
|
@@ -3,8 +3,7 @@
|
||||||
|
|
||||||
|
case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
||||||
|
{:ok, 0} ->
|
||||||
|
- IO.puts("No .org files found in #{notes_dir}")
|
||||||
|
- System.halt(0)
|
||||||
|
+ IO.puts(" no .org files found")
|
||||||
|
|
||||||
|
{:ok, count} ->
|
||||||
|
IO.puts(" exported #{count} file(s)")
|
||||||
|
```
|
||||||
|
## Agent (2026-02-22 11:45:49)
|
||||||
|
|
||||||
|
Now let's verify compilation:
|
||||||
|
|
||||||
|
### Tool Call [completed]: nix develop --command mix compile --warnings-as-errors
|
||||||
|
|
||||||
|
**Tool:** execute
|
||||||
|
**Timestamp:** 2026-02-22 11:45:52
|
||||||
|
|
||||||
|
```
|
||||||
|
warning: Git tree '/home/ignaciobll/code/org-garden' is dirty
|
||||||
|
Compiling 2 files (.ex)
|
||||||
|
Generated org_garden app
|
||||||
|
```
|
||||||
|
|||||||
@@ -306,8 +306,7 @@ defmodule OrgGarden.CLI do
|
|||||||
|
|
||||||
case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
||||||
{:ok, 0} ->
|
{:ok, 0} ->
|
||||||
IO.puts("No .org files found in #{notes_dir}")
|
IO.puts(" no .org files found")
|
||||||
System.halt(0)
|
|
||||||
|
|
||||||
{:ok, count} ->
|
{:ok, count} ->
|
||||||
IO.puts(" exported #{count} file(s)")
|
IO.puts(" exported #{count} file(s)")
|
||||||
|
|||||||
@@ -150,6 +150,8 @@ defmodule OrgGarden.Server do
|
|||||||
case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
case OrgGarden.Export.export_all(notes_dir, output_dir) do
|
||||||
{:ok, 0} ->
|
{:ok, 0} ->
|
||||||
Logger.warning("No .org files found in #{notes_dir}")
|
Logger.warning("No .org files found in #{notes_dir}")
|
||||||
|
# Still generate index (will be empty or have default content)
|
||||||
|
OrgGarden.Index.generate(content_dir)
|
||||||
:ok
|
:ok
|
||||||
|
|
||||||
{:ok, count} ->
|
{:ok, count} ->
|
||||||
|
|||||||
Reference in New Issue
Block a user