FossilRepo
Add Fossil Guide: curated docs section + doc page viewer - Curated index page with categorized links to Fossil documentation: Getting Started, Version Control, Built-in Features, Administration, Reference - Doc page viewer reads .wiki/.md files from the Fossil repo source tree and renders through the Fossil content renderer - "Fossil Guide" link in sidebar with graduation cap icon - Reads docs from the fossil-scm project's www/ directory
Commit
25bbd0575b81f3136f398594d61c6bc308b37dfe9e3ee11773424cf044937621
Parent
1c110be73edc162…
5 files changed
+2
+48
+17
+62
+10
+2
| --- fossil/urls.py | ||
| +++ fossil/urls.py | ||
| @@ -18,6 +18,8 @@ | ||
| 18 | 18 | path("wiki/edit/<path:page_name>", views.wiki_edit, name="wiki_edit"), |
| 19 | 19 | path("tickets/create/", views.ticket_create, name="ticket_create"), |
| 20 | 20 | path("forum/", views.forum_list, name="forum"), |
| 21 | 21 | path("forum/<str:thread_uuid>/", views.forum_thread, name="forum_thread"), |
| 22 | 22 | path("user/<str:username>/", views.user_activity, name="user_activity"), |
| 23 | + path("docs/", views.fossil_docs, name="docs"), | |
| 24 | + path("docs/<path:doc_path>", views.fossil_doc_page, name="doc_page"), | |
| 23 | 25 | ] |
| 24 | 26 |
| --- fossil/urls.py | |
| +++ fossil/urls.py | |
| @@ -18,6 +18,8 @@ | |
| 18 | path("wiki/edit/<path:page_name>", views.wiki_edit, name="wiki_edit"), |
| 19 | path("tickets/create/", views.ticket_create, name="ticket_create"), |
| 20 | path("forum/", views.forum_list, name="forum"), |
| 21 | path("forum/<str:thread_uuid>/", views.forum_thread, name="forum_thread"), |
| 22 | path("user/<str:username>/", views.user_activity, name="user_activity"), |
| 23 | ] |
| 24 |
| --- fossil/urls.py | |
| +++ fossil/urls.py | |
| @@ -18,6 +18,8 @@ | |
| 18 | path("wiki/edit/<path:page_name>", views.wiki_edit, name="wiki_edit"), |
| 19 | path("tickets/create/", views.ticket_create, name="ticket_create"), |
| 20 | path("forum/", views.forum_list, name="forum"), |
| 21 | path("forum/<str:thread_uuid>/", views.forum_thread, name="forum_thread"), |
| 22 | path("user/<str:username>/", views.user_activity, name="user_activity"), |
| 23 | path("docs/", views.fossil_docs, name="docs"), |
| 24 | path("docs/<path:doc_path>", views.fossil_doc_page, name="doc_page"), |
| 25 | ] |
| 26 |
+48
| --- fossil/views.py | ||
| +++ fossil/views.py | ||
| @@ -692,10 +692,58 @@ | ||
| 692 | 692 | "activity": activity, |
| 693 | 693 | "active_tab": "timeline", |
| 694 | 694 | }, |
| 695 | 695 | ) |
| 696 | 696 | |
| 697 | + | |
| 698 | +# --- Fossil Docs --- | |
| 699 | + | |
| 700 | +FOSSIL_SCM_SLUG = "fossil-scm" | |
| 701 | + | |
| 702 | + | |
| 703 | +@login_required | |
| 704 | +def fossil_docs(request, slug): | |
| 705 | + """Curated Fossil documentation index page.""" | |
| 706 | + P.PROJECT_VIEW.check(request.user) | |
| 707 | + project = get_object_or_404(Project, slug=slug, deleted_at__isnull=True) | |
| 708 | + return render(request, "fossil/docs_index.html", {"project": project, "fossil_scm_slug": slug, "active_tab": "wiki"}) | |
| 709 | + | |
| 710 | + | |
| 711 | +@login_required | |
| 712 | +def fossil_doc_page(request, slug, doc_path): | |
| 713 | + """Render a documentation file from the Fossil repo source tree.""" | |
| 714 | + P.PROJECT_VIEW.check(request.user) | |
| 715 | + project, fossil_repo, reader = _get_repo_and_reader(slug) | |
| 716 | + | |
| 717 | + with reader: | |
| 718 | + checkin_uuid = reader.get_latest_checkin_uuid() | |
| 719 | + files = reader.get_files_at_checkin(checkin_uuid) if checkin_uuid else [] | |
| 720 | + | |
| 721 | + target = None | |
| 722 | + for f in files: | |
| 723 | + if f.name == doc_path: | |
| 724 | + target = f | |
| 725 | + break | |
| 726 | + | |
| 727 | + if not target: | |
| 728 | + raise Http404(f"Documentation file not found: {doc_path}") | |
| 729 | + | |
| 730 | + content_bytes = reader.get_file_content(target.uuid) | |
| 731 | + | |
| 732 | + try: | |
| 733 | + content = content_bytes.decode("utf-8") | |
| 734 | + except UnicodeDecodeError as e: | |
| 735 | + raise Http404("Binary file cannot be rendered as documentation") from e | |
| 736 | + | |
| 737 | + content_html = mark_safe(_render_fossil_content(content, project_slug=slug)) | |
| 738 | + | |
| 739 | + return render( | |
| 740 | + request, | |
| 741 | + "fossil/doc_page.html", | |
| 742 | + {"project": project, "doc_path": doc_path, "content_html": content_html, "active_tab": "wiki"}, | |
| 743 | + ) | |
| 744 | + | |
| 697 | 745 | |
| 698 | 746 | # --- Helpers --- |
| 699 | 747 | |
| 700 | 748 | |
| 701 | 749 | def _build_file_tree(files, current_dir=""): |
| 702 | 750 | |
| 703 | 751 | ADDED templates/fossil/doc_page.html |
| 704 | 752 | ADDED templates/fossil/docs_index.html |
| --- fossil/views.py | |
| +++ fossil/views.py | |
| @@ -692,10 +692,58 @@ | |
| 692 | "activity": activity, |
| 693 | "active_tab": "timeline", |
| 694 | }, |
| 695 | ) |
| 696 | |
| 697 | |
| 698 | # --- Helpers --- |
| 699 | |
| 700 | |
| 701 | def _build_file_tree(files, current_dir=""): |
| 702 | |
| 703 | DDED templates/fossil/doc_page.html |
| 704 | DDED templates/fossil/docs_index.html |
| --- fossil/views.py | |
| +++ fossil/views.py | |
| @@ -692,10 +692,58 @@ | |
| 692 | "activity": activity, |
| 693 | "active_tab": "timeline", |
| 694 | }, |
| 695 | ) |
| 696 | |
| 697 | |
| 698 | # --- Fossil Docs --- |
| 699 | |
| 700 | FOSSIL_SCM_SLUG = "fossil-scm" |
| 701 | |
| 702 | |
| 703 | @login_required |
| 704 | def fossil_docs(request, slug): |
| 705 | """Curated Fossil documentation index page.""" |
| 706 | P.PROJECT_VIEW.check(request.user) |
| 707 | project = get_object_or_404(Project, slug=slug, deleted_at__isnull=True) |
| 708 | return render(request, "fossil/docs_index.html", {"project": project, "fossil_scm_slug": slug, "active_tab": "wiki"}) |
| 709 | |
| 710 | |
| 711 | @login_required |
| 712 | def fossil_doc_page(request, slug, doc_path): |
| 713 | """Render a documentation file from the Fossil repo source tree.""" |
| 714 | P.PROJECT_VIEW.check(request.user) |
| 715 | project, fossil_repo, reader = _get_repo_and_reader(slug) |
| 716 | |
| 717 | with reader: |
| 718 | checkin_uuid = reader.get_latest_checkin_uuid() |
| 719 | files = reader.get_files_at_checkin(checkin_uuid) if checkin_uuid else [] |
| 720 | |
| 721 | target = None |
| 722 | for f in files: |
| 723 | if f.name == doc_path: |
| 724 | target = f |
| 725 | break |
| 726 | |
| 727 | if not target: |
| 728 | raise Http404(f"Documentation file not found: {doc_path}") |
| 729 | |
| 730 | content_bytes = reader.get_file_content(target.uuid) |
| 731 | |
| 732 | try: |
| 733 | content = content_bytes.decode("utf-8") |
| 734 | except UnicodeDecodeError as e: |
| 735 | raise Http404("Binary file cannot be rendered as documentation") from e |
| 736 | |
| 737 | content_html = mark_safe(_render_fossil_content(content, project_slug=slug)) |
| 738 | |
| 739 | return render( |
| 740 | request, |
| 741 | "fossil/doc_page.html", |
| 742 | {"project": project, "doc_path": doc_path, "content_html": content_html, "active_tab": "wiki"}, |
| 743 | ) |
| 744 | |
| 745 | |
| 746 | # --- Helpers --- |
| 747 | |
| 748 | |
| 749 | def _build_file_tree(files, current_dir=""): |
| 750 | |
| 751 | DDED templates/fossil/doc_page.html |
| 752 | DDED templates/fossil/docs_index.html |
| --- a/templates/fossil/doc_page.html | ||
| +++ b/templates/fossil/doc_page.html | ||
| @@ -0,0 +1,17 @@ | ||
| 1 | +{% extends "base.html" %} | |
| 2 | +{% block title %}{{ doc_path }} — Fossil Guide — Fossilrepo{% endblock %} | |
| 3 | + | |
| 4 | +{% block content %} | |
| 5 | +<div class="max-w-4xl"> | |
| 6 | + <div class="mb-4"> | |
| 7 | + <a href="{% url 'fossil:docs' slug=project.slug %}" class="text-sm text-brand-light hover:text-bd">← Back to FossilSCM Guide</a> | |
| 8 | + </div> | |
| 9 | + | |
| 10 | + <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700"> | |
| 11 | + <div class="px-6 py-4 border-b border-gray-700"> | |
| 12 | + <h1 class="text-lg font-semibold text-gray-100 font-mono">{{ doc_path }}</h1> | |
| 13 | + </div> | |
| 14 | + <div class="px-6 py-6"> | |
| 15 | + <div class="prose prose-invert prose-gray max-w-none"> | |
| 16 | + {{ content_html }} | |
| 17 | + |
| --- a/templates/fossil/doc_page.html | |
| +++ b/templates/fossil/doc_page.html | |
| @@ -0,0 +1,17 @@ | |
| --- a/templates/fossil/doc_page.html | |
| +++ b/templates/fossil/doc_page.html | |
| @@ -0,0 +1,17 @@ | |
| 1 | {% extends "base.html" %} |
| 2 | {% block title %}{{ doc_path }} — Fossil Guide — Fossilrepo{% endblock %} |
| 3 | |
| 4 | {% block content %} |
| 5 | <div class="max-w-4xl"> |
| 6 | <div class="mb-4"> |
| 7 | <a href="{% url 'fossil:docs' slug=project.slug %}" class="text-sm text-brand-light hover:text-bd">← Back to FossilSCM Guide</a> |
| 8 | </div> |
| 9 | |
| 10 | <div class="overflow-hidden rounded-lg bg-gray-800 shadow border border-gray-700"> |
| 11 | <div class="px-6 py-4 border-b border-gray-700"> |
| 12 | <h1 class="text-lg font-semibold text-gray-100 font-mono">{{ doc_path }}</h1> |
| 13 | </div> |
| 14 | <div class="px-6 py-6"> |
| 15 | <div class="prose prose-invert prose-gray max-w-none"> |
| 16 | {{ content_html }} |
| 17 |
| --- a/templates/fossil/docs_index.html | ||
| +++ b/templates/fossil/docs_index.html | ||
| @@ -0,0 +1,62 @@ | ||
| 1 | +{% extends "base.html" | |
| 2 | +{% block title %}FossilSCM Guide — Fossilrepo{% endblock %} | |
| 3 | + | |
| 4 | +{% block content %} | |
| 5 | +<div class="max-w-4xl"> | |
| 6 | + <h1 class="text-2xl font-bold Guide</h1> | |
| 7 | + <p class6"text-sm text-gray-400 mb-4">Reference documentation for Fossil SCr, bundled grid grid-cols-1 gap-4 sm:grid-cols-2"> | |
| 8 | + | |
| 9 | + <div class="rounded-lg bg-gray-800 border border-gray-700 p-5"> | |
| 10 | + <h3 class="text-sm font-semibold text-gray-200 mb-3 uppercase tracking-wider">Getting Started</h3> | |
| 11 | + <div class="space-y-2"> | |
| 12 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/quickstart.wiki' %}" class="block text-sm text-bra500 flex-shrink-0"></span> Quick Start Guide</a> | |
| 13 | + <a href="{% url 'fossil:doc_page' slugblock text-sm text-braBuilding from Source</a> | |
| 14 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/concepts.wiki' %}" class="block text-sm text-braCore Concepts</a> | |
| 15 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_pathblock text-sm text-braFAQ <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/chat.md' %}" class="flexgap-2 text-sm text-brand-light hover:text-brand"> | |
| 16 | + <span class="w-2 h-2 rounde{% extends "base.html" %} | |
| 17 | +{% block title %}FossilSCM Guide — Fossilrepo{% endblock %} | |
| 18 | + | |
| 19 | +{% block content %} | |
| 20 | +<div class="max-w-4xl"> | |
| 21 | + <h1 class="text-2xock t text-sm text-brand-light hover:text-brand"> | |
| 22 | + <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Backups</a> | |
| 23 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/fileformat.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> | |
| 24 | + <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> File Format</a> | |
| 25 | + </div> | |
| 26 | + </div> | |
| 27 | + | |
| 28 | + <div class="rounded-lg bg-gray-800 border border-gray-700 p-5 sm:col-span-2"> | |
| 29 | + <h3 class="text-sm font-semibold text-gray-200 mb-3 uppercase tracking-wider">Reference</h3> | |
| 30 | + <div class="grid grid-cols-1 sm:grid-cols-2 gap-2"> | |
| 31 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/changes.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> | |
| 32 | + <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Changelog</a> | |
| 33 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/permutedindex.html' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> | |
| 34 | + <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Command Reference</a> | |
| 35 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/th1.md' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> | |
| 36 | + <span class="w-2 h-2 rounded-full bg-gray-600 flex-shrink-0"></span> TH1 Scripting | |
| 37 | + <span class="text-xs text-gray-500">(native Fossil only)</span></a> | |
| 38 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/fossil-v-git.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> | |
| 39 | + <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Fossil vs Git</a> | |
| 40 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/hashpolicy.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> | |
| 41 | + <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Hash Policy</a> | |
| 42 | + <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/embeddeddoc.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> | |
| 43 | + <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Embedded Docs</a> | |
| 44 | + </div> | |
| 45 | + </div> | |
| 46 | + | |
| 47 | + </div> | |
| 48 | + | |
| 49 | + <!-- FossilRepo-specific additions --> | |
| 50 | + <div class="mt-6 rounded-lg bg-gray-800/50 border border-gray-700 p-5"> | |
| 51 | + <h3 class="text-sm font-semibold text-gray-200 mb-2">FossilRepo Additions</h3> | |
| 52 | + <p class="text-xs text-gray-400 mb-3">Features added by FossilRepo beyond native Fossil:</p> | |
| 53 | + <div class="grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm text-gray-400"> | |
| 54 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Git mirror sync (GitHub/GitLab)</span> | |
| 55 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> MCP server for AI tools</span> | |
| 56 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> JSON API + batch operations</span> | |
| 57 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Agent workspaces + task claiming</span> | |
| 58 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> CI status checks + SVG badges</span> | |
| 59 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Webhooks with HMAC signing</span> | |
| 60 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Org roles + project-level RBAC</span> | |
| 61 | + <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Release management with archives</span> | |
| 62 | + <span class="flex items-center gap-2"><sp |
| --- a/templates/fossil/docs_index.html | |
| +++ b/templates/fossil/docs_index.html | |
| @@ -0,0 +1,62 @@ | |
| --- a/templates/fossil/docs_index.html | |
| +++ b/templates/fossil/docs_index.html | |
| @@ -0,0 +1,62 @@ | |
| 1 | {% extends "base.html" |
| 2 | {% block title %}FossilSCM Guide — Fossilrepo{% endblock %} |
| 3 | |
| 4 | {% block content %} |
| 5 | <div class="max-w-4xl"> |
| 6 | <h1 class="text-2xl font-bold Guide</h1> |
| 7 | <p class6"text-sm text-gray-400 mb-4">Reference documentation for Fossil SCr, bundled grid grid-cols-1 gap-4 sm:grid-cols-2"> |
| 8 | |
| 9 | <div class="rounded-lg bg-gray-800 border border-gray-700 p-5"> |
| 10 | <h3 class="text-sm font-semibold text-gray-200 mb-3 uppercase tracking-wider">Getting Started</h3> |
| 11 | <div class="space-y-2"> |
| 12 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/quickstart.wiki' %}" class="block text-sm text-bra500 flex-shrink-0"></span> Quick Start Guide</a> |
| 13 | <a href="{% url 'fossil:doc_page' slugblock text-sm text-braBuilding from Source</a> |
| 14 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/concepts.wiki' %}" class="block text-sm text-braCore Concepts</a> |
| 15 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_pathblock text-sm text-braFAQ <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/chat.md' %}" class="flexgap-2 text-sm text-brand-light hover:text-brand"> |
| 16 | <span class="w-2 h-2 rounde{% extends "base.html" %} |
| 17 | {% block title %}FossilSCM Guide — Fossilrepo{% endblock %} |
| 18 | |
| 19 | {% block content %} |
| 20 | <div class="max-w-4xl"> |
| 21 | <h1 class="text-2xock t text-sm text-brand-light hover:text-brand"> |
| 22 | <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Backups</a> |
| 23 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/fileformat.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> |
| 24 | <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> File Format</a> |
| 25 | </div> |
| 26 | </div> |
| 27 | |
| 28 | <div class="rounded-lg bg-gray-800 border border-gray-700 p-5 sm:col-span-2"> |
| 29 | <h3 class="text-sm font-semibold text-gray-200 mb-3 uppercase tracking-wider">Reference</h3> |
| 30 | <div class="grid grid-cols-1 sm:grid-cols-2 gap-2"> |
| 31 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/changes.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> |
| 32 | <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Changelog</a> |
| 33 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/permutedindex.html' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> |
| 34 | <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Command Reference</a> |
| 35 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/th1.md' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> |
| 36 | <span class="w-2 h-2 rounded-full bg-gray-600 flex-shrink-0"></span> TH1 Scripting |
| 37 | <span class="text-xs text-gray-500">(native Fossil only)</span></a> |
| 38 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/fossil-v-git.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> |
| 39 | <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Fossil vs Git</a> |
| 40 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/hashpolicy.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> |
| 41 | <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Hash Policy</a> |
| 42 | <a href="{% url 'fossil:doc_page' slug=fossil_scm_slug doc_path='www/embeddeddoc.wiki' %}" class="flex items-center gap-2 text-sm text-brand-light hover:text-brand"> |
| 43 | <span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Embedded Docs</a> |
| 44 | </div> |
| 45 | </div> |
| 46 | |
| 47 | </div> |
| 48 | |
| 49 | <!-- FossilRepo-specific additions --> |
| 50 | <div class="mt-6 rounded-lg bg-gray-800/50 border border-gray-700 p-5"> |
| 51 | <h3 class="text-sm font-semibold text-gray-200 mb-2">FossilRepo Additions</h3> |
| 52 | <p class="text-xs text-gray-400 mb-3">Features added by FossilRepo beyond native Fossil:</p> |
| 53 | <div class="grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm text-gray-400"> |
| 54 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Git mirror sync (GitHub/GitLab)</span> |
| 55 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> MCP server for AI tools</span> |
| 56 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> JSON API + batch operations</span> |
| 57 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Agent workspaces + task claiming</span> |
| 58 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> CI status checks + SVG badges</span> |
| 59 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Webhooks with HMAC signing</span> |
| 60 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Org roles + project-level RBAC</span> |
| 61 | <span class="flex items-center gap-2"><span class="w-2 h-2 rounded-full bg-green-500 flex-shrink-0"></span> Release management with archives</span> |
| 62 | <span class="flex items-center gap-2"><sp |
| --- templates/includes/sidebar.html | ||
| +++ templates/includes/sidebar.html | ||
| @@ -131,10 +131,20 @@ | ||
| 131 | 131 | </a> |
| 132 | 132 | {% endif %} |
| 133 | 133 | </div> |
| 134 | 134 | </div> |
| 135 | 135 | {% endif %} |
| 136 | + | |
| 137 | + <!-- Fossil Guide --> | |
| 138 | + <a href="{% url 'fossil:docs' slug='fossil-scm' %}" | |
| 139 | + class="flex items-center gap-2 rounded-md px-2 py-2 text-sm font-medium {% if '/fossil/docs/' in request.path %}bg-gray-800 text-white{% else %}text-gray-400 hover:bg-gray-800 hover:text-white{% endif %}" | |
| 140 | + :title="collapsed ? 'Fossil Guide' : ''"> | |
| 141 | + <svg class="h-4 w-4 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> | |
| 142 | + <path stroke-linecap="round" stroke-linejoin="round" d="M4.26 10.147a60.438 60.438 0 00-.491 6.347A48.62 48.62 0 0112 20.904a48.62 48.62 0 018.232-4.41 60.46 60.46 0 00-.491-6.347m-15.482 0a50.636 50.636 0 00-2.658-.813A59.906 59.906 0 0112 3.493a59.903 59.903 0 0110.399 5.84c-.896.248-1.783.52-2.658.814m-15.482 0A50.717 50.717 0 0112 13.489a50.702 50.702 0 017.74-3.342M6.75 15a.75.75 0 100-1.5.75.75 0 000 1.5zm0 0v-3.675A55.378 55.378 0 0112 8.443m-7.007 11.55A5.981 5.981 0 006.75 15.75v-1.5" /> | |
| 143 | + </svg> | |
| 144 | + <span x-show="!collapsed" class="truncate">Fossil Guide</span> | |
| 145 | + </a> | |
| 136 | 146 | |
| 137 | 147 | <!-- Settings --> |
| 138 | 148 | {% if perms.organization.view_organization %} |
| 139 | 149 | <a href="{% url 'organization:settings' %}" |
| 140 | 150 | class="flex items-center gap-2 rounded-md px-2 py-2 text-sm font-medium {% if '/settings/' in request.path and '/settings/teams/' not in request.path %}bg-gray-800 text-white{% else %}text-gray-400 hover:bg-gray-800 hover:text-white{% endif %}" |
| 141 | 151 |
| --- templates/includes/sidebar.html | |
| +++ templates/includes/sidebar.html | |
| @@ -131,10 +131,20 @@ | |
| 131 | </a> |
| 132 | {% endif %} |
| 133 | </div> |
| 134 | </div> |
| 135 | {% endif %} |
| 136 | |
| 137 | <!-- Settings --> |
| 138 | {% if perms.organization.view_organization %} |
| 139 | <a href="{% url 'organization:settings' %}" |
| 140 | class="flex items-center gap-2 rounded-md px-2 py-2 text-sm font-medium {% if '/settings/' in request.path and '/settings/teams/' not in request.path %}bg-gray-800 text-white{% else %}text-gray-400 hover:bg-gray-800 hover:text-white{% endif %}" |
| 141 |
| --- templates/includes/sidebar.html | |
| +++ templates/includes/sidebar.html | |
| @@ -131,10 +131,20 @@ | |
| 131 | </a> |
| 132 | {% endif %} |
| 133 | </div> |
| 134 | </div> |
| 135 | {% endif %} |
| 136 | |
| 137 | <!-- Fossil Guide --> |
| 138 | <a href="{% url 'fossil:docs' slug='fossil-scm' %}" |
| 139 | class="flex items-center gap-2 rounded-md px-2 py-2 text-sm font-medium {% if '/fossil/docs/' in request.path %}bg-gray-800 text-white{% else %}text-gray-400 hover:bg-gray-800 hover:text-white{% endif %}" |
| 140 | :title="collapsed ? 'Fossil Guide' : ''"> |
| 141 | <svg class="h-4 w-4 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor"> |
| 142 | <path stroke-linecap="round" stroke-linejoin="round" d="M4.26 10.147a60.438 60.438 0 00-.491 6.347A48.62 48.62 0 0112 20.904a48.62 48.62 0 018.232-4.41 60.46 60.46 0 00-.491-6.347m-15.482 0a50.636 50.636 0 00-2.658-.813A59.906 59.906 0 0112 3.493a59.903 59.903 0 0110.399 5.84c-.896.248-1.783.52-2.658.814m-15.482 0A50.717 50.717 0 0112 13.489a50.702 50.702 0 017.74-3.342M6.75 15a.75.75 0 100-1.5.75.75 0 000 1.5zm0 0v-3.675A55.378 55.378 0 0112 8.443m-7.007 11.55A5.981 5.981 0 006.75 15.75v-1.5" /> |
| 143 | </svg> |
| 144 | <span x-show="!collapsed" class="truncate">Fossil Guide</span> |
| 145 | </a> |
| 146 | |
| 147 | <!-- Settings --> |
| 148 | {% if perms.organization.view_organization %} |
| 149 | <a href="{% url 'organization:settings' %}" |
| 150 | class="flex items-center gap-2 rounded-md px-2 py-2 text-sm font-medium {% if '/settings/' in request.path and '/settings/teams/' not in request.path %}bg-gray-800 text-white{% else %}text-gray-400 hover:bg-gray-800 hover:text-white{% endif %}" |
| 151 |