Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
51e37bc
wip: snapshot hypeR review changes before client overhaul
Cvicnaire Sep 14, 2026
4da9638
feat: getHypeRGenesets with genesets = "msigdb" and a correct MSigDB …
Cvicnaire Sep 14, 2026
120aee8
feat: hypeR-native query vectors with group_label split and ordered s…
Cvicnaire Sep 14, 2026
0b86e4f
feat: hypeR-native runHypeR returning hyp/multihyp with SigRepo prove…
Cvicnaire Sep 14, 2026
0d547be
docs: document the hypeR-native client and its breaking changes
Cvicnaire Sep 14, 2026
4963fe1
fix: unique query names, safe probe_id join, input validation and zer…
Cvicnaire Sep 14, 2026
f33235d
fix: zero-weight kstest guard checks genesets within a gene-vector ba…
Cvicnaire Sep 14, 2026
4398f74
docs: rewrite the hypeR tutorial for the hypeR-native client
Cvicnaire Sep 14, 2026
d021c2c
chore: declare openxlsx in Suggests for the hypeR client tests
Cvicnaire Sep 14, 2026
e3e913d
fix: kstest docs match hypeR's p-values, difexp background contains t…
Cvicnaire Sep 14, 2026
7a23956
feat: kstest direction and signature ranking, input-driven return typ…
Cvicnaire Sep 15, 2026
49704c8
docs: hypeR tutorial and NEWS for direction, ks_source, return types …
Cvicnaire Sep 15, 2026
ecdeac6
feat: hypeR-native signature input, getHypeRDifexp() and per-signatur…
Cvicnaire Sep 15, 2026
92eafa9
docs: tutorial and NEWS for signature input, getHypeRDifexp and backg…
Cvicnaire Sep 15, 2026
018a249
feat: categorical splits, signed-ranking checks and BS831 enrichment …
Cvicnaire Sep 15, 2026
24a72c3
docs: direction types, BS831 defaults and background guard in the hyp…
Cvicnaire Sep 15, 2026
99c5994
feat: fgsea engine that splits fgseaMultilevel results into hypeR up/…
Cvicnaire Sep 15, 2026
5a6174d
feat: prepareHypeRSignatures(test = "fgsea") builds the kstest up ran…
Cvicnaire Sep 15, 2026
fcb1665
feat: runHypeR(test = "fgsea") with seeded runs, up/down ES split and…
Cvicnaire Sep 15, 2026
36befcf
docs: GSEA with fgsea in the hypeR tutorial and NEWS
Cvicnaire Sep 15, 2026
3dc0eb9
fix: fgsea empty rankings, direction-independent pooled FDR, fgsea ro…
Cvicnaire Sep 15, 2026
e880f94
feat: hypeRDotData() builds shared top-N dot-plot data from runHypeR …
Cvicnaire Sep 15, 2026
abe01a0
feat: hypeREnrichmentData() recomputes running enrichment scores with…
Cvicnaire Sep 15, 2026
48eba32
feat: plotHypeRDots() draws a shared-geneset dot plot for any hyp or …
Cvicnaire Sep 15, 2026
6fb4e16
feat: plotHypeREnrichment() draws running-score curves (kstest, fgsea…
Cvicnaire Sep 15, 2026
2eabe96
feat: plotHypeRMap() wraps hypeR's enrichment and hierarchy maps, ret…
Cvicnaire Sep 15, 2026
8441379
docs: plotting functions in the runHypeR docs, pkgdown, NEWS and the …
Cvicnaire Sep 15, 2026
5a0e6d4
fix: plotting final-review fixes (fgsea tick order, absolute kstest, …
Cvicnaire Sep 15, 2026
ba83de9
feat: plot titles, signature key and whole-ranking fgsea labels
Cvicnaire Sep 15, 2026
24d9642
docs: say which runHypeR() arguments are required and which have defa…
Cvicnaire Sep 16, 2026
d1020f2
docs: required and optional arguments for the remaining hypeR exports
Cvicnaire Sep 16, 2026
483c0b2
feat: annotation tutorial, required organism/test, both-sided ranked …
Cvicnaire Sep 17, 2026
cc32bed
fix: colour kstest down queries by their score on the original ranking
Cvicnaire Sep 17, 2026
f3984bb
Merge branch 'master' into HypeR-Review
Cvicnaire Sep 17, 2026
8e036e8
Run R CMD check and validation on dev as well as master
Cvicnaire Sep 24, 2026
b559006
Document the dev branch, the release pull request and the staging tunnel
Cvicnaire Sep 24, 2026
37b2028
Pin the test host in pkgdown too, not just R CMD check
Cvicnaire Sep 24, 2026
e62f51e
Merge pull request #235 from montilab/234-run-r-cmd-check-and-validat…
Cvicnaire Sep 24, 2026
098309a
Merge pull request #237 from montilab/236-document-the-dev-branch-the…
Cvicnaire Sep 24, 2026
f6432ab
Say when Closes #NNN actually fires under the dev model
Cvicnaire Sep 24, 2026
fb7b193
Merge pull request #239 from montilab/238-contributing-says-issues-cl…
Cvicnaire Sep 24, 2026
4470665
Ask SigRepo_Server to rebuild the staging image when this package cha…
Cvicnaire Sep 24, 2026
b2ad4d1
Merge pull request #244 from montilab/master
Cvicnaire Sep 26, 2026
7dcaf75
Merge pull request #247 from montilab/master
Cvicnaire Sep 26, 2026
be42d5e
Remove R/hypeR_examples.R, a Shiny module that was never part of the …
Cvicnaire Sep 26, 2026
bf302a3
Merge pull request #249 from montilab/248-remove-hyper-examples
Cvicnaire Sep 26, 2026
6506a95
Merge dev into the hypeR client branch and adopt the type and platfor…
Cvicnaire Sep 27, 2026
ddad3a9
Merge pull request #223 from montilab/198-r-client-hyper-review
Cvicnaire Sep 27, 2026
40b30f2
connect-sigrepo-mcp skill: stop listing run_enrichment among the MCP …
Cvicnaire Sep 27, 2026
2984ff7
Merge pull request #251 from montilab/250-mcp-skill-drop-run-enrichment
Cvicnaire Sep 27, 2026
1b3b130
Close linked issues when a pull request merges into dev
Cvicnaire Sep 29, 2026
a2a558b
Merge pull request #254 from montilab/253-close-linked-issues-on-merg…
Cvicnaire Sep 29, 2026
0261ba1
Add writeSignatureSearchScript(), which writes a LINCS search script
Cvicnaire Sep 29, 2026
afecb1a
Merge pull request #256 from montilab/252-write-signaturesearch-script
Cvicnaire Sep 29, 2026
b74d6b0
Merge master into dev: scoreless uni-directional signatures and searc…
Cvicnaire Oct 7, 2026
c684659
Resolve the DESCRIPTION and NEWS conflict markers left in the merge c…
Cvicnaire Oct 7, 2026
d6dd4d8
Merge pull request #262 from montilab/merge-master-into-dev-2026-10-07
Cvicnaire Oct 7, 2026
f88dc50
Add mergeDifexp() to merge signatures' difexp tables into one matrix
Cvicnaire Oct 5, 2026
b24e09d
mergeDifexp(): add collapse = "min" for p-value columns
Cvicnaire Oct 7, 2026
b44f17e
NEWS: mergeDifexp()
Cvicnaire Oct 7, 2026
0a953d0
Add design spec for searchExternal() (Rummagene, RummaGEO, CORESH)
Cvicnaire Oct 7, 2026
fc70d73
Add implementation plan for searchExternal()
Cvicnaire Oct 7, 2026
9c53fd2
Add shared HTTP and data-frame helpers for external signature searches
Cvicnaire Oct 7, 2026
cab7979
Translate a signature into gene symbols and an organism code for exte…
Cvicnaire Oct 7, 2026
1eae97e
Add the Rummagene adapter for searchExternal()
Cvicnaire Oct 7, 2026
656fcd0
Add the RummaGEO adapter for searchExternal()
Cvicnaire Oct 7, 2026
d05414b
Add the CORESH adapter for searchExternal()
Cvicnaire Oct 7, 2026
706a0be
Add searchExternal(): one call to query Rummagene, RummaGEO and CORESH
Cvicnaire Oct 7, 2026
5afb30c
Add opt-in live tests for the external search adapters
Cvicnaire Oct 7, 2026
4aa2f07
Report symbol-lookup failures and empty directions instead of blaming…
Cvicnaire Oct 7, 2026
2239f14
Say which number is the query and which is the hits in searchExternal…
Cvicnaire Oct 7, 2026
aa48357
Merge pull request #266 from montilab/265-add-searchexternal-rummagen…
Cvicnaire Oct 7, 2026
07d3075
Merge remote-tracking branch 'origin/dev' into merge-difexp
Cvicnaire Oct 8, 2026
76a78c5
Merge pull request #264 from montilab/merge-difexp
Cvicnaire Oct 8, 2026
f90580a
Merge master into dev: NEWS rebuild for #258
Cvicnaire Oct 13, 2026
b23c8e7
Merge pull request #269 from montilab/merge-master-into-dev-2026-10-13
Cvicnaire Oct 13, 2026
6a3ce62
Merge pull request #241 from montilab/240-client-changes-never-reach-…
Cvicnaire Oct 13, 2026
862e2bf
NEWS for 1.1.0: carry the section in NEWS.Rmd, rename the header, add…
Cvicnaire Oct 14, 2026
9a190cc
Merge pull request #271 from montilab/270-news-for-the-110-release-re…
Cvicnaire Oct 14, 2026
78f555e
Bump Version to 1.1.0
Cvicnaire Oct 14, 2026
45150a7
Merge pull request #273 from montilab/272-bump-version-to-110-for-the…
Cvicnaire Oct 14, 2026
83fca0d
Remove the searchExternal planning documents from docs/
Cvicnaire Oct 14, 2026
3ae0ecd
Merge pull request #276 from montilab/275-remove-the-searchexternal-p…
Cvicnaire Oct 14, 2026
0267f1a
pkgdown: add mergeDifexp() and searchExternal() to the reference index
Cvicnaire Oct 14, 2026
71be4e5
Merge pull request #279 from montilab/278-pkgdown-reference-index-is-…
Cvicnaire Oct 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .Rbuildignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@
^refCheck\.R$
^\.Rproj\.user$
^local_validation$
^R/hypeR_examples\.R$
^testing_manuscripts$
^artifacts$
^sigs_in_repo\.csv$
^\.lintr$
^CONTRIBUTING\.md$
^\.superpowers$
4 changes: 2 additions & 2 deletions .claude/skills/connect-sigrepo-mcp/SKILL.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
name: connect-sigrepo-mcp
description: Registers SigRepo's MCP server (https://sigrepo.org/mcp/) with Claude Code if it isn't already added, asks the user for their SigRepo api_key, and carries it forward for the rest of the session so every MCP tool call (search_signatures, run_enrichment, etc.) includes it automatically. Use this whenever the user asks to "connect to SigRepo's MCP," "set up SigRepo MCP," "use the SigRepo MCP tools," or wants to start querying/searching SigRepo signatures, collections, gene sets, or run enrichment via MCP but hasn't already supplied an api_key this session.
description: Registers SigRepo's MCP server (https://sigrepo.org/mcp/) with Claude Code if it isn't already added, asks the user for their SigRepo api_key, and carries it forward for the rest of the session so every MCP tool call (search_signatures, compare_signatures, etc.) includes it automatically. Use this whenever the user asks to "connect to SigRepo's MCP," "set up SigRepo MCP," "use the SigRepo MCP tools," or wants to start querying/searching SigRepo signatures, collections, gene sets, or run enrichment via MCP but hasn't already supplied an api_key this session.
---

# Connect to SigRepo's MCP server
Expand Down Expand Up @@ -53,7 +53,7 @@ it to a file, and don't echo it back after this point.
The registered server exposes 9 tools: `list_vocabulary`,
`search_signatures`, `get_signature_context`, `compare_signatures`,
`search_collections`, `search_geneset_resources`, `search_geneset_entries`,
`search_features`, and `run_enrichment`. A reasonable starting point if the
`search_features`, and `rummagene_enrich`. A reasonable starting point if the
person hasn't said what they want yet: call `list_vocabulary` to show what
organisms/phenotypes/assay types actually have data, then `search_signatures`
from there.
Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/R-CMD-CHECK.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
# Need help debugging build failures? Start at https://github.com/r-lib/actions#where-to-find-help
on:
push:
branches: [master]
branches: [master, dev]
paths-ignore:
- '.github/workflows/document.yaml'
- '.github/workflows/gh-pages-pkgdown.yaml'
Expand All @@ -12,7 +12,7 @@ on:
- '**.Rmd'
- '.gitignore'
pull_request:
branches: [master]
branches: [master, dev]
release:
types: [published]
workflow_dispatch:
Expand Down Expand Up @@ -43,6 +43,13 @@ jobs:
env:
GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }}
R_KEEP_PKG_SOURCE: yes
# test_conn_handler defaults host to sigrepo.org and api_host to the
# production IP. Nothing here reaches production today: this check supplies
# no SIGREPO_TEST_DB_USER or _PASSWORD, runs with --no-tests --no-examples,
# and every @examples block is wrapped in \dontrun. Pin the hosts anyway, so
# that stays true if credentials are ever added to this workflow.
SIGREPO_TEST_DB_HOST: 127.0.0.1
SIGREPO_TEST_API_HOST: http://127.0.0.1

