Skip to content

chore(release): bring develop's post-cut changes into 0.10.0 - #1024

Merged
HuiJun merged 78 commits into
mainfrom
hotfix/0.10.0-develop-sync
Oct 9, 2026
Merged

HuiJun merged 78 commits into
mainfrom
hotfix/0.10.0-develop-sync

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 9, 2026 •

Copy link
Copy Markdown
Contributor

What and why

release/0.10.0 merged to main before develop finished landing the work the maintainers chose for 0.10.0. This hotfix, cut from main, merges develop (d681851) into the release tree so the tag carries it, and folds the fragments those changes added into the already-dated ## 0.10.0 section of CHANGELOG.md, as a hotfix on main must.

What it brings over, by merge into develop:

The hotfix's own commits: the two develop merges, the two changelog folds, and the version bump of the surfaces develop added since the cut — editors/jupyterlab/package.json (+ lock) to 0.10.0, and the 0.9.2 mentions in editors/README.md, docs/reference/java-api.md and the Java agent skill that the release cut missed.

How it was verified

On the merged tree (82f0fac): gofmt -l . (empty), go build ./..., go vet ./..., make lint; go test -race -count=1 -timeout 60m ./... with OPENSYSML_REQUIRE_TRAINING_CORPUS, OPENSYSML_REQUIRE_PILOT_CORPORA, OPENSYSML_REQUIRE_PILOT_LIBRARY_XMI and OPENSYSML_REQUIRE_PSSM_SUITE set (all packages ok); go test -run TestStdlibConformance ./internal/workspace/libs; make proto-breaking BUF_BREAKING_REF=origin/main; python3 scripts/changelog.py check, scripts/check-doc-ids.py, scripts/check-doc-links.py, make docs-check; CIRCLE_TAG=v0.10.0 client/python/scripts/check_version.py --editors → 0.10.0; Python client suite 1454 passed. The kernel wheel was built with the CircleCI step commands and installed into a clean virtualenv: the JupyterLab extension registers at 0.10.0, and the CLI listing, %documents/%views, %viz, notebook %load and the repository usage errors behave as documented at the prompt and in the kernel.

The release rehearsal (release_rehearsal=true) is to be re-run on main after this merges and before the tag.

Checklist

  • make test and make lint pass locally
  • Tests added or updated for the change (carried by the merged pull requests)
  • Documentation extended where it already covers the surface (see CONTRIBUTING.md)
  • Changelog entry added as changes/unreleased/<slug>.<section>.md, not as an edit to CHANGELOG.md — a hotfix folds the fragments into the dated section instead
  • baselines regenerated and make docs-counts run if a gate count moved (none moved)
  • No internal work-item labels (waves, slices, F4, K5) in the body, docs, or changelog

Link to Devin session: https://nasa-jpl-demo.devinenterprise.com/sessions/3db6a090aa214667b2a66d372c6e36b1
Open in Devin Desktop: https://nasa-jpl-demo.devinenterprise.com/desktop/session/3db6a090aa214667b2a66d372c6e36b1?variant=devin
Requested by: @HuiJun

devin-ai-integration Bot and others added 30 commits October 8, 2026 16:52
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…urce spelling

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
A branch stating its source twice, in either spelling, was read from the
first value alone, so a second source beside the member before it was
dropped. Every stated source must be the member before it.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
… term

A source spelled as a literal with the preceding member's IRI text passed
the branch check and was dropped; the check now compares the complete term.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Whole, the package took 31-57 minutes under -race on the CI runners, straddling its 55-minute per-package limit. The conformance-corpus-wide suites (exploration, check/explore agreement, witness replay, execution conformance and its policies) take about half of that, so they run as the runtime-corpus shard and the rest of the package as the runtime shard. The coverage merge collapses the blocks the two shards share.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
The merge now runs scripts/dedupe-coverage.py, which the job had no checkout for.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…n asked

Run is now Listen then Serve. Listen binds the five channels and returns the
connection they are bound on: a TCP channel whose port is 0 takes a free port
and the connection reports it, while a port given is bound as given, so a
connection file keeps naming the ports Jupyter chose.

The kernel's tests used to reserve five free ports, release them and have the
kernel bind them later; another process on a busy CI runner could take one in
between, the kernel's Run failed, and the test then waited minutes on a dial
nothing answered. The tests now bind on port 0 and dial the ports Listen
reports, and a kernel that cannot bind fails the test at once.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…s, refuse a second Listen

