From e88b9792a4c887bf5cc81b7ec88efd1d2621e2c9 Mon Sep 17 00:00:00 2001 From: Bradley Erickson Date: Tue, 17 Feb 2026 10:09:06 -0500 Subject: [PATCH] updated links to repo and rawgit to jsdeliver --- README.md | 2 +- VERSION | 2 +- devops/tasks/remote_scripts/gitpaths.py | 2 +- devops/tasks/scripts/baseline_packages.fab | 2 +- docs/tutorials/install.md | 4 ++-- docs/tutorials/workshop.md | 12 ++++++------ extension/writing-process/package.json | 2 +- extension/writing-process/src/manifest.json | 2 +- learning_observer/VERSION | 2 +- .../communication_protocol/README.md | 2 +- learning_observer/learning_observer/downloads.py | 4 ++-- learning_observer/learning_observer/module.py | 6 +++--- learning_observer/learning_observer/routes.py | 2 +- .../learning_observer/static/debug.html | 2 +- .../learning_observer/static/modules/login.html | 2 +- .../learning_observer/static/webapp.html | 2 +- modules/lo_event/package.json | 6 +++--- modules/toy-assess/README.md | 2 +- modules/wo_bulk_essay_analysis/VERSION | 2 +- modules/wo_bulk_essay_analysis/setup.cfg | 2 +- modules/wo_common_student_errors/setup.cfg | 2 +- modules/wo_document_list/setup.cfg | 2 +- modules/wo_highlight_dashboard/setup.cfg | 2 +- modules/writing_observer/VERSION | 2 +- modules/writing_observer/writing_observer/module.py | 2 +- package.json | 6 +++--- requirements.txt | 2 +- scripts/package.json | 6 +++--- ux/ux.html | 2 +- wo_requirements.txt | 8 ++++---- 30 files changed, 48 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 8c56ebba..b555f227 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ learning analytics dashboard to help instructors be able to manage student learning processes, and in particular, student writing processes. -![linting](https://github.com/ETS-Next-Gen/writing_observer/actions/workflows/pycodestyle.yml/badge.svg) +![linting](https://github.com/ArgLab/writing_observer/actions/workflows/pycodestyle.yml/badge.svg) ## Learning Observer diff --git a/VERSION b/VERSION index 82977005..2e1b98f6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0+2026.02.03T15.21.57.253Z.1310c89e.berickson.20260130.execution.dag.single.value +0.1.0+2026.02.17T15.09.06.345Z.5f75e49b.berickson.20260217.updated.dead.links diff --git a/devops/tasks/remote_scripts/gitpaths.py b/devops/tasks/remote_scripts/gitpaths.py index 80801ca8..db0db4d5 100644 --- a/devops/tasks/remote_scripts/gitpaths.py +++ b/devops/tasks/remote_scripts/gitpaths.py @@ -10,7 +10,7 @@ def gitpath_to_name(packagepath): ''' Convert a git path to the name of the repo. For example: - `https://github.com/ETS-Next-Gen/writing_observer.git` ==> `writing_observer` + `https://github.com/ArgLab/writing_observer.git` ==> `writing_observer` ''' package = os.path.split(packagepath)[1] if package.endswith(".git"): diff --git a/devops/tasks/scripts/baseline_packages.fab b/devops/tasks/scripts/baseline_packages.fab index fbd88ece..a4b19fe9 100644 --- a/devops/tasks/scripts/baseline_packages.fab +++ b/devops/tasks/scripts/baseline_packages.fab @@ -1,4 +1,4 @@ cd sudo apt-get -y install git ansible awscli -git clone https://github.com/ETS-Next-Gen/writing_observer.git +git clone https://github.com/ArgLab/writing_observer.git cd writing_observer/devops/ansible ; sudo ansible-playbook local.yaml diff --git a/docs/tutorials/install.md b/docs/tutorials/install.md index 412765c0..9a5c177c 100644 --- a/docs/tutorials/install.md +++ b/docs/tutorials/install.md @@ -22,13 +22,13 @@ Have two terminal windows or tabs open. We will run the server in one and use th 1. Open a terminal and clone the repository: ```bash - git clone https://github.com/ETS-Next-Gen/writing_observer.git lo_tutorial + git clone https://github.com/ArgLab/writing_observer.git lo_tutorial ``` If you have an SSH key configured with GitHub, you can use: ```bash - git clone git@github.com:ETS-Next-Gen/writing_observer.git lo_tutorial + git clone git@github.com:ArgLab/writing_observer.git lo_tutorial ``` 2. Change into the new directory: diff --git a/docs/tutorials/workshop.md b/docs/tutorials/workshop.md index b10d595f..6fa12fee 100644 --- a/docs/tutorials/workshop.md +++ b/docs/tutorials/workshop.md @@ -48,13 +48,13 @@ If you don't have a way of managing Python virtual environments, or would prefer First make sure you clone the repository: ```bash -git clone https://github.com/ETS-Next-Gen/writing_observer.git lo_workshop +git clone https://github.com/ArgLab/writing_observer.git lo_workshop ``` **or**, if you have a github account properly configured with ssh: ```bash -git clone git@github.com:ETS-Next-Gen/writing_observer.git lo_workshop +git clone git@github.com:ArgLab/writing_observer.git lo_workshop ``` ```bash @@ -173,7 +173,7 @@ This will generate events for 10 students typing a set of loremipsum texts and s You can look at the format of these specific events in the `/learning_observer/learning_observer/logs/` directory. In the test system, we simply put events into log files, but we are gradually moving towards a more sophisticated, open-science, family-rights oriented data store (shown at the bottom of [this document](system_design.md). This is theoretically interesting, since it gives a cryptographically-verifiable way to audit what data was created and what analyses ran. -There are several good standards for [event formats](events.md), and to integrate learning data, we will need to support them all. Most of these have converged on a line of JSON per event, but the specifics are format-specific. We are including [some code](https://github.com/ETS-Next-Gen/writing_observer/blob/master/modules/lo_event/lo_event/xapi.cjs) to help support the major ones. However, the events here are somewhat bound to how Google Docs thinks about documents. +There are several good standards for [event formats](events.md), and to integrate learning data, we will need to support them all. Most of these have converged on a line of JSON per event, but the specifics are format-specific. We are including [some code](https://github.com/ArgLab/writing_observer/blob/master/modules/lo_event/lo_event/xapi.cjs) to help support the major ones. However, the events here are somewhat bound to how Google Docs thinks about documents. ## module.py @@ -251,7 +251,7 @@ In `module.py`, you see this line: EXECUTION_DAG = learning_observer.communication_protocol.util.generate_base_dag_for_student_reducer('student_event_counter', 'my_event_module') ``` -This is shorthand for a common query which JOINs the class roster with the output of the reducers. The Python code for the query itself is [here](https://github.com/ETS-Next-Gen/writing_observer/blob/berickson/workshop/learning_observer/learning_observer/communication_protocol/util.py#L58), but the jist of the code is: +This is shorthand for a common query which JOINs the class roster with the output of the reducers. The Python code for the query itself is [here](https://github.com/ArgLab/writing_observer/blob/berickson/workshop/learning_observer/learning_observer/communication_protocol/util.py#L58), but the jist of the code is: ```python 'roster': course_roster(runtime=q.parameter('runtime'), course_id=q.parameter("course_id", required=True)), @@ -326,11 +326,11 @@ Once set up, the development workflow here is rather fast, since the UX updates ### `lo_event` -Our data streaming library is [lo_event](https://github.com/ETS-Next-Gen/writing_observer/tree/master/modules/lo_event). This library is designed to stream events (typically) from a JavaScript client, and handles all of the complexity of things like persistance, queuing, and retries for you. Cookiecutter cde, but it should save you a bunch of time. +Our data streaming library is [lo_event](https://github.com/ArgLab/writing_observer/tree/master/modules/lo_event). This library is designed to stream events (typically) from a JavaScript client, and handles all of the complexity of things like persistance, queuing, and retries for you. Cookiecutter cde, but it should save you a bunch of time. ### `lo_assess` -Much more interesting, in development (and probably in need of renaming) is [`lo_assess`](https://github.com/ETS-Next-Gen/writing_observer/tree/pmitros/loevent-v2/modules/lo_event/lo_event/lo_assess). +Much more interesting, in development (and probably in need of renaming) is [`lo_assess`](https://github.com/ArgLab/writing_observer/tree/pmitros/loevent-v2/modules/lo_event/lo_event/lo_assess). There is an XML format (based on edX OLX, which is in turn based on LON-CAPA XML) for creating interactives. diff --git a/extension/writing-process/package.json b/extension/writing-process/package.json index b789a11c..d1bb950f 100644 --- a/extension/writing-process/package.json +++ b/extension/writing-process/package.json @@ -6,7 +6,7 @@ "author": "Piotr Mitros, Bradley Erickson", "repository": { "type": "git", - "url": "https://github.com/ETS-Next-Gen/writing_observer/tree/master/extension/writing-process" + "url": "https://github.com/ArgLab/writing_observer/tree/master/extension/writing-process" }, "scripts": { "ext:start": "xt-build -e dev -w", diff --git a/extension/writing-process/src/manifest.json b/extension/writing-process/src/manifest.json index ad7c064a..945ec770 100644 --- a/extension/writing-process/src/manifest.json +++ b/extension/writing-process/src/manifest.json @@ -2,7 +2,7 @@ "name": "__MSG_appName__", "short_name": "__MSG_appShortName__", "description": "__MSG_appDescription__", - "homepage_url": "https://github.com/ETS-Next-Gen/writing_observer/tree/master/extension/writing-process", + "homepage_url": "https://github.com/ArgLab/writing_observer/tree/master/extension/writing-process", "incognito": "not_allowed", "version": "1.0.0.2", "version_name": "1.0.0.2", diff --git a/learning_observer/VERSION b/learning_observer/VERSION index 82977005..2e1b98f6 100644 --- a/learning_observer/VERSION +++ b/learning_observer/VERSION @@ -1 +1 @@ -0.1.0+2026.02.03T15.21.57.253Z.1310c89e.berickson.20260130.execution.dag.single.value +0.1.0+2026.02.17T15.09.06.345Z.5f75e49b.berickson.20260217.updated.dead.links diff --git a/learning_observer/learning_observer/communication_protocol/README.md b/learning_observer/learning_observer/communication_protocol/README.md index 86b3f798..c86b24ce 100644 --- a/learning_observer/learning_observer/communication_protocol/README.md +++ b/learning_observer/learning_observer/communication_protocol/README.md @@ -25,7 +25,7 @@ In `module.py`, you see this line: EXECUTION_DAG = learning_observer.communication_protocol.util.generate_base_dag_for_student_reducer('student_event_counter', 'my_event_module') ``` -This is shorthand for a common query which JOINs the class roster with the output of the reducers. The Python code for the query itself is [here](https://github.com/ETS-Next-Gen/writing_observer/blob/berickson/workshop/learning_observer/learning_observer/communication_protocol/util.py#L58), but the jist of the code is: +This is shorthand for a common query which JOINs the class roster with the output of the reducers. The Python code for the query itself is [here](https://github.com/ArgLab/writing_observer/blob/berickson/workshop/learning_observer/learning_observer/communication_protocol/util.py#L58), but the jist of the code is: ```python 'roster': course_roster(runtime=q.parameter('runtime'), course_id=q.parameter("course_id", required=True)), diff --git a/learning_observer/learning_observer/downloads.py b/learning_observer/learning_observer/downloads.py index abea0476..f0c2c3a1 100644 --- a/learning_observer/learning_observer/downloads.py +++ b/learning_observer/learning_observer/downloads.py @@ -52,12 +52,12 @@ "62618d4bff6e51fafa25d41cb59bd97f3ebd72fd94ebd09a52c17c4c23fdca3962b" } SHOWDOWN_JS = { - "url": "https://rawgit.com/showdownjs/showdown/1.9.1/dist/showdown.js", + "url": "https://cdn.jsdelivr.net/gh/showdownjs/showdown@1.9.1/dist/showdown.js", "hash": "4fe14f17c2a1d0275d44e06d7e68d2b177779196c6d0c562d082eb5435eec" "4e710a625be524767aef3d9a1f6a5b88f912ddd71821f4a9df12ff7dd66d6fbb3c9" } SHOWDOWN_JS_MAP = { - "url": "https://rawgit.com/showdownjs/showdown/1.9.1/dist/showdown.js.map", + "url": "https://cdn.jsdelivr.net/gh/showdownjs/showdown@1.9.1/dist/showdown.js.map", "hash": "74690aa3cea07fd075942ba9e98cf7297752994b93930acb3a1baa2d3042a" "62b5523d3da83177f63e6c02fe2a09c8414af9e1774dad892a303e15a86dbeb29ba" } diff --git a/learning_observer/learning_observer/module.py b/learning_observer/learning_observer/module.py index e40fe77e..ddfa5a93 100644 --- a/learning_observer/learning_observer/module.py +++ b/learning_observer/learning_observer/module.py @@ -79,12 +79,12 @@ "62618d4bff6e51fafa25d41cb59bd97f3ebd72fd94ebd09a52c17c4c23fdca3962b" }, "showdown.js": { # Default markup library - "url": "https://rawgit.com/showdownjs/showdown/1.9.1/dist/showdown.js", + "url": "https://cdn.jsdelivr.net/gh/showdownjs/showdown@1.9.1/dist/showdown.js", "hash": "4fe14f17c2a1d0275d44e06d7e68d2b177779196c6d0c562d082eb5435eec" "4e710a625be524767aef3d9a1f6a5b88f912ddd71821f4a9df12ff7dd66d6fbb3c9" }, "showdown.js.map": { # Part of above - "url": "https://rawgit.com/showdownjs/showdown/1.9.1/dist/showdown.js.map", + "url": "https://cdn.jsdelivr.net/gh/showdownjs/showdown@1.9.1/dist/showdown.js.map", "hash": "74690aa3cea07fd075942ba9e98cf7297752994b93930acb3a1baa2d3042a" "62b5523d3da83177f63e6c02fe2a09c8414af9e1774dad892a303e15a86dbeb29ba" }, @@ -115,7 +115,7 @@ STATIC_FILE_GIT_REPOS = { # 'writing_observer': { # # Where we can grab a copy of the repo, if not already on the system - # 'url': 'https://github.com/ETS-Next-Gen/writing_observer.git', + # 'url': 'https://github.com/ArgLab/writing_observer.git', # # Where the static files in the repo lie # 'prefix': 'learning_observer/learning_observer/static', # # Branches we serve. This can either be a whitelist (e.g. which ones diff --git a/learning_observer/learning_observer/routes.py b/learning_observer/learning_observer/routes.py index fbe4e1a7..5fc12b7b 100644 --- a/learning_observer/learning_observer/routes.py +++ b/learning_observer/learning_observer/routes.py @@ -379,7 +379,7 @@ def register_repo_routes(app, repos): An example repo is: { - 'url': 'https://github.com/ETS-Next-Gen/writing_observer.git', // URL to the repo; downloaded if not already here + 'url': 'https://github.com/ArgLab/writing_observer.git', // URL to the repo; downloaded if not already here 'prefix': 'modules/writing_observer/writing_observer/static', // Path in repo to serve static files from 'module': 'wobserver', // Module name to use in the static path diff --git a/learning_observer/learning_observer/static/debug.html b/learning_observer/learning_observer/static/debug.html index c4cc6cdb..e647a827 100644 --- a/learning_observer/learning_observer/static/debug.html +++ b/learning_observer/learning_observer/static/debug.html @@ -51,7 +51,7 @@ Service. The source code is available under the - AGPLv3 license on github. + AGPLv3 license on github.

diff --git a/learning_observer/learning_observer/static/modules/login.html b/learning_observer/learning_observer/static/modules/login.html index 271e391d..d816638d 100644 --- a/learning_observer/learning_observer/static/modules/login.html +++ b/learning_observer/learning_observer/static/modules/login.html @@ -56,7 +56,7 @@

{{ server_name }}

Contribute - on github

+ on github

diff --git a/learning_observer/learning_observer/static/webapp.html b/learning_observer/learning_observer/static/webapp.html index 9effc938..9c27b1ff 100644 --- a/learning_observer/learning_observer/static/webapp.html +++ b/learning_observer/learning_observer/static/webapp.html @@ -51,7 +51,7 @@ Service. The source code is available under the - AGPLv3 license on github. + AGPLv3 license on github.

diff --git a/modules/lo_event/package.json b/modules/lo_event/package.json index f5e85ee5..75b64066 100644 --- a/modules/lo_event/package.json +++ b/modules/lo_event/package.json @@ -15,14 +15,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/ETS-Next-Gen/writing_observer.git" + "url": "git+https://github.com/ArgLab/writing_observer.git" }, "author": "Piotr Mitros", "license": "SEE LICENSE IN license.txt", "bugs": { - "url": "https://github.com/ETS-Next-Gen/writing_observer/issues" + "url": "https://github.com/ArgLab/writing_observer/issues" }, - "homepage": "https://github.com/ETS-Next-Gen/writing_observer#readme", + "homepage": "https://github.com/ArgLab/writing_observer#readme", "type": "module", "dependencies": { "aws-sdk": "^2.1614.0", diff --git a/modules/toy-assess/README.md b/modules/toy-assess/README.md index 1b05a709..c161a391 100644 --- a/modules/toy-assess/README.md +++ b/modules/toy-assess/README.md @@ -8,7 +8,7 @@ This may require also running npm audit fix You will also need to install writing_observer and package up lo_event to use inside the project. -Place to clone from: https://github.com/ETS-Next-Gen/writing_observer +Place to clone from: https://github.com/ArgLab/writing_observer cd to cloned directory, type npm install Then, inside writing_observer/modules/lo_event: diff --git a/modules/wo_bulk_essay_analysis/VERSION b/modules/wo_bulk_essay_analysis/VERSION index 696424a4..2e1b98f6 100644 --- a/modules/wo_bulk_essay_analysis/VERSION +++ b/modules/wo_bulk_essay_analysis/VERSION @@ -1 +1 @@ -0.1.0+2025.09.30T15.53.18.556Z.1c72d9e1.master +0.1.0+2026.02.17T15.09.06.345Z.5f75e49b.berickson.20260217.updated.dead.links diff --git a/modules/wo_bulk_essay_analysis/setup.cfg b/modules/wo_bulk_essay_analysis/setup.cfg index 9f5cfb10..a1883dcd 100644 --- a/modules/wo_bulk_essay_analysis/setup.cfg +++ b/modules/wo_bulk_essay_analysis/setup.cfg @@ -1,7 +1,7 @@ [metadata] name = WO Bulk Essay Analysis description = Dashboard for interfacing a classroom of essays with automated feedback -url = https://github.com/ETS-Next-Gen/writing_observer +url = https://github.com/ArgLab/writing_observer version = file:VERSION [options] diff --git a/modules/wo_common_student_errors/setup.cfg b/modules/wo_common_student_errors/setup.cfg index cec31a2f..0f7c59fe 100644 --- a/modules/wo_common_student_errors/setup.cfg +++ b/modules/wo_common_student_errors/setup.cfg @@ -1,7 +1,7 @@ [metadata] name = Writing Observer Common Student Errors description = Dashboard for viewing errors across a classroom of students. -url = https://github.com/ETS-Next-Gen/writing_observer +url = https://github.com/ArgLab/writing_observer version = 0.1 [options] diff --git a/modules/wo_document_list/setup.cfg b/modules/wo_document_list/setup.cfg index 01be4a27..1d99323f 100644 --- a/modules/wo_document_list/setup.cfg +++ b/modules/wo_document_list/setup.cfg @@ -1,7 +1,7 @@ [metadata] name = Writing Observer List of Documents description = Dashboard for viewing documents from various sources for each student. -url = https://github.com/ETS-Next-Gen/writing_observer +url = https://github.com/ArgLab/writing_observer version = 0.1 [options] diff --git a/modules/wo_highlight_dashboard/setup.cfg b/modules/wo_highlight_dashboard/setup.cfg index 617f176d..af3d30f0 100644 --- a/modules/wo_highlight_dashboard/setup.cfg +++ b/modules/wo_highlight_dashboard/setup.cfg @@ -1,7 +1,7 @@ [metadata] name = Dash Writing Observer Class Highlight Dashboard description = Dashboard using Dash for the Writing Observer -url = https://github.com/ETS-Next-Gen/writing_observer +url = https://github.com/ArgLab/writing_observer version = 0.1 [options] diff --git a/modules/writing_observer/VERSION b/modules/writing_observer/VERSION index 0d5696b3..2e1b98f6 100644 --- a/modules/writing_observer/VERSION +++ b/modules/writing_observer/VERSION @@ -1 +1 @@ -0.1.0+2026.02.02T20.54.51.168Z.c0f2a8f0.berickson.20260113.extension.tab.ids +0.1.0+2026.02.17T15.09.06.345Z.5f75e49b.berickson.20260217.updated.dead.links diff --git a/modules/writing_observer/writing_observer/module.py b/modules/writing_observer/writing_observer/module.py index b23df832..3b9154d9 100644 --- a/modules/writing_observer/writing_observer/module.py +++ b/modules/writing_observer/writing_observer/module.py @@ -359,7 +359,7 @@ STATIC_FILE_GIT_REPOS = { 'writing_observer': { # Where we can grab a copy of the repo, if not already on the system - 'url': 'https://github.com/ETS-Next-Gen/writing_observer.git', + 'url': 'https://github.com/ArgLab/writing_observer.git', # Where the static files in the repo lie 'prefix': 'modules/writing_observer/writing_observer/static', # Branches we serve. This can either be a whitelist (e.g. which ones diff --git a/package.json b/package.json index 76f3136f..a7618690 100644 --- a/package.json +++ b/package.json @@ -15,14 +15,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/ETS-Next-Gen/writing_observer.git" + "url": "git+https://github.com/ArgLab/writing_observer.git" }, "author": "", "license": "SEE LICENSE IN LICENSE.TXT", "bugs": { - "url": "https://github.com/ETS-Next-Gen/writing_observer/issues" + "url": "https://github.com/ArgLab/writing_observer/issues" }, - "homepage": "https://github.com/ETS-Next-Gen/writing_observer#readme", + "homepage": "https://github.com/ArgLab/writing_observer#readme", "devDependencies": { "@actions/core": "^1.10.0", "eslint": "^8.38.0", diff --git a/requirements.txt b/requirements.txt index d052bba1..ad7eb08c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -37,4 +37,4 @@ svgwrite uvloop watchdog -gitserve @ git+https://github.com/ETS-Next-Gen/writing_observer.git#subdirectory=gitserve +gitserve @ git+https://github.com/ArgLab/writing_observer.git#subdirectory=gitserve diff --git a/scripts/package.json b/scripts/package.json index ca6df8c8..7a25eaad 100644 --- a/scripts/package.json +++ b/scripts/package.json @@ -8,14 +8,14 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/ETS-Next-Gen/writing_observer.git" + "url": "git+https://github.com/ArgLab/writing_observer.git" }, "author": "Piotr Mitros", "license": "AGPL-3.0", "bugs": { - "url": "https://github.com/ETS-Next-Gen/writing_observer/issues" + "url": "https://github.com/ArgLab/writing_observer/issues" }, - "homepage": "https://github.com/ETS-Next-Gen/writing_observer#readme", + "homepage": "https://github.com/ArgLab/writing_observer#readme", "dependencies": { "ws": "^8.17.1" } diff --git a/ux/ux.html b/ux/ux.html index 2ff54a62..d66bdd19 100644 --- a/ux/ux.html +++ b/ux/ux.html @@ -13,7 +13,7 @@ - + diff --git a/wo_requirements.txt b/wo_requirements.txt index 5d42da25..6741b1cd 100644 --- a/wo_requirements.txt +++ b/wo_requirements.txt @@ -1,4 +1,4 @@ -writing_observer @ git+https://github.com/ETS-Next-Gen/writing_observer.git#subdirectory=modules/writing_observer/ -lo_gpt @ git+https://github.com/ETS-Next-Gen/writing_observer.git#subdirectory=modules/lo_gpt/ -wo_bulk_essay_analysis @ git+https://github.com/ETS-Next-Gen/writing_observer.git#subdirectory=modules/wo_bulk_essay_analysis/ -wo_classroom_text_highlighter @ git+https://github.com/ETS-Next-Gen/writing_observer.git#subdirectory=modules/wo_classroom_text_highlighter/ +writing_observer @ git+https://github.com/ArgLab/writing_observer.git#subdirectory=modules/writing_observer/ +lo_gpt @ git+https://github.com/ArgLab/writing_observer.git#subdirectory=modules/lo_gpt/ +wo_bulk_essay_analysis @ git+https://github.com/ArgLab/writing_observer.git#subdirectory=modules/wo_bulk_essay_analysis/ +wo_classroom_text_highlighter @ git+https://github.com/ArgLab/writing_observer.git#subdirectory=modules/wo_classroom_text_highlighter/