steps:
- uses: actions/checkout@v4
Expand Down
72 changes: 72 additions & 0 deletions .github/workflows/close-linked-issues.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
name: close-linked-issues

on:
# pull_request_target, not pull_request: the job needs a token that can close
# issues, and it never checks out or runs the pull request's code, so the
# usual risk of that trigger does not apply.
pull_request_target:
types: [closed]
# GitHub honours `Closes #NNN` only when a pull request merges into the
# default branch, which is master. Pull requests target dev, so without
# this job the keyword does nothing until a release carries dev into
# master, and every issue resolved in between sits open on the board.
branches: [dev]

permissions:
issues: write

jobs:
close:
if: github.event.pull_request.merged == true
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
with:
script: |
const pr = context.payload.pull_request;
const { owner, repo } = context.repo;

// Keywords inside HTML comments and code are not instructions.
const body = (pr.body || '')
.replace(/<!--[\s\S]*?-->/g, '')
.replace(/```[\s\S]*?```/g, '')
.replace(/`[^`\n]*`/g, '');

// The same keywords GitHub recognises, followed by #N, owner/repo#N
// or an issue URL.
const pattern = /\b(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?):?\s+(?:([\w.-]+\/[\w.-]+)?#(\d+)|https:\/\/github\.com\/([\w.-]+\/[\w.-]+)\/issues\/(\d+))/gi;

const numbers = new Set();
for (const m of body.matchAll(pattern)) {
const target = (m[1] || m[3] || `${owner}/${repo}`).toLowerCase();
const number = Number(m[2] || m[4]);
if (target !== `${owner}/${repo}`.toLowerCase()) {
// This job's token reaches this repository only.
core.warning(`${target}#${number} is in another repository; close it by hand.`);
continue;
}
numbers.add(number);
}