Listen now returns an error while a binding is still unserved, so a repeated call cannot replace the first binding's stop before failing on its ports. The channels close once their context ends, whether or not Serve is called, so a kernel that was only listened on releases its ports; Serve shares the same single close.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…documents and %views

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
* feat(cli): list a model's documents, views and diagrams with -list, %documents and %views

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(cli): refuse -list with -import flags and with -html-default-css

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…te grammars

gengrammar now also writes editors/jupyterlab/src/syntax.json, the keyword,
constant, contextual-word and operator tables the JupyterLab tokenizer reads,
from the same lexer keyword lists as the VS Code grammars; the multi-character
operators the grammars match come from one list too. A test holds the
committed table to the generator's output, as it does the grammars.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…ng for JupyterLab 4 and Notebook 7

A prebuilt JupyterLab extension under editors/jupyterlab registers the sysml
(text/x-sysml, .sysml) and kerml (text/x-kerml, .kerml) CodeMirror 6 languages
with a StreamLanguage tokenizer driven by the generated syntax table: keywords
and contextual words, line and block comments, doc and comment bodies, strings
with escapes, numbers, unrestricted and qualified names, operators and
punctuation, and a cell's leading kernel command. The kernel reports
codemirror_mode sysml, and a test holds its language_info to what the
extension registers.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…d the sdist

make jupyterlab-build puts the extension's build in client/jupyter-kernel/
labextension/, and setup.py installs it as shared data under
share/jupyter/labextensions/jupyterlab-opensysml in the platform wheels, the
pure wheel and the sdist, refusing to build any of them without it; the sdist
still carries no kernel. build-jupyter-kernel-dist.sh builds the extension once
before the distributions and checks all six carry the same bundle; the
CircleCI job runs on the Node variant of the Python image and checks the
installed wheel registered the extension, the nightly installs jupyterlab
before the build, and the hygiene tests pin all of it. A jupyterlab area in
the pull-request workflow tests and builds the extension, check_version
--editors reads its manifest, and the docs describe what pip now ships.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
The Jupyter highlight style leaves the namespace tag uncolored, so
ScalarValues in ScalarValues::Real looked like any other name; the segments
before :: now take the special-name tag the style colors.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
An unquoted :all: makes the workflow file invalid YAML, so no check of the
pull-request workflow could start.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…mmand plain

The lexer reads //* as a multiline note, so the CodeMirror tokenizer and the
TextMate grammars now carry it to the closing */ instead of ending it at the
line. A block comment that closes mid-line also marks the line as occupied, so
a % token after it is no longer a meta-command.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…t version

jupyter labextension list reports the manifest's version, so the nightly
stamps editors/jupyterlab with the snapshot's npm version before the kernel
distributions are built and checks the wheel's labextension carries it.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
* ci: run internal/exec/runtime as two race shards split by test name

Whole, the package took 31-57 minutes under -race on the CI runners, straddling its 55-minute per-package limit. The conformance-corpus-wide suites (exploration, check/explore agreement, witness replay, execution conformance and its policies) take about half of that, so they run as the runtime-corpus shard and the rest of the package as the runtime shard. The coverage merge collapses the blocks the two shards share.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* ci: check the tree out before merging the race shards' profiles

The merge now runs scripts/dedupe-coverage.py, which the job had no checkout for.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* ci: shorten the runtime shard comments to two lines

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
* fix(jupyter): bind the kernel's channels in Listen, on free ports when asked

Run is now Listen then Serve. Listen binds the five channels and returns the
connection they are bound on: a TCP channel whose port is 0 takes a free port
and the connection reports it, while a port given is bound as given, so a
connection file keeps naming the ports Jupyter chose.

The kernel's tests used to reserve five free ports, release them and have the
kernel bind them later; another process on a busy CI runner could take one in
between, the kernel's Run failed, and the test then waited minutes on a dial
nothing answered. The tests now bind on port 0 and dial the ports Listen
reports, and a kernel that cannot bind fails the test at once.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(jupyter): close a listened kernel's channels when its context ends, refuse a second Listen