if (numbers.size === 0) {
core.info(`#${pr.number} names no issue to close.`);
return;
}

for (const issue_number of numbers) {
const { data: issue } = await github.rest.issues.get({ owner, repo, issue_number });
if (issue.pull_request || issue.state === 'closed') {
core.info(`#${issue_number} skipped: ${issue.pull_request ? 'a pull request' : 'already closed'}.`);
continue;
}
await github.rest.issues.createComment({
owner, repo, issue_number,
body: `Closed by #${pr.number}, merged into \`${pr.base.ref}\`.`,
});
await github.rest.issues.update({
owner, repo, issue_number,
state: 'closed',
state_reason: 'completed',
});
core.info(`#${issue_number} closed.`);
}
77 changes: 77 additions & 0 deletions .github/workflows/notify-staging-image.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: notify staging image

# Tell SigRepo_Server to rebuild the staging image when this package changes on
# dev.
#
# Why this is needed at all: the server calls SigRepo:: by namespace, which
# resolves from the installed library, not from the /SigRepo bind mount --
# inside the container find.package("SigRepo") returns
# /usr/local/lib/R/site-library/SigRepo, and nothing calls pkgload::load_all()
# on that path. So this package reaches the server ONLY through the Docker
# image. SigRepo_Server's build watches only its own files, so without this
# workflow a push here triggers nothing and montilab.bu.edu quietly keeps
# running whatever client was baked in last.
#
# That gap matters most for R/sqlFunctions.R: lookup_table_sql is called 21
# times across 5 of the server's API files and twice in its Shiny app, and its
# query shape is what made getSignature take 4.6 seconds before the index fix.
# Only the staging replica has enough rows for a regression to show.