Listen now returns an error while a binding is still unserved, so a repeated call cannot replace the first binding's stop before failing on its ports. The channels close once their context ends, whether or not Serve is called, so a kernel that was only listened on releases its ports; Serve shares the same single close.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
* fix(export): refuse a decision branch that states a trigger

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(export): check a decision branch's source through either sysml:source spelling

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* docs(export): record the decision branches the RDF decoder refuses

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(export): refuse a decision branch stating a second source

A branch stating its source twice, in either spelling, was read from the
first value alone, so a second source beside the member before it was
dropped. Every stated source must be the member before it.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(export): compare a decision branch's stated source as a whole RDF term

A source spelled as a literal with the preceding member's IRI text passed
the branch check and was dropped; the check now compares the complete term.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…ghting

* feat(editors): generate the CodeMirror syntax table beside the TextMate grammars

gengrammar now also writes editors/jupyterlab/src/syntax.json, the keyword,
constant, contextual-word and operator tables the JupyterLab tokenizer reads,
from the same lexer keyword lists as the VS Code grammars; the multi-character
operators the grammars match come from one list too. A test holds the
committed table to the generator's output, as it does the grammars.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* feat(jupyterlab): jupyterlab-opensysml, SysML v2 and KerML highlighting for JupyterLab 4 and Notebook 7

A prebuilt JupyterLab extension under editors/jupyterlab registers the sysml
(text/x-sysml, .sysml) and kerml (text/x-kerml, .kerml) CodeMirror 6 languages
with a StreamLanguage tokenizer driven by the generated syntax table: keywords
and contextual words, line and block comments, doc and comment bodies, strings
with escapes, numbers, unrestricted and qualified names, operators and
punctuation, and a cell's leading kernel command. The kernel reports
codemirror_mode sysml, and a test holds its language_info to what the
extension registers.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* feat(jupyter): ship the JupyterLab extension in every kernel wheel and the sdist

make jupyterlab-build puts the extension's build in client/jupyter-kernel/
labextension/, and setup.py installs it as shared data under
share/jupyter/labextensions/jupyterlab-opensysml in the platform wheels, the
pure wheel and the sdist, refusing to build any of them without it; the sdist
still carries no kernel. build-jupyter-kernel-dist.sh builds the extension once
before the distributions and checks all six carry the same bundle; the
CircleCI job runs on the Node variant of the Python image and checks the
installed wheel registered the extension, the nightly installs jupyterlab
before the build, and the hygiene tests pin all of it. A jupyterlab area in
the pull-request workflow tests and builds the extension, check_version
--editors reads its manifest, and the docs describe what pip now ships.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(jupyterlab): color the qualifying segments of a qualified name

The Jupyter highlight style leaves the namespace tag uncolored, so
ScalarValues in ScalarValues::Real looked like any other name; the segments
before :: now take the special-name tag the style colors.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* ci: quote the --only-binary argument of the JupyterLab install step

An unquoted :all: makes the workflow file invalid YAML, so no check of the
pull-request workflow could start.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(editors): highlight //* notes to their */ and keep a mid-line %command plain

The lexer reads //* as a multiline note, so the CodeMirror tokenizer and the
TextMate grammars now carry it to the closing */ instead of ending it at the
line. A block comment that closes mid-line also marks the line as occupied, so
a % token after it is no longer a meta-command.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* ci(nightly): stamp the JupyterLab extension manifest with the snapshot version

jupyter labextension list reports the manifest's version, so the nightly
stamps editors/jupyterlab with the snapshot's npm version before the kernel
distributions are built and checks the wheel's labextension carries it.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
%viz [--view=<VIEW>] [--style=<STYLE>...] [<form>] <name> [<name>...]
renders several named elements in one diagram through the pseudo-view
path, in the kind --view names or, by default, the kind the elements
call for (view.Renderer.DefaultKind). The pilot's directions set the
rendering direction; its styles no form here draws are accepted and
noted as not drawn. The Jupyter kernel shows a %viz cell with no form as
Mermaid and, where Graphviz is installed, as SVG drawn from DOT.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…efault Viz to text

- DefaultKind: a structural usage whose only connection is a feature bound by its value to another feature (attribute reading = second.y) is an interconnection, as the interconnection renderer draws that binding as an edge.
- Completion: a --view or --style value typed in lower or upper case is offered in that case, so the candidate begins with the typed word and the prompt inserts it in place.
- Session.Viz with no form and no fallback renders as text instead of panicking.
- A form named after --style PUMLCODE is refused naming the style, as the reverse order already was.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
* feat(repl): draw named elements on demand with the pilot kernel's %viz

%viz [--view=<VIEW>] [--style=<STYLE>...] [<form>] <name> [<name>...]
renders several named elements in one diagram through the pseudo-view
path, in the kind --view names or, by default, the kind the elements
call for (view.Renderer.DefaultKind). The pilot's directions set the
rendering direction; its styles no form here draws are accepted and
noted as not drawn. The Jupyter kernel shows a %viz cell with no form as
Mermaid and, where Graphviz is installed, as SVG drawn from DOT.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(repl): draw value bindings, keep typed case in %viz completion, default Viz to text

- DefaultKind: a structural usage whose only connection is a feature bound by its value to another feature (attribute reading = second.y) is an interconnection, as the interconnection renderer draws that binding as an edge.
- Completion: a --view or --style value typed in lower or upper case is offered in that case, so the candidate begins with the typed word and the prompt inserts it in place.
- Session.Viz with no form and no fallback renders as text instead of panicking.
- A form named after --style PUMLCODE is refused naming the style, as the reverse order already was.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
A path ending in .ipynb loads the notebook's code cells in order, each a
source named '<notebook> cell <n>', for what they declare: % command lines
and bare expressions are skipped and counted in the report. --cells picks
cells by position or tag, a cell tagged skip-load is never loaded, and a
notebook written for another kernel language or in another nbformat is
refused. Notebooks are collected beside .sysml and .kerml files by
directory and pattern expansion, so the sysml command line loads them too.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
HuiJun and others added 5 commits October 9, 2026 03:55
The compiled calc tier held each scalar in 56 bytes and, for every parameter, local and result, boxed it back into the evaluator's constant to decide whether the declaration holds it, building the diagnostic a refusal would name whether or not one followed. A scalar is now the constant packed into 24 bytes (semantics.Packed), unpacked without allocating; which kinds a declaration holds whatever the value is decided once at compile time; the diagnostic is built only on refusal; and the step charge inlines into every node. Results, promotions, refusals, error messages and step counts are unchanged.

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
IsStateActivity, IsBaseThat and IsOccurrenceThis asked for a target's
fully-qualified name on every feature-chain read to compare it against
a known name; they now match the owner chain segment by segment with
symbols.HasFQN, so a conformant body allocates nothing for the question.

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
The REPL, Jupyter and CLI additions, the decision-branch and kernel-port
fixes, the runtime shard split and the six performance changes landed on
develop after release/0.10.0 merged; their fragments now sit under 0.10.0
with the rest.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…was cut

The JupyterLab extension's manifest and lock take the core version
check_version.py --editors expects, releasing.md lists the manifest among
the editors' lockstep surfaces, and the editors' and Java references name
0.10.0 where they still named 0.9.2.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@devin-ai-integration
devin-ai-integration Bot changed the base branch from develop to main October 9, 2026 11:21
devin-ai-integration Bot and others added 2 commits October 9, 2026 11:24
An «ItemFlow» whose source and target are the parts on the realizing
connector's ends, the blocks typing them, or the connector's owner at its
own port — as Cameo writes a flow drawn between parts — now flows between
the ports those ends name instead of being left as a comment.

lower: a view, viewpoint, rendering or metadata member of a state def is
not state content, so a usage typed by it inherits past it instead of
failing to lower, which left migrated state diagrams empty.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
A repository or notebook command given wrong arguments returns its usage as a
*UsageError, whose Error() is only the first line; the terminal loop printed
that line alone, leaving out the line saying what was wrong, while the Jupyter
kernel's traceback showed both. The loop now prints every line the error
holds, the first under the error prefix as before.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
@HuiJun
HuiJun marked this pull request as ready for review October 9, 2026 11:40
…tate rendering

Direction audits of migrated item flows against the source XMI, the
pre-change-binary negative control for lowering fixes, and the
positioned-view pitfalls (-render-unplaced strip, -graphs) that make an
empty state graph look like a placement issue or vice versa.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 4 potential issues.

Devin Review