on:
push:
branches: [dev]
# Only what changes the INSTALLED package. A vignette or README push does
# not need a nine minute image build.
paths:
- "R/**"
- "src/**"
- "inst/**"
- "DESCRIPTION"
- "NAMESPACE"
- ".github/workflows/notify-staging-image.yml"
workflow_dispatch:

jobs:
notify:
runs-on: ubuntu-latest
steps:
- name: Ask SigRepo_Server to rebuild montilab/sigrepo:dev
env:
# secrets.GITHUB_TOKEN cannot reach another repository. GH_DOCS is the
# cross-repo token this project already uses; it needs access to
# montilab/SigRepo_Server for this to work.
TOKEN: ${{ secrets.GH_DOCS }}
SHA: ${{ github.sha }}
REF: ${{ github.ref_name }}
run: |
set -uo pipefail

if [ -z "${TOKEN:-}" ]; then
echo "::error::GH_DOCS is not set, so the staging image cannot be rebuilt."
echo "::error::Staging would silently keep running an older client."
exit 1
fi

code=$(curl -s -o /tmp/dispatch.out -w '%{http_code}' -X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $TOKEN" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/montilab/SigRepo_Server/dispatches \
-d "{\"event_type\":\"sigrepo-client-updated\",\"client_payload\":{\"ref\":\"$REF\",\"sha\":\"$SHA\"}}")

if [ "$code" = "204" ]; then
echo "Asked SigRepo_Server to rebuild montilab/sigrepo:dev for $REF@${SHA:0:8}"
exit 0
fi

# 404 rather than 403 is the usual failure here: GitHub will not
# confirm the existence of a repository the token cannot see, so an
# under-scoped token looks exactly like a missing one. Say so, because
# failing quietly means staging goes stale while looking healthy.
echo "::error::Dispatch to montilab/SigRepo_Server failed with HTTP $code."
if [ "$code" = "404" ]; then
echo "::error::404 here usually means GH_DOCS cannot see SigRepo_Server,"
echo "::error::not that the repository is missing. Check the token's scope."
fi
cat /tmp/dispatch.out
exit 1
8 changes: 8 additions & 0 deletions .github/workflows/pkgdown.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ jobs:
# the site shows the example code without output.
SIGREPO_TEST_DB_USER: ${{ secrets.SIGREPO_TEST_DB_USER }}
SIGREPO_TEST_DB_PASSWORD: ${{ secrets.SIGREPO_TEST_DB_PASSWORD }}
# These two are the reason this matters. test_conn_handler still DEFAULTS
# host to sigrepo.org and api_host to the production IP, and the vignettes
# gate evaluation on the credentials alone, not on the host. So the moment
# the secrets above are set, an unpinned build would run addSignature()
# and deleteSignature() against PRODUCTION, which is read-only for
# signatures by policy. Point them at a stack that is safe to write to.
SIGREPO_TEST_DB_HOST: 127.0.0.1
SIGREPO_TEST_API_HOST: http://127.0.0.1
steps:
- uses: actions/checkout@v4

Expand Down
10 changes: 6 additions & 4 deletions .github/workflows/validation.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: validation

on:
pull_request:
branches: [master]
branches: [master, dev]
push:
branches: [master]
branches: [master, dev]
paths:
- "R/**"
- "tests/**"
Expand Down Expand Up @@ -133,8 +133,10 @@ jobs:
#
# /init_db is schema + reference tables + a full MSigDB gene set build,
# and msigdbr downloads that data from zenodo.org on first use. No test in
# this package uses MSigDB: the hypeR and hypeR-GEM tests construct their
# own gene sets inline and pass them to runHypeR(). So the download bought
# this package needs the database's MSigDB gene sets: the hypeR and
# hypeR-GEM client tests construct their own gene sets inline, and the one
# MSigDB test, test_hypeR_genesets.R, does a live Hallmark fetch through
# msigdbr on the client side that skips on error. So the download bought
# this suite nothing and made every run depend on a third-party service
# staying up -- which is how a zenodo 504 turned into a red build here.
- name: Initialize schema and reference data
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

# Ignore folders
.Rproj.user/
docs/
docs/*

# Local-only validation harness: runs against a developer's own MySQL/API
# stack via local_validation/.env.local-validation. Never belongs on a remote.
Expand Down
50 changes: 49 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,40 @@ are linked before any code is written:

```sh
gh issue create --repo montilab/SigRepo --title "..." --body "..."
gh issue develop <number> --base master --checkout
gh issue develop <number> --base dev --checkout
```

Branch names carry no type prefix — not `fix/`, not `feat/`, not `chore/`. The
default `<number>-<title-slug>` that `gh` produces is what we want.

**`dev` is what gets worked on; `master` is what is live.** Branches come off
`dev` and pull requests go into `dev`. `dev` is deployed to the staging instance
at montilab.bu.edu, where a change is exercised against a full replica of the
data before anyone outside sees it.

`master` is production: it is what sigrepo.org runs. It gains commits only
through a release pull request from `dev`, and direct pushes to it are blocked.
If something ever has to be hotfixed straight onto `master`, merge `master` back
into `dev` the same day. That one rule is what stops the two branches drifting
apart, which is how this arrangement usually goes wrong.

A change that spans both repositories is released from both or from neither.
Otherwise production runs a client and a server from different lines, and the
resulting bug report makes no sense to anyone.

**Every pull request closes its issue.** Put `Closes #NNN` in the description.
This is the rule the rest depends on: it is what lets the board move by itself and
what leaves the reason for a change next to the change.

Note what closes it. GitHub itself honours `Closes #NNN` only when a pull request
merges into the repository's default branch, which is `master`, and pull requests
target `dev`. The `close-linked-issues` workflow covers the gap: when a pull
request merges into `dev`, it closes each issue the description names and leaves
a comment naming the pull request. So a closed issue means merged into `dev`, not
live; what is live is whatever the last release carried into `master`. The
workflow reaches its own repository only, so an issue in the other repository
that your pull request resolves has to be closed by hand.

**Ideas and work are different things.** An idea states a goal, is labelled `idea`,
and is never closed by a pull request. A task or bug is real work: it links to the
idea it serves, and it is closed by the pull request that resolves it. An idea is
Expand Down Expand Up @@ -56,6 +80,30 @@ in the issue, or label it `needs-decision` and say what the decision is.
nobody answers. Closing is not a judgement on the idea; reopen it when it matters
again.

## Reaching the staging instance

montilab.bu.edu keeps every port bound to `127.0.0.1`. It is a shared,
BU-managed host, the lab has already been warned once about an exposed port, and
the staging database holds real signatures behind accounts that can edit them.
So nothing there is published to the network, and reaching it means your own SSH
tunnel with your own BU account:

```sh
ssh -N -o ExitOnForwardFailure=yes \
-L 9051:127.0.0.1:8051 -L 9050:127.0.0.1:8050 -L 9020:127.0.0.1:8020 montilab
```

with `Host montilab` proxying through `scc4.bu.edu` — not scc2, which has no
route to the BUMC network. Local ports are offset by 1000 so they do not collide
with a stack running on your own machine. If you already have a ControlMaster
session open, that command returns immediately and the master process holds the
forwards: the tunnel is live even though it looks like the command exited.

Then open <http://127.0.0.1:9051>.

This needs SCC access. If you do not have it, ask for a walkthrough rather than
a port.

## Labels

Exactly one type label, and exactly one status label.
Expand Down
11 changes: 7 additions & 4 deletions DESCRIPTION
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Package: SigRepo
Type: Package
Title: Storing and processing omic signatures and collections
Version: 1.0.0
Version: 1.1.0
Authors@R:
c(person(given="Reina", family="Chau", role=c("aut","cre"),
email="rchau88@bu.edu", comment=c(ORCID="0000-0003-3012-1404")),
Expand All @@ -23,10 +23,16 @@ Imports:
DBI,
digest,
dplyr,
fgsea,
ggplot2,
httr,
hypeR (>= 2.0.0),
hypeR.GEM,
jsonlite,
methods,
msigdbr,
OmicSignature (>= 1.4.1),
openxlsx,
purrr,
readr,
rlang,
Expand All @@ -37,9 +43,6 @@ Remotes:
Suggests:
BiocManager,
devtools,
fgsea,
hypeR,
hypeR.GEM,
knitr,
pkgdown,
rmarkdown,
Expand Down
Loading
Loading