Comment thread internal/frontend/repl/replext/repository/repository.go
Comment thread internal/translate/interop/sysmlapi/repository.go
Comment thread internal/translate/interop/sysmlapi/client.go Outdated
Comment thread internal/frontend/repl/replext/repository/repository.go
devin-ai-integration Bot and others added 12 commits October 9, 2026 11:43
Co-Authored-By: jason.han <hanhuijun@gmail.com>
… given a direction

Two same-typed parts at same-typed ports let a flow from the block to the
port type stand for either end; only the ends' roles may then tell them
apart, and when they cannot the flow is left as a comment instead of
taking the connector's end order.

lower: a parallel state def's views, viewpoints, renderings and metadata
are no regions, so a usage typed by it lowers as an ordinary one does.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
… branch read honest

A next-page link to another host, port or plaintext is refused like a redirect there instead of being followed with the token; the repository URL the environment supplies is held to the plaintext rule before any request; a branch read before its first commit is still checked for a head that appeared since; and %publish by name resolves the project the session loaded by id, so a namesake no longer makes the name ambiguous.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
…flow-block-ends

* migrate: find item flow ends through the parts and blocks a tool names

An «ItemFlow» whose source and target are the parts on the realizing
connector's ends, the blocks typing them, or the connector's owner at its
own port — as Cameo writes a flow drawn between parts — now flows between
the ports those ends name instead of being left as a comment.

lower: a view, viewpoint, rendering or metadata member of a state def is
not state content, so a usage typed by it inherits past it instead of
failing to lower, which left migrated state diagrams empty.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* migrate: an item flow whose ends stand for both connector ends is not given a direction

Two same-typed parts at same-typed ports let a flow from the block to the
port type stand for either end; only the ends' roles may then tell them
apart, and when they cannot the flow is left as a comment instead of
taking the connector's end order.

lower: a parallel state def's views, viewpoints, renderings and metadata
are no regions, so a usage typed by it lowers as an ordinary one does.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…ion-rendering

* skills: testing-sysml-repl covers v1 migration audits and inherited-state rendering

Direction audits of migrated item flows against the source XMI, the
pre-change-binary negative control for lowering fixes, and the
positioned-view pitfalls (-render-unplaced strip, -graphs) that make an
empty state graph look like a placement issue or vice versa.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* ci: rerun

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
Co-Authored-By: jason.han <hanhuijun@gmail.com>
…till names so

A tracked project renamed or deleted on the server no longer answers to the requested name, so the publish falls back to resolving the name afresh under the ambiguity rules instead of committing into the renamed project or creating a new one over its namesake.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
* fix(sysmlapi): keep the bearer token on the configured server and the branch read honest

A next-page link to another host, port or plaintext is refused like a redirect there instead of being followed with the token; the repository URL the environment supplies is held to the plaintext rule before any request; a branch read before its first commit is still checked for a head that appeared since; and %publish by name resolves the project the session loaded by id, so a namesake no longer makes the name ambiguous.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* fix(sysmlapi): publish by name only through a tracked id the server still names so

A tracked project renamed or deleted on the server no longer answers to the requested name, so the publish falls back to resolving the name afresh under the ambiguity rules instead of committing into the renamed project or creating a new one over its namesake.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…rror-lines

* fix(repl): print every line of a usage error at the prompt

A repository or notebook command given wrong arguments returns its usage as a
*UsageError, whose Error() is only the first line; the terminal loop printed
that line alone, leaving out the line saying what was wrong, while the Jupyter
kernel's traceback showed both. The loop now prints every line the error
holds, the first under the error prefix as before.

Co-Authored-By: jason.han <hanhuijun@gmail.com>

* refactor(repl): keep usage-error comments to two lines

Co-Authored-By: jason.han <hanhuijun@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: jason.han <hanhuijun@gmail.com>
…0.10.0

The item-flow endpoint and state-def view fixes to the SysML v1 migrator,
the terminal prompt's full usage errors, and the SysML v2 API client's
token, branch-head and publish-by-id corrections landed on develop after
the previous fold; their fragments now sit under 0.10.0 with the rest.

Co-Authored-By: jason.han <hanhuijun@gmail.com>
@HuiJun
HuiJun merged commit 92715d3 into main Oct 9, 2026
26 checks passed
@HuiJun
HuiJun deleted the hotfix/0.10.0-develop-sync branch October 9, 2026 15:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant